Remove Web of Comics (#17979)

Site only says "404 Not Found"
This commit is contained in:
Vetle Ledaal 2023-09-16 15:37:20 +00:00 committed by GitHub
parent 2307dbf25f
commit e4c8f1c050
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 0 additions and 821 deletions

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest />

View File

@ -1,11 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'Web of Comics'
pkgNameSuffix = 'ru.webofcomics'
extClass = '.WebOfComics'
extVersionCode = 5
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

View File

@ -1,808 +0,0 @@
package eu.kanade.tachiyomi.extension.ru.webofcomics
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
import kotlin.math.absoluteValue
import kotlin.random.Random
class WebOfComics : ParsedHttpSource() {
override val name = "Web of Comics"
override val baseUrl = "https://webofcomics.ru"
override val lang = "ru"
override val supportsLatest = true
private val userAgentRandomizer = "${Random.nextInt().absoluteValue}"
override fun headersBuilder(): Headers.Builder = Headers.Builder()
.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.$userAgentRandomizer Safari/537.36")
.add("Referer", baseUrl)
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.rateLimit(3)
.build()
override fun popularMangaRequest(page: Int): Request {
return POST(
"$baseUrl/page/$page",
body = FormBody.Builder()
.add("dlenewssortby", "rating")
.add("dledirection", "desc")
.add("set_new_sort", "dle_sort_main")
.add("set_direction_sort", "dle_direction_main")
.build(),
headers = headers,
)
}
override fun latestUpdatesRequest(page: Int): Request {
return POST(
"$baseUrl/page/$page",
body = FormBody.Builder()
.add("dlenewssortby", "date")
.add("dledirection", "desc")
.add("set_new_sort", "dle_sort_main")
.add("set_direction_sort", "dle_direction_main")
.build(),
headers = headers,
)
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
if (query.isNotEmpty()) {
return POST(
"$baseUrl/index.php?do=search",
body = FormBody.Builder()
.add("do", "search")
.add("subaction", "search")
.add("story", query)
.add("search_start", page.toString())
.build(),
headers = headers,
)
}
val mutableGenre = mutableListOf<String>()
val mutableType = mutableListOf<String>()
val mutableAge = mutableListOf<String>()
val mutableStatus = mutableListOf<String>()
var publisherCat = ""
var orderBy = "desc"
var ascEnd = "rating"
var sectionOr = "All"
(if (filters.isEmpty()) getFilterList() else filters).forEach { select ->
when (select) {
is OrderBy -> {
orderBy = arrayOf("date", "rating", "news_read", "comm_num", "title", "d.year", "d.multirating")[select.state!!.index]
ascEnd = if (select.state!!.ascending) "asc" else "desc"
}
is AgeList -> select.state.forEach { age ->
if (age.state) {
mutableAge += age.name
}
}
is StatusList -> select.state.forEach { status ->
if (status.state) {
mutableStatus += status.name
}
}
is Section -> {
if (select.state == 1) {
sectionOr = "Comics"
filters.forEach { filter ->
when (filter) {
is GenreComics -> filter.state.forEach { genre ->
if (genre.state) {
mutableGenre += genre.name
}
}
is TypeComics -> filter.state.forEach { type ->
if (type.state) {
mutableType += type.name
}
}
is PublishersComics -> {
if (filter.state > 0) {
publisherCat = getPublishersComics()[filter.state].id
}
}
else -> {}
}
}
}
if (select.state == 2) {
sectionOr = "Manga"
filters.forEach { filter ->
when (filter) {
is GenreManga -> filter.state.forEach { genre ->
if (genre.state) {
mutableGenre += genre.name
}
}
is TypeManga -> filter.state.forEach { type ->
if (type.state) {
mutableType += type.name
}
}
is PublishersManga -> {
if (filter.state > 0) {
publisherCat = getPublishersManga()[filter.state].id
}
}
else -> {}
}
}
}
}
else -> {}
}
}
if (sectionOr == "Comics") {
return GET("$baseUrl/f/age=${mutableAge.joinToString(",")}/comicsormanga=Comics/o.cat=$publisherCat/translatestatus=${mutableStatus.joinToString(",")}/genre=${mutableGenre.joinToString(",")}/type=${mutableType.joinToString(",")}/sort=$orderBy/order=$ascEnd/page/$page", headers)
}
if (sectionOr == "Manga") {
return GET("$baseUrl/f/age=${mutableAge.joinToString(",")}/comicsormanga=Manga/o.cat=$publisherCat/translatestatus=${mutableStatus.joinToString(",")}/genremanga=${mutableGenre.joinToString(",")}/typemanga=${mutableType.joinToString(",")}/sort=$orderBy/order=$ascEnd/page/$page", headers)
}
return POST(
"$baseUrl/page/$page",
body = FormBody.Builder()
.add("dlenewssortby", orderBy)
.add("dledirection", ascEnd)
.add("set_new_sort", "dle_sort_main")
.add("set_direction_sort", "dle_direction_main")
.build(),
headers = headers,
)
}
override fun searchMangaParse(response: Response): MangasPage {
val document = response.asJsoup()
val mangas = document.select(searchMangaSelector()).map { element ->
searchMangaFromElement(element)
}
return MangasPage(mangas, mangas.isNotEmpty())
}
override fun popularMangaSelector() = ".movie-item"
override fun latestUpdatesSelector() = popularMangaSelector()
override fun searchMangaSelector() = popularMangaSelector()
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
manga.thumbnail_url = baseUrl + element.select(".lazyload").first()!!.attr("data-src").replace("/thumbs", "")
element.select(".movie-title").first()!!.let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.html().substringBefore("<div>")
}
return manga
}
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
override fun popularMangaNextPageSelector() = ".pnext a"
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaNextPageSelector(): String? = null
private fun parseStatus(status: String): Int {
return when (status) {
"Завершён" -> SManga.COMPLETED
"Продолжается" -> SManga.ONGOING
else -> SManga.UNKNOWN
}
}
override fun mangaDetailsParse(document: Document): SManga {
val ratingValue = document.select(".multirating-itog-rateval").text().toFloat()
val ratingVotes = document.select(".multirating-itog-votes").text()
val ratingStar = when {
ratingValue > 9.5 -> "★★★★★"
ratingValue > 8.5 -> "★★★★✬"
ratingValue > 7.5 -> "★★★★☆"
ratingValue > 6.5 -> "★★★✬☆"
ratingValue > 5.5 -> "★★★☆☆"
ratingValue > 4.5 -> "★★✬☆☆"
ratingValue > 3.5 -> "★★☆☆☆"
ratingValue > 2.5 -> "★✬☆☆☆"
ratingValue > 1.5 -> "★☆☆☆☆"
ratingValue > 0.5 -> "✬☆☆☆☆"
else -> "☆☆☆☆☆"
}
val manga = SManga.create()
val infoElement = document.select(".page-cols").first()!!
val infoElement2 = document.select(".m-info2 .sliceinfo1")
manga.title = infoElement.select("h1").first()!!.text()
manga.thumbnail_url = baseUrl + infoElement.select(".lazyload").first()!!.attr("data-src")
manga.description = infoElement.select("H2").first()!!.text() + "\n" + ratingStar + " " + ratingValue + " (голосов: " + ratingVotes + ")\n" + Jsoup.parse(document.select(".slice-this").first()!!.html().replace("<br>", "REPLACbR")).text().replace("REPLACbR", "\n").substringAfter("Описание:").trim()
manga.author = infoElement2.select(":contains(Автор) a").joinToString { it.text() }
if (manga.author.isNullOrEmpty()) {
manga.author = infoElement.select(".mi-item:contains(Издательство)").first()!!.text()
}
manga.artist = infoElement2.select(":contains(Художник) a").joinToString { it.text() }
manga.genre = (infoElement.select(".mi-item:contains(Тип) a") + infoElement.select(".mi-item:contains(Возраст) a") + infoElement.select(".mi-item:contains(Формат) a") + infoElement.select(".mi-item:contains(Жанр) a")).joinToString { it.text() }
manga.status = if (document.toString().contains("Удалено по просьбе правообладателя")) {
SManga.LICENSED
} else {
parseStatus(infoElement.select(".mi-item:contains(Перевод) a").first()!!.text())
}
return manga
}
override fun chapterListRequest(manga: SManga): Request {
val typeSeries = if (manga.url.contains("/manga/")) {
"xsort='tommanga,glavamanga' template='custom-linkstocomics-xfmanga-guest'"
} else {
"xsort='number' template='custom-linkstocomics-xfcomics-guest'"
}
return POST(
"$baseUrl/engine/ajax/customajax.php",
body = FormBody.Builder()
.add("castom", "custom senxf='fastnavigation|${manga.url.substringAfterLast("/").substringBefore("-")}' $typeSeries limit='3000' sort='asc' cache='yes'")
.build(),
headers = headers,
)
}
override fun chapterListSelector() = ".ltcitems:has(a:not(.alttranslatelink))"
override fun chapterFromElement(element: Element): SChapter {
val chapter = SChapter.create()
element.select("a").first()!!.let {
val numberSection = it.text().substringBefore(" - ")
chapter.name = it.text().substringAfterLast(":")
chapter.chapter_number = if (numberSection.contains("#")) {
numberSection.substringAfter("#").replace("-", ".").toFloatOrNull() ?: -1f
} else {
numberSection.substringAfter("Глава").substringAfter("-").toFloatOrNull() ?: -1f
}
chapter.setUrlWithoutDomain(it.attr("href"))
}
chapter.date_upload = simpleDateFormat.parse(element.select("div").first()!!.text().trim())?.time ?: 0L
return chapter
}
override fun chapterListParse(response: Response): List<SChapter> {
return super.chapterListParse(response).reversed()
}
override fun pageListParse(document: Document): List<Page> {
var baseImgUrl = document.select("link[rel='image_src']").last()!!.attr("href")
if (baseImgUrl.isEmpty()) {
return document.select(".readtab .lazyload").mapIndexed { index, element ->
Page(
index,
"",
"https://read.webofcomics.ru/webofcomics.ru/www/webofcomics.ru/public_html/uploads/" + element.attr("data-src").substringAfter("/uploads/"),
)
}
}
val uploadUrl =
with(baseImgUrl) {
when {
contains("/uploads/") -> "/uploads/"
contains("/manga/") -> "/manga/"
contains("/mangaparser/") -> "/mangaparser/"
else -> "errorUploads"
}
}
baseImgUrl = baseImgUrl.substringBefore(uploadUrl)
if (document.select(".readtab .lazyload").isNotEmpty()) {
return document.select(".readtab .lazyload").mapIndexed { index, element ->
Page(
index,
"",
baseImgUrl + uploadUrl + element.attr("data-src").substringAfter(uploadUrl),
)
}
} else {
val counterPageStr = document.select("#comics script").toString()
val startPageStr = counterPageStr
.substringAfter("for(var i =")
.substringBefore("; i <")
.trim()
var endPageStr = counterPageStr
.substringAfter("; i <")
.substringBefore("; i++)")
.trim()
if (endPageStr.contains("=")) {
endPageStr = (endPageStr.replace("=", "").trim().toInt() + 1).toString()
}
if (baseImgUrl.contains("/share.")) {
baseImgUrl = counterPageStr
.substringAfter("data-src=\"")
.substringBefore("' + i")
.trim().replace("https://feik.domain.ru/", "https://read.webofcomics.ru/webofcomics.ru/www/webofcomics.ru/public_html/") +
counterPageStr
.substringAfter("i + '")
.substringBefore("\">")
.trim()
}
val countSubPage = counterPageStr.split("document.write").size
return (startPageStr.toInt() until endPageStr.toInt()).mapIndexed { index, page ->
val subPage = when (countSubPage) {
3 -> {
when {
page < 10 -> "0"
else -> ""
}
}
4 -> {
when {
page < 10 -> "00"
page < 100 -> "0"
else -> ""
}
}
else -> ""
}
Page(
index,
"",
baseImgUrl.substringBeforeLast("/") + "/$subPage$page." + baseImgUrl.substringAfterLast("."),
)
}
}
}
override fun imageUrlParse(document: Document) = ""
// Filters
private class CheckFilter(name: String) : Filter.CheckBox(name)
private data class Publisher(val name: String, val id: String)
override fun getFilterList() = FilterList(
Section(),
OrderBy(),
Filter.Separator(),
Filter.Header("ОБЩИЕ ФИЛЬТРЫ♼"),
Filter.Separator(),
StatusList(getStatusList()),
AgeList(getAgeList()),
Filter.Separator(),
Filter.Header("КОМИКСЫ♼"),
Filter.Separator(),
TypeComics(getTypesComics()),
GenreComics(getGenresComics()),
PublishersComics(publishersComics),
Filter.Separator(),
Filter.Header("МАНГА♼"),
Filter.Separator(),
TypeManga(getTypesManga()),
GenreManga(getGenresManga()),
PublishersManga(publishersManga),
)
private class OrderBy : Filter.Sort(
"Сортировать по",
arrayOf("Дате обновления", "Популярности", "Просмотрам", "Комментариям", "Алфавиту", "Дате выпуска♼", "Рейтингу♼"),
Selection(1, false),
)
private class Section : Filter.Select<String>(
"ИЛИ",
arrayOf("Сортировка(без фильтрации♼)", "КОМИКСЫ", "МАНГА"),
)
private class StatusList(statuses: List<CheckFilter>) : Filter.Group<CheckFilter>("Статус перевода", statuses)
private fun getStatusList() = listOf(
CheckFilter("Продолжается"),
CheckFilter("Завершён"),
CheckFilter("Заморожен"),
)
private class AgeList(ages: List<CheckFilter>) : Filter.Group<CheckFilter>("Возрастное ограничение", ages)
private fun getAgeList() = listOf(
CheckFilter("16+"),
CheckFilter("18+"),
)
// Filters Comics
private class GenreComics(genres: List<CheckFilter>) : Filter.Group<CheckFilter>("Жанры", genres)
private class TypeComics(types: List<CheckFilter>) : Filter.Group<CheckFilter>("Тип", types)
private class PublishersComics(publishers: Array<String>) : Filter.Select<String>("Издательства", publishers)
private fun getGenresComics() = listOf(
CheckFilter("Антиутопия"),
CheckFilter("Биография"),
CheckFilter("Боевик"),
CheckFilter("Боевые Искусства"),
CheckFilter("Вампиры"),
CheckFilter("Вестерн"),
CheckFilter("Военный"),
CheckFilter("Детектив"),
CheckFilter("Детский"),
CheckFilter("Драма"),
CheckFilter("Зомби"),
CheckFilter("Исторический"),
CheckFilter("Киберпанк"),
CheckFilter("Комедия"),
CheckFilter("Космоопера"),
CheckFilter("Криминал"),
CheckFilter("Мелодрама"),
CheckFilter("Мистика"),
CheckFilter("Нуар"),
CheckFilter("Пародия"),
CheckFilter("Повседневность"),
CheckFilter("Постапокалиптика"),
CheckFilter("Приключения"),
CheckFilter("Путешествия во времени"),
CheckFilter("Романтика"),
CheckFilter("Сверхъестественное"),
CheckFilter("Слэшер"),
CheckFilter("Стимпанк"),
CheckFilter("Супергероика"),
CheckFilter("Триллер"),
CheckFilter("Ужасы"),
CheckFilter("Фантасмагория"),
CheckFilter("Фантастика"),
CheckFilter("Фэнтези"),
CheckFilter("Эротика"),
)
private fun getTypesComics() = listOf(
CheckFilter("Ван шот"),
CheckFilter("Лимитка"),
CheckFilter("Макси-серия (Онгоинг)"),
CheckFilter("Графический роман"),
CheckFilter("Спешл"),
CheckFilter("Превью"),
CheckFilter("Ежегодник"),
CheckFilter("Сборник"),
)
private fun getPublishersComics() = listOf(
Publisher("Все", "Not"),
Publisher("12 Bis", "221"),
Publisher("12-Gauge Comics", "59"),
Publisher("215 INK", "135"),
Publisher("4Twenty Limited", "236"),
Publisher("Aardvark", "122"),
Publisher("Ablaze", "137"),
Publisher("Abrams ComicArts", "220"),
Publisher("Abstract Studio", "30"),
Publisher("Action Lab", "116"),
Publisher("Aftershock Comics", "95"),
Publisher("Albin Michel", "43"),
Publisher("Alias Enterprises", "79"),
Publisher("Alterna Comics", "114"),
Publisher("Alterna Comics", "70"),
Publisher("American Mythology Productions", "101"),
Publisher("America's Best Comics", "51"),
Publisher("Ankama", "180"),
Publisher("Antarctic Press", "46"),
Publisher("Archaia Studios Press", "45"),
Publisher("Archie Comics", "39"),
Publisher("Arh Comix", "139"),
Publisher("Arrow", "156"),
Publisher("Atlas Comics", "108"),
Publisher("Atomeka Press", "84"),
Publisher("Avatar Press", "22"),
Publisher("AWA Studios", "162"),
Publisher("Benitez Productions", "158"),
Publisher("Best Jackett Press", "237"),
Publisher("Black Mask Studios", "93"),
Publisher("Blizzard Entertainment", "100"),
Publisher("Bluewater Comics", "96"),
Publisher("Bongo", "78"),
Publisher("Boom! Studios", "25"),
Publisher("Boundless Comics", "24"),
Publisher("Bubble", "94"),
Publisher("Carlsen Comics", "165"),
Publisher("Casterman", "54"),
Publisher("Catalan Communications", "58"),
Publisher("CD Projekt Red", "163"),
Publisher("Chaos! Comics", "48"),
Publisher("Cinebooks", "44"),
Publisher("Coffin Comics", "103"),
Publisher("Comico", "73"),
Publisher("Comics Experience", "160"),
Publisher("Comics USA", "35"),
Publisher("Creator Owned Comics", "195"),
Publisher("Curtis Magazines", "217"),
Publisher("Dargaud", "41"),
Publisher("Dark Horse Comics", "18"),
Publisher("Darkstorm Comics", "26"),
Publisher("Dayjob Studio", "166"),
Publisher("DC Comics", "11"),
Publisher("Dead Dog", "155"),
Publisher("Delcourt", "71"),
Publisher("Devil's Due Publishing", "33"),
Publisher("Devolver Digital", "106"),
Publisher("Digital Webbing", "143"),
Publisher("Disney Comics", "109"),
Publisher("Dreamwave Productions", "66"),
Publisher("Dupuis", "111"),
Publisher("Dynamite Entertainment", "19"),
Publisher("Eclipse Comics", "102"),
Publisher("Editorial Novaro", "228"),
Publisher("Egmont Magazines", "38"),
Publisher("Ehapa Verlag", "151"),
Publisher("Entity", "129"),
Publisher("Eternity", "157"),
Publisher("Europe Comics", "134"),
Publisher("Evil Twin Comics", "27"),
Publisher("Exploding Albatross Funnybooks", "64"),
Publisher("Fantagraphics", "117"),
Publisher("Fawcett Publications", "34"),
Publisher("First Comics", "198"),
Publisher("First Second Books", "90"),
Publisher("Fleetway", "80"),
Publisher("Fox Atomic Comics", "119"),
Publisher("Games Workshop", "133"),
Publisher("Genesis West", "172"),
Publisher("GG Studio", "77"),
Publisher("Ginger Rabbit Studio", "67"),
Publisher("Glénat", "112"),
Publisher("H. H. Windsor", "174"),
Publisher("Harris Comics", "55"),
Publisher("Heavy Metal", "89"),
Publisher("Heiro-Graphic", "123"),
Publisher("Humanoids", "21"),
Publisher("Icon Comics", "29"),
Publisher("Id Software", "69"),
Publisher("IDW Publishing", "16"),
Publisher("Illusion Studios", "181"),
Publisher("Image Comics", "15"),
Publisher("Joe Books", "83"),
Publisher("Koyama Press", "104"),
Publisher("Le Lombard", "63"),
Publisher("Legendary Comics", "144"),
Publisher("Lion Forge Comics", "85"),
Publisher("Locust Moon Press", "121"),
Publisher("Machaon", "107"),
Publisher("Magic Strip", "190"),
Publisher("Magnetic Press", "61"),
Publisher("Malibu", "56"),
Publisher("Marvel Comics", "13"),
Publisher("Max", "14"),
Publisher("Mirage", "40"),
Publisher("MonkeyBrain Comics", "42"),
Publisher("Monsterverse", "115"),
Publisher("Moonstone", "209"),
Publisher("Mount Olympus Comics", "171"),
Publisher("Nintendo", "127"),
Publisher("Northstar", "113"),
Publisher("Nowa Fantastyka", "141"),
Publisher("Omnibus Press", "188"),
Publisher("Oni Press", "28"),
Publisher("Panelsyndicate", "88"),
Publisher("Piranha Press", "206"),
Publisher("Radical Publishing", "86"),
Publisher("Rebellion", "68"),
Publisher("Red 5 Comics", "164"),
Publisher("Revolution Software Ltd", "37"),
Publisher("Revolver Comics", "72"),
Publisher("SAF Comics", "170"),
Publisher("Salleck Publications", "65"),
Publisher("Scholastic Book Services", "49"),
Publisher("Sega", "189"),
Publisher("Self Published", "47"),
Publisher("Sergio Bonelli Editore", "98"),
Publisher("Shadowline", "36"),
Publisher("Sirius Entertainment", "140"),
Publisher("Skybound", "62"),
Publisher("Slave Labor Graphics (SLG)", "75"),
Publisher("Soleil", "17"),
Publisher("Space Goat Productions", "225"),
Publisher("Splitter", "87"),
Publisher("Star Comics", "159"),
Publisher("Storm King Comics", "175"),
Publisher("Tell Tale Publications", "167"),
Publisher("Titan Comics", "60"),
Publisher("Top Cow", "23"),
Publisher("Top Shelf", "118"),
Publisher("Topps", "53"),
Publisher("Toutain Editor", "203"),
Publisher("UDON", "169"),
Publisher("Valiant", "50"),
Publisher("Vanquish Interactive", "224"),
Publisher("Vault Comics", "161"),
Publisher("Vents d'Ouest", "110"),
Publisher("Vertigo", "20"),
Publisher("Viper Comics", "154"),
Publisher("Virgin Comics", "76"),
Publisher("Vortex", "74"),
Publisher("Warp Graphics", "31"),
Publisher("WildStorm", "52"),
Publisher("Zenescope Entertainment", "32"),
Publisher("Неизвестное издательство", "57"),
)
private val publishersComics = getPublishersComics().map {
it.name
}.toTypedArray()
// Filters Manga
private class GenreManga(genres: List<CheckFilter>) : Filter.Group<CheckFilter>("Жанры", genres)
private class TypeManga(types: List<CheckFilter>) : Filter.Group<CheckFilter>("Тип", types)
private class PublishersManga(publishers: Array<String>) : Filter.Select<String>("Издательства", publishers)
private fun getGenresManga() = listOf(
CheckFilter("Арт"),
CheckFilter("Бара"),
CheckFilter("Боевик"),
CheckFilter("Боевые искусства"),
CheckFilter("Вампиры"),
CheckFilter("Война"),
CheckFilter("Гарем"),
CheckFilter("Гендерная интрига"),
CheckFilter("Героическое фэнтези"),
CheckFilter("Гуро"),
CheckFilter("Детектив"),
CheckFilter("Дзёсэй"),
CheckFilter("Додзинси"),
CheckFilter("Драма"),
CheckFilter("Ёнкома"),
CheckFilter("Зомби"),
CheckFilter("Игра"),
CheckFilter("Исекай"),
CheckFilter("История"),
CheckFilter("Киберпанк"),
CheckFilter("Кодомо"),
CheckFilter("Комедия"),
CheckFilter("Кулинария"),
CheckFilter("Магия"),
CheckFilter("Махо-сёдзё"),
CheckFilter("Меха"),
CheckFilter("Мистика"),
CheckFilter("Мужская беременность"),
CheckFilter("Научная фантастика"),
CheckFilter("Оборотни"),
CheckFilter("Образовательная"),
CheckFilter("Омегаверс"),
CheckFilter("Повседневность"),
CheckFilter("Полиция"),
CheckFilter("Постапокалиптика"),
CheckFilter("Приключения"),
CheckFilter("Психология"),
CheckFilter("Романтика"),
CheckFilter("Самурайский боевик"),
CheckFilter("Сборник"),
CheckFilter("Сверхъестественное"),
CheckFilter("Сёдзё"),
CheckFilter("Сёдзё-ай"),
CheckFilter("Сёнэн"),
CheckFilter("Сёнэн-ай"),
CheckFilter("Сказка"),
CheckFilter("Спорт"),
CheckFilter("Сэйнэн"),
CheckFilter("Трагедия"),
CheckFilter("Триллер"),
CheckFilter("Ужасы"),
CheckFilter("Фантастика"),
CheckFilter("Фэнтези"),
CheckFilter("Школа"),
CheckFilter("Экшен"),
CheckFilter("Элементы юмора"),
CheckFilter("Эротика"),
CheckFilter("Этти"),
CheckFilter("Юри"),
CheckFilter("Яой"),
)
private fun getTypesManga() = listOf(
CheckFilter("Манга"),
CheckFilter("Манхва"),
CheckFilter("Маньхуа"),
CheckFilter("OEL-Манга"),
CheckFilter("Руманга"),
CheckFilter("Индонезийский"),
CheckFilter("Комикс западный"),
)
private fun getPublishersManga() = listOf(
Publisher("Все", "Not"),
Publisher("AC.QQ", "128"),
Publisher("Akita Shoten", "136"),
Publisher("Alphapolis", "223"),
Publisher("Asahi Shimbunsha", "204"),
Publisher("ASCII Media Works", "92"),
Publisher("Beyond", "201"),
Publisher("Bilibili", "193"),
Publisher("Bomtoon", "177"),
Publisher("BookCube", "186"),
Publisher("Cherish Media", "227"),
Publisher("Comico Japan", "210"),
Publisher("Core Magazine", "194"),
Publisher("D&C Media", "211"),
Publisher("Daum", "142"),
Publisher("DCC", "230"),
Publisher("eComiX", "202"),
Publisher("Enterbrain", "150"),
Publisher("Frontier Works", "214"),
Publisher("Fujimi Shobo", "146"),
Publisher("Gentosha", "212"),
Publisher("Hakusensha", "176"),
Publisher("Hifumi Shobo", "218"),
Publisher("iQIYI", "226"),
Publisher("Kadokawa Shoten", "97"),
Publisher("Kaiousha", "185"),
Publisher("Kakao", "138"),
Publisher("Kidari Studio", "196"),
Publisher("Kill Time Communication", "148"),
Publisher("Kodansha", "126"),
Publisher("KuaiKan Manhua", "147"),
Publisher("Lezhin", "125"),
Publisher("Libre", "215"),
Publisher("Mag Garden", "208"),
Publisher("Manhuatai", "182"),
Publisher("Mkzhan", "197"),
Publisher("MrBlue", "187"),
Publisher("Naver", "145"),
Publisher("Nihon Bungeisha", "233"),
Publisher("PeanuToon", "205"),
Publisher("Pixiv", "216"),
Publisher("Printemps Shuppan", "213"),
Publisher("Ridibooks", "207"),
Publisher("Screamo", "192"),
Publisher("Seirin Kogeisha", "168"),
Publisher("Seoul Media Comics", "191"),
Publisher("Shinshokan", "235"),
Publisher("Shogakukan", "124"),
Publisher("Shonen Gahosha", "173"),
Publisher("Shueisha", "105"),
Publisher("Square Enix", "131"),
Publisher("Suiseisha", "219"),
Publisher("Takeshobo", "199"),
Publisher("Tencent", "200"),
Publisher("Tokuma Shoten", "222"),
Publisher("Tokyopop", "99"),
Publisher("Toptoon", "184"),
Publisher("U17", "130"),
Publisher("Webtoon", "183"),
Publisher("Неизвестное издательство", "149"),
)
private val publishersManga = getPublishersManga().map {
it.name
}.toTypedArray()
companion object {
private val simpleDateFormat by lazy { SimpleDateFormat("dd.MM.yyyy", Locale.US) }
}
}