diff --git a/lib-multisrc/hotcomics/build.gradle.kts b/lib-multisrc/hotcomics/build.gradle.kts new file mode 100644 index 000000000..e6f660213 --- /dev/null +++ b/lib-multisrc/hotcomics/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("lib-multisrc") +} + +baseVersionCode = 1 + +dependencies { + api(project(":lib:cookieinterceptor")) +} diff --git a/lib-multisrc/hotcomics/src/eu/kanade/tachiyomi/multisrc/hotcomics/HotComics.kt b/lib-multisrc/hotcomics/src/eu/kanade/tachiyomi/multisrc/hotcomics/HotComics.kt new file mode 100644 index 000000000..623dd71d3 --- /dev/null +++ b/lib-multisrc/hotcomics/src/eu/kanade/tachiyomi/multisrc/hotcomics/HotComics.kt @@ -0,0 +1,158 @@ +package eu.kanade.tachiyomi.multisrc.hotcomics + +import eu.kanade.tachiyomi.lib.cookieinterceptor.CookieInterceptor +import eu.kanade.tachiyomi.network.GET +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.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale + +abstract class HotComics( + final override val name: String, + final override val lang: String, + final override val baseUrl: String, +) : HttpSource() { + + override val supportsLatest = true + + override val client = network.cloudflareClient.newBuilder() + .addNetworkInterceptor( + CookieInterceptor(baseUrl.removePrefix("https://"), "hc_vfs" to "Y"), + ) + .build() + + override fun headersBuilder() = super.headersBuilder() + .set("Referer", "$baseUrl/") + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/en", headers) + override fun popularMangaParse(response: Response) = searchMangaParse(response) + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/en/new", headers) + override fun latestUpdatesParse(response: Response) = popularMangaParse(response) + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = baseUrl.toHttpUrl().newBuilder().apply { + if (query.isNotEmpty()) { + addEncodedPathSegments("en/search") + addQueryParameter("keyword", query.trim()) + } else { + val filter = filters.filterIsInstance().first() + addEncodedPathSegments(filter.selected) + addQueryParameter("page", page.toString()) + } + }.build() + + return GET(url, headers) + } + + abstract class SelectFilter( + name: String, + private val options: List>, + ) : Filter.Select( + name, + options.map { it.first }.toTypedArray(), + ) { + val selected get() = options[state].second + } + + abstract val browseList: List> + + class BrowseFilter(browseList: List>) : SelectFilter("Browse", browseList) + + override fun getFilterList() = FilterList( + Filter.Header("Doesn't work with Text search"), + Filter.Separator(), + BrowseFilter(browseList), + ) + + override fun searchMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + + val entries = document.select("li[itemtype*=ComicSeries]:not(.no-comic) > a").map { element -> + SManga.create().apply { + setUrlWithoutDomain(element.absUrl("href")) + thumbnail_url = element.selectFirst("div.visual img")?.imgAttr() + title = element.selectFirst("div.main-text > h4.title")!!.text() + } + }.distinctBy { it.url } + val hasNextPage = document.selectFirst("div.pagination a.vnext:not(.disabled)") != null + + return MangasPage(entries, hasNextPage) + } + + override fun mangaDetailsParse(response: Response) = SManga.create().apply { + val document = response.asJsoup() + + title = document.selectFirst("h2.episode-title")!!.text() + with(document.selectFirst("p.type_box")!!) { + author = selectFirst("span.writer")?.text() + ?.substringAfter("ⓒ")?.trim() + genre = selectFirst("span.type")?.text() + ?.split("/")?.joinToString { it.trim() } + status = when (selectFirst("span.date")?.text()) { + "End", "Ende" -> SManga.COMPLETED + null -> SManga.UNKNOWN + else -> SManga.ONGOING + } + } + description = buildString { + document.selectFirst("div.episode-contents header") + ?.text()?.let { + append(it) + append("\n\n") + } + document.selectFirst("div.title_content > h2:not(.episode-title)") + ?.text()?.let { append(it) } + }.trim() + } + + override fun chapterListParse(response: Response): List { + return response.asJsoup().select("#tab-chapter a").map { element -> + SChapter.create().apply { + setUrlWithoutDomain(element.absUrl("href")) + name = element.selectFirst(".cell-num")!!.text() + date_upload = parseDate(element.selectFirst(".cell-time")?.text()) + } + }.reversed() + } + + private val dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH) + + private fun parseDate(date: String?): Long { + date ?: return 0L + + return try { + dateFormat.parse(date)!!.time + } catch (_: ParseException) { + 0L + } + } + + override fun pageListParse(response: Response): List { + return response.asJsoup().select("#viewer-img img").mapIndexed { idx, img -> + Page(idx, imageUrl = img.imgAttr()) + } + } + + private fun Element.imgAttr(): String { + return when { + hasAttr("data-src") -> absUrl("data-src") + else -> absUrl("src") + } + } + + override fun imageUrlParse(response: Response): String { + throw UnsupportedOperationException() + } +} diff --git a/src/de/toomicstop/build.gradle b/src/de/toomicstop/build.gradle new file mode 100644 index 000000000..808869bec --- /dev/null +++ b/src/de/toomicstop/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'Toomics.Top' + extClass = '.ToomicsTop' + themePkg = 'hotcomics' + overrideVersionCode = 0 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/de/toomicstop/res/mipmap-hdpi/ic_launcher.png b/src/de/toomicstop/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ac158cda4 Binary files /dev/null and b/src/de/toomicstop/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/de/toomicstop/res/mipmap-mdpi/ic_launcher.png b/src/de/toomicstop/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9683a5d64 Binary files /dev/null and b/src/de/toomicstop/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/de/toomicstop/res/mipmap-xhdpi/ic_launcher.png b/src/de/toomicstop/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..d8a9bb222 Binary files /dev/null and b/src/de/toomicstop/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/de/toomicstop/res/mipmap-xxhdpi/ic_launcher.png b/src/de/toomicstop/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..fe7fac821 Binary files /dev/null and b/src/de/toomicstop/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/de/toomicstop/res/mipmap-xxxhdpi/ic_launcher.png b/src/de/toomicstop/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..cb6622346 Binary files /dev/null and b/src/de/toomicstop/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/de/toomicstop/src/eu/kanade/tachiyomi/extension/de/toomicstop/ToomicsTop.kt b/src/de/toomicstop/src/eu/kanade/tachiyomi/extension/de/toomicstop/ToomicsTop.kt new file mode 100644 index 000000000..84b95f164 --- /dev/null +++ b/src/de/toomicstop/src/eu/kanade/tachiyomi/extension/de/toomicstop/ToomicsTop.kt @@ -0,0 +1,44 @@ +package eu.kanade.tachiyomi.extension.de.toomicstop + +import eu.kanade.tachiyomi.multisrc.hotcomics.HotComics +import eu.kanade.tachiyomi.source.model.MangasPage +import okhttp3.Response + +class ToomicsTop : HotComics( + "Toomics.Top", + "de", + "https://toomics.top", +) { + override fun searchMangaParse(response: Response): MangasPage { + val mangasPage = super.searchMangaParse(response) + mangasPage.mangas.apply { + for (i in indices) { + this[i].url = this[i].url.replace(urlIdRegex, ".html") + } + } + + return mangasPage + } + + private val urlIdRegex = Regex("""(/\w+).html""") + + override val browseList = listOf( + Pair("Home", "en"), + Pair("Weekly", "en/weekly"), + Pair("New", "en/new"), + Pair("Genre: All", "en/genres"), + Pair("Genre: Romantik", "en/genres/Romantik"), + Pair("Genre: Drama", "en/genres/Drama"), + Pair("Genre: BL", "en/genres/BL"), + Pair("Genre: Action", "en/genres/Action"), + Pair("Genre: Schulleben", "en/genres/Schulleben"), + Pair("Genre: Fantasy", "en/genres/Fantasy"), + Pair("Genre: Comedy", "en/genres/Comedy"), + Pair("Genre: Historisch", "en/genres/Historisch"), + Pair("Genre: Sci-Fi", "en/genres/Sci-Fi"), + Pair("Genre: Thriller", "en/genres/Thriller"), + Pair("Genre: Horror", "en/genres/Horror"), + Pair("Genre: Sport", "en/genres/Sport"), + Pair("Genre: GL", "en/genres/GL"), + ) +} diff --git a/src/en/daycomicsme/build.gradle b/src/en/daycomicsme/build.gradle new file mode 100644 index 000000000..374e43b0d --- /dev/null +++ b/src/en/daycomicsme/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'DAYcomics.me' + extClass = '.DAYcomicsMe' + themePkg = 'hotcomics' + overrideVersionCode = 0 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/daycomicsme/res/mipmap-hdpi/ic_launcher.png b/src/en/daycomicsme/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..70a259cc0 Binary files /dev/null and b/src/en/daycomicsme/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/en/daycomicsme/res/mipmap-mdpi/ic_launcher.png b/src/en/daycomicsme/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..209f165ef Binary files /dev/null and b/src/en/daycomicsme/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/en/daycomicsme/res/mipmap-xhdpi/ic_launcher.png b/src/en/daycomicsme/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..7cef3bc08 Binary files /dev/null and b/src/en/daycomicsme/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/en/daycomicsme/res/mipmap-xxhdpi/ic_launcher.png b/src/en/daycomicsme/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..58d60537c Binary files /dev/null and b/src/en/daycomicsme/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/en/daycomicsme/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/daycomicsme/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d614670ed Binary files /dev/null and b/src/en/daycomicsme/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/en/daycomicsme/src/eu/kanade/tachiyomi/extension/en/daycomicsme/DAYcomicsMe.kt b/src/en/daycomicsme/src/eu/kanade/tachiyomi/extension/en/daycomicsme/DAYcomicsMe.kt new file mode 100644 index 000000000..e4e822a60 --- /dev/null +++ b/src/en/daycomicsme/src/eu/kanade/tachiyomi/extension/en/daycomicsme/DAYcomicsMe.kt @@ -0,0 +1,30 @@ +package eu.kanade.tachiyomi.extension.en.daycomicsme + +import eu.kanade.tachiyomi.multisrc.hotcomics.HotComics + +class DAYcomicsMe : HotComics( + "DAYcomics.me", + "en", + "https://daycomics.me", +) { + override val browseList = listOf( + Pair("Home", "en"), + Pair("Weekly", "en/weekly"), + Pair("New", "en/new"), + Pair("Genre: All", "en/genres"), + Pair("Genre: Romance", "en/genres/Romance"), + Pair("Genre: Office", "en/genres/Office"), + Pair("Genre: College", "en/genres/College"), + Pair("Genre: Drama", "en/genres/Drama"), + Pair("Genre: Isekai", "en/genres/Isekai"), + Pair("Genre: UNCENSORED", "en/genres/UNCENSORED"), + Pair("Genre: Action", "en/genres/Action"), + Pair("Genre: BL", "en/genres/BL"), + Pair("Genre: New", "en/genres/New"), + Pair("Genre: Slice of Life", "en/genres/Slice_of_Life"), + Pair("Genre: Supernatural", "en/genres/Supernatural"), + Pair("Genre: Historical", "en/genres/Historical"), + Pair("Genre: School Life", "en/genres/School_Life"), + Pair("Genre: Horror Thriller", "en/genres/Horror_Thriller"), + ) +} diff --git a/src/en/hotcomics/build.gradle b/src/en/hotcomics/build.gradle new file mode 100644 index 000000000..0409f6a2b --- /dev/null +++ b/src/en/hotcomics/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'HotComics' + extClass = '.HotComics' + themePkg = 'hotcomics' + overrideVersionCode = 0 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/hotcomics/res/mipmap-hdpi/ic_launcher.png b/src/en/hotcomics/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..644b42d52 Binary files /dev/null and b/src/en/hotcomics/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/en/hotcomics/res/mipmap-mdpi/ic_launcher.png b/src/en/hotcomics/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b21b46aba Binary files /dev/null and b/src/en/hotcomics/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/en/hotcomics/res/mipmap-xhdpi/ic_launcher.png b/src/en/hotcomics/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..39082e18b Binary files /dev/null and b/src/en/hotcomics/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/en/hotcomics/res/mipmap-xxhdpi/ic_launcher.png b/src/en/hotcomics/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..584d40c7e Binary files /dev/null and b/src/en/hotcomics/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/en/hotcomics/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/hotcomics/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4a40e4a32 Binary files /dev/null and b/src/en/hotcomics/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/en/hotcomics/src/eu/kanade/tachiyomi/extension/en/hotcomics/HotComics.kt b/src/en/hotcomics/src/eu/kanade/tachiyomi/extension/en/hotcomics/HotComics.kt new file mode 100644 index 000000000..6a9a92da2 --- /dev/null +++ b/src/en/hotcomics/src/eu/kanade/tachiyomi/extension/en/hotcomics/HotComics.kt @@ -0,0 +1,29 @@ +package eu.kanade.tachiyomi.extension.en.hotcomics + +import eu.kanade.tachiyomi.multisrc.hotcomics.HotComics + +class HotComics : HotComics( + "HotComics", + "en", + "https://hotcomics.me", +) { + override val browseList = listOf( + Pair("Home", "en"), + Pair("Weekly", "en/weekly"), + Pair("New", "en/new"), + Pair("Genre: All", "en/genres"), + Pair("Genre: Sports", "en/genres/Sports"), + Pair("Genre: Historical", "en/genres/Historical"), + Pair("Genre: Drama", "en/genres/Drama"), + Pair("Genre: BL", "en/genres/BL"), + Pair("Genre: Thriller", "en/genres/Thriller"), + Pair("Genre: School life", "en/genres/School_life"), + Pair("Genre: Comedy", "en/genres/Comedy"), + Pair("Genre: GL", "en/genres/GL"), + Pair("Genre: Action", "en/genres/Action"), + Pair("Genre: Sci-fi", "en/genres/Sci-fi"), + Pair("Genre: Horror", "en/genres/Horror"), + Pair("Genre: Fantasy", "en/genres/Fantasy"), + Pair("Genre: Romance", "en/genres/Romance"), + ) +} diff --git a/src/en/toomicsfree/build.gradle b/src/en/toomicsfree/build.gradle new file mode 100644 index 000000000..c7537d5c7 --- /dev/null +++ b/src/en/toomicsfree/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'ToomicsFree.com' + extClass = '.ToomicsFree' + themePkg = 'hotcomics' + overrideVersionCode = 0 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/toomicsfree/res/mipmap-hdpi/ic_launcher.png b/src/en/toomicsfree/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ac158cda4 Binary files /dev/null and b/src/en/toomicsfree/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/en/toomicsfree/res/mipmap-mdpi/ic_launcher.png b/src/en/toomicsfree/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9683a5d64 Binary files /dev/null and b/src/en/toomicsfree/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/en/toomicsfree/res/mipmap-xhdpi/ic_launcher.png b/src/en/toomicsfree/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..d8a9bb222 Binary files /dev/null and b/src/en/toomicsfree/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/en/toomicsfree/res/mipmap-xxhdpi/ic_launcher.png b/src/en/toomicsfree/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..fe7fac821 Binary files /dev/null and b/src/en/toomicsfree/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/en/toomicsfree/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/toomicsfree/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..cb6622346 Binary files /dev/null and b/src/en/toomicsfree/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/en/toomicsfree/src/eu/kanade/tachiyomi/extension/en/toomicsfree/ToomicsFree.kt b/src/en/toomicsfree/src/eu/kanade/tachiyomi/extension/en/toomicsfree/ToomicsFree.kt new file mode 100644 index 000000000..3cc132972 --- /dev/null +++ b/src/en/toomicsfree/src/eu/kanade/tachiyomi/extension/en/toomicsfree/ToomicsFree.kt @@ -0,0 +1,29 @@ +package eu.kanade.tachiyomi.extension.en.toomicsfree + +import eu.kanade.tachiyomi.multisrc.hotcomics.HotComics + +class ToomicsFree : HotComics( + "ToomicsFree.com", + "en", + "https://toomicsfree.com", +) { + override val browseList = listOf( + Pair("Home", "en"), + Pair("Weekly", "en/weekly"), + Pair("New", "en/new"), + Pair("Genre: All", "en/genres"), + Pair("Genre: Sports", "en/genres/Sports"), + Pair("Genre: Historical", "en/genres/Historical"), + Pair("Genre: Drama", "en/genres/Drama"), + Pair("Genre: BL", "en/genres/BL"), + Pair("Genre: Thriller", "en/genres/Thriller"), + Pair("Genre: School life", "en/genres/School_life"), + Pair("Genre: Comedy", "en/genres/Comedy"), + Pair("Genre: GL", "en/genres/GL"), + Pair("Genre: Action", "en/genres/Action"), + Pair("Genre: Sci-fi", "en/genres/Sci-fi"), + Pair("Genre: Horror", "en/genres/Horror"), + Pair("Genre: Fantasy", "en/genres/Fantasy"), + Pair("Genre: Romance", "en/genres/Romance"), + ) +} diff --git a/src/en/toomicsfreeinfo/build.gradle b/src/en/toomicsfreeinfo/build.gradle new file mode 100644 index 000000000..16c92a054 --- /dev/null +++ b/src/en/toomicsfreeinfo/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'ToomicsFree.info' + extClass = '.ToomicsFreeInfo' + themePkg = 'hotcomics' + overrideVersionCode = 0 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/toomicsfreeinfo/res/mipmap-hdpi/ic_launcher.png b/src/en/toomicsfreeinfo/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ac158cda4 Binary files /dev/null and b/src/en/toomicsfreeinfo/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/en/toomicsfreeinfo/res/mipmap-mdpi/ic_launcher.png b/src/en/toomicsfreeinfo/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9683a5d64 Binary files /dev/null and b/src/en/toomicsfreeinfo/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/en/toomicsfreeinfo/res/mipmap-xhdpi/ic_launcher.png b/src/en/toomicsfreeinfo/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..d8a9bb222 Binary files /dev/null and b/src/en/toomicsfreeinfo/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/en/toomicsfreeinfo/res/mipmap-xxhdpi/ic_launcher.png b/src/en/toomicsfreeinfo/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..fe7fac821 Binary files /dev/null and b/src/en/toomicsfreeinfo/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/en/toomicsfreeinfo/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/toomicsfreeinfo/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..cb6622346 Binary files /dev/null and b/src/en/toomicsfreeinfo/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/en/toomicsfreeinfo/src/eu/kanade/tachiyomi/extension/en/toomicsfreeinfo/ToomicsFreeInfo.kt b/src/en/toomicsfreeinfo/src/eu/kanade/tachiyomi/extension/en/toomicsfreeinfo/ToomicsFreeInfo.kt new file mode 100644 index 000000000..43e3fd9a9 --- /dev/null +++ b/src/en/toomicsfreeinfo/src/eu/kanade/tachiyomi/extension/en/toomicsfreeinfo/ToomicsFreeInfo.kt @@ -0,0 +1,29 @@ +package eu.kanade.tachiyomi.extension.en.toomicsfreeinfo + +import eu.kanade.tachiyomi.multisrc.hotcomics.HotComics + +class ToomicsFreeInfo : HotComics( + "ToomicsFree.info", + "en", + "https://toomicsfree.info", +) { + override val browseList = listOf( + Pair("Home", "en"), + Pair("Weekly", "en/weekly"), + Pair("New", "en/new"), + Pair("Genre: All", "en/genres"), + Pair("Genre: Sports", "en/genres/Sports"), + Pair("Genre: Historical", "en/genres/Historical"), + Pair("Genre: Drama", "en/genres/Drama"), + Pair("Genre: BL", "en/genres/BL"), + Pair("Genre: Thriller", "en/genres/Thriller"), + Pair("Genre: School life", "en/genres/School_life"), + Pair("Genre: Comedy", "en/genres/Comedy"), + Pair("Genre: GL", "en/genres/GL"), + Pair("Genre: Action", "en/genres/Action"), + Pair("Genre: Sci-fi", "en/genres/Sci-fi"), + Pair("Genre: Horror", "en/genres/Horror"), + Pair("Genre: Fantasy", "en/genres/Fantasy"), + Pair("Genre: Romance", "en/genres/Romance"), + ) +}