diff --git a/build.gradle b/build.gradle index 5eebf9302..9ff951742 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { - ext.kotlin_version = '1.3.72' - ext.coroutines_version = '1.3.5' + ext.kotlin_version = '1.4.10' + ext.coroutines_version = '1.3.9' repositories { google() maven { url 'https://plugins.gradle.org/m2/' } @@ -10,7 +10,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath 'org.jmailen.gradle:kotlinter-gradle:2.3.2' + classpath 'org.jmailen.gradle:kotlinter-gradle:3.0.2' } } diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index eb07604ff..2ef266b98 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -1,6 +1,6 @@ object Deps { object kotlin { - const val version = "1.3.72" + const val version = "1.4.10" const val stdlib = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$version" } diff --git a/src/all/boommanga/src/eu/kanade/tachiyomi/extension/all/boommanga/BoomManga.kt b/src/all/boommanga/src/eu/kanade/tachiyomi/extension/all/boommanga/BoomManga.kt index b099be0a4..92f1a7c64 100644 --- a/src/all/boommanga/src/eu/kanade/tachiyomi/extension/all/boommanga/BoomManga.kt +++ b/src/all/boommanga/src/eu/kanade/tachiyomi/extension/all/boommanga/BoomManga.kt @@ -7,13 +7,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale open class BoomManga( override val name: String, @@ -69,11 +69,11 @@ open class BoomManga( override fun chapterFromElement(element: Element): SChapter { val chapter = SChapter.create() - chapter.url = element.select("a").attr("href") - chapter.chapter_number = element.select("[data-num]").attr("data-num").toFloat() - val date = element.select(".date").text() - if (date.isNotBlank()) { chapter.date_upload = parseDate(date) } - chapter.name = nameselector(element).trim() + chapter.url = element.select("a").attr("href") + chapter.chapter_number = element.select("[data-num]").attr("data-num").toFloat() + val date = element.select(".date").text() + if (date.isNotBlank()) { chapter.date_upload = parseDate(date) } + chapter.name = nameselector(element).trim() return chapter } @@ -84,7 +84,7 @@ open class BoomManga( } private fun parseDate(date: String): Long { - return SimpleDateFormat("yyyy-MM-dd kk:mm:ss", Locale.US).parse(date).time + return SimpleDateFormat("yyyy-MM-dd kk:mm:ss", Locale.US).parse(date)?.time ?: 0L } override fun mangaDetailsParse(document: Document): SManga { diff --git a/src/all/comicake/src/eu/kanade/tachiyomi/extension/all/comicake/ComiCake.kt b/src/all/comicake/src/eu/kanade/tachiyomi/extension/all/comicake/ComiCake.kt index 804767e34..149badceb 100644 --- a/src/all/comicake/src/eu/kanade/tachiyomi/extension/all/comicake/ComiCake.kt +++ b/src/all/comicake/src/eu/kanade/tachiyomi/extension/all/comicake/ComiCake.kt @@ -10,14 +10,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.Request import okhttp3.Response import org.json.JSONArray import org.json.JSONObject import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale abstract class ComiCake( override val name: String, @@ -146,7 +146,7 @@ abstract class ComiCake( private fun parseChapterJson(obj: JSONObject) = SChapter.create().apply { name = obj.getString("title") // title will always have content, vs. name that's an optional field chapter_number = (obj.getInt("chapter") + (obj.getInt("subchapter") / 10.0)).toFloat() - date_upload = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZ", Locale.getDefault()).parse(obj.getString("published_at")).time + date_upload = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZ", Locale.getDefault()).parse(obj.getString("published_at"))?.time ?: 0L // TODO scanlator field by adding team to expandable in CC (low priority given the use case of CC) url = obj.getString("manifest") } diff --git a/src/all/ehentai/src/eu/kanade/tachiyomi/extension/all/ehentai/EHentai.kt b/src/all/ehentai/src/eu/kanade/tachiyomi/extension/all/ehentai/EHentai.kt index b2d06e326..4ad56d9de 100644 --- a/src/all/ehentai/src/eu/kanade/tachiyomi/extension/all/ehentai/EHentai.kt +++ b/src/all/ehentai/src/eu/kanade/tachiyomi/extension/all/ehentai/EHentai.kt @@ -4,8 +4,6 @@ import android.annotation.SuppressLint import android.app.Application import android.content.SharedPreferences import android.net.Uri -import android.support.v7.preference.CheckBoxPreference as LegacyCheckBoxPreference -import android.support.v7.preference.PreferenceScreen as LegacyPreferenceScreen import androidx.preference.CheckBoxPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.network.GET @@ -24,7 +22,6 @@ 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 java.net.URLEncoder import okhttp3.CacheControl import okhttp3.CookieJar import okhttp3.Headers @@ -34,6 +31,9 @@ import org.jsoup.nodes.Element import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.net.URLEncoder +import android.support.v7.preference.CheckBoxPreference as LegacyCheckBoxPreference +import android.support.v7.preference.PreferenceScreen as LegacyPreferenceScreen open class EHentai(override val lang: String, private val ehLang: String) : ConfigurableSource, HttpSource() { @@ -85,11 +85,15 @@ open class EHentai(override val lang: String, private val ehLang: String) : Conf return MangasPage(parsedMangas, hasNextPage) } - override fun fetchChapterList(manga: SManga): Observable> = Observable.just(listOf(SChapter.create().apply { - url = manga.url - name = "Chapter" - chapter_number = 1f - })) + override fun fetchChapterList(manga: SManga): Observable> = Observable.just( + listOf( + SChapter.create().apply { + url = manga.url + name = "Chapter" + chapter_number = 1f + } + ) + ) override fun fetchPageList(chapter: SChapter) = fetchChapterPage(chapter, "$baseUrl/${chapter.url}").map { it.mapIndexed { i, s -> @@ -218,8 +222,10 @@ open class EHentai(override val lang: String, private val ehLang: String) : Conf ?.trim() ?.let { right -> ignore { - when (left.removeSuffix(":") - .toLowerCase()) { + when ( + left.removeSuffix(":") + .toLowerCase() + ) { "posted" -> datePosted = EX_DATE_FORMAT.parse(right)?.time ?: 0 "visible" -> visible = right.nullIfBlank() "language" -> { @@ -255,8 +261,10 @@ open class EHentai(override val lang: String, private val ehLang: String) : Conf select("#taglist tr").forEach { val namespace = it.select(".tc").text().removeSuffix(":") val currentTags = it.select("div").map { element -> - Tag(element.text().trim(), - element.hasClass("gtl")) + Tag( + element.text().trim(), + element.hasClass("gtl") + ) } tags[namespace] = currentTags } @@ -367,18 +375,21 @@ open class EHentai(override val lang: String, private val ehLang: String) : Conf } } - class GenreGroup : UriGroup("Genres", listOf( - GenreOption("Dōjinshi", "doujinshi"), - GenreOption("Manga", "manga"), - GenreOption("Artist CG", "artistcg"), - GenreOption("Game CG", "gamecg"), - GenreOption("Western", "western"), - GenreOption("Non-H", "non-h"), - GenreOption("Image Set", "imageset"), - GenreOption("Cosplay", "cosplay"), - GenreOption("Asian Porn", "asianporn"), - GenreOption("Misc", "misc") - )) + class GenreGroup : UriGroup( + "Genres", + listOf( + GenreOption("Dōjinshi", "doujinshi"), + GenreOption("Manga", "manga"), + GenreOption("Artist CG", "artistcg"), + GenreOption("Game CG", "gamecg"), + GenreOption("Western", "western"), + GenreOption("Non-H", "non-h"), + GenreOption("Image Set", "imageset"), + GenreOption("Cosplay", "cosplay"), + GenreOption("Asian Porn", "asianporn"), + GenreOption("Misc", "misc") + ) + ) class AdvancedOption(name: String, private val param: String, defValue: Boolean = false) : CheckBox(name, defValue), UriFilter { override fun addToUri(builder: Uri.Builder) { @@ -423,19 +434,22 @@ open class EHentai(override val lang: String, private val ehLang: String) : Conf } // Explicit type arg for listOf() to workaround this: KT-16570 - class AdvancedGroup : UriGroup>("Advanced Options", listOf( - AdvancedOption("Search Gallery Name", "f_sname", true), - AdvancedOption("Search Gallery Tags", "f_stags", true), - AdvancedOption("Search Gallery Description", "f_sdesc"), - AdvancedOption("Search Torrent Filenames", "f_storr"), - AdvancedOption("Only Show Galleries With Torrents", "f_sto"), - AdvancedOption("Search Low-Power Tags", "f_sdt1"), - AdvancedOption("Search Downvoted Tags", "f_sdt2"), - AdvancedOption("Show Expunged Galleries", "f_sh"), - RatingOption(), - MinPagesOption(), - MaxPagesOption() - )) + class AdvancedGroup : UriGroup>( + "Advanced Options", + listOf( + AdvancedOption("Search Gallery Name", "f_sname", true), + AdvancedOption("Search Gallery Tags", "f_stags", true), + AdvancedOption("Search Gallery Description", "f_sdesc"), + AdvancedOption("Search Torrent Filenames", "f_storr"), + AdvancedOption("Only Show Galleries With Torrents", "f_sto"), + AdvancedOption("Search Low-Power Tags", "f_sdt1"), + AdvancedOption("Search Downvoted Tags", "f_sdt2"), + AdvancedOption("Show Expunged Galleries", "f_sh"), + RatingOption(), + MinPagesOption(), + MaxPagesOption() + ) + ) private class EnforceLanguageFilter(default: Boolean) : CheckBox("Enforce language", default) diff --git a/src/all/ehentai/src/eu/kanade/tachiyomi/extension/all/ehentai/MetadataCopier.kt b/src/all/ehentai/src/eu/kanade/tachiyomi/extension/all/ehentai/MetadataCopier.kt index 301bacb95..fef785b69 100644 --- a/src/all/ehentai/src/eu/kanade/tachiyomi/extension/all/ehentai/MetadataCopier.kt +++ b/src/all/ehentai/src/eu/kanade/tachiyomi/extension/all/ehentai/MetadataCopier.kt @@ -38,8 +38,9 @@ fun ExGalleryMetadata.copyTo(manga: SManga) { manga.status = SManga.COMPLETED title?.let { t -> if (ONGOING_SUFFIX.any { - t.endsWith(it, ignoreCase = true) - }) manga.status = SManga.ONGOING + t.endsWith(it, ignoreCase = true) + } + ) manga.status = SManga.ONGOING } // Build a nice looking description out of what we know diff --git a/src/all/elimangas/src/eu/kanade/tachiyomi/extension/all/elimangas/EliMangasProvider.kt b/src/all/elimangas/src/eu/kanade/tachiyomi/extension/all/elimangas/EliMangasProvider.kt index 5e70944e7..10c576413 100644 --- a/src/all/elimangas/src/eu/kanade/tachiyomi/extension/all/elimangas/EliMangasProvider.kt +++ b/src/all/elimangas/src/eu/kanade/tachiyomi/extension/all/elimangas/EliMangasProvider.kt @@ -37,14 +37,17 @@ open class EliMangasProvider( override fun popularMangaParse(response: Response): MangasPage { val json = gson.fromJson(response.body()!!.string()).asJsonArray - return MangasPage(json.map { - SManga.create().apply { - val id = it["id"].asString - url = id - title = it["name"].asString - thumbnail_url = "https://www.elimangas.com/images/$id.jpg" - } - }, json.size() >= 30) + return MangasPage( + json.map { + SManga.create().apply { + val id = it["id"].asString + url = id + title = it["name"].asString + thumbnail_url = "https://www.elimangas.com/images/$id.jpg" + } + }, + json.size() >= 30 + ) } // Latest diff --git a/src/all/emerald/src/eu/kanade/tachiyomi/extension/all/emerald/Emerald.kt b/src/all/emerald/src/eu/kanade/tachiyomi/extension/all/emerald/Emerald.kt index 058ab592c..4813713e0 100644 --- a/src/all/emerald/src/eu/kanade/tachiyomi/extension/all/emerald/Emerald.kt +++ b/src/all/emerald/src/eu/kanade/tachiyomi/extension/all/emerald/Emerald.kt @@ -7,14 +7,14 @@ 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 java.util.Calendar -import java.util.concurrent.TimeUnit import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar +import java.util.concurrent.TimeUnit open class Emerald( override val name: String, @@ -76,8 +76,11 @@ open class Emerald( } } if (styleToInclude.isNotEmpty()) { - url.addQueryParameter("styles", styleToInclude - .joinToString(",")) + url.addQueryParameter( + "styles", + styleToInclude + .joinToString(",") + ) } } is DemographicFilter -> { @@ -88,8 +91,11 @@ open class Emerald( } } if (demographicToInclude.isNotEmpty()) { - url.addQueryParameter("demogs", demographicToInclude - .joinToString(",")) + url.addQueryParameter( + "demogs", + demographicToInclude + .joinToString(",") + ) } } is StatusFilter -> { @@ -110,8 +116,11 @@ open class Emerald( } } if (genreToInclude.isNotEmpty()) { - url.addQueryParameter("genres", genreToInclude - .joinToString(",")) + url.addQueryParameter( + "genres", + genreToInclude + .joinToString(",") + ) } } is StarFilter -> { @@ -154,8 +163,10 @@ open class Emerald( val manga = SManga.create() val genres = mutableListOf() val status = infoElement.select("div.attr-item:contains(status) span").text() - infoElement.select("div.attr-item:contains(genres) span").text().split(" / " - .toRegex()).forEach { element -> + infoElement.select("div.attr-item:contains(genres) span").text().split( + " / " + .toRegex() + ).forEach { element -> genres.add(element) } manga.title = infoElement.select("h3").text() @@ -259,10 +270,12 @@ open class Emerald( val imgJson = JSONObject(script) val imgNames = imgJson.names() - for (i in 0 until imgNames.length()) { - val imgKey = imgNames.getString(i) - val imgUrl = imgJson.getString(imgKey) - pages.add(Page(i, "", imgUrl)) + if (imgNames != null) { + for (i in 0 until imgNames.length()) { + val imgKey = imgNames.getString(i) + val imgUrl = imgJson.getString(imgKey) + pages.add(Page(i, "", imgUrl)) + } } return pages @@ -276,40 +289,49 @@ open class Emerald( private class GenreFilter(genres: List) : Filter.Group("Genres", genres) private class StatusFilter : Filter.TriState("Completed") - private class StarFilter : UriPartFilter("Stars", arrayOf( - Pair("", ""), + Pair("5 Stars", "5"), + Pair("4 Stars", "4"), + Pair("3 Stars", "3"), + Pair("2 Stars", "2"), + Pair("1 Stars", "1") + ) + ) - private class ChapterFilter : UriPartFilter("Chapters", arrayOf( - Pair("", ""), + Pair("1 ~ 9", "1-9"), + Pair("10 ~ 29", "10-29"), + Pair("30 ~ 99", "30-99"), + Pair("100 ~ 199", "100-199"), + Pair("200+", "200"), + Pair("100+", "100"), + Pair("50+", "50"), + Pair("10+", "10"), + Pair("1+", "1") + ) + ) - private class SortBy : UriPartFilter("Sorts By", arrayOf( - Pair("", ""), + Pair("Totally", "views_t"), + Pair("365 days", "views_y"), + Pair("30 days", "views_m"), + Pair("7 days", "views_w"), + Pair("24 hours", "views_d"), + Pair("60 minutes", "views_h"), + Pair("A-Z", "title"), + Pair("Update time", "update"), + Pair("Add time", "create") + ) + ) override fun getFilterList() = FilterList( Filter.Header("NOTE: Ignored if using text search!"), diff --git a/src/all/fmreader/src/eu/kanade/tachiyomi/extension/all/fmreader/FMReader.kt b/src/all/fmreader/src/eu/kanade/tachiyomi/extension/all/fmreader/FMReader.kt index c5c93b95d..25f9d87a0 100644 --- a/src/all/fmreader/src/eu/kanade/tachiyomi/extension/all/fmreader/FMReader.kt +++ b/src/all/fmreader/src/eu/kanade/tachiyomi/extension/all/fmreader/FMReader.kt @@ -10,8 +10,6 @@ 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 java.nio.charset.Charset -import java.util.Calendar import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -20,6 +18,8 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.select.Elements +import java.nio.charset.Charset +import java.util.Calendar /** * For sites based on the Flat-Manga CMS @@ -81,11 +81,14 @@ abstract class FMReader( url.addQueryParameter("ungenre", ungenre) } is SortBy -> { - url.addQueryParameter("sort", when (filter.state?.index) { - 0 -> "name" - 1 -> "views" - else -> "last_update" - }) + url.addQueryParameter( + "sort", + when (filter.state?.index) { + 0 -> "name" + 1 -> "views" + else -> "last_update" + } + ) if (filter.state?.ascending == true) url.addQueryParameter("sort_type", "ASC") } diff --git a/src/all/fmreader/src/eu/kanade/tachiyomi/extension/all/fmreader/FMReaderFactory.kt b/src/all/fmreader/src/eu/kanade/tachiyomi/extension/all/fmreader/FMReaderFactory.kt index d39264ed8..586d14dbb 100644 --- a/src/all/fmreader/src/eu/kanade/tachiyomi/extension/all/fmreader/FMReaderFactory.kt +++ b/src/all/fmreader/src/eu/kanade/tachiyomi/extension/all/fmreader/FMReaderFactory.kt @@ -11,7 +11,6 @@ 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.util.asJsoup -import java.net.URLEncoder import okhttp3.FormBody import okhttp3.Interceptor import okhttp3.OkHttpClient @@ -20,6 +19,7 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.net.URLEncoder class FMReaderFactory : SourceFactory { override fun createSources(): List = listOf( @@ -242,9 +242,11 @@ class SayTruyen : FMReader("Say Truyen", "https://saytruyen.com", "vi") { } override fun chapterListParse(response: Response): List { return response.asJsoup().let { document -> - document.select(chapterListSelector()).map { chapterFromElement(it).apply { - scanlator = document.select("div.row li:has(b:contains(Nhóm dịch)) small").text() - } } + document.select(chapterListSelector()).map { + chapterFromElement(it).apply { + scanlator = document.select("div.row li:has(b:contains(Nhóm dịch)) small").text() + } + } } } override fun pageListParse(document: Document): List = super.pageListParse(document).onEach { it.imageUrl!!.trim() } diff --git a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlide.kt b/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlide.kt index 602ab99bd..545cad0e9 100644 --- a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlide.kt +++ b/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlide.kt @@ -10,17 +10,17 @@ 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 okhttp3.FormBody +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element import java.text.ParseException import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date import java.util.HashSet import java.util.Locale -import okhttp3.FormBody -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element abstract class FoolSlide( override val name: String, @@ -116,9 +116,9 @@ abstract class FoolSlide( // if there's no image on the details page, get the first page of the first chapter fun getDetailsThumbnail(document: Document, urlSelector: String = chapterUrlSelector): String? { return document.select("div.thumbnail img, table.thumb img").firstOrNull()?.attr("abs:src") - ?: document.select(chapterListSelector()).last().select(urlSelector).attr("abs:href") - .let { url -> client.newCall(allowAdult(GET(url, headers))).execute() } - .let { response -> pageListParse(response).first().imageUrl } + ?: document.select(chapterListSelector()).last().select(urlSelector).attr("abs:href") + .let { url -> client.newCall(allowAdult(GET(url, headers))).execute() } + .let { response -> pageListParse(response).first().imageUrl } } override fun mangaDetailsParse(document: Document): SManga { @@ -138,9 +138,12 @@ abstract class FoolSlide( private fun allowAdult(request: Request) = allowAdult(request.url().toString()) private fun allowAdult(url: String): Request { - return POST(url, body = FormBody.Builder() - .add("adult", "true") - .build()) + return POST( + url, + body = FormBody.Builder() + .add("adult", "true") + .build() + ) } override fun chapterListRequest(manga: SManga) = allowAdult(super.chapterListRequest(manga)) @@ -216,7 +219,7 @@ abstract class FoolSlide( if (result != null) { // Result parsed but no year, copy current year over result = Calendar.getInstance().apply { - time = result + time = result!! set(Calendar.YEAR, Calendar.getInstance().get(Calendar.YEAR)) }.time } diff --git a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/HentaiCafe.kt b/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/HentaiCafe.kt index 36d164386..126d185dc 100644 --- a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/HentaiCafe.kt +++ b/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/HentaiCafe.kt @@ -9,12 +9,12 @@ import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.asJsoup -import java.net.URLEncoder import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.net.URLEncoder @Nsfw class HentaiCafe : FoolSlide("Hentai Cafe", "https://hentai.cafe", "en", "/manga") { @@ -124,7 +124,8 @@ class HentaiCafe : FoolSlide("Hentai Cafe", "https://hentai.cafe", "en", "/manga response.close() // Better error message for invalid artist if (response.code() == 404 && - !filters.findInstance()?.state.isNullOrBlank()) + !filters.findInstance()?.state.isNullOrBlank() + ) error("Invalid artist!") else throw Exception("HTTP error ${response.code()}") } @@ -145,192 +146,195 @@ class HentaiCafe : FoolSlide("Hentai Cafe", "https://hentai.cafe", "en", "/manga class ArtistFilter : Filter.Text("Artist (must be exact match)") class BookFilter : Filter.CheckBox("Show books only", false) - class TagFilter : Filter.Select("Tag", arrayOf( - Tag("", ""), + Tag("ahegao", "Ahegao"), + Tag("anal", "Anal"), + Tag("apron", "Apron"), + Tag("ashioki", "Ashioki"), + Tag("bakunyuu", "Bakunyuu"), + Tag("bathroom-sex", "Bathroom sex"), + Tag("beauty-mark", "Beauty mark"), + Tag("big-ass", "Big ass"), + Tag("big-breast", "Big breast"), + Tag("big-dick", "Big dick"), + Tag("biting", "Biting"), + Tag("black-mail", "Blackmail"), + Tag("blindfold", "Blindfold"), + Tag("blowjob", "Blowjob"), + Tag("body-swap", "Body swap"), + Tag("bondage", "Bondage"), + Tag("booty", "Booty"), + Tag("bride", "Bride"), + Tag("bukkake", "Bukkake"), + Tag("bunny-girl", "Bunny girl"), + Tag("busty", "Busty"), + Tag("cat", "Cat"), + Tag("cat-girl", "Cat girl"), + Tag("catgirl", "Catgirl"), + Tag("cheating", "Cheating"), + Tag("cheerleader", "Cheerleader"), + Tag("chikan", "Chikan"), + Tag("christmas", "Christmas"), + Tag("chubby", "Chubby"), + Tag("color", "Color"), + Tag("comedy", "Comedy"), + Tag("condom", "Condom"), + Tag("cosplay", "Cosplay"), + Tag("creampie", "Creampie"), + Tag("crossdressing", "Crossdressing"), + Tag("crotch-tattoo", "Crotch tattoo"), + Tag("cunnilingus", "Cunnilingus"), + Tag("dark-skin", "Dark skin"), + Tag("deepthroat", "Deepthroat"), + Tag("defloration", "Defloration"), + Tag("devil", "Devil"), + Tag("double-penetration", "Double penetration"), + Tag("doujin", "Doujin"), + Tag("doujinshi", "Doujinshi"), + Tag("drama", "Drama"), + Tag("drug", "Drug"), + Tag("drunk", "Drunk"), + Tag("elf", "Elf"), + Tag("exhibitionism", "Exhibitionism"), + Tag("eyebrows", "Eyebrows"), + Tag("eyepatch", "Eyepatch"), + Tag("facesitting", "Facesitting"), + Tag("fangs", "Fangs"), + Tag("fantasy", "Fantasy"), + Tag("fellatio", "Fellatio"), + Tag("femboy", "Femboy"), + Tag("femdom", "Femdom"), + Tag("filming", "Filming"), + Tag("flat-chest", "Flat chest"), + Tag("footjob", "Footjob"), + Tag("freckles", "Freckles"), + Tag("full-color", "Full color"), + Tag("furry", "Furry"), + Tag("futanari", "Futanari"), + Tag("gangbang", "Gangbang"), + Tag("gender-bender", "Gender bender"), + Tag("genderbend", "Genderbend"), + Tag("girls4m", "Girls4m"), + Tag("glasses", "Glasses"), + Tag("group", "Group"), + Tag("gyaru", "Gyaru"), + Tag("hairy", "Hairy"), + Tag("hairy-armpit", "Hairy armpit"), + Tag("handjob", "Handjob"), + Tag("harem", "Harem"), + Tag("headphones", "Headphones"), + Tag("heart-pupils", "Heart pupils"), + Tag("hentai", "Hentai"), + Tag("historical", "Historical"), + Tag("horns", "Horns"), + Tag("horror", "Horror"), + Tag("housewife", "Housewife"), + Tag("huge-boobs", "Huge-boobs"), + Tag("humiliation", "Humiliation"), + Tag("idol", "Idol"), + Tag("imouto", "Imouto"), + Tag("impregnation", "Impregnation"), + Tag("incest", "Incest"), + Tag("inseki", "Inseki"), + Tag("inverted-nipples", "Inverted nipples"), + Tag("irrumatio", "Irrumatio"), + Tag("isekai", "Isekai"), + Tag("kemono-mimi", "Kemono mimi"), + Tag("kimono", "Kimono"), + Tag("kogal", "Kogal"), + Tag("lactation", "Lactation"), + Tag("large-breast", "Large breast"), + Tag("lingerie", "Lingerie"), + Tag("loli", "Loli"), + Tag("love-hotel", "Love hotel"), + Tag("magical-girl", "Magical girl"), + Tag("maid", "Maid"), + Tag("masturbation", "Masturbation"), + Tag("miko", "Miko"), + Tag("milf", "Milf"), + Tag("mind-break", "Mind break"), + Tag("mind-control", "Mind control"), + Tag("monster-girl", "Monster girl"), + Tag("muscles", "Muscles"), + Tag("nakadashi", "Nakadashi"), + Tag("naked-apron", "Naked apron"), + Tag("netorare", "Netorare"), + Tag("netorase", "Netorase"), + Tag("netori", "Netori"), + Tag("ninja", "Ninja"), + Tag("nun", "Nun"), + Tag("nurse", "Nurse"), + Tag("office-lady", "Office lady"), + Tag("ojousama", "Ojousama"), + Tag("old-man", "Old man"), + Tag("onani", "Onani"), + Tag("oni", "Oni"), + Tag("orgasm-denial", "Orgasm denial"), + Tag("osananajimi", "Osananajimi"), + Tag("pailoli", "Pailoli"), + Tag("paizuri", "Paizuri"), + Tag("pegging", "Pegging"), + Tag("petite", "Petite"), + Tag("pettanko", "Pettanko"), + Tag("ponytail", "Ponytail"), + Tag("pregnant", "Pregnant"), + Tag("prositution", "Prositution"), + Tag("pubic-hair", "Pubic Hair"), + Tag("qipao", "Qipao"), + Tag("rape", "Rape"), + Tag("reverse-rape", "Reverse rape"), + Tag("rimjob", "Rimjob"), + Tag("schoolgirl", "Schoolgirl"), + Tag("schoolgirl-outfit", "Schoolgirl outfit"), + Tag("sci-fi", "Sci-fi"), + Tag("senpai", "Senpai"), + Tag("sex", "Sex"), + Tag("sex-toys", "Sex toys"), + Tag("shimapan", "Shimapan"), + Tag("shota", "Shota"), + Tag("shouta", "Shouta"), + Tag("sister", "Sister"), + Tag("sleeping", "Sleeping"), + Tag("small-breast", "Small breast"), + Tag("socks", "Socks"), + Tag("spats", "Spats"), + Tag("spread", "Spread"), + Tag("squirting", "Squirting"), + Tag("stocking", "Stocking"), + Tag("stockings", "Stockings"), + Tag("succubus", "Succubus"), + Tag("swimsuit", "Swimsuit"), + Tag("swinging", "Swinging"), + Tag("tall-girl", "Tall-girl"), + Tag("tanlines", "Tanlines"), + Tag("teacher", "Teacher"), + Tag("tentacles", "Tentacles"), + Tag("threesome", "Threesome"), + Tag("time-stop", "Time stop"), + Tag("tomboy", "Tomboy"), + Tag("toys", "Toys"), + Tag("trans", "Trans"), + Tag("tsundere", "Tsundere"), + Tag("twin", "Twin"), + Tag("twintails", "Twintails"), + Tag("ugly-bastard", "Ugly bastard"), + Tag("uncensored", "Uncensored"), + Tag("unlimited", "Unlimited"), + Tag("urination", "Urination"), + Tag("vanilla", "Vanilla"), + Tag("virgin", "Virgin"), + Tag("vomit", "Vomit"), + Tag("voyeurism", "Voyeurism"), + Tag("waitress", "Waitress"), + Tag("x-ray", "X-Ray"), + Tag("yandere", "Yandere"), + Tag("yukata", "Yukata"), + Tag("yuri", "Yuri") + ) + ) class Tag(val name: String, private val displayName: String) { override fun toString() = displayName diff --git a/src/all/genkan/src/eu/kanade/tachiyomi/extension/all/genkan/Genkan.kt b/src/all/genkan/src/eu/kanade/tachiyomi/extension/all/genkan/Genkan.kt index 83045f326..819f294fd 100644 --- a/src/all/genkan/src/eu/kanade/tachiyomi/extension/all/genkan/Genkan.kt +++ b/src/all/genkan/src/eu/kanade/tachiyomi/extension/all/genkan/Genkan.kt @@ -8,15 +8,15 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.select.Elements +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale abstract class Genkan( override val name: String, diff --git a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt index 64fe75f32..7d79e0a0f 100644 --- a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt +++ b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/Hitomi.kt @@ -4,8 +4,6 @@ import android.app.Application import android.content.SharedPreferences import android.support.v7.preference.CheckBoxPreference import android.support.v7.preference.PreferenceScreen -import androidx.preference.CheckBoxPreference as AndroidXCheckBoxPreference -import androidx.preference.PreferenceScreen as AndroidXPreferenceScreen import com.github.salomonbrys.kotson.array import com.github.salomonbrys.kotson.get import com.github.salomonbrys.kotson.string @@ -28,6 +26,8 @@ import rx.Single import rx.schedulers.Schedulers import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import androidx.preference.CheckBoxPreference as AndroidXCheckBoxPreference +import androidx.preference.PreferenceScreen as AndroidXPreferenceScreen /** * Ported from TachiyomiSy @@ -190,13 +190,13 @@ open class Hitomi(override val lang: String, private val nozomiLang: String) : H } } - return base.flatMap { (_, ids) -> - val chunks = ids.chunked(PAGE_SIZE) + return base.flatMap { (_, ids) -> + val chunks = ids.chunked(PAGE_SIZE) - nozomiIdsToMangas(chunks[page - 1]).map { mangas -> - MangasPage(mangas, page < chunks.size) - } - }.toObservable() + nozomiIdsToMangas(chunks[page - 1]).map { mangas -> + MangasPage(mangas, page < chunks.size) + } + }.toObservable() } override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = throw UnsupportedOperationException("Not used") diff --git a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiNozomi.kt b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiNozomi.kt index b66923a03..43a397e40 100644 --- a/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiNozomi.kt +++ b/src/all/hitomi/src/eu/kanade/tachiyomi/extension/all/hitomi/HitomiNozomi.kt @@ -4,12 +4,12 @@ import eu.kanade.tachiyomi.extension.all.hitomi.Hitomi.Companion.LTN_BASE_URL import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.asObservable import eu.kanade.tachiyomi.network.asObservableSuccess -import java.security.MessageDigest import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import rx.Observable import rx.Single +import java.security.MessageDigest private typealias HashedTerm = ByteArray diff --git a/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/Komga.kt b/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/Komga.kt index 38f5082c5..b9635b428 100644 --- a/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/Komga.kt +++ b/src/all/komga/src/eu/kanade/tachiyomi/extension/all/komga/Komga.kt @@ -24,9 +24,6 @@ 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 java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale import okhttp3.Credentials import okhttp3.Headers import okhttp3.HttpUrl @@ -38,6 +35,9 @@ import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { override fun popularMangaRequest(page: Int): Request = @@ -215,8 +215,10 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { else -> SManga.UNKNOWN } // TODO: remove safe calls in next iteration - genre = (metadata.genres?.plus(metadata.tags ?: emptySet()) - ?: emptySet()).joinToString(", ") + genre = ( + metadata.genres?.plus(metadata.tags ?: emptySet()) + ?: emptySet() + ).joinToString(", ") description = metadata.summary } @@ -225,10 +227,10 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { Date().time else { try { - SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US).parse(date).time + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US).parse(date)?.time ?: 0L } catch (ex: Exception) { try { - SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S", Locale.US).parse(date).time + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S", Locale.US).parse(date)?.time ?: 0L } catch (ex: Exception) { Date().time } @@ -370,65 +372,80 @@ open class Komga(suffix: String = "") : ConfigurableSource, HttpSource() { } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ response -> - libraries = try { - gson.fromJson(response.body()?.charStream()!!) - } catch (e: Exception) { - emptyList() - } - }, {}) + .subscribe( + { response -> + libraries = try { + gson.fromJson(response.body()?.charStream()!!) + } catch (e: Exception) { + emptyList() + } + }, + {} + ) Single.fromCallable { client.newCall(GET("$baseUrl/api/v1/collections?unpaged=true", headers)).execute() } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ response -> - collections = try { - gson.fromJson>(response.body()?.charStream()!!).content - } catch (e: Exception) { - emptyList() - } - }, {}) + .subscribe( + { response -> + collections = try { + gson.fromJson>(response.body()?.charStream()!!).content + } catch (e: Exception) { + emptyList() + } + }, + {} + ) Single.fromCallable { client.newCall(GET("$baseUrl/api/v1/genres", headers)).execute() } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ response -> - genres = try { - gson.fromJson(response.body()?.charStream()!!) - } catch (e: Exception) { - emptySet() - } - }, {}) + .subscribe( + { response -> + genres = try { + gson.fromJson(response.body()?.charStream()!!) + } catch (e: Exception) { + emptySet() + } + }, + {} + ) Single.fromCallable { client.newCall(GET("$baseUrl/api/v1/tags", headers)).execute() } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ response -> - tags = try { - gson.fromJson(response.body()?.charStream()!!) - } catch (e: Exception) { - emptySet() - } - }, {}) + .subscribe( + { response -> + tags = try { + gson.fromJson(response.body()?.charStream()!!) + } catch (e: Exception) { + emptySet() + } + }, + {} + ) Single.fromCallable { client.newCall(GET("$baseUrl/api/v1/publishers", headers)).execute() } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ response -> - publishers = try { - gson.fromJson(response.body()?.charStream()!!) - } catch (e: Exception) { - emptySet() - } - }, {}) + .subscribe( + { response -> + publishers = try { + gson.fromJson(response.body()?.charStream()!!) + } catch (e: Exception) { + emptySet() + } + }, + {} + ) } companion object { diff --git a/src/all/lanraragi/src/eu/kanade/tachiyomi/extension/all/lanraragi/LANraragi.kt b/src/all/lanraragi/src/eu/kanade/tachiyomi/extension/all/lanraragi/LANraragi.kt index f908f97d8..cf7ca36ea 100644 --- a/src/all/lanraragi/src/eu/kanade/tachiyomi/extension/all/lanraragi/LANraragi.kt +++ b/src/all/lanraragi/src/eu/kanade/tachiyomi/extension/all/lanraragi/LANraragi.kt @@ -59,7 +59,8 @@ open class LANraragi : ConfigurableSource, HttpSource() { url = "${uriBuild.encodedPath}?${uriBuild.encodedQuery}" chapter_number = 1F name = "Chapter" - }) + } + ) } override fun pageListParse(response: Response): List { @@ -118,7 +119,9 @@ open class LANraragi : ConfigurableSource, HttpSource() { artist = getArtist(it.tags) author = artist } - }, currentStart + jsonResult.data.size < jsonResult.recordsFiltered) + }, + currentStart + jsonResult.data.size < jsonResult.recordsFiltered + ) } // Preferences diff --git a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt index cdd74f61c..325389c94 100644 --- a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt +++ b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/Madara.kt @@ -11,13 +11,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale -import java.util.concurrent.TimeUnit -import kotlin.math.absoluteValue -import kotlin.random.Random import okhttp3.CacheControl import okhttp3.FormBody import okhttp3.Headers @@ -29,6 +22,13 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import java.util.concurrent.TimeUnit +import kotlin.math.absoluteValue +import kotlin.random.Random abstract class Madara( override val name: String, @@ -189,19 +189,25 @@ abstract class Madara( private class ArtistFilter : Filter.Text("Artist") private class YearFilter : Filter.Text("Year of Released") private class StatusFilter(status: List) : Filter.Group("Status", status) - private class OrderByFilter : UriPartFilter("Order By", arrayOf( - Pair("", ""), + Pair("Latest", "latest"), + Pair("A-Z", "alphabet"), + Pair("Rating", "rating"), + Pair("Trending", "trending"), + Pair("Most Views", "views"), + Pair("New", "new-manga") + ) + ) + private class GenreConditionFilter : UriPartFilter( + "Genre condition", + arrayOf( + Pair("or", ""), + Pair("and", "1") + ) + ) private class GenreList(genres: List) : Filter.Group("Genres", genres) class Genre(name: String, val id: String = name) : Filter.CheckBox(name) @@ -385,7 +391,7 @@ abstract class Madara( .let { elements -> if (elements.isEmpty() && !document.select(dataIdSelector).isNullOrEmpty()) getXhrChapters(document.select(dataIdSelector).attr("data-id")).select(chapterListSelector()) - else elements + else elements } .map { chapterFromElement(it) } } @@ -491,9 +497,13 @@ abstract class Madara( override fun pageListParse(document: Document): List { return document.select(pageListParseSelector).mapIndexed { index, element -> - Page(index, document.location(), element.select("img").first()?.let { - it.absUrl(if (it.hasAttr("data-src")) "data-src" else "src") - }) + Page( + index, + document.location(), + element.select("img").first()?.let { + it.absUrl(if (it.hasAttr("data-src")) "data-src" else "src") + } + ) } } diff --git a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt index 74be5fd6f..b1098f79e 100644 --- a/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt +++ b/src/all/madara/src/eu/kanade/tachiyomi/extension/all/madara/MadaraFactory.kt @@ -12,8 +12,6 @@ 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.util.asJsoup -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.CacheControl import okhttp3.FormBody import okhttp3.Headers @@ -23,6 +21,8 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MadaraFactory : SourceFactory { override fun createSources(): List = listOf( @@ -197,13 +197,21 @@ class MangaRawr : Madara("MangaRawr", "https://mangarawr.com", "en") class NinjaScans : Madara("NinjaScans", "https://ninjascans.com", "en") -class ReadManhua : Madara("ReadManhua", "https://readmanhua.net", "en", - dateFormat = SimpleDateFormat("dd MMM yy", Locale.US)) +class ReadManhua : Madara( + "ReadManhua", + "https://readmanhua.net", + "en", + dateFormat = SimpleDateFormat("dd MMM yy", Locale.US) +) class IsekaiScanCom : Madara("IsekaiScan.com", "https://isekaiscan.com", "en") -class JustForFun : Madara("Just For Fun", "https://just-for-fun.ru", "ru", - dateFormat = SimpleDateFormat("yy.MM.dd", Locale.US)) +class JustForFun : Madara( + "Just For Fun", + "https://just-for-fun.ru", + "ru", + dateFormat = SimpleDateFormat("yy.MM.dd", Locale.US) +) class AoCTranslations : Madara("Agent of Change Translations", "https://aoc.moe", "en") { override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl) @@ -243,11 +251,19 @@ class KomikGo : Madara("KomikGo", "https://komikgo.com", "id") class LuxyScans : Madara("Luxy Scans", "https://luxyscans.com", "en") -class TsubakiNoScan : Madara("Tsubaki No Scan", "https://tsubakinoscan.com", "fr", - dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) +class TsubakiNoScan : Madara( + "Tsubaki No Scan", + "https://tsubakinoscan.com", + "fr", + dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US) +) -class YokaiJump : Madara("Yokai Jump", "https://yokaijump.fr", "fr", - dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) +class YokaiJump : Madara( + "Yokai Jump", + "https://yokaijump.fr", + "fr", + dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US) +) class ZManga : Madara("ZManga", "https://zmanga.org", "es") @@ -261,8 +277,12 @@ class MangazukiClubJP : Madara("Mangazuki.club", "https://mangazuki.club", "ja") class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club", "ko") -class FirstKissManga : Madara("1st Kiss", "https://1stkissmanga.com", "en", - dateFormat = SimpleDateFormat("dd MMM yyyy", Locale.US)) { +class FirstKissManga : Madara( + "1st Kiss", + "https://1stkissmanga.com", + "en", + dateFormat = SimpleDateFormat("dd MMM yyyy", Locale.US) +) { override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl) } @@ -287,8 +307,12 @@ class ManyToonMe : Madara("ManyToon.me", "https://manytoon.me", "en") class BoysLove : Madara("BoysLove", "https://boyslove.me", "en") -class ChibiManga : Madara("Chibi Manga", "http://www.cmreader.info", "en", - dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US)) { +class ChibiManga : Madara( + "Chibi Manga", + "http://www.cmreader.info", + "en", + dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US) +) { override fun chapterListParse(response: Response): List { response.asJsoup().let { documet -> documet.select("li.parent.has-child").let { volumes -> @@ -562,41 +586,43 @@ class DoujinHentai : Madara("DoujinHentai", "https://doujinhentai.net", "es", Si GenreSelectFilter() ) - class GenreSelectFilter : UriPartFilter("Búsqueda de género", arrayOf( - Pair("", ""), - Pair("Ecchi", "ecchi"), - Pair("Yaoi", "yaoi"), - Pair("Yuri", "yuri"), - Pair("Anal", "anal"), - Pair("Tetonas", "tetonas"), - Pair("Escolares", "escolares"), - Pair("Incesto", "incesto"), - Pair("Virgenes", "virgenes"), - Pair("Masturbacion", "masturbacion"), - Pair("Maduras", "maduras"), - Pair("Lolicon", "lolicon"), - Pair("Bikini", "bikini"), - Pair("Sirvientas", "sirvientas"), - Pair("Enfermera", "enfermera"), - Pair("Embarazada", "embarazada"), - Pair("Ahegao", "ahegao"), - Pair("Casadas", "casadas"), - Pair("Chica Con Pene", "chica-con-pene"), - Pair("Juguetes Sexuales", "juguetes-sexuales"), - Pair("Orgias", "orgias"), - Pair("Harem", "harem"), - Pair("Romance", "romance"), - Pair("Profesores", "profesores"), - Pair("Tentaculos", "tentaculos"), - Pair("Mamadas", "mamadas"), - Pair("Shota", "shota"), - Pair("Interracial", "interracial"), - Pair("Full Color", "full-colo"), - Pair("Sin Censura", "sin-censura"), - Pair("Futanari", "futanari"), - Pair("Doble Penetracion", "doble-penetracion"), - Pair("Cosplay", "cosplay") - ) + class GenreSelectFilter : UriPartFilter( + "Búsqueda de género", + arrayOf( + Pair("", ""), + Pair("Ecchi", "ecchi"), + Pair("Yaoi", "yaoi"), + Pair("Yuri", "yuri"), + Pair("Anal", "anal"), + Pair("Tetonas", "tetonas"), + Pair("Escolares", "escolares"), + Pair("Incesto", "incesto"), + Pair("Virgenes", "virgenes"), + Pair("Masturbacion", "masturbacion"), + Pair("Maduras", "maduras"), + Pair("Lolicon", "lolicon"), + Pair("Bikini", "bikini"), + Pair("Sirvientas", "sirvientas"), + Pair("Enfermera", "enfermera"), + Pair("Embarazada", "embarazada"), + Pair("Ahegao", "ahegao"), + Pair("Casadas", "casadas"), + Pair("Chica Con Pene", "chica-con-pene"), + Pair("Juguetes Sexuales", "juguetes-sexuales"), + Pair("Orgias", "orgias"), + Pair("Harem", "harem"), + Pair("Romance", "romance"), + Pair("Profesores", "profesores"), + Pair("Tentaculos", "tentaculos"), + Pair("Mamadas", "mamadas"), + Pair("Shota", "shota"), + Pair("Interracial", "interracial"), + Pair("Full Color", "full-colo"), + Pair("Sin Censura", "sin-censura"), + Pair("Futanari", "futanari"), + Pair("Doble Penetracion", "doble-penetracion"), + Pair("Cosplay", "cosplay") + ) ) } diff --git a/src/all/mangabox/src/eu/kanade/tachiyomi/extension/all/mangabox/MangaBox.kt b/src/all/mangabox/src/eu/kanade/tachiyomi/extension/all/mangabox/MangaBox.kt index e793a80bd..46ac82eeb 100644 --- a/src/all/mangabox/src/eu/kanade/tachiyomi/extension/all/mangabox/MangaBox.kt +++ b/src/all/mangabox/src/eu/kanade/tachiyomi/extension/all/mangabox/MangaBox.kt @@ -9,11 +9,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -21,6 +16,11 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import java.util.concurrent.TimeUnit // Based off of Mangakakalot 1.2.8 diff --git a/src/all/mangabox/src/eu/kanade/tachiyomi/extension/all/mangabox/MangaBoxFactory.kt b/src/all/mangabox/src/eu/kanade/tachiyomi/extension/all/mangabox/MangaBoxFactory.kt index c71bc6e89..9dcfc7eb5 100644 --- a/src/all/mangabox/src/eu/kanade/tachiyomi/extension/all/mangabox/MangaBoxFactory.kt +++ b/src/all/mangabox/src/eu/kanade/tachiyomi/extension/all/mangabox/MangaBoxFactory.kt @@ -7,12 +7,12 @@ import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.asJsoup -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MangaBoxFactory : SourceFactory { override fun createSources(): List = listOf( diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt index 9b06f1c6a..cfc6df98d 100644 --- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt +++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt @@ -28,10 +28,6 @@ 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 java.net.URLEncoder -import java.util.Date -import java.util.concurrent.TimeUnit -import kotlin.collections.set import okhttp3.CacheControl import okhttp3.Headers import okhttp3.HttpUrl @@ -45,6 +41,10 @@ import org.jsoup.parser.Parser import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.net.URLEncoder +import java.util.Date +import java.util.concurrent.TimeUnit +import kotlin.collections.set abstract class MangaDex( override val lang: String, @@ -421,7 +421,8 @@ abstract class MangaDex( // Remove bbcode tags as well as parses any html characters in description or chapter name to actual characters for example ♥ will show ♥ private fun cleanString(string: String): String { - val bbRegex = """\[(\w+)[^]]*](.*?)\[/\1]""".toRegex() + val bbRegex = + """\[(\w+)[^]]*](.*?)\[/\1]""".toRegex() var intermediate = string .replace("[list]", "") .replace("[/list]", "") @@ -801,9 +802,11 @@ abstract class MangaDex( private class TagExclusionMode : Filter.Select("Tag exclusion mode", arrayOf("All (and)", "Any (or)"), 1) // default selection (Rating Descending) matches popularMangaRequest url - class SortFilter : Filter.Sort("Sort", + class SortFilter : Filter.Sort( + "Sort", sortables.map { it.first }.toTypedArray(), - Selection(3, false)) + Selection(3, false) + ) private class OriginalLanguage : Filter.Select("Original Language", SOURCE_LANG_LIST.map { it.first }.toTypedArray()) @@ -955,7 +958,8 @@ abstract class MangaDex( Triple("Number of comments", 4, 5), Triple("Rating", 6, 7), Triple("Views", 8, 9), - Triple("Follows", 10, 11)) + Triple("Follows", 10, 11) + ) private val SOURCE_LANG_LIST = listOf( Pair("All", "0"), @@ -970,7 +974,8 @@ abstract class MangaDex( Pair("Korean", "28"), Pair("Spanish (LATAM)", "29"), Pair("Thai", "32"), - Pair("Filipino", "34")) + Pair("Filipino", "34") + ) private var hasMangaPlus = false } diff --git a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventure.kt b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventure.kt index 46417953c..0edc54b24 100644 --- a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventure.kt +++ b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventure.kt @@ -12,14 +12,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.Request import okhttp3.Response import org.json.JSONArray import org.json.JSONObject import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale /** * MangAdventure base source. @@ -88,9 +88,11 @@ abstract class MangAdventure( when (it) { is Person -> uri.appendQueryParameter("author", it.state) is Status -> uri.appendQueryParameter("status", it.string()) - is CategoryList -> cat.addAll(it.state.mapNotNull { c -> - Uri.encode(c.optString()) - }) + is CategoryList -> cat.addAll( + it.state.mapNotNull { c -> + Uri.encode(c.optString()) + } + ) else -> Unit } } @@ -99,18 +101,21 @@ abstract class MangAdventure( override fun latestUpdatesParse(response: Response) = JSONArray(response.asString()).run { - MangasPage((0 until length()).map { - val obj = getJSONObject(it) - SManga.create().apply { - url = obj.getString("url") - title = obj.getString("title") - thumbnail_url = obj.getString("cover") - // A bit of a hack to sort by date - description = httpDateToTimestamp( - obj.getJSONObject("latest_chapter").getString("date") - ).toString() - } - }.sortedByDescending(SManga::description), false) + MangasPage( + (0 until length()).map { + val obj = getJSONObject(it) + SManga.create().apply { + url = obj.getString("url") + title = obj.getString("title") + thumbnail_url = obj.getString("cover") + // A bit of a hack to sort by date + description = httpDateToTimestamp( + obj.getJSONObject("latest_chapter").getString("date") + ).toString() + } + }.sortedByDescending(SManga::description), + false + ) } override fun chapterListParse(response: Response) = @@ -143,9 +148,12 @@ abstract class MangAdventure( override fun searchMangaParse(response: Response) = JSONArray(response.asString()).run { - MangasPage((0 until length()).map { - SManga.create().fromJSON(getJSONObject(it)) - }.sortedBy(SManga::title), false) + MangasPage( + (0 until length()).map { + SManga.create().fromJSON(getJSONObject(it)) + }.sortedBy(SManga::title), + false + ) } override fun getFilterList() = @@ -226,7 +234,7 @@ abstract class MangAdventure( * @return The timestamp of the date. */ fun httpDateToTimestamp(date: String) = - SimpleDateFormat(HTTP_DATE, Locale.US).parse(date).time + SimpleDateFormat(HTTP_DATE, Locale.US).parse(date)?.time ?: 0L } /** @@ -260,7 +268,8 @@ abstract class MangAdventure( * @constructor Creates a [Filter.Group] object with categories. */ inner class CategoryList : Filter.Group( - "Categories", categories.map(::Category) + "Categories", + categories.map(::Category) ) /** diff --git a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureActivity.kt b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureActivity.kt index 2d4043a8a..ef89678a7 100644 --- a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureActivity.kt +++ b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureActivity.kt @@ -16,11 +16,13 @@ class MangAdventureActivity : Activity() { super.onCreate(savedInstanceState) intent?.data?.pathSegments?.takeIf { it.size > 1 }?.let { try { - startActivity(Intent().apply { - action = "eu.kanade.tachiyomi.SEARCH" - putExtra("query", MangAdventure.SLUG_QUERY + it[1]) - putExtra("filter", packageName) - }) + startActivity( + Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", MangAdventure.SLUG_QUERY + it[1]) + putExtra("filter", packageName) + } + ) } catch (ex: ActivityNotFoundException) { Log.e("MangAdventureActivity", ex.message, ex) } @@ -30,6 +32,7 @@ class MangAdventureActivity : Activity() { } private fun logInvalidIntent(intent: Intent) = Log.e( - "MangAdventureActivity", "Failed to parse URI from intent: $intent" + "MangAdventureActivity", + "Failed to parse URI from intent: $intent" ) } diff --git a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureExtensions.kt b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureExtensions.kt index a209de128..d8c398373 100644 --- a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureExtensions.kt +++ b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureExtensions.kt @@ -3,10 +3,10 @@ package eu.kanade.tachiyomi.extension.all.mangadventure import android.net.Uri import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga -import java.text.DecimalFormat import okhttp3.Response import org.json.JSONArray import org.json.JSONObject +import java.text.DecimalFormat /** Returns the body of a response as a `String`. */ fun Response.asString(): String = body()!!.string() @@ -62,9 +62,9 @@ fun SManga.fromJSON(obj: JSONObject) = apply { title = obj.getString("title") description = obj.getString("description") thumbnail_url = obj.getString("cover") - author = obj.getJSONArray("authors")?.joinField(0) - artist = obj.getJSONArray("artists")?.joinField(0) - genre = obj.getJSONArray("categories")?.joinField("name") + author = obj.getJSONArray("authors").joinField(0) + artist = obj.getJSONArray("artists").joinField(0) + genre = obj.getJSONArray("categories").joinField("name") status = if (obj.getBoolean("completed")) SManga.COMPLETED else SManga.ONGOING } @@ -82,11 +82,14 @@ fun SChapter.fromJSON(obj: JSONObject) = apply { url = obj.getString("url") chapter_number = obj.optString("chapter", "0").toFloat() date_upload = MangAdventure.httpDateToTimestamp(obj.getString("date")) - scanlator = obj.getJSONArray("groups")?.joinField("name", " & ") - name = obj.optString("full_title", buildString { - obj.optInt("volume").let { if (it != 0) append("Vol. $it, ") } - append("Ch. ${chapter_number.format("#.#")}: ") - append(obj.getString("title")) - }) + scanlator = obj.getJSONArray("groups").joinField("name", " & ") + name = obj.optString( + "full_title", + buildString { + obj.optInt("volume").let { if (it != 0) append("Vol. $it, ") } + append("Ch. ${chapter_number.format("#.#")}: ") + append(obj.getString("title")) + } + ) if (obj.getBoolean("final")) name += " [END]" } diff --git a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureFactory.kt b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureFactory.kt index d6c66a404..9fe21e1a2 100644 --- a/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureFactory.kt +++ b/src/all/mangadventure/src/eu/kanade/tachiyomi/extension/all/mangadventure/MangAdventureFactory.kt @@ -10,7 +10,9 @@ class MangAdventureFactory : SourceFactory { /** Arc-Relight source. */ class ArcRelight : MangAdventure( - "Arc-Relight", "https://arc-relight.com", arrayOf( + "Arc-Relight", + "https://arc-relight.com", + arrayOf( "4-Koma", "Chaos;Head", "Collection", diff --git a/src/all/mangaplus/build.gradle b/src/all/mangaplus/build.gradle index 28dd26e5e..723f696f1 100644 --- a/src/all/mangaplus/build.gradle +++ b/src/all/mangaplus/build.gradle @@ -6,13 +6,14 @@ ext { extName = 'MANGA Plus by SHUEISHA' pkgNameSuffix = 'all.mangaplus' extClass = '.MangaPlusFactory' - extVersionCode = 11 + extVersionCode = 12 libVersion = '1.2' } dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-serialization-protobuf:0.20.0' - implementation 'org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0' + final serialization_version = '1.0.0-RC' + implementation "org.jetbrains.kotlinx:kotlinx-serialization-core:$serialization_version" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:$serialization_version" } apply from: "$rootDir/common.gradle" diff --git a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt index 63028b749..f463bb0d8 100644 --- a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt +++ b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt @@ -6,9 +6,6 @@ import android.os.Build import android.support.v7.preference.CheckBoxPreference import android.support.v7.preference.ListPreference import android.support.v7.preference.PreferenceScreen -import androidx.preference.CheckBoxPreference as AndroidXCheckBoxPreference -import androidx.preference.ListPreference as AndroidXListPreference -import androidx.preference.PreferenceScreen as AndroidXPreferenceScreen import com.google.gson.Gson import com.squareup.duktape.Duktape import eu.kanade.tachiyomi.network.GET @@ -20,7 +17,6 @@ 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 java.util.UUID import kotlinx.serialization.protobuf.ProtoBuf import okhttp3.Headers import okhttp3.HttpUrl @@ -33,6 +29,10 @@ import okhttp3.ResponseBody import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.util.UUID +import androidx.preference.CheckBoxPreference as AndroidXCheckBoxPreference +import androidx.preference.ListPreference as AndroidXListPreference +import androidx.preference.PreferenceScreen as AndroidXPreferenceScreen abstract class MangaPlus( override val lang: String, @@ -428,7 +428,7 @@ abstract class MangaPlus( private fun Response.asProto(): MangaPlusResponse { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) - return ProtoBuf.load(MangaPlusSerializer, body()!!.bytes()) + return ProtoBuf.decodeFromByteArray(MangaPlusSerializer, body()!!.bytes()) // Apparently, the version used of Kotlinx Serialization lib causes a crash // on KitKat devices (see #1678). So, if the device is running KitKat or lower, @@ -438,9 +438,13 @@ abstract class MangaPlus( val messageBytes = "var BYTE_ARR = new Uint8Array([${bytes.joinToString()}]);" val res = Duktape.create().use { - it.set("helper", DuktapeHelper::class.java, object : DuktapeHelper { - override fun getProtobuf(): String = protobufJs - }) + it.set( + "helper", + DuktapeHelper::class.java, + object : DuktapeHelper { + override fun getProtobuf(): String = protobufJs + } + ) it.evaluate(messageBytes + DECODE_SCRIPT) as String } diff --git a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusApi.kt b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusApi.kt index dbe2f59e2..c28a62d3d 100644 --- a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusApi.kt +++ b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusApi.kt @@ -3,128 +3,129 @@ package eu.kanade.tachiyomi.extension.all.mangaplus import com.google.gson.annotations.SerializedName import kotlinx.serialization.Serializable import kotlinx.serialization.Serializer -import kotlinx.serialization.protobuf.ProtoId +import kotlinx.serialization.protobuf.ProtoNumber @Serializer(forClass = MangaPlusResponse::class) object MangaPlusSerializer @Serializable data class MangaPlusResponse( - @ProtoId(1) val success: SuccessResult? = null, - @ProtoId(2) val error: ErrorResult? = null + @ProtoNumber(1) val success: SuccessResult? = null, + @ProtoNumber(2) val error: ErrorResult? = null ) @Serializable data class ErrorResult( - @ProtoId(1) val action: Action, - @ProtoId(2) val englishPopup: Popup, - @ProtoId(3) val spanishPopup: Popup + @ProtoNumber(1) val action: Action, + @ProtoNumber(2) val englishPopup: Popup, + @ProtoNumber(3) val spanishPopup: Popup ) enum class Action { DEFAULT, UNAUTHORIZED, MAINTAINENCE, GEOIP_BLOCKING } @Serializable data class Popup( - @ProtoId(1) val subject: String, - @ProtoId(2) val body: String + @ProtoNumber(1) val subject: String, + @ProtoNumber(2) val body: String ) @Serializable data class SuccessResult( - @ProtoId(1) val isFeaturedUpdated: Boolean? = false, - @ProtoId(5) val allTitlesView: AllTitlesView? = null, - @ProtoId(6) val titleRankingView: TitleRankingView? = null, - @ProtoId(8) val titleDetailView: TitleDetailView? = null, - @ProtoId(10) val mangaViewer: MangaViewer? = null, - @ProtoId(11) val webHomeView: WebHomeView? = null + @ProtoNumber(1) val isFeaturedUpdated: Boolean? = false, + @ProtoNumber(5) val allTitlesView: AllTitlesView? = null, + @ProtoNumber(6) val titleRankingView: TitleRankingView? = null, + @ProtoNumber(8) val titleDetailView: TitleDetailView? = null, + @ProtoNumber(10) val mangaViewer: MangaViewer? = null, + @ProtoNumber(11) val webHomeView: WebHomeView? = null ) @Serializable -data class TitleRankingView(@ProtoId(1) val titles: List = emptyList()) +data class TitleRankingView(@ProtoNumber(1) val titles: List<Title> = emptyList()) @Serializable -data class AllTitlesView(@ProtoId(1) val titles: List<Title> = emptyList()) +data class AllTitlesView(@ProtoNumber(1) val titles: List<Title> = emptyList()) @Serializable -data class WebHomeView(@ProtoId(2) val groups: List<UpdatedTitleGroup> = emptyList()) +data class WebHomeView(@ProtoNumber(2) val groups: List<UpdatedTitleGroup> = emptyList()) @Serializable data class TitleDetailView( - @ProtoId(1) val title: Title, - @ProtoId(2) val titleImageUrl: String, - @ProtoId(3) val overview: String, - @ProtoId(4) val backgroundImageUrl: String, - @ProtoId(5) val nextTimeStamp: Int = 0, - @ProtoId(6) val updateTiming: UpdateTiming? = UpdateTiming.DAY, - @ProtoId(7) val viewingPeriodDescription: String = "", - @ProtoId(8) val nonAppearanceInfo: String = "", - @ProtoId(9) val firstChapterList: List<Chapter> = emptyList(), - @ProtoId(10) val lastChapterList: List<Chapter> = emptyList(), - @ProtoId(14) val isSimulReleased: Boolean = true, - @ProtoId(17) val chaptersDescending: Boolean = true + @ProtoNumber(1) val title: Title, + @ProtoNumber(2) val titleImageUrl: String, + @ProtoNumber(3) val overview: String, + @ProtoNumber(4) val backgroundImageUrl: String, + @ProtoNumber(5) val nextTimeStamp: Int = 0, + @ProtoNumber(6) val updateTiming: UpdateTiming? = UpdateTiming.DAY, + @ProtoNumber(7) val viewingPeriodDescription: String = "", + @ProtoNumber(8) val nonAppearanceInfo: String = "", + @ProtoNumber(9) val firstChapterList: List<Chapter> = emptyList(), + @ProtoNumber(10) val lastChapterList: List<Chapter> = emptyList(), + @ProtoNumber(14) val isSimulReleased: Boolean = true, + @ProtoNumber(17) val chaptersDescending: Boolean = true ) enum class UpdateTiming { NOT_REGULARLY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, DAY } @Serializable -data class MangaViewer(@ProtoId(1) val pages: List<MangaPlusPage> = emptyList()) +data class MangaViewer(@ProtoNumber(1) val pages: List<MangaPlusPage> = emptyList()) @Serializable data class Title( - @ProtoId(1) val titleId: Int, - @ProtoId(2) val name: String, - @ProtoId(3) val author: String, - @ProtoId(4) val portraitImageUrl: String, - @ProtoId(5) val landscapeImageUrl: String, - @ProtoId(6) val viewCount: Int = 0, - @ProtoId(7) val language: Language? = Language.ENGLISH + @ProtoNumber(1) val titleId: Int, + @ProtoNumber(2) val name: String, + @ProtoNumber(3) val author: String, + @ProtoNumber(4) val portraitImageUrl: String, + @ProtoNumber(5) val landscapeImageUrl: String, + @ProtoNumber(6) val viewCount: Int = 0, + @ProtoNumber(7) val language: Language? = Language.ENGLISH ) @Serializable enum class Language(val id: Int) { - @ProtoId(0) + @ProtoNumber(0) @SerializedName("0") ENGLISH(0), - @ProtoId(1) + @ProtoNumber(1) @SerializedName("1") SPANISH(1) } @Serializable data class UpdatedTitleGroup( - @ProtoId(1) val groupName: String, - @ProtoId(2) val titles: List<UpdatedTitle> = emptyList() + @ProtoNumber(1) val groupName: String, + @ProtoNumber(2) val titles: List<UpdatedTitle> = emptyList() ) @Serializable data class UpdatedTitle( - @ProtoId(1) val title: Title? = null + @ProtoNumber(1) val title: Title? = null ) @Serializable data class Chapter( - @ProtoId(1) val titleId: Int, - @ProtoId(2) val chapterId: Int, - @ProtoId(3) val name: String, - @ProtoId(4) val subTitle: String? = null, - @ProtoId(6) val startTimeStamp: Int, - @ProtoId(7) val endTimeStamp: Int + @ProtoNumber(1) val titleId: Int, + @ProtoNumber(2) val chapterId: Int, + @ProtoNumber(3) val name: String, + @ProtoNumber(4) val subTitle: String? = null, + @ProtoNumber(6) val startTimeStamp: Int, + @ProtoNumber(7) val endTimeStamp: Int ) @Serializable -data class MangaPlusPage(@ProtoId(1) val page: MangaPage? = null) +data class MangaPlusPage(@ProtoNumber(1) val page: MangaPage? = null) @Serializable data class MangaPage( - @ProtoId(1) val imageUrl: String, - @ProtoId(2) val width: Int, - @ProtoId(3) val height: Int, - @ProtoId(5) val encryptionKey: String? = null + @ProtoNumber(1) val imageUrl: String, + @ProtoNumber(2) val width: Int, + @ProtoNumber(3) val height: Int, + @ProtoNumber(5) val encryptionKey: String? = null ) // Used for the deserialization on KitKat devices. -const val DECODE_SCRIPT: String = """ +const val DECODE_SCRIPT: String = + """ Duktape.modSearch = function(id) { if (id == "protobufjs") return helper.getProtobuf(); diff --git a/src/all/mangatoon/src/eu/kanade/tachiyomi/extension/all/mangatoon/MangaToon.kt b/src/all/mangatoon/src/eu/kanade/tachiyomi/extension/all/mangatoon/MangaToon.kt index 831bc8053..873fdfe8e 100644 --- a/src/all/mangatoon/src/eu/kanade/tachiyomi/extension/all/mangatoon/MangaToon.kt +++ b/src/all/mangatoon/src/eu/kanade/tachiyomi/extension/all/mangatoon/MangaToon.kt @@ -7,13 +7,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale open class MangaToon( override val lang: String, @@ -73,16 +73,16 @@ open class MangaToon( override fun chapterFromElement(element: Element): SChapter { val chapter = SChapter.create() - chapter.url = element.select("a").first().attr("href") - chapter.chapter_number = element.select("div.item-left").text().trim().toFloat() + chapter.url = element.select("a").first().attr("href") + chapter.chapter_number = element.select("div.item-left").text().trim().toFloat() val date = element.select("div.episode-date").text() - chapter.date_upload = parseDate(date) - chapter.name = if (chapter.chapter_number> 20) { "\uD83D\uDD12 " } else { "" } + element.select("div.episode-title").text().trim() + chapter.date_upload = parseDate(date) + chapter.name = if (chapter.chapter_number> 20) { "\uD83D\uDD12 " } else { "" } + element.select("div.episode-title").text().trim() return chapter } private fun parseDate(date: String): Long { - return SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(date).time + return SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(date)?.time ?: 0L } override fun mangaDetailsParse(document: Document): SManga { diff --git a/src/all/mangatoon/src/eu/kanade/tachiyomi/extension/all/mangatoon/MangaToonFactory.kt b/src/all/mangatoon/src/eu/kanade/tachiyomi/extension/all/mangatoon/MangaToonFactory.kt index 6b6e3ba7e..59f28b41a 100644 --- a/src/all/mangatoon/src/eu/kanade/tachiyomi/extension/all/mangatoon/MangaToonFactory.kt +++ b/src/all/mangatoon/src/eu/kanade/tachiyomi/extension/all/mangatoon/MangaToonFactory.kt @@ -14,11 +14,11 @@ class MangaToonFactory : SourceFactory { TH() ) -class ZH : MangaToon("zh", "cn") -class EN : MangaToon("en", "en") -class ID : MangaToon("id", "id") -class VI : MangaToon("vi", "vi") -class ES : MangaToon("es", "es") -class PT : MangaToon("pt", "pt") -class TH : MangaToon("th", "th") + class ZH : MangaToon("zh", "cn") + class EN : MangaToon("en", "en") + class ID : MangaToon("id", "id") + class VI : MangaToon("vi", "vi") + class ES : MangaToon("es", "es") + class PT : MangaToon("pt", "pt") + class TH : MangaToon("th", "th") } diff --git a/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/Generator.kt b/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/Generator.kt index 64e839d6d..509c76b9e 100644 --- a/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/Generator.kt +++ b/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/Generator.kt @@ -4,6 +4,10 @@ import android.annotation.SuppressLint import android.annotation.TargetApi import android.os.Build import com.google.gson.Gson +import okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.Jsoup +import org.jsoup.nodes.Document import java.io.File import java.io.PrintWriter import java.security.cert.CertificateException @@ -13,10 +17,6 @@ import java.util.concurrent.TimeUnit import javax.net.ssl.SSLContext import javax.net.ssl.TrustManager import javax.net.ssl.X509TrustManager -import okhttp3.OkHttpClient -import okhttp3.Request -import org.jsoup.Jsoup -import org.jsoup.nodes.Document /** * This class generates the sources for MMRCMS. @@ -195,21 +195,23 @@ class Generator { @Throws(Exception::class) private fun getOkHttpClient(): OkHttpClient { - val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager { - @SuppressLint("TrustAllX509TrustManager") - @Throws(CertificateException::class) - override fun checkClientTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) { - } + val trustAllCerts = arrayOf<TrustManager>( + object : X509TrustManager { + @SuppressLint("TrustAllX509TrustManager") + @Throws(CertificateException::class) + override fun checkClientTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) { + } - @SuppressLint("TrustAllX509TrustManager") - @Throws(CertificateException::class) - override fun checkServerTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) { - } + @SuppressLint("TrustAllX509TrustManager") + @Throws(CertificateException::class) + override fun checkServerTrusted(chain: Array<java.security.cert.X509Certificate>, authType: String) { + } - override fun getAcceptedIssuers(): Array<java.security.cert.X509Certificate> { - return arrayOf() + override fun getAcceptedIssuers(): Array<java.security.cert.X509Certificate> { + return arrayOf() + } } - }) + ) // Install the all-trusting trust manager @@ -272,61 +274,62 @@ class Generator { SourceData("fr", "Op-VF", "https://www.op-vf.com"), SourceData("fr", "FR Scan", "https://www.frscan.me"), // NOTE: THIS SOURCE CONTAINS A CUSTOM LANGUAGE SYSTEM (which will be ignored)! - SourceData("other", "HentaiShark", "https://www.hentaishark.com", true)) - // Changed CMS - // SourceData("en", "MangaTreat Scans", "http://www.mangatreat.com"), - // SourceData("en", "Chibi Manga Reader", "https://www.cmreader.info"), - // SourceData("tr", "Epikmanga", "https://www.epikmanga.com"), - // SourceData("en", "Hatigarm Scans", "https://hatigarmscans.net"), - // Went offline - // SourceData("en", "Mangawww Reader", "https://mangawww.club"), - // SourceData("ru", "Anigai clan", "http://anigai.ru"), - // SourceData("en", "ZXComic", "http://zxcomic.com"), - // SourceData("es", "SOS Scanlation", "https://sosscanlation.com"), - // SourceData("es", "MangaCasa", "https://mangacasa.com")) - // SourceData("ja", "RAW MANGA READER", "https://rawmanga.site"), - // SourceData("ar", "Manga FYI", "http://mangafyi.com/manga/arabic"), - // SourceData("en", "MangaRoot", "http://mangaroot.com"), - // SourceData("en", "MangaForLife", "http://manga4ever.com"), - // SourceData("en", "Manga Spoil", "http://mangaspoil.com"), - // SourceData("en", "MangaBlue", "http://mangablue.com"), - // SourceData("en", "Manga Forest", "https://mangaforest.com"), - // SourceData("en", "DManga", "http://dmanga.website"), - // SourceData("en", "DB Manga", "http://dbmanga.com"), - // SourceData("en", "Mangacox", "http://mangacox.com"), - // SourceData("en", "GO Manhwa", "http://gomanhwa.xyz"), - // SourceData("en", "KoManga", "https://komanga.net"), - // SourceData("en", "Manganimecan", "http://manganimecan.com"), - // SourceData("en", "Hentai2Manga", "http://hentai2manga.com"), - // SourceData("en", "4 Manga", "http://4-manga.com"), - // SourceData("en", "XYXX.INFO", "http://xyxx.info"), - // SourceData("en", "Isekai Manga Reader", "https://isekaimanga.club"), - // SourceData("fa", "TrinityReader", "http://trinityreader.pw"), - // SourceData("fr", "Manga-LEL", "https://www.manga-lel.com"), - // SourceData("fr", "Manga Etonnia", "https://www.etonnia.com"), - // SourceData("fr", "ScanFR.com"), "http://scanfr.com"), - // SourceData("fr", "Manga FYI", "http://mangafyi.com/manga/french"), - // SourceData("fr", "scans-manga", "http://scans-manga.com"), - // SourceData("fr", "Henka no Kaze", "http://henkanokazelel.esy.es/upload"), - // SourceData("fr", "Tous Vos Scans", "http://www.tous-vos-scans.com"), - // SourceData("id", "Manga Desu", "http://mangadesu.net"), - // SourceData("id", "Komik Mangafire.ID", "http://go.mangafire.id"), - // SourceData("id", "MangaOnline", "https://mangaonline.web.id"), - // SourceData("id", "MangaNesia", "https://manganesia.com"), - // SourceData("id", "MangaID", "https://mangaid.me" - // SourceData("id", "Manga Seru", "http://www.mangaseru.top" - // SourceData("id", "Manga FYI", "http://mangafyi.com/manga/indonesian" - // SourceData("id", "Bacamangaku", "http://www.bacamangaku.com"), - // SourceData("id", "Indo Manga Reader", "http://indomangareader.com"), - // SourceData("it", "Kingdom Italia Reader", "http://kireader.altervista.org"), - // SourceData("ja", "IchigoBook", "http://ichigobook.com"), - // SourceData("ja", "Mangaraw Online", "http://mangaraw.online" - // SourceData("ja", "Mangazuki RAWS", "https://raws.mangazuki.co"), - // SourceData("ja", "MangaRAW", "https://www.mgraw.com"), - // SourceData("ja", "マンガ/漫画 マガジン/雑誌 raw", "http://netabare-manga-raw.com"), - // SourceData("ru", "NAKAMA", "http://nakama.ru"), - // SourceData("tr", "MangAoi", "http://mangaoi.com"), - // SourceData("tr", "ManhuaTR", "http://www.manhua-tr.com"), + SourceData("other", "HentaiShark", "https://www.hentaishark.com", true) + ) + // Changed CMS + // SourceData("en", "MangaTreat Scans", "http://www.mangatreat.com"), + // SourceData("en", "Chibi Manga Reader", "https://www.cmreader.info"), + // SourceData("tr", "Epikmanga", "https://www.epikmanga.com"), + // SourceData("en", "Hatigarm Scans", "https://hatigarmscans.net"), + // Went offline + // SourceData("en", "Mangawww Reader", "https://mangawww.club"), + // SourceData("ru", "Anigai clan", "http://anigai.ru"), + // SourceData("en", "ZXComic", "http://zxcomic.com"), + // SourceData("es", "SOS Scanlation", "https://sosscanlation.com"), + // SourceData("es", "MangaCasa", "https://mangacasa.com")) + // SourceData("ja", "RAW MANGA READER", "https://rawmanga.site"), + // SourceData("ar", "Manga FYI", "http://mangafyi.com/manga/arabic"), + // SourceData("en", "MangaRoot", "http://mangaroot.com"), + // SourceData("en", "MangaForLife", "http://manga4ever.com"), + // SourceData("en", "Manga Spoil", "http://mangaspoil.com"), + // SourceData("en", "MangaBlue", "http://mangablue.com"), + // SourceData("en", "Manga Forest", "https://mangaforest.com"), + // SourceData("en", "DManga", "http://dmanga.website"), + // SourceData("en", "DB Manga", "http://dbmanga.com"), + // SourceData("en", "Mangacox", "http://mangacox.com"), + // SourceData("en", "GO Manhwa", "http://gomanhwa.xyz"), + // SourceData("en", "KoManga", "https://komanga.net"), + // SourceData("en", "Manganimecan", "http://manganimecan.com"), + // SourceData("en", "Hentai2Manga", "http://hentai2manga.com"), + // SourceData("en", "4 Manga", "http://4-manga.com"), + // SourceData("en", "XYXX.INFO", "http://xyxx.info"), + // SourceData("en", "Isekai Manga Reader", "https://isekaimanga.club"), + // SourceData("fa", "TrinityReader", "http://trinityreader.pw"), + // SourceData("fr", "Manga-LEL", "https://www.manga-lel.com"), + // SourceData("fr", "Manga Etonnia", "https://www.etonnia.com"), + // SourceData("fr", "ScanFR.com"), "http://scanfr.com"), + // SourceData("fr", "Manga FYI", "http://mangafyi.com/manga/french"), + // SourceData("fr", "scans-manga", "http://scans-manga.com"), + // SourceData("fr", "Henka no Kaze", "http://henkanokazelel.esy.es/upload"), + // SourceData("fr", "Tous Vos Scans", "http://www.tous-vos-scans.com"), + // SourceData("id", "Manga Desu", "http://mangadesu.net"), + // SourceData("id", "Komik Mangafire.ID", "http://go.mangafire.id"), + // SourceData("id", "MangaOnline", "https://mangaonline.web.id"), + // SourceData("id", "MangaNesia", "https://manganesia.com"), + // SourceData("id", "MangaID", "https://mangaid.me" + // SourceData("id", "Manga Seru", "http://www.mangaseru.top" + // SourceData("id", "Manga FYI", "http://mangafyi.com/manga/indonesian" + // SourceData("id", "Bacamangaku", "http://www.bacamangaku.com"), + // SourceData("id", "Indo Manga Reader", "http://indomangareader.com"), + // SourceData("it", "Kingdom Italia Reader", "http://kireader.altervista.org"), + // SourceData("ja", "IchigoBook", "http://ichigobook.com"), + // SourceData("ja", "Mangaraw Online", "http://mangaraw.online" + // SourceData("ja", "Mangazuki RAWS", "https://raws.mangazuki.co"), + // SourceData("ja", "MangaRAW", "https://www.mgraw.com"), + // SourceData("ja", "マンガ/漫画 マガジン/雑誌 raw", "http://netabare-manga-raw.com"), + // SourceData("ru", "NAKAMA", "http://nakama.ru"), + // SourceData("tr", "MangAoi", "http://mangaoi.com"), + // SourceData("tr", "ManhuaTR", "http://www.manhua-tr.com"), val relativePath = System.getProperty("user.dir") + "/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/GeneratedSources.kt" diff --git a/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/MyMangaReaderCMSSource.kt b/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/MyMangaReaderCMSSource.kt index 9d34344ad..eaf0145c0 100644 --- a/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/MyMangaReaderCMSSource.kt +++ b/src/all/mmrcms/src/eu/kanade/tachiyomi/extension/all/mmrcms/MyMangaReaderCMSSource.kt @@ -18,16 +18,16 @@ 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 java.net.URLDecoder -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Element import rx.Observable +import java.net.URLDecoder +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit open class MyMangaReaderCMSSource( final override val lang: String, @@ -114,17 +114,20 @@ open class MyMangaReaderCMSSource( val jsonArray = jsonParser.parse(response.body()!!.string()).let { if (name == "Mangas.pw") it.array else it["suggestions"].array } - MangasPage(jsonArray - .map { - SManga.create().apply { - val segment = it["data"].string - url = getUrlWithoutBaseUrl(itemUrl + segment) - title = it["value"].string + MangasPage( + jsonArray + .map { + SManga.create().apply { + val segment = it["data"].string + url = getUrlWithoutBaseUrl(itemUrl + segment) + title = it["value"].string - // Guess thumbnails - // thumbnail_url = "$baseUrl/uploads/manga/$segment/cover/cover_250x350.jpg" - } - }, false) + // Guess thumbnails + // thumbnail_url = "$baseUrl/uploads/manga/$segment/cover/cover_250x350.jpg" + } + }, + false + ) } else { internalMangaParse(response) } @@ -184,27 +187,30 @@ open class MyMangaReaderCMSSource( "Utsukushii" -> "div.content div.col-sm-6" else -> "div[class^=col-sm], div.col-xs-6" } - return MangasPage(document.select(internalMangaSelector).map { - SManga.create().apply { - val urlElement = it.getElementsByClass("chart-title") - if (urlElement.size == 0) { - url = getUrlWithoutBaseUrl(it.select("a").attr("href")) - title = it.select("div.caption").text() - it.select("div.caption div").text().let { if (it.isNotEmpty()) title = title.substringBefore(it) } // To clean submanga's titles without breaking hentaishark's - } else { - url = getUrlWithoutBaseUrl(urlElement.attr("href")) - title = urlElement.text().trim() - } + return MangasPage( + document.select(internalMangaSelector).map { + SManga.create().apply { + val urlElement = it.getElementsByClass("chart-title") + if (urlElement.size == 0) { + url = getUrlWithoutBaseUrl(it.select("a").attr("href")) + title = it.select("div.caption").text() + it.select("div.caption div").text().let { if (it.isNotEmpty()) title = title.substringBefore(it) } // To clean submanga's titles without breaking hentaishark's + } else { + url = getUrlWithoutBaseUrl(urlElement.attr("href")) + title = urlElement.text().trim() + } - it.select("img").let { img -> - thumbnail_url = when { - it.hasAttr("data-background-image") -> it.attr("data-background-image") // Utsukushii - img.hasAttr("data-src") -> coverGuess(img.attr("abs:data-src"), url) - else -> coverGuess(img.attr("abs:src"), url) + it.select("img").let { img -> + thumbnail_url = when { + it.hasAttr("data-background-image") -> it.attr("data-background-image") // Utsukushii + img.hasAttr("data-src") -> coverGuess(img.attr("abs:data-src"), url) + else -> coverGuess(img.attr("abs:src"), url) + } } } - } - }, document.select(".pagination a[rel=next]").isNotEmpty()) + }, + document.select(".pagination a[rel=next]").isNotEmpty() + ) } // Guess thumbnails on broken websites @@ -364,39 +370,43 @@ open class MyMangaReaderCMSSource( } override fun pageListParse(response: Response) = response.asJsoup().select("#all > .img-responsive") - .mapIndexed { i, e -> - var url = (if (e.hasAttr("data-src")) e.attr("abs:data-src") else e.attr("abs:src")).trim() + .mapIndexed { i, e -> + var url = (if (e.hasAttr("data-src")) e.attr("abs:data-src") else e.attr("abs:src")).trim() - // Mangas.pw encodes some of their urls, decode them - if (name.contains("Mangas.pw") && !url.contains(".")) { - url = Base64.decode(url.substringAfter("//"), Base64.DEFAULT).toString(Charsets.UTF_8).substringBefore("=") - url = URLDecoder.decode(url, "UTF-8") - } - - Page(i, "", url) + // Mangas.pw encodes some of their urls, decode them + if (name.contains("Mangas.pw") && !url.contains(".")) { + url = Base64.decode(url.substringAfter("//"), Base64.DEFAULT).toString(Charsets.UTF_8).substringBefore("=") + url = URLDecoder.decode(url, "UTF-8") } + Page(i, "", url) + } + override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("Unused method called!") private fun getInitialFilterList() = listOf<Filter<*>>( - Filter.Header("NOTE: Ignored if using text search!"), - Filter.Separator(), - AuthorFilter(), - UriSelectFilter("Category", - "cat", - arrayOf("" to "Any", - *categoryMappings.toTypedArray() - ) - ), - UriSelectFilter("Begins with", - "alpha", - arrayOf("" to "Any", - *"#ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray().map { - Pair(it.toString(), it.toString()) - }.toTypedArray() - ) - ), - SortFilter() + Filter.Header("NOTE: Ignored if using text search!"), + Filter.Separator(), + AuthorFilter(), + UriSelectFilter( + "Category", + "cat", + arrayOf( + "" to "Any", + *categoryMappings.toTypedArray() + ) + ), + UriSelectFilter( + "Begins with", + "alpha", + arrayOf( + "" to "Any", + *"#ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray().map { + Pair(it.toString(), it.toString()) + }.toTypedArray() + ) + ), + SortFilter() ) /** @@ -406,11 +416,16 @@ open class MyMangaReaderCMSSource( return when { name == "Mangas.pw" -> FilterList() tagMappings != null -> { - FilterList(getInitialFilterList() + UriSelectFilter("Tag", - "tag", - arrayOf("" to "Any", - *tagMappings.toTypedArray() - ))) + FilterList( + getInitialFilterList() + UriSelectFilter( + "Tag", + "tag", + arrayOf( + "" to "Any", + *tagMappings.toTypedArray() + ) + ) + ) } else -> FilterList(getInitialFilterList()) } @@ -429,7 +444,7 @@ open class MyMangaReaderCMSSource( private val firstIsUnspecified: Boolean = true, defaultValue: Int = 0 ) : - Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter { + Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter { override fun addToUri(uri: Uri.Builder) { if (state != 0 || !firstIsUnspecified) uri.appendQueryParameter(uriParam, vals[state].first) @@ -442,9 +457,13 @@ open class MyMangaReaderCMSSource( } } - class SortFilter : Filter.Sort("Sort", + class SortFilter : + Filter.Sort( + "Sort", sortables.map { it.second }.toTypedArray(), - Selection(0, true)), UriFilter { + Selection(0, true) + ), + UriFilter { override fun addToUri(uri: Uri.Builder) { uri.appendQueryParameter("sortBy", sortables[state!!.index].first) uri.appendQueryParameter("asc", state!!.ascending.toString()) @@ -452,9 +471,9 @@ open class MyMangaReaderCMSSource( companion object { private val sortables = arrayOf( - "name" to "Name", - "views" to "Popularity", - "last_release" to "Last update" + "name" to "Name", + "views" to "Popularity", + "last_release" to "Last update" ) } } diff --git a/src/all/myreadingmanga/src/eu/kanade/tachiyomi/extension/all/myreadingmanga/MyReadingManga.kt b/src/all/myreadingmanga/src/eu/kanade/tachiyomi/extension/all/myreadingmanga/MyReadingManga.kt index 92e292ef2..2fc471020 100644 --- a/src/all/myreadingmanga/src/eu/kanade/tachiyomi/extension/all/myreadingmanga/MyReadingManga.kt +++ b/src/all/myreadingmanga/src/eu/kanade/tachiyomi/extension/all/myreadingmanga/MyReadingManga.kt @@ -13,9 +13,6 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.CacheControl import okhttp3.Headers import okhttp3.OkHttpClient @@ -24,6 +21,9 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit open class MyReadingManga(override val lang: String, private val siteLang: String, private val latestLang: String) : ParsedHttpSource() { @@ -159,8 +159,12 @@ open class MyReadingManga(override val lang: String, private val siteLang: Strin } if (needCover) { - thumbnail_url = getThumbnail(getImage(client.newCall(GET("$baseUrl/search/?search=${document.location()}", headers)) - .execute().asJsoup().select("div.wdm_results div.p_content img").first())) + thumbnail_url = getThumbnail( + getImage( + client.newCall(GET("$baseUrl/search/?search=${document.location()}", headers)) + .execute().asJsoup().select("div.wdm_results div.p_content img").first() + ) + ) } } } diff --git a/src/all/nhentai/src/eu/kanade/tachiyomi/extension/all/nhentai/NHUtils.kt b/src/all/nhentai/src/eu/kanade/tachiyomi/extension/all/nhentai/NHUtils.kt index 8a2d0f97c..020fb151b 100644 --- a/src/all/nhentai/src/eu/kanade/tachiyomi/extension/all/nhentai/NHUtils.kt +++ b/src/all/nhentai/src/eu/kanade/tachiyomi/extension/all/nhentai/NHUtils.kt @@ -1,8 +1,8 @@ package eu.kanade.tachiyomi.extension.all.nhentai -import java.text.SimpleDateFormat import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat object NHUtils { fun getArtists(document: Document): String { @@ -57,7 +57,7 @@ object NHUtils { fun getTime(document: Document): Long { val timeString = document.toString().substringAfter("datetime=\"").substringBefore("\">").replace("T", " ") - return SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSZ").parse(timeString).time + return SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSZ").parse(timeString)?.time ?: 0L } private fun Element.cleanTag(): String = text().replace(Regex("\\(.*\\)"), "").trim() diff --git a/src/all/nhentai/src/eu/kanade/tachiyomi/extension/all/nhentai/NHentai.kt b/src/all/nhentai/src/eu/kanade/tachiyomi/extension/all/nhentai/NHentai.kt index e2ff79285..6c025e51d 100644 --- a/src/all/nhentai/src/eu/kanade/tachiyomi/extension/all/nhentai/NHentai.kt +++ b/src/all/nhentai/src/eu/kanade/tachiyomi/extension/all/nhentai/NHentai.kt @@ -251,12 +251,14 @@ open class NHentai( override fun chapterListParse(response: Response): List<SChapter> { val document = response.asJsoup() - return listOf(SChapter.create().apply { - name = "Chapter" - scanlator = getGroups(document) - date_upload = getTime(document) - setUrlWithoutDomain(response.request().url().encodedPath()) - }) + return listOf( + SChapter.create().apply { + name = "Chapter" + scanlator = getGroups(document) + date_upload = getTime(document) + setUrlWithoutDomain(response.request().url().encodedPath()) + } + ) } override fun chapterFromElement(element: Element) = throw UnsupportedOperationException("Not used") diff --git a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NHTags.kt b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NHTags.kt index 33636c9cd..984214805 100644 --- a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NHTags.kt +++ b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NHTags.kt @@ -2,1522 +2,1522 @@ package eu.kanade.tachiyomi.extension.all.ninehentai object NHTags { fun getTagsList() = listOf( - Tag(id = 16712, name = "3d"), - Tag(id = 1054, name = "Abortion"), - Tag(id = 5198, name = "Absorption"), - Tag(id = 3576, name = "Adventitious Penis"), - Tag(id = 9348, name = "Adventitious Vagina"), - Tag(id = 25549, name = "Afro"), - Tag(id = 193, name = "Age Progression"), - Tag(id = 702, name = "Age Regression"), - Tag(id = 214, name = "Ahegao"), - Tag(id = 6636, name = "Albino"), - Tag(id = 10, name = "Alien"), - Tag(id = 1101, name = "Alien Girl"), - Tag(id = 215, name = "All The Way Through"), - Tag(id = 23272, name = "Already Uploaded"), - Tag(id = 288, name = "Amputee"), - Tag(id = 30, name = "Anal"), - Tag(id = 6266, name = "Anal Birth"), - Tag(id = 10530, name = "Animal On Animal"), - Tag(id = 11881, name = "Animal On Furry"), - Tag(id = 17056, name = "Animated"), - Tag(id = 4770, name = "Anorexic"), - Tag(id = 15880, name = "Anthology"), - Tag(id = 24975, name = "Ao No Sunadokei"), - Tag(id = 209, name = "Apron"), - Tag(id = 814, name = "Armpit Licking"), - Tag(id = 815, name = "Armpit Sex"), - Tag(id = 15974, name = "Artbook"), - Tag(id = 1705, name = "Asphyxiation"), - Tag(id = 1755, name = "Ass Expansion"), - Tag(id = 2148, name = "Assjob"), - Tag(id = 24352, name = "Atsushima Tetsuya"), - Tag(id = 673, name = "Aunt"), - Tag(id = 329, name = "Autofellatio"), - Tag(id = 5662, name = "Autopaizuri"), - Tag(id = 602, name = "Bald"), - Tag(id = 1689, name = "Ball Sucking"), - Tag(id = 5558, name = "Balljob"), - Tag(id = 6380, name = "Balls Expansion"), - Tag(id = 19880, name = "Ban Daiki"), - Tag(id = 36, name = "Bandages"), - Tag(id = 3424, name = "Bandaid"), - Tag(id = 16564, name = "Baphomet"), - Tag(id = 65, name = "Bbm"), - Tag(id = 860, name = "Bbw"), - Tag(id = 147, name = "Bdsm"), - Tag(id = 1154, name = "Bear"), - Tag(id = 4259, name = "Bear Boy"), - Tag(id = 2161, name = "Bear Girl"), - Tag(id = 744, name = "Beauty Mark"), - Tag(id = 2349, name = "Bee Girl"), - Tag(id = 25675, name = "Belial"), - Tag(id = 230, name = "Bestiality"), - Tag(id = 768, name = "Big Areolae"), - Tag(id = 175, name = "Big Ass"), - Tag(id = 1979, name = "Big Balls"), - Tag(id = 42, name = "Big Breasts"), - Tag(id = 559, name = "Big Clit"), - Tag(id = 5081, name = "Big Lips"), - Tag(id = 861, name = "Big Nipples"), - Tag(id = 127, name = "Big Penis"), - Tag(id = 5387, name = "Big Vagina"), - Tag(id = 130, name = "Bike Shorts"), - Tag(id = 201, name = "Bikini"), - Tag(id = 284, name = "Birth"), - Tag(id = 121, name = "Bisexual"), - Tag(id = 104, name = "Blackmail"), - Tag(id = 1057, name = "Blind"), - Tag(id = 1004, name = "Blindfold"), - Tag(id = 330, name = "Blood"), - Tag(id = 106, name = "Bloomers"), - Tag(id = 52, name = "Blowjob"), - Tag(id = 2274, name = "Blowjob Face"), - Tag(id = 269, name = "Body Modification"), - Tag(id = 888, name = "Body Painting"), - Tag(id = 5502, name = "Body Swap"), - Tag(id = 3385, name = "Body Writing"), - Tag(id = 4359, name = "Bodystocking"), - Tag(id = 35, name = "Bodysuit"), - Tag(id = 107, name = "Bondage"), - Tag(id = 5101, name = "Brain Fuck"), - Tag(id = 22629, name = "Brave Kingdom"), - Tag(id = 194, name = "Breast Expansion"), - Tag(id = 246, name = "Breast Feeding"), - Tag(id = 2801, name = "Breast Reduction"), - Tag(id = 335, name = "Bride"), - Tag(id = 2216, name = "Brother"), - Tag(id = 25392, name = "Buddly Love"), - Tag(id = 131, name = "Bukkake"), - Tag(id = 561, name = "Bull"), - Tag(id = 16623, name = "Bump Squad Wolfsbane"), - Tag(id = 797, name = "Bunny Boy"), - Tag(id = 76, name = "Bunny Girl"), - Tag(id = 17169, name = "Burn Out Syndrome"), - Tag(id = 14027, name = "Burping"), - Tag(id = 585, name = "Business Suit"), - Tag(id = 16194, name = "Buso"), - Tag(id = 20819, name = "Buta Hormone"), - Tag(id = 1534, name = "Butler"), - Tag(id = 20149, name = "Byoujo No Sho"), - Tag(id = 16605, name = "Cacty"), - Tag(id = 289, name = "Cannibalism"), - Tag(id = 16362, name = "Canvas 2"), - Tag(id = 19114, name = "Capsule"), - Tag(id = 16484, name = "Captain Tsubasa Fcmin Hiroshima"), - Tag(id = 16028, name = "Caption"), - Tag(id = 10130, name = "Cashier"), - Tag(id = 599, name = "Cat"), - Tag(id = 562, name = "Catboy"), - Tag(id = 17122, name = "Catch And Release"), - Tag(id = 3115, name = "Catfight"), - Tag(id = 77, name = "Catgirl"), - Tag(id = 1053, name = "Cbt"), - Tag(id = 25097, name = "Cc6512"), - Tag(id = 2468, name = "Centaur"), - Tag(id = 239, name = "Cervix Penetration"), - Tag(id = 25210, name = "Chakichi"), - Tag(id = 1049, name = "Chastity Belt"), - Tag(id = 17123, name = "Chayamachi Mejiro"), - Tag(id = 211, name = "Cheating"), - Tag(id = 132, name = "Cheerleader"), - Tag(id = 19745, name = "Chihiro Nobuki"), - Tag(id = 20502, name = "Chika Madoka"), - Tag(id = 22943, name = "Chikadoh"), - Tag(id = 533, name = "Chikan"), - Tag(id = 774, name = "Chinese Dress"), - Tag(id = 25058, name = "Chinpo"), - Tag(id = 15911, name = "Chitumatsuriya Honpo"), - Tag(id = 16516, name = "Chloe Wichers"), - Tag(id = 19312, name = "Chloe Withers"), - Tag(id = 148, name = "Chloroform"), - Tag(id = 19538, name = "Chobikuma"), - Tag(id = 18671, name = "Choiki"), - Tag(id = 16987, name = "Chou Shiryu"), - Tag(id = 16075, name = "Chouji Maboroshi"), - Tag(id = 17135, name = "Chouko"), - Tag(id = 22986, name = "Chounyuu For You"), - Tag(id = 23808, name = "Chounyuu Kenkyuushitsu"), - Tag(id = 1598, name = "Christmas"), - Tag(id = 21526, name = "Chrono Nanae"), - Tag(id = 16546, name = "Chu-shin Kuranosuke"), - Tag(id = 19374, name = "Chubold"), - Tag(id = 22053, name = "Chuchu"), - Tag(id = 16443, name = "Chunen"), - Tag(id = 17036, name = "Clalaclan Philias"), - Tag(id = 5840, name = "Clamp"), - Tag(id = 16280, name = "Clara.v"), - Tag(id = 16140, name = "Classmates"), - Tag(id = 1178, name = "Clit Growth"), - Tag(id = 4008, name = "Closed Eyes"), - Tag(id = 2691, name = "Clothed Female Nude Male"), - Tag(id = 8975, name = "Clothed Male Nude Female"), - Tag(id = 5229, name = "Clothed Paizuri"), - Tag(id = 16661, name = "Clown"), - Tag(id = 1044, name = "Coach"), - Tag(id = 5826, name = "Cockslapping"), - Tag(id = 231, name = "Collar"), - Tag(id = 16496, name = "Compilation"), - Tag(id = 179, name = "Condom"), - Tag(id = 13690, name = "Conjoined"), - Tag(id = 3064, name = "Coprophagia"), - Tag(id = 25201, name = "Cor Leonis"), - Tag(id = 22318, name = "Coribou"), - Tag(id = 253, name = "Corruption"), - Tag(id = 796, name = "Corset"), - Tag(id = 527, name = "Cosplaying"), - Tag(id = 674, name = "Cousin"), - Tag(id = 16666, name = "Cousinanon"), - Tag(id = 14293, name = "Cow"), - Tag(id = 564, name = "Cowgirl"), - Tag(id = 7008, name = "Cowman"), - Tag(id = 25442, name = "Creamytea"), - Tag(id = 128, name = "Crossdressing"), - Tag(id = 852, name = "Crotch Tattoo"), - Tag(id = 4034, name = "Crown"), - Tag(id = 17534, name = "Cubetype"), - Tag(id = 4760, name = "Cum Bath"), - Tag(id = 535, name = "Cum In Eye"), - Tag(id = 913, name = "Cum Swap"), - Tag(id = 560, name = "Cunnilingus"), - Tag(id = 10106, name = "Cuntboy"), - Tag(id = 17444, name = "Curo-kun"), - Tag(id = 23878, name = "Cyan Coke"), - Tag(id = 17323, name = "Cynthia B. Rogers"), - Tag(id = 16510, name = "Dabi"), - Tag(id = 18152, name = "Dai Moru Ya"), - Tag(id = 16120, name = "Daiousamajihen"), - Tag(id = 16366, name = "Dakouin Saboru"), - Tag(id = 16008, name = "Danger-j"), - Tag(id = 23670, name = "Darai."), - Tag(id = 1306, name = "Dark Nipples"), - Tag(id = 16662, name = "Dark Princess"), - Tag(id = 3621, name = "Dark Sclera"), - Tag(id = 51, name = "Dark Skin"), - Tag(id = 275, name = "Daughter"), - Tag(id = 16017, name = "De Kirei Yume"), - Tag(id = 20305, name = "Deception Iv"), - Tag(id = 216, name = "Deepthroat"), - Tag(id = 24670, name = "Deer Boy"), - Tag(id = 16956, name = "Deer Girl"), - Tag(id = 67, name = "Defloration"), - Tag(id = 17321, name = "Gyuo"), - Tag(id = 15909, name = "Gyupaibyu"), - Tag(id = 25565, name = "Gyzertoast"), - Tag(id = 16759, name = "Hachikyu"), - Tag(id = 20014, name = "Hachimitsu Ouji"), - Tag(id = 19369, name = "Hadaka"), - Tag(id = 16772, name = "Hadamurasaki"), - Tag(id = 16474, name = "Hagiri"), - Tag(id = 15251, name = "Haigure"), - Tag(id = 2647, name = "Hairjob"), - Tag(id = 336, name = "Hairy"), - Tag(id = 337, name = "Hairy Armpits"), - Tag(id = 17070, name = "Haitenai"), - Tag(id = 22944, name = "Halco"), - Tag(id = 16293, name = "Halftooth"), - Tag(id = 20445, name = "Halkrom"), - Tag(id = 24341, name = "Halsione"), - Tag(id = 15898, name = "Hamu Boshi"), - Tag(id = 17064, name = "Hanaoka"), - Tag(id = 16792, name = "Hanatarou"), - Tag(id = 7088, name = "Handicapped"), - Tag(id = 352, name = "Handjob"), - Tag(id = 15919, name = "Hanzaki Ran"), - Tag(id = 17041, name = "Happy Start"), - Tag(id = 16376, name = "Haraheridou"), - Tag(id = 16954, name = "Harapeko Manbou"), - Tag(id = 20423, name = "Harazumi Tami"), - Tag(id = 16189, name = "Haredou"), - Tag(id = 270, name = "Harem"), - Tag(id = 16115, name = "Harenchi Noon"), - Tag(id = 22137, name = "Hareta"), - Tag(id = 15877, name = "Harimaro"), - Tag(id = 3468, name = "Harness"), - Tag(id = 616, name = "Harpy"), - Tag(id = 17537, name = "Hatomile"), - Tag(id = 16483, name = "Hayase Hidekazu"), - Tag(id = 17473, name = "Hayato Shibusawa"), - Tag(id = 16736, name = "Heart Core"), - Tag(id = 17552, name = "Hebun Irebun"), - Tag(id = 24170, name = "Hemu"), - Tag(id = 15905, name = "Henachokopinkizu"), - Tag(id = 16183, name = "Hentai B"), - Tag(id = 16072, name = "Hentai The Radical"), - Tag(id = 21724, name = "Heresy"), - Tag(id = 3527, name = "Heterochromia"), - Tag(id = 19908, name = "Hidamaru"), - Tag(id = 125, name = "Hidden Sex"), - Tag(id = 16164, name = "Hieda No Anana"), - Tag(id = 16165, name = "Hieda No Aya"), - Tag(id = 16005, name = "Hieda Touijin"), - Tag(id = 15907, name = "Higashizato Kirico"), - Tag(id = 18131, name = "Higumax"), - Tag(id = 9356, name = "Hijab"), - Tag(id = 24155, name = "Hikari Kamigishi"), - Tag(id = 16632, name = "Hikari Konohana"), - Tag(id = 15981, name = "Hikaru Hayashi"), - Tag(id = 22492, name = "Hikkin"), - Tag(id = 17457, name = "Hikoushi"), - Tag(id = 17138, name = "Himawari Manjyu"), - Tag(id = 19581, name = "Himitsu No Hanazono"), - Tag(id = 15903, name = "Hina Can"), - Tag(id = 16026, name = "Hiroki Endo"), - Tag(id = 16336, name = "Hisako Ushigami"), - Tag(id = 24708, name = "Hisashi Ryuuto"), - Tag(id = 25200, name = "Hiyori Chan"), - Tag(id = 23351, name = "Hizuki Haruka"), - Tag(id = 16982, name = "Hmp"), - Tag(id = 15978, name = "Hobihobi"), - Tag(id = 15895, name = "Hokuhokutou Ejiputo Gaisha"), - Tag(id = 17246, name = "Homigiwa Ichiyou"), - Tag(id = 15902, name = "Homing Spitz"), - Tag(id = 16256, name = "Honami Majo"), - Tag(id = 21678, name = "Honenuki Chicken."), - Tag(id = 20041, name = "Hong Ban-jang"), - Tag(id = 21465, name = "Hori Makoto"), - Tag(id = 1712, name = "Horns"), - Tag(id = 15899, name = "Horny Animals"), - Tag(id = 17178, name = "Horobi No Michi"), - Tag(id = 234, name = "Horse"), - Tag(id = 1577, name = "Horse Boy"), - Tag(id = 8480, name = "Horse Cock"), - Tag(id = 1578, name = "Horse Girl"), - Tag(id = 1187, name = "Hotpants"), - Tag(id = 15982, name = "How To"), - Tag(id = 202, name = "Huge Breasts"), - Tag(id = 282, name = "Huge Penis"), - Tag(id = 21295, name = "Hui C"), - Tag(id = 1095, name = "Human On Furry"), - Tag(id = 298, name = "Human Pet"), - Tag(id = 753, name = "Humiliation"), - Tag(id = 16216, name = "Husky Guy"), - Tag(id = 16225, name = "Hutamizu Kirin"), - Tag(id = 20991, name = "Hyakuhachi Kyoukai"), - Tag(id = 17315, name = "Hys"), - Tag(id = 24780, name = "Ibarad"), - Tag(id = 16238, name = "Ibaraki Kasen"), - Tag(id = 16711, name = "Ice Lee"), - Tag(id = 16105, name = "Ichinensei Ni Nacchattara"), - Tag(id = 21720, name = "Idumi"), - Tag(id = 15874, name = "If Code"), - Tag(id = 18986, name = "Iiniku Ushijima"), - Tag(id = 17229, name = "Iisuke"), - Tag(id = 16788, name = "Ikebukuro"), - Tag(id = 15998, name = "Ikenie Seminar"), - Tag(id = 16339, name = "Im Dal-young"), - Tag(id = 15973, name = "Immoral Maika"), - Tag(id = 220, name = "Impregnation"), - Tag(id = 18800, name = "Inazuma Blade"), - Tag(id = 203, name = "Incest"), - Tag(id = 15868, name = "Incomplete"), - Tag(id = 8840, name = "Infantilism"), - Tag(id = 221, name = "Inflation"), - Tag(id = 21709, name = "Inijio"), - Tag(id = 17962, name = "Inner Moka"), - Tag(id = 16144, name = "Inoue"), - Tag(id = 236, name = "Insect"), - Tag(id = 4648, name = "Insect Boy"), - Tag(id = 2469, name = "Insect Girl"), - Tag(id = 1252, name = "Inseki"), - Tag(id = 16978, name = "Inugoya Kakko Kari"), - Tag(id = 22358, name = "Inuguro Sansei"), - Tag(id = 24207, name = "Inui Achu"), - Tag(id = 24994, name = "Inunabe"), - Tag(id = 23760, name = "Inuzuka Koutarou"), - Tag(id = 242, name = "Inverted Nipples"), - Tag(id = 1424, name = "Invisible"), - Tag(id = 20910, name = "Ireading"), - Tag(id = 18318, name = "Irukukwu"), - Tag(id = 16885, name = "Isana Tachibana"), - Tag(id = 16498, name = "Isobe Mutsumi"), - Tag(id = 16276, name = "Issei Ryuudou"), - Tag(id = 16701, name = "Itigosizu Eri Natsume"), - Tag(id = 17005, name = "Itomari"), - Tag(id = 15975, name = "Itsuki Sayaka"), - Tag(id = 23386, name = "Iwapero"), - Tag(id = 16142, name = "Izawa"), - Tag(id = 25181, name = "Izu"), - Tag(id = 17556, name = "Izumi-s"), - Tag(id = 21941, name = "Izumida Touichirou"), - Tag(id = 16468, name = "Jace Beleren"), - Tag(id = 19082, name = "Jack O Lantern"), - Tag(id = 16157, name = "Jaga Note"), - Tag(id = 16942, name = "Jake Muller"), - Tag(id = 16321, name = "Jibakurei"), - Tag(id = 25577, name = "Jiggly Toons"), - Tag(id = 17156, name = "Jika"), - Tag(id = 19874, name = "Joe Hasegawa"), - Tag(id = 17324, name = "Johnny-do"), - Tag(id = 16774, name = "Johnnys Jimusho"), - Tag(id = 16950, name = "Jomy Marquis Shin"), - Tag(id = 16263, name = "Jonokuchi Joji"), - Tag(id = 18310, name = "Jony"), - Tag(id = 18990, name = "Jonylaser R"), - Tag(id = 17778, name = "Joso No Oji-sama"), - Tag(id = 2231, name = "Josou Seme"), - Tag(id = 24084, name = "Jsc"), - Tag(id = 16495, name = "Juana"), - Tag(id = 16222, name = "Jun686"), - Tag(id = 23865, name = "Junior"), - Tag(id = 16625, name = "Junjou Kurarimondo"), - Tag(id = 22065, name = "Junkie Daijin"), - Tag(id = 16078, name = "Juuichijou"), - Tag(id = 20745, name = "Juurokurou"), - Tag(id = 23758, name = "K.tomo"), - Tag(id = 15984, name = "K.z.z."), - Tag(id = 15985, name = "K.z.z. Force"), - Tag(id = 15986, name = "K.z.z. Gundan"), - Tag(id = 17660, name = "K2tomonokai"), - Tag(id = 22223, name = "Kabi Killer"), - Tag(id = 17227, name = "Kabutomaru Choko"), - Tag(id = 24023, name = "Kadarinka"), - Tag(id = 23374, name = "Kagayakitei"), - Tag(id = 16267, name = "Kagehara Hanzow"), - Tag(id = 16976, name = "Kagura Heki"), - Tag(id = 19909, name = "Kaijuu"), - Tag(id = 18440, name = "Kaishou Nachi"), - Tag(id = 17147, name = "Kaitouchuu."), - Tag(id = 23508, name = "Kakeyu"), - Tag(id = 16584, name = "Kamadoya"), - Tag(id = 21085, name = "Kamatsukatei"), - Tag(id = 20255, name = "Kamiaya"), - Tag(id = 16315, name = "Kaminobe"), - Tag(id = 16316, name = "Kaminobe Kanon"), - Tag(id = 18528, name = "Kamiomi Tsukuyomi"), - Tag(id = 16606, name = "Kamo Nabako"), - Tag(id = 17155, name = "Kaname Itsuki"), - Tag(id = 16274, name = "Kanatofu"), - Tag(id = 23940, name = "Kancho"), - Tag(id = 15912, name = "Kankuro"), - Tag(id = 18378, name = "Kannagi No Tori"), - Tag(id = 24265, name = "Kano Yattsu Hashi"), - Tag(id = 16826, name = "Kanran Okawa"), - Tag(id = 18818, name = "Kanu Uncho"), - Tag(id = 5660, name = "Kappa"), - Tag(id = 21307, name = "Kare-nidaikon"), - Tag(id = 24171, name = "Karhu"), - Tag(id = 17168, name = "Kasai Yukiha"), - Tag(id = 18360, name = "Kashinopon"), - Tag(id = 16519, name = "Katanashi Apollo"), - Tag(id = 19616, name = "Katou Setsuko"), - Tag(id = 16831, name = "Katsumi Liqueur"), - Tag(id = 21010, name = "Kawada"), - Tag(id = 16456, name = "Kawakita Hiroyuki"), - Tag(id = 16850, name = "Kazemichi"), - Tag(id = 15892, name = "Kazoku Yuugi"), - Tag(id = 24881, name = "Kazumi Araiwa"), - Tag(id = 15956, name = "Kdft"), - Tag(id = 23717, name = "Kebiishi"), - Tag(id = 15972, name = "Keikihei"), - Tag(id = 15878, name = "Keitaro Arima"), - Tag(id = 80, name = "Kemonomimi"), - Tag(id = 16979, name = "Kemonoskey"), - Tag(id = 16557, name = "Ken Fudou"), - Tag(id = 23880, name = "Kenesco"), - Tag(id = 23881, name = "Kenesu"), - Tag(id = 16558, name = "Kenn Fudou"), - Tag(id = 20769, name = "Kenta Yumiya"), - Tag(id = 25043, name = "Kichihachi"), - Tag(id = 21547, name = "Kien-biu"), - Tag(id = 1155, name = "Kigurumi"), - Tag(id = 16633, name = "Kimiaki Shirai"), - Tag(id = 16340, name = "Kimkwang-hyun"), - Tag(id = 17199, name = "Kimmie"), - Tag(id = 689, name = "Kimono"), - Tag(id = 16627, name = "Kin-tore"), - Tag(id = 6173, name = "Kindergarten Uniform"), - Tag(id = 16761, name = "Kinkaku"), - Tag(id = 17116, name = "Kinmechou Pinku"), - Tag(id = 22920, name = "Kinnataro"), - Tag(id = 16834, name = "Kino Asana"), - Tag(id = 22586, name = "Kinomiya Yutaka"), - Tag(id = 17842, name = "Kira Asamiya"), - Tag(id = 16671, name = "Kiri Gami Shima"), - Tag(id = 16672, name = "Kiri Shin Shima"), - Tag(id = 16355, name = "Kirimochi Niwe"), - Tag(id = 724, name = "Kissing"), - Tag(id = 16793, name = "Kitamakura"), - Tag(id = 18682, name = "Kitou Chimata"), - Tag(id = 25255, name = "Kitsunekov"), - Tag(id = 3473, name = "Kneepit Sex"), - Tag(id = 21820, name = "Kobamiso"), - Tag(id = 17109, name = "Koboshi"), - Tag(id = 21384, name = "Kohako"), - Tag(id = 16141, name = "Kohe"), - Tag(id = 18298, name = "Koi Mo Mata Utau"), - Tag(id = 17325, name = "Koikuchikinako"), - Tag(id = 25612, name = "Kokitsuma"), - Tag(id = 15896, name = "Kokuritsu Shounen"), - Tag(id = 16678, name = "Kokuryu"), - Tag(id = 17267, name = "Kokuto Nikke"), - Tag(id = 23694, name = "Konakona"), - Tag(id = 23872, name = "Konbu Kyoudai"), - Tag(id = 23151, name = "Konezu"), - Tag(id = 16851, name = "Konno Kita"), - Tag(id = 16949, name = "Konoka"), - Tag(id = 16306, name = "Koridorasu"), - Tag(id = 19523, name = "Kotarou Katsura"), - Tag(id = 16922, name = "Kotoe"), - Tag(id = 19555, name = "Kou-chan"), - Tag(id = 18799, name = "Koube Iori"), - Tag(id = 17278, name = "Kozo Youhei"), - Tag(id = 21828, name = "Kozountoko"), - Tag(id = 15901, name = "Kudara Naizo"), - Tag(id = 16424, name = "Kumazaki Satoru"), - Tag(id = 17658, name = "Kunisaki"), - Tag(id = 377, name = "Kunoichi"), - Tag(id = 24057, name = "Kuntakku"), - Tag(id = 16870, name = "Kurajin"), - Tag(id = 17086, name = "Kurazushi"), - Tag(id = 24069, name = "Kurenai Okome"), - Tag(id = 19039, name = "Kurokami Kujika"), - Tag(id = 22340, name = "Kuromaru"), - Tag(id = 17215, name = "Kuromoinu No Kemono"), - Tag(id = 16138, name = "Kuroshiro"), - Tag(id = 17002, name = "Kurumigi Kurumi"), - Tag(id = 20608, name = "Kuryu Josai"), - Tag(id = 20395, name = "Kusogaki Teikoku"), - Tag(id = 20572, name = "Kusoge"), - Tag(id = 24249, name = "Kussie"), - Tag(id = 23474, name = "Kusu"), - Tag(id = 16114, name = "Kuu"), - Tag(id = 16695, name = "Kuukaku"), - Tag(id = 16265, name = "Kyojinkou"), - Tag(id = 19338, name = "Kyojitsu Himaku"), - Tag(id = 20583, name = "Kyoroukan"), - Tag(id = 16955, name = "Kyougoku Akira"), - Tag(id = 212, name = "Lab Coat"), - Tag(id = 204, name = "Lactation"), - Tag(id = 24573, name = "Landstalker"), - Tag(id = 22394, name = "Langley"), - Tag(id = 222, name = "Large Insertions"), - Tag(id = 15925, name = "Largo"), - Tag(id = 75, name = "Latex"), - Tag(id = 1407, name = "Layer Cake"), - Tag(id = 25125, name = "Leash"), - Tag(id = 16341, name = "Lee Soo-hyon"), - Tag(id = 16998, name = "Lee Yo Dong"), - Tag(id = 1647, name = "Leg Lock"), - Tag(id = 7978, name = "Legjob"), - Tag(id = 17052, name = "Lenna"), - Tag(id = 16985, name = "Leon"), - Tag(id = 22295, name = "Leonstar"), - Tag(id = 958, name = "Leotard"), - Tag(id = 16665, name = "Lhytiss"), - Tag(id = 19309, name = "Liangshan Bo"), - Tag(id = 16290, name = "Liaswe No.9"), - Tag(id = 16517, name = "Lillian Ljungstrom"), - Tag(id = 17102, name = "Ling"), - Tag(id = 782, name = "Lingerie"), - Tag(id = 8995, name = "Lion"), - Tag(id = 20966, name = "Lioness"), - Tag(id = 15916, name = "Little Retro"), - Tag(id = 710, name = "Living Clothes"), - Tag(id = 3709, name = "Lizard Girl"), - Tag(id = 2491, name = "Lizard Guy"), - Tag(id = 54, name = "Lolicon"), - Tag(id = 16143, name = "Lolita Core"), - Tag(id = 2742, name = "Long Tongue"), - Tag(id = 25252, name = "Lordkingu"), - Tag(id = 17085, name = "Love Junky"), - Tag(id = 16261, name = "Lovely Kinoko"), - Tag(id = 3681, name = "Low Bestiality"), - Tag(id = 94, name = "Low Lolicon"), - Tag(id = 1938, name = "Low Shotacon"), - Tag(id = 16943, name = "M Company"), - Tag(id = 16541, name = "M Works"), - Tag(id = 16221, name = "M2 Company"), - Tag(id = 23339, name = "Maako Asagiri"), - Tag(id = 16931, name = "Macaroni.e"), - Tag(id = 16957, name = "Machan Nankin"), - Tag(id = 271, name = "Machine"), - Tag(id = 23066, name = "Machino Suteinu"), - Tag(id = 23767, name = "Machio"), - Tag(id = 13273, name = "Maggot"), - Tag(id = 640, name = "Magical Girl"), - Tag(id = 16059, name = "Mahou Shounen Majorian"), - Tag(id = 55, name = "Maid"), - Tag(id = 25194, name = "Maita Keikaku"), - Tag(id = 16243, name = "Majorina"), - Tag(id = 17572, name = "Makamaka Dou"), - Tag(id = 25636, name = "Makeup"), - Tag(id = 16004, name = "Makie Sazaki"), - Tag(id = 24882, name = "Makoto Araiwa"), - Tag(id = 16744, name = "Makoto Sako"), - Tag(id = 15886, name = "Makoto Teteno"), - Tag(id = 22583, name = "Malboro"), - Tag(id = 95, name = "Male On Dickgirl"), - Tag(id = 686, name = "Males Only"), - Tag(id = 19159, name = "Mami Itou"), - Tag(id = 15950, name = "Manaka De Ikuno"), - Tag(id = 25025, name = "Manga Jigoku"), - Tag(id = 16486, name = "Mangetsu Ujiya"), - Tag(id = 16208, name = "Mannmaru"), - Tag(id = 23178, name = "Mao Fa Bao"), - Tag(id = 22921, name = "Maou Kyuu"), - Tag(id = 24668, name = "Mari Tamaki"), - Tag(id = 21395, name = "Marie Ange"), - Tag(id = 19487, name = "Marika Hoshino"), - Tag(id = 20235, name = "Marusuke"), - Tag(id = 19645, name = "Maruya Kae"), - Tag(id = 16437, name = "Mashiba Kenta"), - Tag(id = 118, name = "Masked Face"), - Tag(id = 23319, name = "Master Asia"), - Tag(id = 90, name = "Masturbation"), - Tag(id = 16647, name = "Masuda Aura"), - Tag(id = 23163, name = "Mata Kara Stream"), - Tag(id = 16307, name = "Matsukazon"), - Tag(id = 15891, name = "Matsumoto Mimi"), - Tag(id = 16969, name = "Mazala."), - Tag(id = 16463, name = "Me Ten"), - Tag(id = 21432, name = "Mebaeros"), - Tag(id = 1260, name = "Mecha Boy"), - Tag(id = 1615, name = "Mecha Girl"), - Tag(id = 16932, name = "Medetaya"), - Tag(id = 24450, name = "Meikyukoubou"), - Tag(id = 16825, name = "Melibe Mukade"), - Tag(id = 5329, name = "Menstruation"), - Tag(id = 5201, name = "Mermaid"), - Tag(id = 5341, name = "Merman"), - Tag(id = 25382, name = "Merryweather"), - Tag(id = 959, name = "Metal Armor"), - Tag(id = 24906, name = "Metameta"), - Tag(id = 24907, name = "Metametadan"), - Tag(id = 20406, name = "Metata"), - Tag(id = 16617, name = "Miakis"), - Tag(id = 16429, name = "Michiru Katou"), - Tag(id = 16085, name = "Microgravity"), - Tag(id = 3289, name = "Midget"), - Tag(id = 17027, name = "Midoh Tsukasaa"), - Tag(id = 18452, name = "Mikado Muramasa"), - Tag(id = 18687, name = "Mikado Sensei"), - Tag(id = 17065, name = "Mikage Mika"), - Tag(id = 152, name = "Miko"), - Tag(id = 22689, name = "Mikumo"), - Tag(id = 18023, name = "Mikuni Jiou"), - Tag(id = 16363, name = "Mikupantu"), - Tag(id = 205, name = "Milf"), - Tag(id = 17078, name = "Milfeuille Sakuraba"), - Tag(id = 811, name = "Military"), - Tag(id = 17476, name = "Dekamarasu Scirocco"), - Tag(id = 685, name = "Demon"), - Tag(id = 78, name = "Demon Girl"), - Tag(id = 17023, name = "Deriken"), - Tag(id = 17024, name = "Deriya"), - Tag(id = 16876, name = "Descent Into Darkness"), - Tag(id = 24824, name = "Detention"), - Tag(id = 1151, name = "Diaper"), - Tag(id = 23413, name = "Dic-f41"), - Tag(id = 149, name = "Dick Growth"), - Tag(id = 150, name = "Dickgirl On Dickgirl"), - Tag(id = 16693, name = "Dickgirl On Female"), - Tag(id = 266, name = "Dickgirl On Male"), - Tag(id = 3068, name = "Dickgirls Only"), - Tag(id = 2735, name = "Dicknipples"), - Tag(id = 24289, name = "Digianko"), - Tag(id = 111, name = "Dilf"), - Tag(id = 16926, name = "Dingo Egret"), - Tag(id = 16927, name = "Dingo Igrit"), - Tag(id = 7096, name = "Dinosaur"), - Tag(id = 19202, name = "Dismantling"), - Tag(id = 17018, name = "Doburoki"), - Tag(id = 261, name = "Dog"), - Tag(id = 446, name = "Dog Boy"), - Tag(id = 296, name = "Dog Girl"), - Tag(id = 15889, name = "Dogu Bros."), - Tag(id = 16974, name = "Dojidom"), - Tag(id = 17952, name = "Doku Ninjin"), - Tag(id = 5464, name = "Doll Joints"), - Tag(id = 2506, name = "Dolphin"), - Tag(id = 5665, name = "Donkey"), - Tag(id = 18545, name = "Doppel Gangers"), - Tag(id = 22418, name = "Dorina"), - Tag(id = 22635, name = "Dosukoi"), - Tag(id = 1525, name = "Double Anal"), - Tag(id = 1589, name = "Double Blowjob"), - Tag(id = 133, name = "Double Penetration"), - Tag(id = 17249, name = "Double Sensei Life"), - Tag(id = 217, name = "Double Vaginal"), - Tag(id = 1229, name = "Dougi"), - Tag(id = 16490, name = "Doumeki"), - Tag(id = 5865, name = "Dragon"), - Tag(id = 24209, name = "Drasna"), - Tag(id = 23510, name = "Drawg"), - Tag(id = 19857, name = "Dreamers Fantasy"), - Tag(id = 108, name = "Drugs"), - Tag(id = 775, name = "Drunk"), - Tag(id = 16113, name = "Duga"), - Tag(id = 24408, name = "Eagle Marin"), - Tag(id = 4675, name = "Ear Fuck"), - Tag(id = 19315, name = "Ebio"), - Tag(id = 18286, name = "Ebipan"), - Tag(id = 17371, name = "Ebisuya"), - Tag(id = 1157, name = "Eel"), - Tag(id = 1273, name = "Eggs"), - Tag(id = 23385, name = "Eji"), - Tag(id = 1698, name = "Electric Shocks"), - Tag(id = 24182, name = "Elephant"), - Tag(id = 748, name = "Elf"), - Tag(id = 24369, name = "Elf-san Wa Yaserarenai."), - Tag(id = 16643, name = "Elizaveta Hedervary"), - Tag(id = 16929, name = "Emeralda Etuva"), - Tag(id = 417, name = "Emotionless Sex"), - Tag(id = 17236, name = "Ena Seishuin"), - Tag(id = 17237, name = "Ena Seishuuin"), - Tag(id = 16930, name = "Endou Macaroni"), - Tag(id = 297, name = "Enema"), - Tag(id = 19026, name = "Ero Hon"), - Tag(id = 16815, name = "Erotic Mania"), - Tag(id = 20271, name = "Etk"), - Tag(id = 24870, name = "Etori Yuuya"), - Tag(id = 16417, name = "Ex-driver"), - Tag(id = 17088, name = "Executant"), - Tag(id = 17044, name = "Executional"), - Tag(id = 134, name = "Exhibitionism"), - Tag(id = 16482, name = "Exorcist Miko"), - Tag(id = 1815, name = "Eye Penetration"), - Tag(id = 1699, name = "Eyemask"), - Tag(id = 1227, name = "Eyepatch"), - Tag(id = 20744, name = "Eyo"), - Tag(id = 176, name = "Facesitting"), - Tag(id = 232, name = "Fairy"), - Tag(id = 19301, name = "Farron"), - Tag(id = 974, name = "Farting"), - Tag(id = 1890, name = "Father"), - Tag(id = 16027, name = "Faulklin"), - Tag(id = 16966, name = "Fcnurse"), - Tag(id = 16861, name = "Femal"), - Tag(id = 101, name = "Females Only"), - Tag(id = 240, name = "Femdom"), - Tag(id = 455, name = "Feminization"), - Tag(id = 15865, name = "Ffm Threesome"), - Tag(id = 1406, name = "Fft Threesome"), - Tag(id = 16337, name = "Figure"), - Tag(id = 528, name = "Filming"), - Tag(id = 11, name = "Fingering"), - Tag(id = 23994, name = "Firing Pin"), - Tag(id = 376, name = "First Person Perspective"), - Tag(id = 10947, name = "Fish"), - Tag(id = 13079, name = "Fishnets"), - Tag(id = 218, name = "Fisting"), - Tag(id = 24402, name = "Flaccid"), - Tag(id = 21373, name = "Flamenco Diamond"), - Tag(id = 21374, name = "Flamenco Ruby"), - Tag(id = 21375, name = "Flamenco Sapphire"), - Tag(id = 536, name = "Foot Insertion"), - Tag(id = 502, name = "Foot Licking"), - Tag(id = 355, name = "Footjob"), - Tag(id = 24432, name = "Forbidden Content"), - Tag(id = 514, name = "Forniphilia"), - Tag(id = 9242, name = "Fox"), - Tag(id = 716, name = "Fox Boy"), - Tag(id = 1094, name = "Fox Girl"), - Tag(id = 25605, name = "Foxinshadow"), - Tag(id = 25286, name = "Foxxx321"), - Tag(id = 834, name = "Freckles"), - Tag(id = 22144, name = "Fredrika"), - Tag(id = 5458, name = "Frog"), - Tag(id = 7363, name = "Frog Girl"), - Tag(id = 151, name = "Frottage"), - Tag(id = 23984, name = "Fuji Potato"), - Tag(id = 18059, name = "Fujii Sakuya"), - Tag(id = 18155, name = "Fujikatsupiko"), - Tag(id = 17505, name = "Fujimoto Go"), - Tag(id = 16121, name = "Fujitani Sonami"), - Tag(id = 16421, name = "Fukai Youki"), - Tag(id = 16975, name = "Fukaumi Tadashito"), - Tag(id = 17200, name = "Fukuyama San"), - Tag(id = 791, name = "Full Body Tattoo"), - Tag(id = 24998, name = "Full Censored"), - Tag(id = 15866, name = "Full Censorship"), - Tag(id = 15871, name = "Full Color"), - Tag(id = 17284, name = "Fumotonoya"), - Tag(id = 1439, name = "Fundoshi"), - Tag(id = 563, name = "Furry"), - Tag(id = 20956, name = "Fushimori Tonkatsu"), - Tag(id = 79, name = "Futanari"), - Tag(id = 16756, name = "Futsuka"), - Tag(id = 21620, name = "Fuuka Kazaguruma"), - Tag(id = 17696, name = "Fuuzen No Tomoshibi"), - Tag(id = 16583, name = "Fuwa Kaduki"), - Tag(id = 19171, name = "Fwpa"), - Tag(id = 16828, name = "G-maru Edition"), - Tag(id = 18256, name = "G.to.me"), - Tag(id = 241, name = "Gag"), - Tag(id = 24168, name = "Gakuran"), - Tag(id = 23017, name = "Ganesha"), - Tag(id = 219, name = "Gaping"), - Tag(id = 316, name = "Garter Belt"), - Tag(id = 2778, name = "Gasmask"), - Tag(id = 22826, name = "Gasper Vladi"), - Tag(id = 20741, name = "Gass. Mosa"), - Tag(id = 17257, name = "Gayasabu"), - Tag(id = 21679, name = "Gekidan Futari"), - Tag(id = 267, name = "Gender Bender"), - Tag(id = 15873, name = "Gene Shalit"), - Tag(id = 16913, name = "Genjuro Kazanari"), - Tag(id = 16616, name = "Genso Suikoden"), - Tag(id = 17226, name = "Genso Suikoden 5"), - Tag(id = 17176, name = "Gesho Ichiro"), - Tag(id = 16818, name = "Gevanni"), - Tag(id = 923, name = "Ghost"), - Tag(id = 2744, name = "Giant"), - Tag(id = 1706, name = "Giantess"), - Tag(id = 25288, name = "Giantessamazons"), - Tag(id = 5218, name = "Gigantic Breasts"), - Tag(id = 16236, name = "Gijinka"), - Tag(id = 16760, name = "Ginkaku"), - Tag(id = 16620, name = "Girlchoco"), - Tag(id = 22566, name = "Glamorous Sky"), - Tag(id = 53, name = "Glasses"), - Tag(id = 3976, name = "Glory Hole"), - Tag(id = 9628, name = "Goat"), - Tag(id = 4296, name = "Goblin"), - Tag(id = 17238, name = "Godou Kusanagi"), - Tag(id = 17433, name = "Gogogo"), - Tag(id = 23116, name = "Gohan Oomori"), - Tag(id = 537, name = "Gokkun"), - Tag(id = 21383, name = "Goko"), - Tag(id = 10723, name = "Gorilla"), - Tag(id = 1330, name = "Gothic Lolita"), - Tag(id = 23831, name = "Gozenzeuna"), - Tag(id = 16435, name = "Grace Ishikawa"), - Tag(id = 24086, name = "Grad Lancia"), - Tag(id = 23889, name = "Gragas"), - Tag(id = 1904, name = "Granddaughter"), - Tag(id = 5121, name = "Grandfather"), - Tag(id = 16065, name = "Grandia Iii"), - Tag(id = 4724, name = "Grandmother"), - Tag(id = 17319, name = "Granny Smith"), - Tag(id = 17068, name = "Greek Myth"), - Tag(id = 25439, name = "Groovymidnightshow"), - Tag(id = 23631, name = "Grop"), - Tag(id = 695, name = "Group"), - Tag(id = 7097, name = "Growth"), - Tag(id = 20957, name = "Grpr"), - Tag(id = 34, name = "Guro"), - Tag(id = 1658, name = "Gyaru"), - Tag(id = 4454, name = "Gyaru-oh"), - Tag(id = 156, name = "Gymshorts"), - Tag(id = 17318, name = "Milkcure"), - Tag(id = 243, name = "Milking"), - Tag(id = 16602, name = "Millefiori Firianno Biscotti"), - Tag(id = 23274, name = "Millia"), - Tag(id = 18027, name = "Mimana Orimoto"), - Tag(id = 23225, name = "Mina Shirouto"), - Tag(id = 114, name = "Mind Break"), - Tag(id = 116, name = "Mind Control"), - Tag(id = 3724, name = "Minigirl"), - Tag(id = 5707, name = "Miniguy"), - Tag(id = 4842, name = "Minotaur"), - Tag(id = 23177, name = "Miou Ootori"), - Tag(id = 16345, name = "Mirayia"), - Tag(id = 16018, name = "Missing Cover"), - Tag(id = 21546, name = "Misuke"), - Tag(id = 16377, name = "Mitoukana"), - Tag(id = 19911, name = "Mitsuhide"), - Tag(id = 18486, name = "Mitsuko"), - Tag(id = 22161, name = "Mitsunoho"), - Tag(id = 19284, name = "Miu Otsuki"), - Tag(id = 25514, name = "Miyabe Kiwi"), - Tag(id = 23417, name = "Miyabi Ash"), - Tag(id = 19158, name = "Miyama Yasuhiro"), - Tag(id = 17060, name = "Mizupii"), - Tag(id = 15869, name = "Mmf Threesome"), - Tag(id = 16095, name = "Mmt Threesome"), - Tag(id = 16009, name = "Moeharuka Non"), - Tag(id = 23164, name = "Mohorovicic Matako"), - Tag(id = 23511, name = "Mokechi"), - Tag(id = 23765, name = "Moki"), - Tag(id = 25011, name = "Mokko"), - Tag(id = 22519, name = "Mokkuafunfun"), - Tag(id = 23903, name = "Mokottsu"), - Tag(id = 20625, name = "Momihama"), - Tag(id = 16346, name = "Momoishi"), - Tag(id = 24588, name = "Momoka"), - Tag(id = 16757, name = "Momoya"), - Tag(id = 7567, name = "Monkey"), - Tag(id = 6717, name = "Monoeye"), - Tag(id = 237, name = "Monster"), - Tag(id = 285, name = "Monster Girl"), - Tag(id = 18423, name = "Moon Zero"), - Tag(id = 22080, name = "Moonfishcafe"), - Tag(id = 17059, name = "Moonlight Panic"), - Tag(id = 3028, name = "Moral Degeneration"), - Tag(id = 20001, name = "Mori Udura"), - Tag(id = 22527, name = "Morizoh"), - Tag(id = 15867, name = "Mosaic Censorship"), - Tag(id = 206, name = "Mother"), - Tag(id = 14906, name = "Mouse"), - Tag(id = 734, name = "Mouse Boy"), - Tag(id = 1802, name = "Mouse Girl"), - Tag(id = 15910, name = "Mtf Threesome"), - Tag(id = 17083, name = "Mugen Fiammatta"), - Tag(id = 17124, name = "Mugifumi Tetsudauyo"), - Tag(id = 15863, name = "Multi-work Series"), - Tag(id = 3622, name = "Multiple Arms"), - Tag(id = 272, name = "Multiple Breasts"), - Tag(id = 21176, name = "Multiple Nipples"), - Tag(id = 481, name = "Multiple Paizuri"), - Tag(id = 1100, name = "Multiple Penises"), - Tag(id = 17228, name = "Mune-mune"), - Tag(id = 16884, name = "Muratataichi"), - Tag(id = 119, name = "Muscle"), - Tag(id = 20643, name = "Muscle Growth"), - Tag(id = 2197, name = "Mute"), - Tag(id = 16787, name = "Myon"), - Tag(id = 25638, name = "Myster Box"), - Tag(id = 15929, name = "Mystic Cage"), - Tag(id = 16449, name = "Nabeshima Akira"), - Tag(id = 16912, name = "Nabu Umedama"), - Tag(id = 20729, name = "Nagano-n"), - Tag(id = 16789, name = "Nagumo."), - Tag(id = 12, name = "Nakadashi"), - Tag(id = 20242, name = "Nakate Sae"), - Tag(id = 19813, name = "Nama Wasabi Honten"), - Tag(id = 16852, name = "Namida"), - Tag(id = 15958, name = "Nan"), - Tag(id = 15893, name = "Nanaki"), - Tag(id = 20068, name = "Nanaki Nanatarou"), - Tag(id = 16442, name = "Nanako Todoroki"), - Tag(id = 17096, name = "Nanami-kasuga"), - Tag(id = 15959, name = "Nann"), - Tag(id = 16832, name = "Naono Bokera"), - Tag(id = 16704, name = "Naruga"), - Tag(id = 20996, name = "Naruse Sakei"), - Tag(id = 15885, name = "Nase No Go"), - Tag(id = 22604, name = "Natalie"), - Tag(id = 17012, name = "Natsu An"), - Tag(id = 17158, name = "Natsu No Kumo"), - Tag(id = 15887, name = "Natsumi Takao"), - Tag(id = 16264, name = "Natsune Tachibana"), - Tag(id = 5644, name = "Navel Fuck"), - Tag(id = 1188, name = "Nazi"), - Tag(id = 16819, name = "Near"), - Tag(id = 287, name = "Necrophilia"), - Tag(id = 16123, name = "Negative From The Beginning"), - Tag(id = 17113, name = "Neji Musume"), - Tag(id = 16320, name = "Nekomarudou Honpo"), - Tag(id = 23607, name = "Nekota Shiro"), - Tag(id = 24552, name = "Nekoweapons"), - Tag(id = 16514, name = "Nesshisen"), - Tag(id = 105, name = "Netorare"), - Tag(id = 20880, name = "New Horizon"), - Tag(id = 805, name = "Niece"), - Tag(id = 22906, name = "Nijigen"), - Tag(id = 2822, name = "Ninja"), - Tag(id = 23632, name = "Nintai Akira"), - Tag(id = 10476, name = "Nipple Birth"), - Tag(id = 4719, name = "Nipple Expansion"), - Tag(id = 903, name = "Nipple Fuck"), - Tag(id = 16837, name = "Nishioka Kyoudai"), - Tag(id = 15906, name = "Nishizuki Chikara"), - Tag(id = 17174, name = "Nitta"), - Tag(id = 20829, name = "Nitta Kani"), - Tag(id = 18637, name = "Nizimu Me"), - Tag(id = 16572, name = "No Graffiti"), - Tag(id = 16248, name = "Nomoto Saharu"), - Tag(id = 25482, name = "Non-nude"), - Tag(id = 15983, name = "Nonorumia"), - Tag(id = 17805, name = "Noramushi"), - Tag(id = 25481, name = "Norman Maggot"), - Tag(id = 8273, name = "Nose Fuck"), - Tag(id = 1481, name = "Nose Hook"), - Tag(id = 15955, name = "Notsu"), - Tag(id = 16024, name = "Novel"), - Tag(id = 16155, name = "Nudity Only"), - Tag(id = 16364, name = "Nuko"), - Tag(id = 338, name = "Nun"), - Tag(id = 235, name = "Nurse"), - Tag(id = 18238, name = "Nururyun"), - Tag(id = 17035, name = "Nutmeg"), - Tag(id = 19856, name = "Nyankofujin"), - Tag(id = 22878, name = "Nyansei-fukko"), - Tag(id = 19730, name = "O-ide Riko"), - Tag(id = 19809, name = "Ochazukenori"), - Tag(id = 20689, name = "Ochine"), - Tag(id = 1440, name = "Octopus"), - Tag(id = 16279, name = "Ogiura Tomoko"), - Tag(id = 18991, name = "Ohkawa Aoi"), - Tag(id = 21315, name = "Ohno Kogorou"), - Tag(id = 22307, name = "Oidemase"), - Tag(id = 3088, name = "Oil"), - Tag(id = 24399, name = "Ojo Jotaro"), - Tag(id = 15991, name = "Ojou"), - Tag(id = 20508, name = "Okano Hajimetei"), - Tag(id = 16272, name = "Okayu Club"), - Tag(id = 19112, name = "Okome Takeichi"), - Tag(id = 8946, name = "Old Lady"), - Tag(id = 334, name = "Old Man"), - Tag(id = 22633, name = "Omae Umasou Da Na"), - Tag(id = 16766, name = "Omya"), - Tag(id = 1651, name = "Onahole"), - Tag(id = 1234, name = "Oni"), - Tag(id = 22587, name = "Oono Saeko"), - Tag(id = 18200, name = "Ootaki Miura"), - Tag(id = 17188, name = "Ootsuka Shunji"), - Tag(id = 20717, name = "Ootsuki Kyouko"), - Tag(id = 16151, name = "Oppai Brothers"), - Tag(id = 1013, name = "Oppai Loli"), - Tag(id = 20320, name = "Opq"), - Tag(id = 1650, name = "Orc"), - Tag(id = 17516, name = "Ore P 2-gou"), - Tag(id = 23659, name = "Ore To Kakuni To Abura Soba"), - Tag(id = 457, name = "Orgasm Denial"), - Tag(id = 16585, name = "Oruga Susumu"), - Tag(id = 16947, name = "Orunito"), - Tag(id = 15914, name = "Oshioki Yuki-chan"), - Tag(id = 24995, name = "Osovo"), - Tag(id = 25227, name = "Ostrich"), - Tag(id = 16634, name = "Osuneko Shoukai"), - Tag(id = 17862, name = "Otaku Life Japan"), - Tag(id = 20726, name = "Otome Kibun"), - Tag(id = 16941, name = "Otonano Omochiya"), - Tag(id = 16894, name = "Otosaki Tsubaki"), - Tag(id = 17152, name = "Otoskai Tsubaki"), - Tag(id = 17087, name = "Ototoi No Are"), - Tag(id = 24715, name = "Ougi Production"), - Tag(id = 16122, name = "Ousama Jihen"), - Tag(id = 15861, name = "Out Of Order"), - Tag(id = 23387, name = "Outcount"), - Tag(id = 24808, name = "Outdoor"), - Tag(id = 17133, name = "Outdoors"), - Tag(id = 1334, name = "Oyakodon"), - Tag(id = 16241, name = "Pacifier"), - Tag(id = 183, name = "Paizuri"), - Tag(id = 7823, name = "Panda Girl"), - Tag(id = 25178, name = "Pandaj"), - Tag(id = 22688, name = "Pandaya"), - Tag(id = 10970, name = "Panther"), - Tag(id = 135, name = "Pantyhose"), - Tag(id = 136, name = "Pantyjob"), - Tag(id = 17100, name = "Paopa Ship"), - Tag(id = 827, name = "Parasite"), - Tag(id = 17137, name = "Partial Color"), - Tag(id = 16412, name = "Partially Translated"), - Tag(id = 1516, name = "Pasties"), - Tag(id = 23693, name = "Pecora"), - Tag(id = 456, name = "Pegging"), - Tag(id = 17153, name = "Pekopon Shinryaku Hyougikai"), - Tag(id = 7368, name = "Penis Birth"), - Tag(id = 16563, name = "Peri"), - Tag(id = 2136, name = "Petrification"), - Tag(id = 1515, name = "Phimosis"), - Tag(id = 2432, name = "Phone Sex"), - Tag(id = 18992, name = "Pied A Terre"), - Tag(id = 299, name = "Piercing"), - Tag(id = 600, name = "Pig"), - Tag(id = 5713, name = "Pig Girl"), - Tag(id = 4211, name = "Pig Man"), - Tag(id = 1153, name = "Pillory"), - Tag(id = 7261, name = "Pirate"), - Tag(id = 1674, name = "Piss Drinking"), - Tag(id = 22865, name = "Pisti"), - Tag(id = 793, name = "Plant Girl"), - Tag(id = 22520, name = "Poki"), - Tag(id = 1399, name = "Pole Dancing"), - Tag(id = 1732, name = "Policeman"), - Tag(id = 320, name = "Policewoman"), - Tag(id = 22829, name = "Pometa"), - Tag(id = 3599, name = "Ponygirl"), - Tag(id = 760, name = "Ponytail"), - Tag(id = 15894, name = "Poor Grammar"), - Tag(id = 16310, name = "Poporo"), - Tag(id = 16453, name = "Porunamin C"), - Tag(id = 538, name = "Possession"), - Tag(id = 268, name = "Pregnant"), - Tag(id = 503, name = "Prehensile Hair"), - Tag(id = 11469, name = "Priest"), - Tag(id = 20497, name = "Principal Kuno"), - Tag(id = 25407, name = "Project Physalis"), - Tag(id = 1496, name = "Prolapse"), - Tag(id = 294, name = "Prostate Massage"), - Tag(id = 931, name = "Prostitution"), - Tag(id = 16367, name = "Psycho Soldier"), - Tag(id = 1482, name = "Pubic Stubble"), - Tag(id = 2990, name = "Public Use"), - Tag(id = 16795, name = "Purimu"), - Tag(id = 16250, name = "Purupyon"), - Tag(id = 18500, name = "Pythagora Switch"), - Tag(id = 19115, name = "Quattro"), - Tag(id = 20138, name = "R-otome"), - Tag(id = 17110, name = "Rabbit Revelry Inc."), - Tag(id = 12938, name = "Raccoon Boy"), - Tag(id = 3567, name = "Raccoon Girl"), - Tag(id = 6453, name = "Race Queen"), - Tag(id = 21425, name = "Raichi Hoshimiya"), - Tag(id = 21955, name = "Rajyaki"), - Tag(id = 16139, name = "Rakanka Tiger"), - Tag(id = 23718, name = "Rakuen Tsuihou"), - Tag(id = 15920, name = "Rakugaki Syachu"), - Tag(id = 19071, name = "Randamu"), - Tag(id = 2551, name = "Randoseru"), - Tag(id = 43, name = "Rape"), - Tag(id = 17006, name = "Rati"), - Tag(id = 18186, name = "Rebaudio"), - Tag(id = 23800, name = "Recording"), - Tag(id = 15915, name = "Redraw"), - Tag(id = 17032, name = "Reese"), - Tag(id = 19632, name = "Reisen Two"), - Tag(id = 17270, name = "Remilia"), - Tag(id = 20382, name = "Renekton"), - Tag(id = 15890, name = "Replaced"), - Tag(id = 5574, name = "Reptile"), - Tag(id = 16858, name = "Resi"), - Tag(id = 16257, name = "Retreat"), - Tag(id = 24087, name = "Ricardo Gavarni"), - Tag(id = 16835, name = "Rika Koushu"), - Tag(id = 16836, name = "Rika Kousyu"), - Tag(id = 223, name = "Rimjob"), - Tag(id = 16439, name = "Rinbu"), - Tag(id = 18907, name = "Ringo Koubou"), - Tag(id = 17252, name = "Ritomasu"), - Tag(id = 16659, name = "Rittiri"), - Tag(id = 56, name = "Robot"), - Tag(id = 15872, name = "Rock Dou"), - Tag(id = 24880, name = "Rofu Pukaj"), - Tag(id = 19929, name = "Roudoc 2-gou"), - Tag(id = 15960, name = "Route A"), - Tag(id = 16682, name = "Rurio Nagase"), - Tag(id = 17810, name = "Ryo Yazaki"), - Tag(id = 16481, name = "Ryo-ko"), - Tag(id = 21672, name = "Ryokurin"), - Tag(id = 224, name = "Ryona"), - Tag(id = 17179, name = "Ryouji Sawa"), - Tag(id = 23147, name = "Ryouta Murakami"), - Tag(id = 16365, name = "Ryu Morikawa"), - Tag(id = 16457, name = "Ryuho"), - Tag(id = 16063, name = "Ryuji Kawamoto"), - Tag(id = 16021, name = "Ryuushika"), - Tag(id = 16944, name = "Sabatama Yumi"), - Tag(id = 15897, name = "Sabato Mihashigo"), - Tag(id = 16996, name = "Sabawo 380"), - Tag(id = 16518, name = "Sagasile"), - Tag(id = 16402, name = "Sai Akuto"), - Tag(id = 24085, name = "Saifu"), - Tag(id = 16670, name = "Saikare."), - Tag(id = 17177, name = "Saikoro"), - Tag(id = 17017, name = "Saikyo Tomomi"), - Tag(id = 17146, name = "Sailor Aluminum Siren"), - Tag(id = 16973, name = "Saimin"), - Tag(id = 16013, name = "Saimin Pikatto House"), - Tag(id = 16186, name = "Sakazaki"), - Tag(id = 16252, name = "Saki Watanabe"), - Tag(id = 15883, name = "Sakino Asuka"), - Tag(id = 23322, name = "Sakki Okita"), - Tag(id = 23612, name = "Sakkimita"), - Tag(id = 24437, name = "Sakura Kagamihara"), - Tag(id = 23768, name = "Sakurabobu"), - Tag(id = 423, name = "Saliva"), - Tag(id = 15881, name = "Sammohung"), - Tag(id = 15882, name = "Samohanyunpyou"), - Tag(id = 16125, name = "Sample"), - Tag(id = 15928, name = "Sangokushi Puzzle Taisen"), - Tag(id = 17117, name = "Santa Maria"), - Tag(id = 24336, name = "Sarugaso"), - Tag(id = 16506, name = "Sasara Somae"), - Tag(id = 16694, name = "Sata"), - Tag(id = 16586, name = "Satellite U"), - Tag(id = 16375, name = "Satoshi Sou"), - Tag(id = 16824, name = "Satou Kiyotoshi"), - Tag(id = 23366, name = "Satsuki Marin"), - Tag(id = 20566, name = "Sautsu"), - Tag(id = 19124, name = "Sawara Cashy"), - Tag(id = 16428, name = "Sayuri Hirose"), - Tag(id = 15876, name = "Scanmark"), - Tag(id = 1336, name = "Scar"), - Tag(id = 273, name = "Scat"), - Tag(id = 68, name = "School Swimsuit"), - Tag(id = 22, name = "Schoolboy Uniform"), - Tag(id = 24, name = "Schoolgirl Uniform"), - Tag(id = 17103, name = "Schwarzkatze"), - Tag(id = 17104, name = "Schwarzkratze"), - Tag(id = 6068, name = "Scrotal Lingerie"), - Tag(id = 17224, name = "Seikan Nekoguruma"), - Tag(id = 17995, name = "Sekaiju No Anone"), - Tag(id = 788, name = "Selfcest"), - Tag(id = 17004, name = "Semaru Taiho"), - Tag(id = 16440, name = "Sen Renbu"), - Tag(id = 17171, name = "Senbonzakura"), - Tag(id = 18677, name = "Sendai Oni"), - Tag(id = 23873, name = "Sendaiki"), - Tag(id = 22387, name = "Senhime"), - Tag(id = 17322, name = "Senki Zesshou"), - Tag(id = 17809, name = "Setsuko"), - Tag(id = 109, name = "Sex Toys"), - Tag(id = 16644, name = "Sexual Sunday"), - Tag(id = 16438, name = "Shadow Thorn"), - Tag(id = 331, name = "Shared Senses"), - Tag(id = 20051, name = "Shark"), - Tag(id = 3974, name = "Shark Boy"), - Tag(id = 22443, name = "Sharon"), - Tag(id = 5823, name = "Shaved Head"), - Tag(id = 15652, name = "Sheep Boy"), - Tag(id = 784, name = "Sheep Girl"), - Tag(id = 458, name = "Shemale"), - Tag(id = 25341, name = "Sherwood"), - Tag(id = 21466, name = "Shibainu Lab"), - Tag(id = 321, name = "Shibari"), - Tag(id = 17154, name = "Shichimi Hacchin"), - Tag(id = 23344, name = "Shikiouzi"), - Tag(id = 22907, name = "Shima Shuu"), - Tag(id = 21991, name = "Shimada Hisami"), - Tag(id = 137, name = "Shimapan"), - Tag(id = 16860, name = "Shimotsuki Kairi"), - Tag(id = 22950, name = "Shina Mon"), - Tag(id = 21673, name = "Shinna"), - Tag(id = 18092, name = "Shinomiya Utai"), - Tag(id = 16190, name = "Shinooka Fuku Enchou"), - Tag(id = 20450, name = "Shinoshima Usa"), - Tag(id = 18494, name = "Shinsuke Inue"), - Tag(id = 16822, name = "Shinsuke Nishizono"), - Tag(id = 17370, name = "Shintaro Konno"), - Tag(id = 24070, name = "Shio Onigiri"), - Tag(id = 16451, name = "Shiokaze Kaidou"), - Tag(id = 19727, name = "Shiomeshi"), - Tag(id = 18973, name = "Shirokuma Sato"), - Tag(id = 18720, name = "Shirotakurota"), - Tag(id = 16914, name = "Shirow"), - Tag(id = 17014, name = "Shisaki Tayuu"), - Tag(id = 20045, name = "Shizu Shidou"), - Tag(id = 16014, name = "Short Circuit"), - Tag(id = 66, name = "Shotacon"), - Tag(id = 16970, name = "Shounen Kyouso"), - Tag(id = 18864, name = "Shounen Teacher Group"), - Tag(id = 17053, name = "Shoutai Fumei"), - Tag(id = 17054, name = "Shoutai Humei"), - Tag(id = 711, name = "Shrinking"), - Tag(id = 17130, name = "Shugetsu"), - Tag(id = 22637, name = "Shunju"), - Tag(id = 21905, name = "Shut Hell"), - Tag(id = 23240, name = "Shuuyu Koukin"), - Tag(id = 24355, name = "Sibasaki Koh"), - Tag(id = 15943, name = "Silver Sandial"), - Tag(id = 16041, name = "Sinyati"), - Tag(id = 138, name = "Sister"), - Tag(id = 17329, name = "Sjf"), - Tag(id = 16020, name = "Ski"), - Tag(id = 5877, name = "Skinsuit"), - Tag(id = 19682, name = "Skn"), - Tag(id = 300, name = "Slave"), - Tag(id = 153, name = "Sleeping"), - Tag(id = 1449, name = "Slime"), - Tag(id = 13461, name = "Slime Boy"), - Tag(id = 1408, name = "Slime Girl"), - Tag(id = 22104, name = "Slime King"), - Tag(id = 23847, name = "Slow Masturbation Research Society"), - Tag(id = 4597, name = "Slug"), - Tag(id = 32, name = "Small Breasts"), - Tag(id = 25364, name = "Small Penis"), - Tag(id = 429, name = "Smegma"), - Tag(id = 1254, name = "Smell"), - Tag(id = 3524, name = "Smoking"), - Tag(id = 8672, name = "Snail Girl"), - Tag(id = 4702, name = "Snake"), - Tag(id = 23232, name = "Snake Boy"), - Tag(id = 785, name = "Snake Girl"), - Tag(id = 254, name = "Snuff"), - Tag(id = 6084, name = "Sockjob"), - Tag(id = 16849, name = "Softcel Pictures"), - Tag(id = 16846, name = "Soichiro Arima"), - Tag(id = 81, name = "Sole Dickgirl"), - Tag(id = 25, name = "Sole Female"), - Tag(id = 23, name = "Sole Male"), - Tag(id = 24229, name = "Solefemale"), - Tag(id = 608, name = "Solo Action"), - Tag(id = 18433, name = "Solullaby"), - Tag(id = 23404, name = "Son-son"), - Tag(id = 20256, name = "Sorairo Porin"), - Tag(id = 17197, name = "Sorauta"), - Tag(id = 24446, name = "Southern Emperor"), - Tag(id = 1359, name = "Spanking"), - Tag(id = 23067, name = "Spanner And Camellia"), - Tag(id = 889, name = "Speculum"), - Tag(id = 18061, name = "Speedy"), - Tag(id = 16215, name = "Spicaya"), - Tag(id = 11905, name = "Spider"), - Tag(id = 3623, name = "Spider Girl"), - Tag(id = 16823, name = "Spirit Of Ecsta"), - Tag(id = 16917, name = "Spon"), - Tag(id = 16898, name = "Square Rain"), - Tag(id = 5355, name = "Squid Boy"), - Tag(id = 1582, name = "Squid Girl"), - Tag(id = 7230, name = "Squirrel Girl"), - Tag(id = 786, name = "Squirting"), - Tag(id = 7371, name = "Ssbbm"), - Tag(id = 7093, name = "Ssbbw"), - Tag(id = 23302, name = "Stagger"), - Tag(id = 20756, name = "Staggio Ton-pierohbee"), - Tag(id = 16997, name = "Steevejo"), - Tag(id = 22316, name = "Steward"), - Tag(id = 884, name = "Stewardess"), - Tag(id = 57, name = "Stockings"), - Tag(id = 225, name = "Stomach Deformation"), - Tag(id = 17126, name = "Story Act"), - Tag(id = 15864, name = "Story Arc"), - Tag(id = 139, name = "Strap-on"), - Tag(id = 6576, name = "Stretching"), - Tag(id = 3873, name = "Stuck In Wall"), - Tag(id = 17106, name = "Studio Campus"), - Tag(id = 21909, name = "Studio Crimson"), - Tag(id = 17045, name = "Studio Mxh"), - Tag(id = 20431, name = "Studio Onion"), - Tag(id = 23602, name = "Suckaline"), - Tag(id = 17003, name = "Suda Yuriko"), - Tag(id = 16952, name = "Sui Kayama"), - Tag(id = 16811, name = "Sui Ren"), - Tag(id = 23732, name = "Suidoku"), - Tag(id = 16452, name = "Suina Ruu"), - Tag(id = 17184, name = "Suiranao"), - Tag(id = 17069, name = "Suiseimushi"), - Tag(id = 22021, name = "Sukurinton"), - Tag(id = 140, name = "Sumata"), - Tag(id = 141, name = "Sundress"), - Tag(id = 166, name = "Sunglasses"), - Tag(id = 25589, name = "Super Smash Bros"), - Tag(id = 15904, name = "Supertoasted"), - Tag(id = 16899, name = "Susu Suzumi"), - Tag(id = 16016, name = "Sutazubu-saku"), - Tag(id = 25195, name = "Suzuki Senpai"), - Tag(id = 22531, name = "Suzuki Tenpura"), - Tag(id = 16491, name = "Suzuku Kururugi"), - Tag(id = 16663, name = "Suzumi Yuu"), - Tag(id = 17273, name = "Suzunari"), - Tag(id = 23674, name = "Suzune Arizono"), - Tag(id = 696, name = "Sweating"), - Tag(id = 69, name = "Swimsuit"), - Tag(id = 635, name = "Swinging"), - Tag(id = 1955, name = "Syringe"), - Tag(id = 17011, name = "System Speculation"), - Tag(id = 754, name = "Table Masturbation"), - Tag(id = 19556, name = "Tachinami Takajin"), - Tag(id = 16816, name = "Tadai Yuu"), - Tag(id = 16664, name = "Tae Anezaki"), - Tag(id = 24925, name = "Tae Yamada"), - Tag(id = 17908, name = "Taeko Nonomiya"), - Tag(id = 25425, name = "Tail"), - Tag(id = 1156, name = "Tail Plug"), - Tag(id = 16907, name = "Tail-gun"), - Tag(id = 2861, name = "Tailjob"), - Tag(id = 16464, name = "Taimanin"), - Tag(id = 16465, name = "Taimanin Haiboku"), - Tag(id = 17797, name = "Taiyoushin"), - Tag(id = 20077, name = "Takakujyu"), - Tag(id = 16281, name = "Takakura Row"), - Tag(id = 16742, name = "Takamura Chinatsu"), - Tag(id = 24757, name = "Takatou Kei"), - Tag(id = 23832, name = "Takatsu Rin"), - Tag(id = 18111, name = "Takimoto Yukari"), - Tag(id = 16480, name = "Takoyaki Yoshi"), - Tag(id = 922, name = "Tall Girl"), - Tag(id = 120, name = "Tall Man"), - Tag(id = 16626, name = "Tama Shippo"), - Tag(id = 24669, name = "Tamaki Mari"), - Tag(id = 20900, name = "Tami Nishimikado"), - Tag(id = 23735, name = "Tanken Wa Ra 2"), - Tag(id = 15870, name = "Tankoubon"), - Tag(id = 303, name = "Tanlines"), - Tag(id = 17151, name = "Tanukigirl"), - Tag(id = 22214, name = "Tanukine"), - Tag(id = 16794, name = "Tanuma"), - Tag(id = 16698, name = "Tapir"), - Tag(id = 22323, name = "Tasu"), - Tag(id = 17057, name = "Tat"), - Tag(id = 16821, name = "Tateno Makoto"), - Tag(id = 20524, name = "Tatsuhide"), - Tag(id = 23415, name = "Tayuri"), - Tag(id = 112, name = "Teacher"), - Tag(id = 23459, name = "Tecoya"), - Tag(id = 16158, name = "Tee Crown"), - Tag(id = 25562, name = "Teebsly"), - Tag(id = 16487, name = "Tekorun"), - Tag(id = 22899, name = "Tenjou Shio"), - Tag(id = 196, name = "Tentacles"), - Tag(id = 24136, name = "Tep"), - Tag(id = 16180, name = "Teru-bee"), - Tag(id = 18721, name = "Tetsu Hagane"), - Tag(id = 12900, name = "Thick Eyebrows"), - Tag(id = 769, name = "Thigh High Boots"), - Tag(id = 641, name = "Tiara"), - Tag(id = 2728, name = "Tickling"), - Tag(id = 12085, name = "Tiger"), - Tag(id = 960, name = "Tights"), - Tag(id = 23600, name = "Tigrevurmud Vorn"), - Tag(id = 23173, name = "Tilia"), - Tag(id = 15913, name = "Time Stop"), - Tag(id = 17717, name = "Tobaroku"), - Tag(id = 20550, name = "Tocori"), - Tag(id = 495, name = "Toddlercon"), - Tag(id = 16287, name = "Tohno Hongshi"), - Tag(id = 16785, name = "Tokage 3gou"), - Tag(id = 21710, name = "Tokizawa"), - Tag(id = 20551, name = "Tokori"), - Tag(id = 24137, name = "Tokyo Survivor"), - Tag(id = 16928, name = "Tokyo-ya"), - Tag(id = 19807, name = "Tom Jpn"), - Tag(id = 16595, name = "Tomadoiki"), - Tag(id = 13, name = "Tomboy"), - Tag(id = 129, name = "Tomgirl"), - Tag(id = 25091, name = "Tomobukiya"), - Tag(id = 16226, name = "Tomoko Ogura"), - Tag(id = 15917, name = "Tonboya"), - Tag(id = 16537, name = "Tongue Job"), - Tag(id = 23105, name = "Tooku No Mura"), - Tag(id = 1441, name = "Tooth Brushing"), - Tag(id = 15888, name = "Tooyama Masuko"), - Tag(id = 25256, name = "Toriaezu."), - Tag(id = 752, name = "Torture"), - Tag(id = 17328, name = "Toshinari Arito"), - Tag(id = 25478, name = "Toshkarts"), - Tag(id = 23840, name = "Totomono"), - Tag(id = 22879, name = "Touma Nigou"), - Tag(id = 16946, name = "Toyotomi Hideyoshi"), - Tag(id = 113, name = "Tracksuit"), - Tag(id = 7331, name = "Trampling"), - Tag(id = 195, name = "Transformation"), - Tag(id = 233, name = "Tribadism"), - Tag(id = 5540, name = "Triple Anal"), - Tag(id = 226, name = "Triple Penetration"), - Tag(id = 1526, name = "Triple Vaginal"), - Tag(id = 16765, name = "Try Hougen"), - Tag(id = 23845, name = "Tsujiadon"), - Tag(id = 16106, name = "Tsukasa Kotobuki"), - Tag(id = 16786, name = "Tsukigara Rosshi"), - Tag(id = 16560, name = "Tsukigata Rosshi"), - Tag(id = 23897, name = "Tsuru Kame"), - Tag(id = 15999, name = "Tsurumanjaro"), - Tag(id = 15908, name = "Tsuta Hiroko"), - Tag(id = 18801, name = "Tsuzuki Shiori"), - Tag(id = 792, name = "Ttf Threesome"), - Tag(id = 15875, name = "Ttm Threesome"), - Tag(id = 244, name = "Tube"), - Tag(id = 22694, name = "Turnover"), - Tag(id = 10994, name = "Turtle"), - Tag(id = 780, name = "Tutor"), - Tag(id = 17021, name = "Twin Bell"), - Tag(id = 142, name = "Twins"), - Tag(id = 115, name = "Twintails"), - Tag(id = 23174, name = "Tyria"), - Tag(id = 25109, name = "Tzinnxt"), - Tag(id = 16561, name = "Uekio Aloe"), - Tag(id = 15884, name = "Uesato Takeharu"), - Tag(id = 23739, name = "Ujiro"), - Tag(id = 22521, name = "Umaisake"), - Tag(id = 20106, name = "Ume Kurumizawa"), - Tag(id = 18201, name = "Umetsu Yasuomi"), - Tag(id = 16776, name = "Una777"), - Tag(id = 712, name = "Unbirth"), - Tag(id = 15862, name = "Uncensored"), - Tag(id = 7151, name = "Uncle"), - Tag(id = 286, name = "Underwater"), - Tag(id = 21894, name = "Uni Unio"), - Tag(id = 19786, name = "Unihoge"), - Tag(id = 16292, name = "Unomaa"), - Tag(id = 1517, name = "Unusual Pupils"), - Tag(id = 1565, name = "Unusual Teeth"), - Tag(id = 16432, name = "Urabata"), - Tag(id = 16184, name = "Uragiru Kuchibiru"), - Tag(id = 18434, name = "Urako"), - Tag(id = 227, name = "Urethra Insertion"), - Tag(id = 143, name = "Urination"), - Tag(id = 16624, name = "Uru Fusube In"), - Tag(id = 16945, name = "Usagiro"), - Tag(id = 20522, name = "Ustilago Nuda"), - Tag(id = 17161, name = "Usuk"), - Tag(id = 18665, name = "Utsu Kawaya"), - Tag(id = 6045, name = "Vacbed"), - Tag(id = 2800, name = "Vaginal Sticker"), - Tag(id = 58, name = "Vampire"), - Tag(id = 16948, name = "Variant Set"), - Tag(id = 23976, name = "Virginia Nitouhei"), - Tag(id = 213, name = "Virginity"), - Tag(id = 17046, name = "Viriya"), - Tag(id = 17458, name = "Visual She"), - Tag(id = 228, name = "Vomit"), - Tag(id = 238, name = "Vore"), - Tag(id = 124, name = "Voyeurism"), - Tag(id = 16192, name = "Wada Tomohiro"), - Tag(id = 20686, name = "Waio"), - Tag(id = 2084, name = "Waiter"), - Tag(id = 374, name = "Waitress"), - Tag(id = 15879, name = "Walkure"), - Tag(id = 19824, name = "Wanya Aguda"), - Tag(id = 16645, name = "Warikka"), - Tag(id = 16191, name = "Watanabe Enchou"), - Tag(id = 16212, name = "Watari Naomi"), - Tag(id = 16182, name = "Watermarked"), - Tag(id = 16007, name = "Webtoon"), - Tag(id = 16507, name = "Wedding Ring"), - Tag(id = 1756, name = "Weight Gain"), - Tag(id = 16197, name = "Welkin Gunther"), - Tag(id = 4703, name = "Wet Clothes"), - Tag(id = 3719, name = "Whip"), - Tag(id = 264, name = "Widow"), - Tag(id = 17058, name = "Will Powers"), - Tag(id = 16994, name = "Wingjob"), - Tag(id = 404, name = "Wings"), - Tag(id = 926, name = "Witch"), - Tag(id = 1560, name = "Wolf"), - Tag(id = 2066, name = "Wolf Boy"), - Tag(id = 1551, name = "Wolf Girl"), - Tag(id = 2868, name = "Wooden Horse"), - Tag(id = 828, name = "Worm"), - Tag(id = 332, name = "Wormhole"), - Tag(id = 17066, name = "Wrestle Angels Survivor"), - Tag(id = 1990, name = "Wrestling"), - Tag(id = 17042, name = "X-boy"), - Tag(id = 144, name = "X-ray"), - Tag(id = 20575, name = "Xera"), - Tag(id = 16249, name = "Yada Masaka"), - Tag(id = 16883, name = "Yagami"), - Tag(id = 17084, name = "Yagami Baneri"), - Tag(id = 16967, name = "Yahiko"), - Tag(id = 24447, name = "Yamada Botan"), - Tag(id = 18806, name = "Yamada Kana"), - Tag(id = 17470, name = "Yamada Tasaku"), - Tag(id = 16275, name = "Yamamomo Kajitsu"), - Tag(id = 16511, name = "Yamamoto Hideo"), - Tag(id = 18257, name = "Yamane Akira"), - Tag(id = 16006, name = "Yamane Amano"), - Tag(id = 16877, name = "Yami No Matsuri"), - Tag(id = 968, name = "Yandere"), - Tag(id = 283, name = "Yaoi"), - Tag(id = 23158, name = "Yarou Tomo No Bansankai"), - Tag(id = 16015, name = "Yasou Shigeru"), - Tag(id = 16508, name = "Yasu G"), - Tag(id = 22667, name = "Yasuhara Osamu"), - Tag(id = 23460, name = "Yatsugi Teco"), - Tag(id = 17040, name = "Yokohama-ya"), - Tag(id = 16965, name = "Yokotaya"), - Tag(id = 16273, name = "Yoshiki Aya"), - Tag(id = 17459, name = "Yoshizuki Minoru"), - Tag(id = 16817, name = "Youna"), - Tag(id = 18367, name = "Yousei Kanin"), - Tag(id = 22257, name = "Yshtola"), - Tag(id = 20770, name = "Yu Tendo"), - Tag(id = 16862, name = "Yubel"), - Tag(id = 15997, name = "Yui Narumi"), - Tag(id = 17115, name = "Yukai Sachiko"), - Tag(id = 17850, name = "Yukata Kobayakawa"), - Tag(id = 16117, name = "Yuki Hiiragi"), - Tag(id = 21680, name = "Yukiruru"), - Tag(id = 19205, name = "Yume No Omutsu Kissa"), - Tag(id = 16916, name = "Yumego"), - Tag(id = 16454, name = "Yumemigotoki"), - Tag(id = 17542, name = "Yumesaki Ai"), - Tag(id = 24592, name = "Yumeutsutsu Hideki"), - Tag(id = 15900, name = "Yumiko"), - Tag(id = 16420, name = "Yunisuke"), - Tag(id = 14, name = "Yuri"), - Tag(id = 24046, name = "Yuriyura"), - Tag(id = 17798, name = "Yuugaitosho"), - Tag(id = 16130, name = "Yuugi Yami"), - Tag(id = 20140, name = "Yuzurizaki Nero"), - Tag(id = 20767, name = "Zeitaku Zanmai"), - Tag(id = 24430, name = "Ziggurat"), - Tag(id = 21354, name = "Zinkurou"), - Tag(id = 290, name = "Zombie") + Tag(id = 16712, name = "3d"), + Tag(id = 1054, name = "Abortion"), + Tag(id = 5198, name = "Absorption"), + Tag(id = 3576, name = "Adventitious Penis"), + Tag(id = 9348, name = "Adventitious Vagina"), + Tag(id = 25549, name = "Afro"), + Tag(id = 193, name = "Age Progression"), + Tag(id = 702, name = "Age Regression"), + Tag(id = 214, name = "Ahegao"), + Tag(id = 6636, name = "Albino"), + Tag(id = 10, name = "Alien"), + Tag(id = 1101, name = "Alien Girl"), + Tag(id = 215, name = "All The Way Through"), + Tag(id = 23272, name = "Already Uploaded"), + Tag(id = 288, name = "Amputee"), + Tag(id = 30, name = "Anal"), + Tag(id = 6266, name = "Anal Birth"), + Tag(id = 10530, name = "Animal On Animal"), + Tag(id = 11881, name = "Animal On Furry"), + Tag(id = 17056, name = "Animated"), + Tag(id = 4770, name = "Anorexic"), + Tag(id = 15880, name = "Anthology"), + Tag(id = 24975, name = "Ao No Sunadokei"), + Tag(id = 209, name = "Apron"), + Tag(id = 814, name = "Armpit Licking"), + Tag(id = 815, name = "Armpit Sex"), + Tag(id = 15974, name = "Artbook"), + Tag(id = 1705, name = "Asphyxiation"), + Tag(id = 1755, name = "Ass Expansion"), + Tag(id = 2148, name = "Assjob"), + Tag(id = 24352, name = "Atsushima Tetsuya"), + Tag(id = 673, name = "Aunt"), + Tag(id = 329, name = "Autofellatio"), + Tag(id = 5662, name = "Autopaizuri"), + Tag(id = 602, name = "Bald"), + Tag(id = 1689, name = "Ball Sucking"), + Tag(id = 5558, name = "Balljob"), + Tag(id = 6380, name = "Balls Expansion"), + Tag(id = 19880, name = "Ban Daiki"), + Tag(id = 36, name = "Bandages"), + Tag(id = 3424, name = "Bandaid"), + Tag(id = 16564, name = "Baphomet"), + Tag(id = 65, name = "Bbm"), + Tag(id = 860, name = "Bbw"), + Tag(id = 147, name = "Bdsm"), + Tag(id = 1154, name = "Bear"), + Tag(id = 4259, name = "Bear Boy"), + Tag(id = 2161, name = "Bear Girl"), + Tag(id = 744, name = "Beauty Mark"), + Tag(id = 2349, name = "Bee Girl"), + Tag(id = 25675, name = "Belial"), + Tag(id = 230, name = "Bestiality"), + Tag(id = 768, name = "Big Areolae"), + Tag(id = 175, name = "Big Ass"), + Tag(id = 1979, name = "Big Balls"), + Tag(id = 42, name = "Big Breasts"), + Tag(id = 559, name = "Big Clit"), + Tag(id = 5081, name = "Big Lips"), + Tag(id = 861, name = "Big Nipples"), + Tag(id = 127, name = "Big Penis"), + Tag(id = 5387, name = "Big Vagina"), + Tag(id = 130, name = "Bike Shorts"), + Tag(id = 201, name = "Bikini"), + Tag(id = 284, name = "Birth"), + Tag(id = 121, name = "Bisexual"), + Tag(id = 104, name = "Blackmail"), + Tag(id = 1057, name = "Blind"), + Tag(id = 1004, name = "Blindfold"), + Tag(id = 330, name = "Blood"), + Tag(id = 106, name = "Bloomers"), + Tag(id = 52, name = "Blowjob"), + Tag(id = 2274, name = "Blowjob Face"), + Tag(id = 269, name = "Body Modification"), + Tag(id = 888, name = "Body Painting"), + Tag(id = 5502, name = "Body Swap"), + Tag(id = 3385, name = "Body Writing"), + Tag(id = 4359, name = "Bodystocking"), + Tag(id = 35, name = "Bodysuit"), + Tag(id = 107, name = "Bondage"), + Tag(id = 5101, name = "Brain Fuck"), + Tag(id = 22629, name = "Brave Kingdom"), + Tag(id = 194, name = "Breast Expansion"), + Tag(id = 246, name = "Breast Feeding"), + Tag(id = 2801, name = "Breast Reduction"), + Tag(id = 335, name = "Bride"), + Tag(id = 2216, name = "Brother"), + Tag(id = 25392, name = "Buddly Love"), + Tag(id = 131, name = "Bukkake"), + Tag(id = 561, name = "Bull"), + Tag(id = 16623, name = "Bump Squad Wolfsbane"), + Tag(id = 797, name = "Bunny Boy"), + Tag(id = 76, name = "Bunny Girl"), + Tag(id = 17169, name = "Burn Out Syndrome"), + Tag(id = 14027, name = "Burping"), + Tag(id = 585, name = "Business Suit"), + Tag(id = 16194, name = "Buso"), + Tag(id = 20819, name = "Buta Hormone"), + Tag(id = 1534, name = "Butler"), + Tag(id = 20149, name = "Byoujo No Sho"), + Tag(id = 16605, name = "Cacty"), + Tag(id = 289, name = "Cannibalism"), + Tag(id = 16362, name = "Canvas 2"), + Tag(id = 19114, name = "Capsule"), + Tag(id = 16484, name = "Captain Tsubasa Fcmin Hiroshima"), + Tag(id = 16028, name = "Caption"), + Tag(id = 10130, name = "Cashier"), + Tag(id = 599, name = "Cat"), + Tag(id = 562, name = "Catboy"), + Tag(id = 17122, name = "Catch And Release"), + Tag(id = 3115, name = "Catfight"), + Tag(id = 77, name = "Catgirl"), + Tag(id = 1053, name = "Cbt"), + Tag(id = 25097, name = "Cc6512"), + Tag(id = 2468, name = "Centaur"), + Tag(id = 239, name = "Cervix Penetration"), + Tag(id = 25210, name = "Chakichi"), + Tag(id = 1049, name = "Chastity Belt"), + Tag(id = 17123, name = "Chayamachi Mejiro"), + Tag(id = 211, name = "Cheating"), + Tag(id = 132, name = "Cheerleader"), + Tag(id = 19745, name = "Chihiro Nobuki"), + Tag(id = 20502, name = "Chika Madoka"), + Tag(id = 22943, name = "Chikadoh"), + Tag(id = 533, name = "Chikan"), + Tag(id = 774, name = "Chinese Dress"), + Tag(id = 25058, name = "Chinpo"), + Tag(id = 15911, name = "Chitumatsuriya Honpo"), + Tag(id = 16516, name = "Chloe Wichers"), + Tag(id = 19312, name = "Chloe Withers"), + Tag(id = 148, name = "Chloroform"), + Tag(id = 19538, name = "Chobikuma"), + Tag(id = 18671, name = "Choiki"), + Tag(id = 16987, name = "Chou Shiryu"), + Tag(id = 16075, name = "Chouji Maboroshi"), + Tag(id = 17135, name = "Chouko"), + Tag(id = 22986, name = "Chounyuu For You"), + Tag(id = 23808, name = "Chounyuu Kenkyuushitsu"), + Tag(id = 1598, name = "Christmas"), + Tag(id = 21526, name = "Chrono Nanae"), + Tag(id = 16546, name = "Chu-shin Kuranosuke"), + Tag(id = 19374, name = "Chubold"), + Tag(id = 22053, name = "Chuchu"), + Tag(id = 16443, name = "Chunen"), + Tag(id = 17036, name = "Clalaclan Philias"), + Tag(id = 5840, name = "Clamp"), + Tag(id = 16280, name = "Clara.v"), + Tag(id = 16140, name = "Classmates"), + Tag(id = 1178, name = "Clit Growth"), + Tag(id = 4008, name = "Closed Eyes"), + Tag(id = 2691, name = "Clothed Female Nude Male"), + Tag(id = 8975, name = "Clothed Male Nude Female"), + Tag(id = 5229, name = "Clothed Paizuri"), + Tag(id = 16661, name = "Clown"), + Tag(id = 1044, name = "Coach"), + Tag(id = 5826, name = "Cockslapping"), + Tag(id = 231, name = "Collar"), + Tag(id = 16496, name = "Compilation"), + Tag(id = 179, name = "Condom"), + Tag(id = 13690, name = "Conjoined"), + Tag(id = 3064, name = "Coprophagia"), + Tag(id = 25201, name = "Cor Leonis"), + Tag(id = 22318, name = "Coribou"), + Tag(id = 253, name = "Corruption"), + Tag(id = 796, name = "Corset"), + Tag(id = 527, name = "Cosplaying"), + Tag(id = 674, name = "Cousin"), + Tag(id = 16666, name = "Cousinanon"), + Tag(id = 14293, name = "Cow"), + Tag(id = 564, name = "Cowgirl"), + Tag(id = 7008, name = "Cowman"), + Tag(id = 25442, name = "Creamytea"), + Tag(id = 128, name = "Crossdressing"), + Tag(id = 852, name = "Crotch Tattoo"), + Tag(id = 4034, name = "Crown"), + Tag(id = 17534, name = "Cubetype"), + Tag(id = 4760, name = "Cum Bath"), + Tag(id = 535, name = "Cum In Eye"), + Tag(id = 913, name = "Cum Swap"), + Tag(id = 560, name = "Cunnilingus"), + Tag(id = 10106, name = "Cuntboy"), + Tag(id = 17444, name = "Curo-kun"), + Tag(id = 23878, name = "Cyan Coke"), + Tag(id = 17323, name = "Cynthia B. Rogers"), + Tag(id = 16510, name = "Dabi"), + Tag(id = 18152, name = "Dai Moru Ya"), + Tag(id = 16120, name = "Daiousamajihen"), + Tag(id = 16366, name = "Dakouin Saboru"), + Tag(id = 16008, name = "Danger-j"), + Tag(id = 23670, name = "Darai."), + Tag(id = 1306, name = "Dark Nipples"), + Tag(id = 16662, name = "Dark Princess"), + Tag(id = 3621, name = "Dark Sclera"), + Tag(id = 51, name = "Dark Skin"), + Tag(id = 275, name = "Daughter"), + Tag(id = 16017, name = "De Kirei Yume"), + Tag(id = 20305, name = "Deception Iv"), + Tag(id = 216, name = "Deepthroat"), + Tag(id = 24670, name = "Deer Boy"), + Tag(id = 16956, name = "Deer Girl"), + Tag(id = 67, name = "Defloration"), + Tag(id = 17321, name = "Gyuo"), + Tag(id = 15909, name = "Gyupaibyu"), + Tag(id = 25565, name = "Gyzertoast"), + Tag(id = 16759, name = "Hachikyu"), + Tag(id = 20014, name = "Hachimitsu Ouji"), + Tag(id = 19369, name = "Hadaka"), + Tag(id = 16772, name = "Hadamurasaki"), + Tag(id = 16474, name = "Hagiri"), + Tag(id = 15251, name = "Haigure"), + Tag(id = 2647, name = "Hairjob"), + Tag(id = 336, name = "Hairy"), + Tag(id = 337, name = "Hairy Armpits"), + Tag(id = 17070, name = "Haitenai"), + Tag(id = 22944, name = "Halco"), + Tag(id = 16293, name = "Halftooth"), + Tag(id = 20445, name = "Halkrom"), + Tag(id = 24341, name = "Halsione"), + Tag(id = 15898, name = "Hamu Boshi"), + Tag(id = 17064, name = "Hanaoka"), + Tag(id = 16792, name = "Hanatarou"), + Tag(id = 7088, name = "Handicapped"), + Tag(id = 352, name = "Handjob"), + Tag(id = 15919, name = "Hanzaki Ran"), + Tag(id = 17041, name = "Happy Start"), + Tag(id = 16376, name = "Haraheridou"), + Tag(id = 16954, name = "Harapeko Manbou"), + Tag(id = 20423, name = "Harazumi Tami"), + Tag(id = 16189, name = "Haredou"), + Tag(id = 270, name = "Harem"), + Tag(id = 16115, name = "Harenchi Noon"), + Tag(id = 22137, name = "Hareta"), + Tag(id = 15877, name = "Harimaro"), + Tag(id = 3468, name = "Harness"), + Tag(id = 616, name = "Harpy"), + Tag(id = 17537, name = "Hatomile"), + Tag(id = 16483, name = "Hayase Hidekazu"), + Tag(id = 17473, name = "Hayato Shibusawa"), + Tag(id = 16736, name = "Heart Core"), + Tag(id = 17552, name = "Hebun Irebun"), + Tag(id = 24170, name = "Hemu"), + Tag(id = 15905, name = "Henachokopinkizu"), + Tag(id = 16183, name = "Hentai B"), + Tag(id = 16072, name = "Hentai The Radical"), + Tag(id = 21724, name = "Heresy"), + Tag(id = 3527, name = "Heterochromia"), + Tag(id = 19908, name = "Hidamaru"), + Tag(id = 125, name = "Hidden Sex"), + Tag(id = 16164, name = "Hieda No Anana"), + Tag(id = 16165, name = "Hieda No Aya"), + Tag(id = 16005, name = "Hieda Touijin"), + Tag(id = 15907, name = "Higashizato Kirico"), + Tag(id = 18131, name = "Higumax"), + Tag(id = 9356, name = "Hijab"), + Tag(id = 24155, name = "Hikari Kamigishi"), + Tag(id = 16632, name = "Hikari Konohana"), + Tag(id = 15981, name = "Hikaru Hayashi"), + Tag(id = 22492, name = "Hikkin"), + Tag(id = 17457, name = "Hikoushi"), + Tag(id = 17138, name = "Himawari Manjyu"), + Tag(id = 19581, name = "Himitsu No Hanazono"), + Tag(id = 15903, name = "Hina Can"), + Tag(id = 16026, name = "Hiroki Endo"), + Tag(id = 16336, name = "Hisako Ushigami"), + Tag(id = 24708, name = "Hisashi Ryuuto"), + Tag(id = 25200, name = "Hiyori Chan"), + Tag(id = 23351, name = "Hizuki Haruka"), + Tag(id = 16982, name = "Hmp"), + Tag(id = 15978, name = "Hobihobi"), + Tag(id = 15895, name = "Hokuhokutou Ejiputo Gaisha"), + Tag(id = 17246, name = "Homigiwa Ichiyou"), + Tag(id = 15902, name = "Homing Spitz"), + Tag(id = 16256, name = "Honami Majo"), + Tag(id = 21678, name = "Honenuki Chicken."), + Tag(id = 20041, name = "Hong Ban-jang"), + Tag(id = 21465, name = "Hori Makoto"), + Tag(id = 1712, name = "Horns"), + Tag(id = 15899, name = "Horny Animals"), + Tag(id = 17178, name = "Horobi No Michi"), + Tag(id = 234, name = "Horse"), + Tag(id = 1577, name = "Horse Boy"), + Tag(id = 8480, name = "Horse Cock"), + Tag(id = 1578, name = "Horse Girl"), + Tag(id = 1187, name = "Hotpants"), + Tag(id = 15982, name = "How To"), + Tag(id = 202, name = "Huge Breasts"), + Tag(id = 282, name = "Huge Penis"), + Tag(id = 21295, name = "Hui C"), + Tag(id = 1095, name = "Human On Furry"), + Tag(id = 298, name = "Human Pet"), + Tag(id = 753, name = "Humiliation"), + Tag(id = 16216, name = "Husky Guy"), + Tag(id = 16225, name = "Hutamizu Kirin"), + Tag(id = 20991, name = "Hyakuhachi Kyoukai"), + Tag(id = 17315, name = "Hys"), + Tag(id = 24780, name = "Ibarad"), + Tag(id = 16238, name = "Ibaraki Kasen"), + Tag(id = 16711, name = "Ice Lee"), + Tag(id = 16105, name = "Ichinensei Ni Nacchattara"), + Tag(id = 21720, name = "Idumi"), + Tag(id = 15874, name = "If Code"), + Tag(id = 18986, name = "Iiniku Ushijima"), + Tag(id = 17229, name = "Iisuke"), + Tag(id = 16788, name = "Ikebukuro"), + Tag(id = 15998, name = "Ikenie Seminar"), + Tag(id = 16339, name = "Im Dal-young"), + Tag(id = 15973, name = "Immoral Maika"), + Tag(id = 220, name = "Impregnation"), + Tag(id = 18800, name = "Inazuma Blade"), + Tag(id = 203, name = "Incest"), + Tag(id = 15868, name = "Incomplete"), + Tag(id = 8840, name = "Infantilism"), + Tag(id = 221, name = "Inflation"), + Tag(id = 21709, name = "Inijio"), + Tag(id = 17962, name = "Inner Moka"), + Tag(id = 16144, name = "Inoue"), + Tag(id = 236, name = "Insect"), + Tag(id = 4648, name = "Insect Boy"), + Tag(id = 2469, name = "Insect Girl"), + Tag(id = 1252, name = "Inseki"), + Tag(id = 16978, name = "Inugoya Kakko Kari"), + Tag(id = 22358, name = "Inuguro Sansei"), + Tag(id = 24207, name = "Inui Achu"), + Tag(id = 24994, name = "Inunabe"), + Tag(id = 23760, name = "Inuzuka Koutarou"), + Tag(id = 242, name = "Inverted Nipples"), + Tag(id = 1424, name = "Invisible"), + Tag(id = 20910, name = "Ireading"), + Tag(id = 18318, name = "Irukukwu"), + Tag(id = 16885, name = "Isana Tachibana"), + Tag(id = 16498, name = "Isobe Mutsumi"), + Tag(id = 16276, name = "Issei Ryuudou"), + Tag(id = 16701, name = "Itigosizu Eri Natsume"), + Tag(id = 17005, name = "Itomari"), + Tag(id = 15975, name = "Itsuki Sayaka"), + Tag(id = 23386, name = "Iwapero"), + Tag(id = 16142, name = "Izawa"), + Tag(id = 25181, name = "Izu"), + Tag(id = 17556, name = "Izumi-s"), + Tag(id = 21941, name = "Izumida Touichirou"), + Tag(id = 16468, name = "Jace Beleren"), + Tag(id = 19082, name = "Jack O Lantern"), + Tag(id = 16157, name = "Jaga Note"), + Tag(id = 16942, name = "Jake Muller"), + Tag(id = 16321, name = "Jibakurei"), + Tag(id = 25577, name = "Jiggly Toons"), + Tag(id = 17156, name = "Jika"), + Tag(id = 19874, name = "Joe Hasegawa"), + Tag(id = 17324, name = "Johnny-do"), + Tag(id = 16774, name = "Johnnys Jimusho"), + Tag(id = 16950, name = "Jomy Marquis Shin"), + Tag(id = 16263, name = "Jonokuchi Joji"), + Tag(id = 18310, name = "Jony"), + Tag(id = 18990, name = "Jonylaser R"), + Tag(id = 17778, name = "Joso No Oji-sama"), + Tag(id = 2231, name = "Josou Seme"), + Tag(id = 24084, name = "Jsc"), + Tag(id = 16495, name = "Juana"), + Tag(id = 16222, name = "Jun686"), + Tag(id = 23865, name = "Junior"), + Tag(id = 16625, name = "Junjou Kurarimondo"), + Tag(id = 22065, name = "Junkie Daijin"), + Tag(id = 16078, name = "Juuichijou"), + Tag(id = 20745, name = "Juurokurou"), + Tag(id = 23758, name = "K.tomo"), + Tag(id = 15984, name = "K.z.z."), + Tag(id = 15985, name = "K.z.z. Force"), + Tag(id = 15986, name = "K.z.z. Gundan"), + Tag(id = 17660, name = "K2tomonokai"), + Tag(id = 22223, name = "Kabi Killer"), + Tag(id = 17227, name = "Kabutomaru Choko"), + Tag(id = 24023, name = "Kadarinka"), + Tag(id = 23374, name = "Kagayakitei"), + Tag(id = 16267, name = "Kagehara Hanzow"), + Tag(id = 16976, name = "Kagura Heki"), + Tag(id = 19909, name = "Kaijuu"), + Tag(id = 18440, name = "Kaishou Nachi"), + Tag(id = 17147, name = "Kaitouchuu."), + Tag(id = 23508, name = "Kakeyu"), + Tag(id = 16584, name = "Kamadoya"), + Tag(id = 21085, name = "Kamatsukatei"), + Tag(id = 20255, name = "Kamiaya"), + Tag(id = 16315, name = "Kaminobe"), + Tag(id = 16316, name = "Kaminobe Kanon"), + Tag(id = 18528, name = "Kamiomi Tsukuyomi"), + Tag(id = 16606, name = "Kamo Nabako"), + Tag(id = 17155, name = "Kaname Itsuki"), + Tag(id = 16274, name = "Kanatofu"), + Tag(id = 23940, name = "Kancho"), + Tag(id = 15912, name = "Kankuro"), + Tag(id = 18378, name = "Kannagi No Tori"), + Tag(id = 24265, name = "Kano Yattsu Hashi"), + Tag(id = 16826, name = "Kanran Okawa"), + Tag(id = 18818, name = "Kanu Uncho"), + Tag(id = 5660, name = "Kappa"), + Tag(id = 21307, name = "Kare-nidaikon"), + Tag(id = 24171, name = "Karhu"), + Tag(id = 17168, name = "Kasai Yukiha"), + Tag(id = 18360, name = "Kashinopon"), + Tag(id = 16519, name = "Katanashi Apollo"), + Tag(id = 19616, name = "Katou Setsuko"), + Tag(id = 16831, name = "Katsumi Liqueur"), + Tag(id = 21010, name = "Kawada"), + Tag(id = 16456, name = "Kawakita Hiroyuki"), + Tag(id = 16850, name = "Kazemichi"), + Tag(id = 15892, name = "Kazoku Yuugi"), + Tag(id = 24881, name = "Kazumi Araiwa"), + Tag(id = 15956, name = "Kdft"), + Tag(id = 23717, name = "Kebiishi"), + Tag(id = 15972, name = "Keikihei"), + Tag(id = 15878, name = "Keitaro Arima"), + Tag(id = 80, name = "Kemonomimi"), + Tag(id = 16979, name = "Kemonoskey"), + Tag(id = 16557, name = "Ken Fudou"), + Tag(id = 23880, name = "Kenesco"), + Tag(id = 23881, name = "Kenesu"), + Tag(id = 16558, name = "Kenn Fudou"), + Tag(id = 20769, name = "Kenta Yumiya"), + Tag(id = 25043, name = "Kichihachi"), + Tag(id = 21547, name = "Kien-biu"), + Tag(id = 1155, name = "Kigurumi"), + Tag(id = 16633, name = "Kimiaki Shirai"), + Tag(id = 16340, name = "Kimkwang-hyun"), + Tag(id = 17199, name = "Kimmie"), + Tag(id = 689, name = "Kimono"), + Tag(id = 16627, name = "Kin-tore"), + Tag(id = 6173, name = "Kindergarten Uniform"), + Tag(id = 16761, name = "Kinkaku"), + Tag(id = 17116, name = "Kinmechou Pinku"), + Tag(id = 22920, name = "Kinnataro"), + Tag(id = 16834, name = "Kino Asana"), + Tag(id = 22586, name = "Kinomiya Yutaka"), + Tag(id = 17842, name = "Kira Asamiya"), + Tag(id = 16671, name = "Kiri Gami Shima"), + Tag(id = 16672, name = "Kiri Shin Shima"), + Tag(id = 16355, name = "Kirimochi Niwe"), + Tag(id = 724, name = "Kissing"), + Tag(id = 16793, name = "Kitamakura"), + Tag(id = 18682, name = "Kitou Chimata"), + Tag(id = 25255, name = "Kitsunekov"), + Tag(id = 3473, name = "Kneepit Sex"), + Tag(id = 21820, name = "Kobamiso"), + Tag(id = 17109, name = "Koboshi"), + Tag(id = 21384, name = "Kohako"), + Tag(id = 16141, name = "Kohe"), + Tag(id = 18298, name = "Koi Mo Mata Utau"), + Tag(id = 17325, name = "Koikuchikinako"), + Tag(id = 25612, name = "Kokitsuma"), + Tag(id = 15896, name = "Kokuritsu Shounen"), + Tag(id = 16678, name = "Kokuryu"), + Tag(id = 17267, name = "Kokuto Nikke"), + Tag(id = 23694, name = "Konakona"), + Tag(id = 23872, name = "Konbu Kyoudai"), + Tag(id = 23151, name = "Konezu"), + Tag(id = 16851, name = "Konno Kita"), + Tag(id = 16949, name = "Konoka"), + Tag(id = 16306, name = "Koridorasu"), + Tag(id = 19523, name = "Kotarou Katsura"), + Tag(id = 16922, name = "Kotoe"), + Tag(id = 19555, name = "Kou-chan"), + Tag(id = 18799, name = "Koube Iori"), + Tag(id = 17278, name = "Kozo Youhei"), + Tag(id = 21828, name = "Kozountoko"), + Tag(id = 15901, name = "Kudara Naizo"), + Tag(id = 16424, name = "Kumazaki Satoru"), + Tag(id = 17658, name = "Kunisaki"), + Tag(id = 377, name = "Kunoichi"), + Tag(id = 24057, name = "Kuntakku"), + Tag(id = 16870, name = "Kurajin"), + Tag(id = 17086, name = "Kurazushi"), + Tag(id = 24069, name = "Kurenai Okome"), + Tag(id = 19039, name = "Kurokami Kujika"), + Tag(id = 22340, name = "Kuromaru"), + Tag(id = 17215, name = "Kuromoinu No Kemono"), + Tag(id = 16138, name = "Kuroshiro"), + Tag(id = 17002, name = "Kurumigi Kurumi"), + Tag(id = 20608, name = "Kuryu Josai"), + Tag(id = 20395, name = "Kusogaki Teikoku"), + Tag(id = 20572, name = "Kusoge"), + Tag(id = 24249, name = "Kussie"), + Tag(id = 23474, name = "Kusu"), + Tag(id = 16114, name = "Kuu"), + Tag(id = 16695, name = "Kuukaku"), + Tag(id = 16265, name = "Kyojinkou"), + Tag(id = 19338, name = "Kyojitsu Himaku"), + Tag(id = 20583, name = "Kyoroukan"), + Tag(id = 16955, name = "Kyougoku Akira"), + Tag(id = 212, name = "Lab Coat"), + Tag(id = 204, name = "Lactation"), + Tag(id = 24573, name = "Landstalker"), + Tag(id = 22394, name = "Langley"), + Tag(id = 222, name = "Large Insertions"), + Tag(id = 15925, name = "Largo"), + Tag(id = 75, name = "Latex"), + Tag(id = 1407, name = "Layer Cake"), + Tag(id = 25125, name = "Leash"), + Tag(id = 16341, name = "Lee Soo-hyon"), + Tag(id = 16998, name = "Lee Yo Dong"), + Tag(id = 1647, name = "Leg Lock"), + Tag(id = 7978, name = "Legjob"), + Tag(id = 17052, name = "Lenna"), + Tag(id = 16985, name = "Leon"), + Tag(id = 22295, name = "Leonstar"), + Tag(id = 958, name = "Leotard"), + Tag(id = 16665, name = "Lhytiss"), + Tag(id = 19309, name = "Liangshan Bo"), + Tag(id = 16290, name = "Liaswe No.9"), + Tag(id = 16517, name = "Lillian Ljungstrom"), + Tag(id = 17102, name = "Ling"), + Tag(id = 782, name = "Lingerie"), + Tag(id = 8995, name = "Lion"), + Tag(id = 20966, name = "Lioness"), + Tag(id = 15916, name = "Little Retro"), + Tag(id = 710, name = "Living Clothes"), + Tag(id = 3709, name = "Lizard Girl"), + Tag(id = 2491, name = "Lizard Guy"), + Tag(id = 54, name = "Lolicon"), + Tag(id = 16143, name = "Lolita Core"), + Tag(id = 2742, name = "Long Tongue"), + Tag(id = 25252, name = "Lordkingu"), + Tag(id = 17085, name = "Love Junky"), + Tag(id = 16261, name = "Lovely Kinoko"), + Tag(id = 3681, name = "Low Bestiality"), + Tag(id = 94, name = "Low Lolicon"), + Tag(id = 1938, name = "Low Shotacon"), + Tag(id = 16943, name = "M Company"), + Tag(id = 16541, name = "M Works"), + Tag(id = 16221, name = "M2 Company"), + Tag(id = 23339, name = "Maako Asagiri"), + Tag(id = 16931, name = "Macaroni.e"), + Tag(id = 16957, name = "Machan Nankin"), + Tag(id = 271, name = "Machine"), + Tag(id = 23066, name = "Machino Suteinu"), + Tag(id = 23767, name = "Machio"), + Tag(id = 13273, name = "Maggot"), + Tag(id = 640, name = "Magical Girl"), + Tag(id = 16059, name = "Mahou Shounen Majorian"), + Tag(id = 55, name = "Maid"), + Tag(id = 25194, name = "Maita Keikaku"), + Tag(id = 16243, name = "Majorina"), + Tag(id = 17572, name = "Makamaka Dou"), + Tag(id = 25636, name = "Makeup"), + Tag(id = 16004, name = "Makie Sazaki"), + Tag(id = 24882, name = "Makoto Araiwa"), + Tag(id = 16744, name = "Makoto Sako"), + Tag(id = 15886, name = "Makoto Teteno"), + Tag(id = 22583, name = "Malboro"), + Tag(id = 95, name = "Male On Dickgirl"), + Tag(id = 686, name = "Males Only"), + Tag(id = 19159, name = "Mami Itou"), + Tag(id = 15950, name = "Manaka De Ikuno"), + Tag(id = 25025, name = "Manga Jigoku"), + Tag(id = 16486, name = "Mangetsu Ujiya"), + Tag(id = 16208, name = "Mannmaru"), + Tag(id = 23178, name = "Mao Fa Bao"), + Tag(id = 22921, name = "Maou Kyuu"), + Tag(id = 24668, name = "Mari Tamaki"), + Tag(id = 21395, name = "Marie Ange"), + Tag(id = 19487, name = "Marika Hoshino"), + Tag(id = 20235, name = "Marusuke"), + Tag(id = 19645, name = "Maruya Kae"), + Tag(id = 16437, name = "Mashiba Kenta"), + Tag(id = 118, name = "Masked Face"), + Tag(id = 23319, name = "Master Asia"), + Tag(id = 90, name = "Masturbation"), + Tag(id = 16647, name = "Masuda Aura"), + Tag(id = 23163, name = "Mata Kara Stream"), + Tag(id = 16307, name = "Matsukazon"), + Tag(id = 15891, name = "Matsumoto Mimi"), + Tag(id = 16969, name = "Mazala."), + Tag(id = 16463, name = "Me Ten"), + Tag(id = 21432, name = "Mebaeros"), + Tag(id = 1260, name = "Mecha Boy"), + Tag(id = 1615, name = "Mecha Girl"), + Tag(id = 16932, name = "Medetaya"), + Tag(id = 24450, name = "Meikyukoubou"), + Tag(id = 16825, name = "Melibe Mukade"), + Tag(id = 5329, name = "Menstruation"), + Tag(id = 5201, name = "Mermaid"), + Tag(id = 5341, name = "Merman"), + Tag(id = 25382, name = "Merryweather"), + Tag(id = 959, name = "Metal Armor"), + Tag(id = 24906, name = "Metameta"), + Tag(id = 24907, name = "Metametadan"), + Tag(id = 20406, name = "Metata"), + Tag(id = 16617, name = "Miakis"), + Tag(id = 16429, name = "Michiru Katou"), + Tag(id = 16085, name = "Microgravity"), + Tag(id = 3289, name = "Midget"), + Tag(id = 17027, name = "Midoh Tsukasaa"), + Tag(id = 18452, name = "Mikado Muramasa"), + Tag(id = 18687, name = "Mikado Sensei"), + Tag(id = 17065, name = "Mikage Mika"), + Tag(id = 152, name = "Miko"), + Tag(id = 22689, name = "Mikumo"), + Tag(id = 18023, name = "Mikuni Jiou"), + Tag(id = 16363, name = "Mikupantu"), + Tag(id = 205, name = "Milf"), + Tag(id = 17078, name = "Milfeuille Sakuraba"), + Tag(id = 811, name = "Military"), + Tag(id = 17476, name = "Dekamarasu Scirocco"), + Tag(id = 685, name = "Demon"), + Tag(id = 78, name = "Demon Girl"), + Tag(id = 17023, name = "Deriken"), + Tag(id = 17024, name = "Deriya"), + Tag(id = 16876, name = "Descent Into Darkness"), + Tag(id = 24824, name = "Detention"), + Tag(id = 1151, name = "Diaper"), + Tag(id = 23413, name = "Dic-f41"), + Tag(id = 149, name = "Dick Growth"), + Tag(id = 150, name = "Dickgirl On Dickgirl"), + Tag(id = 16693, name = "Dickgirl On Female"), + Tag(id = 266, name = "Dickgirl On Male"), + Tag(id = 3068, name = "Dickgirls Only"), + Tag(id = 2735, name = "Dicknipples"), + Tag(id = 24289, name = "Digianko"), + Tag(id = 111, name = "Dilf"), + Tag(id = 16926, name = "Dingo Egret"), + Tag(id = 16927, name = "Dingo Igrit"), + Tag(id = 7096, name = "Dinosaur"), + Tag(id = 19202, name = "Dismantling"), + Tag(id = 17018, name = "Doburoki"), + Tag(id = 261, name = "Dog"), + Tag(id = 446, name = "Dog Boy"), + Tag(id = 296, name = "Dog Girl"), + Tag(id = 15889, name = "Dogu Bros."), + Tag(id = 16974, name = "Dojidom"), + Tag(id = 17952, name = "Doku Ninjin"), + Tag(id = 5464, name = "Doll Joints"), + Tag(id = 2506, name = "Dolphin"), + Tag(id = 5665, name = "Donkey"), + Tag(id = 18545, name = "Doppel Gangers"), + Tag(id = 22418, name = "Dorina"), + Tag(id = 22635, name = "Dosukoi"), + Tag(id = 1525, name = "Double Anal"), + Tag(id = 1589, name = "Double Blowjob"), + Tag(id = 133, name = "Double Penetration"), + Tag(id = 17249, name = "Double Sensei Life"), + Tag(id = 217, name = "Double Vaginal"), + Tag(id = 1229, name = "Dougi"), + Tag(id = 16490, name = "Doumeki"), + Tag(id = 5865, name = "Dragon"), + Tag(id = 24209, name = "Drasna"), + Tag(id = 23510, name = "Drawg"), + Tag(id = 19857, name = "Dreamers Fantasy"), + Tag(id = 108, name = "Drugs"), + Tag(id = 775, name = "Drunk"), + Tag(id = 16113, name = "Duga"), + Tag(id = 24408, name = "Eagle Marin"), + Tag(id = 4675, name = "Ear Fuck"), + Tag(id = 19315, name = "Ebio"), + Tag(id = 18286, name = "Ebipan"), + Tag(id = 17371, name = "Ebisuya"), + Tag(id = 1157, name = "Eel"), + Tag(id = 1273, name = "Eggs"), + Tag(id = 23385, name = "Eji"), + Tag(id = 1698, name = "Electric Shocks"), + Tag(id = 24182, name = "Elephant"), + Tag(id = 748, name = "Elf"), + Tag(id = 24369, name = "Elf-san Wa Yaserarenai."), + Tag(id = 16643, name = "Elizaveta Hedervary"), + Tag(id = 16929, name = "Emeralda Etuva"), + Tag(id = 417, name = "Emotionless Sex"), + Tag(id = 17236, name = "Ena Seishuin"), + Tag(id = 17237, name = "Ena Seishuuin"), + Tag(id = 16930, name = "Endou Macaroni"), + Tag(id = 297, name = "Enema"), + Tag(id = 19026, name = "Ero Hon"), + Tag(id = 16815, name = "Erotic Mania"), + Tag(id = 20271, name = "Etk"), + Tag(id = 24870, name = "Etori Yuuya"), + Tag(id = 16417, name = "Ex-driver"), + Tag(id = 17088, name = "Executant"), + Tag(id = 17044, name = "Executional"), + Tag(id = 134, name = "Exhibitionism"), + Tag(id = 16482, name = "Exorcist Miko"), + Tag(id = 1815, name = "Eye Penetration"), + Tag(id = 1699, name = "Eyemask"), + Tag(id = 1227, name = "Eyepatch"), + Tag(id = 20744, name = "Eyo"), + Tag(id = 176, name = "Facesitting"), + Tag(id = 232, name = "Fairy"), + Tag(id = 19301, name = "Farron"), + Tag(id = 974, name = "Farting"), + Tag(id = 1890, name = "Father"), + Tag(id = 16027, name = "Faulklin"), + Tag(id = 16966, name = "Fcnurse"), + Tag(id = 16861, name = "Femal"), + Tag(id = 101, name = "Females Only"), + Tag(id = 240, name = "Femdom"), + Tag(id = 455, name = "Feminization"), + Tag(id = 15865, name = "Ffm Threesome"), + Tag(id = 1406, name = "Fft Threesome"), + Tag(id = 16337, name = "Figure"), + Tag(id = 528, name = "Filming"), + Tag(id = 11, name = "Fingering"), + Tag(id = 23994, name = "Firing Pin"), + Tag(id = 376, name = "First Person Perspective"), + Tag(id = 10947, name = "Fish"), + Tag(id = 13079, name = "Fishnets"), + Tag(id = 218, name = "Fisting"), + Tag(id = 24402, name = "Flaccid"), + Tag(id = 21373, name = "Flamenco Diamond"), + Tag(id = 21374, name = "Flamenco Ruby"), + Tag(id = 21375, name = "Flamenco Sapphire"), + Tag(id = 536, name = "Foot Insertion"), + Tag(id = 502, name = "Foot Licking"), + Tag(id = 355, name = "Footjob"), + Tag(id = 24432, name = "Forbidden Content"), + Tag(id = 514, name = "Forniphilia"), + Tag(id = 9242, name = "Fox"), + Tag(id = 716, name = "Fox Boy"), + Tag(id = 1094, name = "Fox Girl"), + Tag(id = 25605, name = "Foxinshadow"), + Tag(id = 25286, name = "Foxxx321"), + Tag(id = 834, name = "Freckles"), + Tag(id = 22144, name = "Fredrika"), + Tag(id = 5458, name = "Frog"), + Tag(id = 7363, name = "Frog Girl"), + Tag(id = 151, name = "Frottage"), + Tag(id = 23984, name = "Fuji Potato"), + Tag(id = 18059, name = "Fujii Sakuya"), + Tag(id = 18155, name = "Fujikatsupiko"), + Tag(id = 17505, name = "Fujimoto Go"), + Tag(id = 16121, name = "Fujitani Sonami"), + Tag(id = 16421, name = "Fukai Youki"), + Tag(id = 16975, name = "Fukaumi Tadashito"), + Tag(id = 17200, name = "Fukuyama San"), + Tag(id = 791, name = "Full Body Tattoo"), + Tag(id = 24998, name = "Full Censored"), + Tag(id = 15866, name = "Full Censorship"), + Tag(id = 15871, name = "Full Color"), + Tag(id = 17284, name = "Fumotonoya"), + Tag(id = 1439, name = "Fundoshi"), + Tag(id = 563, name = "Furry"), + Tag(id = 20956, name = "Fushimori Tonkatsu"), + Tag(id = 79, name = "Futanari"), + Tag(id = 16756, name = "Futsuka"), + Tag(id = 21620, name = "Fuuka Kazaguruma"), + Tag(id = 17696, name = "Fuuzen No Tomoshibi"), + Tag(id = 16583, name = "Fuwa Kaduki"), + Tag(id = 19171, name = "Fwpa"), + Tag(id = 16828, name = "G-maru Edition"), + Tag(id = 18256, name = "G.to.me"), + Tag(id = 241, name = "Gag"), + Tag(id = 24168, name = "Gakuran"), + Tag(id = 23017, name = "Ganesha"), + Tag(id = 219, name = "Gaping"), + Tag(id = 316, name = "Garter Belt"), + Tag(id = 2778, name = "Gasmask"), + Tag(id = 22826, name = "Gasper Vladi"), + Tag(id = 20741, name = "Gass. Mosa"), + Tag(id = 17257, name = "Gayasabu"), + Tag(id = 21679, name = "Gekidan Futari"), + Tag(id = 267, name = "Gender Bender"), + Tag(id = 15873, name = "Gene Shalit"), + Tag(id = 16913, name = "Genjuro Kazanari"), + Tag(id = 16616, name = "Genso Suikoden"), + Tag(id = 17226, name = "Genso Suikoden 5"), + Tag(id = 17176, name = "Gesho Ichiro"), + Tag(id = 16818, name = "Gevanni"), + Tag(id = 923, name = "Ghost"), + Tag(id = 2744, name = "Giant"), + Tag(id = 1706, name = "Giantess"), + Tag(id = 25288, name = "Giantessamazons"), + Tag(id = 5218, name = "Gigantic Breasts"), + Tag(id = 16236, name = "Gijinka"), + Tag(id = 16760, name = "Ginkaku"), + Tag(id = 16620, name = "Girlchoco"), + Tag(id = 22566, name = "Glamorous Sky"), + Tag(id = 53, name = "Glasses"), + Tag(id = 3976, name = "Glory Hole"), + Tag(id = 9628, name = "Goat"), + Tag(id = 4296, name = "Goblin"), + Tag(id = 17238, name = "Godou Kusanagi"), + Tag(id = 17433, name = "Gogogo"), + Tag(id = 23116, name = "Gohan Oomori"), + Tag(id = 537, name = "Gokkun"), + Tag(id = 21383, name = "Goko"), + Tag(id = 10723, name = "Gorilla"), + Tag(id = 1330, name = "Gothic Lolita"), + Tag(id = 23831, name = "Gozenzeuna"), + Tag(id = 16435, name = "Grace Ishikawa"), + Tag(id = 24086, name = "Grad Lancia"), + Tag(id = 23889, name = "Gragas"), + Tag(id = 1904, name = "Granddaughter"), + Tag(id = 5121, name = "Grandfather"), + Tag(id = 16065, name = "Grandia Iii"), + Tag(id = 4724, name = "Grandmother"), + Tag(id = 17319, name = "Granny Smith"), + Tag(id = 17068, name = "Greek Myth"), + Tag(id = 25439, name = "Groovymidnightshow"), + Tag(id = 23631, name = "Grop"), + Tag(id = 695, name = "Group"), + Tag(id = 7097, name = "Growth"), + Tag(id = 20957, name = "Grpr"), + Tag(id = 34, name = "Guro"), + Tag(id = 1658, name = "Gyaru"), + Tag(id = 4454, name = "Gyaru-oh"), + Tag(id = 156, name = "Gymshorts"), + Tag(id = 17318, name = "Milkcure"), + Tag(id = 243, name = "Milking"), + Tag(id = 16602, name = "Millefiori Firianno Biscotti"), + Tag(id = 23274, name = "Millia"), + Tag(id = 18027, name = "Mimana Orimoto"), + Tag(id = 23225, name = "Mina Shirouto"), + Tag(id = 114, name = "Mind Break"), + Tag(id = 116, name = "Mind Control"), + Tag(id = 3724, name = "Minigirl"), + Tag(id = 5707, name = "Miniguy"), + Tag(id = 4842, name = "Minotaur"), + Tag(id = 23177, name = "Miou Ootori"), + Tag(id = 16345, name = "Mirayia"), + Tag(id = 16018, name = "Missing Cover"), + Tag(id = 21546, name = "Misuke"), + Tag(id = 16377, name = "Mitoukana"), + Tag(id = 19911, name = "Mitsuhide"), + Tag(id = 18486, name = "Mitsuko"), + Tag(id = 22161, name = "Mitsunoho"), + Tag(id = 19284, name = "Miu Otsuki"), + Tag(id = 25514, name = "Miyabe Kiwi"), + Tag(id = 23417, name = "Miyabi Ash"), + Tag(id = 19158, name = "Miyama Yasuhiro"), + Tag(id = 17060, name = "Mizupii"), + Tag(id = 15869, name = "Mmf Threesome"), + Tag(id = 16095, name = "Mmt Threesome"), + Tag(id = 16009, name = "Moeharuka Non"), + Tag(id = 23164, name = "Mohorovicic Matako"), + Tag(id = 23511, name = "Mokechi"), + Tag(id = 23765, name = "Moki"), + Tag(id = 25011, name = "Mokko"), + Tag(id = 22519, name = "Mokkuafunfun"), + Tag(id = 23903, name = "Mokottsu"), + Tag(id = 20625, name = "Momihama"), + Tag(id = 16346, name = "Momoishi"), + Tag(id = 24588, name = "Momoka"), + Tag(id = 16757, name = "Momoya"), + Tag(id = 7567, name = "Monkey"), + Tag(id = 6717, name = "Monoeye"), + Tag(id = 237, name = "Monster"), + Tag(id = 285, name = "Monster Girl"), + Tag(id = 18423, name = "Moon Zero"), + Tag(id = 22080, name = "Moonfishcafe"), + Tag(id = 17059, name = "Moonlight Panic"), + Tag(id = 3028, name = "Moral Degeneration"), + Tag(id = 20001, name = "Mori Udura"), + Tag(id = 22527, name = "Morizoh"), + Tag(id = 15867, name = "Mosaic Censorship"), + Tag(id = 206, name = "Mother"), + Tag(id = 14906, name = "Mouse"), + Tag(id = 734, name = "Mouse Boy"), + Tag(id = 1802, name = "Mouse Girl"), + Tag(id = 15910, name = "Mtf Threesome"), + Tag(id = 17083, name = "Mugen Fiammatta"), + Tag(id = 17124, name = "Mugifumi Tetsudauyo"), + Tag(id = 15863, name = "Multi-work Series"), + Tag(id = 3622, name = "Multiple Arms"), + Tag(id = 272, name = "Multiple Breasts"), + Tag(id = 21176, name = "Multiple Nipples"), + Tag(id = 481, name = "Multiple Paizuri"), + Tag(id = 1100, name = "Multiple Penises"), + Tag(id = 17228, name = "Mune-mune"), + Tag(id = 16884, name = "Muratataichi"), + Tag(id = 119, name = "Muscle"), + Tag(id = 20643, name = "Muscle Growth"), + Tag(id = 2197, name = "Mute"), + Tag(id = 16787, name = "Myon"), + Tag(id = 25638, name = "Myster Box"), + Tag(id = 15929, name = "Mystic Cage"), + Tag(id = 16449, name = "Nabeshima Akira"), + Tag(id = 16912, name = "Nabu Umedama"), + Tag(id = 20729, name = "Nagano-n"), + Tag(id = 16789, name = "Nagumo."), + Tag(id = 12, name = "Nakadashi"), + Tag(id = 20242, name = "Nakate Sae"), + Tag(id = 19813, name = "Nama Wasabi Honten"), + Tag(id = 16852, name = "Namida"), + Tag(id = 15958, name = "Nan"), + Tag(id = 15893, name = "Nanaki"), + Tag(id = 20068, name = "Nanaki Nanatarou"), + Tag(id = 16442, name = "Nanako Todoroki"), + Tag(id = 17096, name = "Nanami-kasuga"), + Tag(id = 15959, name = "Nann"), + Tag(id = 16832, name = "Naono Bokera"), + Tag(id = 16704, name = "Naruga"), + Tag(id = 20996, name = "Naruse Sakei"), + Tag(id = 15885, name = "Nase No Go"), + Tag(id = 22604, name = "Natalie"), + Tag(id = 17012, name = "Natsu An"), + Tag(id = 17158, name = "Natsu No Kumo"), + Tag(id = 15887, name = "Natsumi Takao"), + Tag(id = 16264, name = "Natsune Tachibana"), + Tag(id = 5644, name = "Navel Fuck"), + Tag(id = 1188, name = "Nazi"), + Tag(id = 16819, name = "Near"), + Tag(id = 287, name = "Necrophilia"), + Tag(id = 16123, name = "Negative From The Beginning"), + Tag(id = 17113, name = "Neji Musume"), + Tag(id = 16320, name = "Nekomarudou Honpo"), + Tag(id = 23607, name = "Nekota Shiro"), + Tag(id = 24552, name = "Nekoweapons"), + Tag(id = 16514, name = "Nesshisen"), + Tag(id = 105, name = "Netorare"), + Tag(id = 20880, name = "New Horizon"), + Tag(id = 805, name = "Niece"), + Tag(id = 22906, name = "Nijigen"), + Tag(id = 2822, name = "Ninja"), + Tag(id = 23632, name = "Nintai Akira"), + Tag(id = 10476, name = "Nipple Birth"), + Tag(id = 4719, name = "Nipple Expansion"), + Tag(id = 903, name = "Nipple Fuck"), + Tag(id = 16837, name = "Nishioka Kyoudai"), + Tag(id = 15906, name = "Nishizuki Chikara"), + Tag(id = 17174, name = "Nitta"), + Tag(id = 20829, name = "Nitta Kani"), + Tag(id = 18637, name = "Nizimu Me"), + Tag(id = 16572, name = "No Graffiti"), + Tag(id = 16248, name = "Nomoto Saharu"), + Tag(id = 25482, name = "Non-nude"), + Tag(id = 15983, name = "Nonorumia"), + Tag(id = 17805, name = "Noramushi"), + Tag(id = 25481, name = "Norman Maggot"), + Tag(id = 8273, name = "Nose Fuck"), + Tag(id = 1481, name = "Nose Hook"), + Tag(id = 15955, name = "Notsu"), + Tag(id = 16024, name = "Novel"), + Tag(id = 16155, name = "Nudity Only"), + Tag(id = 16364, name = "Nuko"), + Tag(id = 338, name = "Nun"), + Tag(id = 235, name = "Nurse"), + Tag(id = 18238, name = "Nururyun"), + Tag(id = 17035, name = "Nutmeg"), + Tag(id = 19856, name = "Nyankofujin"), + Tag(id = 22878, name = "Nyansei-fukko"), + Tag(id = 19730, name = "O-ide Riko"), + Tag(id = 19809, name = "Ochazukenori"), + Tag(id = 20689, name = "Ochine"), + Tag(id = 1440, name = "Octopus"), + Tag(id = 16279, name = "Ogiura Tomoko"), + Tag(id = 18991, name = "Ohkawa Aoi"), + Tag(id = 21315, name = "Ohno Kogorou"), + Tag(id = 22307, name = "Oidemase"), + Tag(id = 3088, name = "Oil"), + Tag(id = 24399, name = "Ojo Jotaro"), + Tag(id = 15991, name = "Ojou"), + Tag(id = 20508, name = "Okano Hajimetei"), + Tag(id = 16272, name = "Okayu Club"), + Tag(id = 19112, name = "Okome Takeichi"), + Tag(id = 8946, name = "Old Lady"), + Tag(id = 334, name = "Old Man"), + Tag(id = 22633, name = "Omae Umasou Da Na"), + Tag(id = 16766, name = "Omya"), + Tag(id = 1651, name = "Onahole"), + Tag(id = 1234, name = "Oni"), + Tag(id = 22587, name = "Oono Saeko"), + Tag(id = 18200, name = "Ootaki Miura"), + Tag(id = 17188, name = "Ootsuka Shunji"), + Tag(id = 20717, name = "Ootsuki Kyouko"), + Tag(id = 16151, name = "Oppai Brothers"), + Tag(id = 1013, name = "Oppai Loli"), + Tag(id = 20320, name = "Opq"), + Tag(id = 1650, name = "Orc"), + Tag(id = 17516, name = "Ore P 2-gou"), + Tag(id = 23659, name = "Ore To Kakuni To Abura Soba"), + Tag(id = 457, name = "Orgasm Denial"), + Tag(id = 16585, name = "Oruga Susumu"), + Tag(id = 16947, name = "Orunito"), + Tag(id = 15914, name = "Oshioki Yuki-chan"), + Tag(id = 24995, name = "Osovo"), + Tag(id = 25227, name = "Ostrich"), + Tag(id = 16634, name = "Osuneko Shoukai"), + Tag(id = 17862, name = "Otaku Life Japan"), + Tag(id = 20726, name = "Otome Kibun"), + Tag(id = 16941, name = "Otonano Omochiya"), + Tag(id = 16894, name = "Otosaki Tsubaki"), + Tag(id = 17152, name = "Otoskai Tsubaki"), + Tag(id = 17087, name = "Ototoi No Are"), + Tag(id = 24715, name = "Ougi Production"), + Tag(id = 16122, name = "Ousama Jihen"), + Tag(id = 15861, name = "Out Of Order"), + Tag(id = 23387, name = "Outcount"), + Tag(id = 24808, name = "Outdoor"), + Tag(id = 17133, name = "Outdoors"), + Tag(id = 1334, name = "Oyakodon"), + Tag(id = 16241, name = "Pacifier"), + Tag(id = 183, name = "Paizuri"), + Tag(id = 7823, name = "Panda Girl"), + Tag(id = 25178, name = "Pandaj"), + Tag(id = 22688, name = "Pandaya"), + Tag(id = 10970, name = "Panther"), + Tag(id = 135, name = "Pantyhose"), + Tag(id = 136, name = "Pantyjob"), + Tag(id = 17100, name = "Paopa Ship"), + Tag(id = 827, name = "Parasite"), + Tag(id = 17137, name = "Partial Color"), + Tag(id = 16412, name = "Partially Translated"), + Tag(id = 1516, name = "Pasties"), + Tag(id = 23693, name = "Pecora"), + Tag(id = 456, name = "Pegging"), + Tag(id = 17153, name = "Pekopon Shinryaku Hyougikai"), + Tag(id = 7368, name = "Penis Birth"), + Tag(id = 16563, name = "Peri"), + Tag(id = 2136, name = "Petrification"), + Tag(id = 1515, name = "Phimosis"), + Tag(id = 2432, name = "Phone Sex"), + Tag(id = 18992, name = "Pied A Terre"), + Tag(id = 299, name = "Piercing"), + Tag(id = 600, name = "Pig"), + Tag(id = 5713, name = "Pig Girl"), + Tag(id = 4211, name = "Pig Man"), + Tag(id = 1153, name = "Pillory"), + Tag(id = 7261, name = "Pirate"), + Tag(id = 1674, name = "Piss Drinking"), + Tag(id = 22865, name = "Pisti"), + Tag(id = 793, name = "Plant Girl"), + Tag(id = 22520, name = "Poki"), + Tag(id = 1399, name = "Pole Dancing"), + Tag(id = 1732, name = "Policeman"), + Tag(id = 320, name = "Policewoman"), + Tag(id = 22829, name = "Pometa"), + Tag(id = 3599, name = "Ponygirl"), + Tag(id = 760, name = "Ponytail"), + Tag(id = 15894, name = "Poor Grammar"), + Tag(id = 16310, name = "Poporo"), + Tag(id = 16453, name = "Porunamin C"), + Tag(id = 538, name = "Possession"), + Tag(id = 268, name = "Pregnant"), + Tag(id = 503, name = "Prehensile Hair"), + Tag(id = 11469, name = "Priest"), + Tag(id = 20497, name = "Principal Kuno"), + Tag(id = 25407, name = "Project Physalis"), + Tag(id = 1496, name = "Prolapse"), + Tag(id = 294, name = "Prostate Massage"), + Tag(id = 931, name = "Prostitution"), + Tag(id = 16367, name = "Psycho Soldier"), + Tag(id = 1482, name = "Pubic Stubble"), + Tag(id = 2990, name = "Public Use"), + Tag(id = 16795, name = "Purimu"), + Tag(id = 16250, name = "Purupyon"), + Tag(id = 18500, name = "Pythagora Switch"), + Tag(id = 19115, name = "Quattro"), + Tag(id = 20138, name = "R-otome"), + Tag(id = 17110, name = "Rabbit Revelry Inc."), + Tag(id = 12938, name = "Raccoon Boy"), + Tag(id = 3567, name = "Raccoon Girl"), + Tag(id = 6453, name = "Race Queen"), + Tag(id = 21425, name = "Raichi Hoshimiya"), + Tag(id = 21955, name = "Rajyaki"), + Tag(id = 16139, name = "Rakanka Tiger"), + Tag(id = 23718, name = "Rakuen Tsuihou"), + Tag(id = 15920, name = "Rakugaki Syachu"), + Tag(id = 19071, name = "Randamu"), + Tag(id = 2551, name = "Randoseru"), + Tag(id = 43, name = "Rape"), + Tag(id = 17006, name = "Rati"), + Tag(id = 18186, name = "Rebaudio"), + Tag(id = 23800, name = "Recording"), + Tag(id = 15915, name = "Redraw"), + Tag(id = 17032, name = "Reese"), + Tag(id = 19632, name = "Reisen Two"), + Tag(id = 17270, name = "Remilia"), + Tag(id = 20382, name = "Renekton"), + Tag(id = 15890, name = "Replaced"), + Tag(id = 5574, name = "Reptile"), + Tag(id = 16858, name = "Resi"), + Tag(id = 16257, name = "Retreat"), + Tag(id = 24087, name = "Ricardo Gavarni"), + Tag(id = 16835, name = "Rika Koushu"), + Tag(id = 16836, name = "Rika Kousyu"), + Tag(id = 223, name = "Rimjob"), + Tag(id = 16439, name = "Rinbu"), + Tag(id = 18907, name = "Ringo Koubou"), + Tag(id = 17252, name = "Ritomasu"), + Tag(id = 16659, name = "Rittiri"), + Tag(id = 56, name = "Robot"), + Tag(id = 15872, name = "Rock Dou"), + Tag(id = 24880, name = "Rofu Pukaj"), + Tag(id = 19929, name = "Roudoc 2-gou"), + Tag(id = 15960, name = "Route A"), + Tag(id = 16682, name = "Rurio Nagase"), + Tag(id = 17810, name = "Ryo Yazaki"), + Tag(id = 16481, name = "Ryo-ko"), + Tag(id = 21672, name = "Ryokurin"), + Tag(id = 224, name = "Ryona"), + Tag(id = 17179, name = "Ryouji Sawa"), + Tag(id = 23147, name = "Ryouta Murakami"), + Tag(id = 16365, name = "Ryu Morikawa"), + Tag(id = 16457, name = "Ryuho"), + Tag(id = 16063, name = "Ryuji Kawamoto"), + Tag(id = 16021, name = "Ryuushika"), + Tag(id = 16944, name = "Sabatama Yumi"), + Tag(id = 15897, name = "Sabato Mihashigo"), + Tag(id = 16996, name = "Sabawo 380"), + Tag(id = 16518, name = "Sagasile"), + Tag(id = 16402, name = "Sai Akuto"), + Tag(id = 24085, name = "Saifu"), + Tag(id = 16670, name = "Saikare."), + Tag(id = 17177, name = "Saikoro"), + Tag(id = 17017, name = "Saikyo Tomomi"), + Tag(id = 17146, name = "Sailor Aluminum Siren"), + Tag(id = 16973, name = "Saimin"), + Tag(id = 16013, name = "Saimin Pikatto House"), + Tag(id = 16186, name = "Sakazaki"), + Tag(id = 16252, name = "Saki Watanabe"), + Tag(id = 15883, name = "Sakino Asuka"), + Tag(id = 23322, name = "Sakki Okita"), + Tag(id = 23612, name = "Sakkimita"), + Tag(id = 24437, name = "Sakura Kagamihara"), + Tag(id = 23768, name = "Sakurabobu"), + Tag(id = 423, name = "Saliva"), + Tag(id = 15881, name = "Sammohung"), + Tag(id = 15882, name = "Samohanyunpyou"), + Tag(id = 16125, name = "Sample"), + Tag(id = 15928, name = "Sangokushi Puzzle Taisen"), + Tag(id = 17117, name = "Santa Maria"), + Tag(id = 24336, name = "Sarugaso"), + Tag(id = 16506, name = "Sasara Somae"), + Tag(id = 16694, name = "Sata"), + Tag(id = 16586, name = "Satellite U"), + Tag(id = 16375, name = "Satoshi Sou"), + Tag(id = 16824, name = "Satou Kiyotoshi"), + Tag(id = 23366, name = "Satsuki Marin"), + Tag(id = 20566, name = "Sautsu"), + Tag(id = 19124, name = "Sawara Cashy"), + Tag(id = 16428, name = "Sayuri Hirose"), + Tag(id = 15876, name = "Scanmark"), + Tag(id = 1336, name = "Scar"), + Tag(id = 273, name = "Scat"), + Tag(id = 68, name = "School Swimsuit"), + Tag(id = 22, name = "Schoolboy Uniform"), + Tag(id = 24, name = "Schoolgirl Uniform"), + Tag(id = 17103, name = "Schwarzkatze"), + Tag(id = 17104, name = "Schwarzkratze"), + Tag(id = 6068, name = "Scrotal Lingerie"), + Tag(id = 17224, name = "Seikan Nekoguruma"), + Tag(id = 17995, name = "Sekaiju No Anone"), + Tag(id = 788, name = "Selfcest"), + Tag(id = 17004, name = "Semaru Taiho"), + Tag(id = 16440, name = "Sen Renbu"), + Tag(id = 17171, name = "Senbonzakura"), + Tag(id = 18677, name = "Sendai Oni"), + Tag(id = 23873, name = "Sendaiki"), + Tag(id = 22387, name = "Senhime"), + Tag(id = 17322, name = "Senki Zesshou"), + Tag(id = 17809, name = "Setsuko"), + Tag(id = 109, name = "Sex Toys"), + Tag(id = 16644, name = "Sexual Sunday"), + Tag(id = 16438, name = "Shadow Thorn"), + Tag(id = 331, name = "Shared Senses"), + Tag(id = 20051, name = "Shark"), + Tag(id = 3974, name = "Shark Boy"), + Tag(id = 22443, name = "Sharon"), + Tag(id = 5823, name = "Shaved Head"), + Tag(id = 15652, name = "Sheep Boy"), + Tag(id = 784, name = "Sheep Girl"), + Tag(id = 458, name = "Shemale"), + Tag(id = 25341, name = "Sherwood"), + Tag(id = 21466, name = "Shibainu Lab"), + Tag(id = 321, name = "Shibari"), + Tag(id = 17154, name = "Shichimi Hacchin"), + Tag(id = 23344, name = "Shikiouzi"), + Tag(id = 22907, name = "Shima Shuu"), + Tag(id = 21991, name = "Shimada Hisami"), + Tag(id = 137, name = "Shimapan"), + Tag(id = 16860, name = "Shimotsuki Kairi"), + Tag(id = 22950, name = "Shina Mon"), + Tag(id = 21673, name = "Shinna"), + Tag(id = 18092, name = "Shinomiya Utai"), + Tag(id = 16190, name = "Shinooka Fuku Enchou"), + Tag(id = 20450, name = "Shinoshima Usa"), + Tag(id = 18494, name = "Shinsuke Inue"), + Tag(id = 16822, name = "Shinsuke Nishizono"), + Tag(id = 17370, name = "Shintaro Konno"), + Tag(id = 24070, name = "Shio Onigiri"), + Tag(id = 16451, name = "Shiokaze Kaidou"), + Tag(id = 19727, name = "Shiomeshi"), + Tag(id = 18973, name = "Shirokuma Sato"), + Tag(id = 18720, name = "Shirotakurota"), + Tag(id = 16914, name = "Shirow"), + Tag(id = 17014, name = "Shisaki Tayuu"), + Tag(id = 20045, name = "Shizu Shidou"), + Tag(id = 16014, name = "Short Circuit"), + Tag(id = 66, name = "Shotacon"), + Tag(id = 16970, name = "Shounen Kyouso"), + Tag(id = 18864, name = "Shounen Teacher Group"), + Tag(id = 17053, name = "Shoutai Fumei"), + Tag(id = 17054, name = "Shoutai Humei"), + Tag(id = 711, name = "Shrinking"), + Tag(id = 17130, name = "Shugetsu"), + Tag(id = 22637, name = "Shunju"), + Tag(id = 21905, name = "Shut Hell"), + Tag(id = 23240, name = "Shuuyu Koukin"), + Tag(id = 24355, name = "Sibasaki Koh"), + Tag(id = 15943, name = "Silver Sandial"), + Tag(id = 16041, name = "Sinyati"), + Tag(id = 138, name = "Sister"), + Tag(id = 17329, name = "Sjf"), + Tag(id = 16020, name = "Ski"), + Tag(id = 5877, name = "Skinsuit"), + Tag(id = 19682, name = "Skn"), + Tag(id = 300, name = "Slave"), + Tag(id = 153, name = "Sleeping"), + Tag(id = 1449, name = "Slime"), + Tag(id = 13461, name = "Slime Boy"), + Tag(id = 1408, name = "Slime Girl"), + Tag(id = 22104, name = "Slime King"), + Tag(id = 23847, name = "Slow Masturbation Research Society"), + Tag(id = 4597, name = "Slug"), + Tag(id = 32, name = "Small Breasts"), + Tag(id = 25364, name = "Small Penis"), + Tag(id = 429, name = "Smegma"), + Tag(id = 1254, name = "Smell"), + Tag(id = 3524, name = "Smoking"), + Tag(id = 8672, name = "Snail Girl"), + Tag(id = 4702, name = "Snake"), + Tag(id = 23232, name = "Snake Boy"), + Tag(id = 785, name = "Snake Girl"), + Tag(id = 254, name = "Snuff"), + Tag(id = 6084, name = "Sockjob"), + Tag(id = 16849, name = "Softcel Pictures"), + Tag(id = 16846, name = "Soichiro Arima"), + Tag(id = 81, name = "Sole Dickgirl"), + Tag(id = 25, name = "Sole Female"), + Tag(id = 23, name = "Sole Male"), + Tag(id = 24229, name = "Solefemale"), + Tag(id = 608, name = "Solo Action"), + Tag(id = 18433, name = "Solullaby"), + Tag(id = 23404, name = "Son-son"), + Tag(id = 20256, name = "Sorairo Porin"), + Tag(id = 17197, name = "Sorauta"), + Tag(id = 24446, name = "Southern Emperor"), + Tag(id = 1359, name = "Spanking"), + Tag(id = 23067, name = "Spanner And Camellia"), + Tag(id = 889, name = "Speculum"), + Tag(id = 18061, name = "Speedy"), + Tag(id = 16215, name = "Spicaya"), + Tag(id = 11905, name = "Spider"), + Tag(id = 3623, name = "Spider Girl"), + Tag(id = 16823, name = "Spirit Of Ecsta"), + Tag(id = 16917, name = "Spon"), + Tag(id = 16898, name = "Square Rain"), + Tag(id = 5355, name = "Squid Boy"), + Tag(id = 1582, name = "Squid Girl"), + Tag(id = 7230, name = "Squirrel Girl"), + Tag(id = 786, name = "Squirting"), + Tag(id = 7371, name = "Ssbbm"), + Tag(id = 7093, name = "Ssbbw"), + Tag(id = 23302, name = "Stagger"), + Tag(id = 20756, name = "Staggio Ton-pierohbee"), + Tag(id = 16997, name = "Steevejo"), + Tag(id = 22316, name = "Steward"), + Tag(id = 884, name = "Stewardess"), + Tag(id = 57, name = "Stockings"), + Tag(id = 225, name = "Stomach Deformation"), + Tag(id = 17126, name = "Story Act"), + Tag(id = 15864, name = "Story Arc"), + Tag(id = 139, name = "Strap-on"), + Tag(id = 6576, name = "Stretching"), + Tag(id = 3873, name = "Stuck In Wall"), + Tag(id = 17106, name = "Studio Campus"), + Tag(id = 21909, name = "Studio Crimson"), + Tag(id = 17045, name = "Studio Mxh"), + Tag(id = 20431, name = "Studio Onion"), + Tag(id = 23602, name = "Suckaline"), + Tag(id = 17003, name = "Suda Yuriko"), + Tag(id = 16952, name = "Sui Kayama"), + Tag(id = 16811, name = "Sui Ren"), + Tag(id = 23732, name = "Suidoku"), + Tag(id = 16452, name = "Suina Ruu"), + Tag(id = 17184, name = "Suiranao"), + Tag(id = 17069, name = "Suiseimushi"), + Tag(id = 22021, name = "Sukurinton"), + Tag(id = 140, name = "Sumata"), + Tag(id = 141, name = "Sundress"), + Tag(id = 166, name = "Sunglasses"), + Tag(id = 25589, name = "Super Smash Bros"), + Tag(id = 15904, name = "Supertoasted"), + Tag(id = 16899, name = "Susu Suzumi"), + Tag(id = 16016, name = "Sutazubu-saku"), + Tag(id = 25195, name = "Suzuki Senpai"), + Tag(id = 22531, name = "Suzuki Tenpura"), + Tag(id = 16491, name = "Suzuku Kururugi"), + Tag(id = 16663, name = "Suzumi Yuu"), + Tag(id = 17273, name = "Suzunari"), + Tag(id = 23674, name = "Suzune Arizono"), + Tag(id = 696, name = "Sweating"), + Tag(id = 69, name = "Swimsuit"), + Tag(id = 635, name = "Swinging"), + Tag(id = 1955, name = "Syringe"), + Tag(id = 17011, name = "System Speculation"), + Tag(id = 754, name = "Table Masturbation"), + Tag(id = 19556, name = "Tachinami Takajin"), + Tag(id = 16816, name = "Tadai Yuu"), + Tag(id = 16664, name = "Tae Anezaki"), + Tag(id = 24925, name = "Tae Yamada"), + Tag(id = 17908, name = "Taeko Nonomiya"), + Tag(id = 25425, name = "Tail"), + Tag(id = 1156, name = "Tail Plug"), + Tag(id = 16907, name = "Tail-gun"), + Tag(id = 2861, name = "Tailjob"), + Tag(id = 16464, name = "Taimanin"), + Tag(id = 16465, name = "Taimanin Haiboku"), + Tag(id = 17797, name = "Taiyoushin"), + Tag(id = 20077, name = "Takakujyu"), + Tag(id = 16281, name = "Takakura Row"), + Tag(id = 16742, name = "Takamura Chinatsu"), + Tag(id = 24757, name = "Takatou Kei"), + Tag(id = 23832, name = "Takatsu Rin"), + Tag(id = 18111, name = "Takimoto Yukari"), + Tag(id = 16480, name = "Takoyaki Yoshi"), + Tag(id = 922, name = "Tall Girl"), + Tag(id = 120, name = "Tall Man"), + Tag(id = 16626, name = "Tama Shippo"), + Tag(id = 24669, name = "Tamaki Mari"), + Tag(id = 20900, name = "Tami Nishimikado"), + Tag(id = 23735, name = "Tanken Wa Ra 2"), + Tag(id = 15870, name = "Tankoubon"), + Tag(id = 303, name = "Tanlines"), + Tag(id = 17151, name = "Tanukigirl"), + Tag(id = 22214, name = "Tanukine"), + Tag(id = 16794, name = "Tanuma"), + Tag(id = 16698, name = "Tapir"), + Tag(id = 22323, name = "Tasu"), + Tag(id = 17057, name = "Tat"), + Tag(id = 16821, name = "Tateno Makoto"), + Tag(id = 20524, name = "Tatsuhide"), + Tag(id = 23415, name = "Tayuri"), + Tag(id = 112, name = "Teacher"), + Tag(id = 23459, name = "Tecoya"), + Tag(id = 16158, name = "Tee Crown"), + Tag(id = 25562, name = "Teebsly"), + Tag(id = 16487, name = "Tekorun"), + Tag(id = 22899, name = "Tenjou Shio"), + Tag(id = 196, name = "Tentacles"), + Tag(id = 24136, name = "Tep"), + Tag(id = 16180, name = "Teru-bee"), + Tag(id = 18721, name = "Tetsu Hagane"), + Tag(id = 12900, name = "Thick Eyebrows"), + Tag(id = 769, name = "Thigh High Boots"), + Tag(id = 641, name = "Tiara"), + Tag(id = 2728, name = "Tickling"), + Tag(id = 12085, name = "Tiger"), + Tag(id = 960, name = "Tights"), + Tag(id = 23600, name = "Tigrevurmud Vorn"), + Tag(id = 23173, name = "Tilia"), + Tag(id = 15913, name = "Time Stop"), + Tag(id = 17717, name = "Tobaroku"), + Tag(id = 20550, name = "Tocori"), + Tag(id = 495, name = "Toddlercon"), + Tag(id = 16287, name = "Tohno Hongshi"), + Tag(id = 16785, name = "Tokage 3gou"), + Tag(id = 21710, name = "Tokizawa"), + Tag(id = 20551, name = "Tokori"), + Tag(id = 24137, name = "Tokyo Survivor"), + Tag(id = 16928, name = "Tokyo-ya"), + Tag(id = 19807, name = "Tom Jpn"), + Tag(id = 16595, name = "Tomadoiki"), + Tag(id = 13, name = "Tomboy"), + Tag(id = 129, name = "Tomgirl"), + Tag(id = 25091, name = "Tomobukiya"), + Tag(id = 16226, name = "Tomoko Ogura"), + Tag(id = 15917, name = "Tonboya"), + Tag(id = 16537, name = "Tongue Job"), + Tag(id = 23105, name = "Tooku No Mura"), + Tag(id = 1441, name = "Tooth Brushing"), + Tag(id = 15888, name = "Tooyama Masuko"), + Tag(id = 25256, name = "Toriaezu."), + Tag(id = 752, name = "Torture"), + Tag(id = 17328, name = "Toshinari Arito"), + Tag(id = 25478, name = "Toshkarts"), + Tag(id = 23840, name = "Totomono"), + Tag(id = 22879, name = "Touma Nigou"), + Tag(id = 16946, name = "Toyotomi Hideyoshi"), + Tag(id = 113, name = "Tracksuit"), + Tag(id = 7331, name = "Trampling"), + Tag(id = 195, name = "Transformation"), + Tag(id = 233, name = "Tribadism"), + Tag(id = 5540, name = "Triple Anal"), + Tag(id = 226, name = "Triple Penetration"), + Tag(id = 1526, name = "Triple Vaginal"), + Tag(id = 16765, name = "Try Hougen"), + Tag(id = 23845, name = "Tsujiadon"), + Tag(id = 16106, name = "Tsukasa Kotobuki"), + Tag(id = 16786, name = "Tsukigara Rosshi"), + Tag(id = 16560, name = "Tsukigata Rosshi"), + Tag(id = 23897, name = "Tsuru Kame"), + Tag(id = 15999, name = "Tsurumanjaro"), + Tag(id = 15908, name = "Tsuta Hiroko"), + Tag(id = 18801, name = "Tsuzuki Shiori"), + Tag(id = 792, name = "Ttf Threesome"), + Tag(id = 15875, name = "Ttm Threesome"), + Tag(id = 244, name = "Tube"), + Tag(id = 22694, name = "Turnover"), + Tag(id = 10994, name = "Turtle"), + Tag(id = 780, name = "Tutor"), + Tag(id = 17021, name = "Twin Bell"), + Tag(id = 142, name = "Twins"), + Tag(id = 115, name = "Twintails"), + Tag(id = 23174, name = "Tyria"), + Tag(id = 25109, name = "Tzinnxt"), + Tag(id = 16561, name = "Uekio Aloe"), + Tag(id = 15884, name = "Uesato Takeharu"), + Tag(id = 23739, name = "Ujiro"), + Tag(id = 22521, name = "Umaisake"), + Tag(id = 20106, name = "Ume Kurumizawa"), + Tag(id = 18201, name = "Umetsu Yasuomi"), + Tag(id = 16776, name = "Una777"), + Tag(id = 712, name = "Unbirth"), + Tag(id = 15862, name = "Uncensored"), + Tag(id = 7151, name = "Uncle"), + Tag(id = 286, name = "Underwater"), + Tag(id = 21894, name = "Uni Unio"), + Tag(id = 19786, name = "Unihoge"), + Tag(id = 16292, name = "Unomaa"), + Tag(id = 1517, name = "Unusual Pupils"), + Tag(id = 1565, name = "Unusual Teeth"), + Tag(id = 16432, name = "Urabata"), + Tag(id = 16184, name = "Uragiru Kuchibiru"), + Tag(id = 18434, name = "Urako"), + Tag(id = 227, name = "Urethra Insertion"), + Tag(id = 143, name = "Urination"), + Tag(id = 16624, name = "Uru Fusube In"), + Tag(id = 16945, name = "Usagiro"), + Tag(id = 20522, name = "Ustilago Nuda"), + Tag(id = 17161, name = "Usuk"), + Tag(id = 18665, name = "Utsu Kawaya"), + Tag(id = 6045, name = "Vacbed"), + Tag(id = 2800, name = "Vaginal Sticker"), + Tag(id = 58, name = "Vampire"), + Tag(id = 16948, name = "Variant Set"), + Tag(id = 23976, name = "Virginia Nitouhei"), + Tag(id = 213, name = "Virginity"), + Tag(id = 17046, name = "Viriya"), + Tag(id = 17458, name = "Visual She"), + Tag(id = 228, name = "Vomit"), + Tag(id = 238, name = "Vore"), + Tag(id = 124, name = "Voyeurism"), + Tag(id = 16192, name = "Wada Tomohiro"), + Tag(id = 20686, name = "Waio"), + Tag(id = 2084, name = "Waiter"), + Tag(id = 374, name = "Waitress"), + Tag(id = 15879, name = "Walkure"), + Tag(id = 19824, name = "Wanya Aguda"), + Tag(id = 16645, name = "Warikka"), + Tag(id = 16191, name = "Watanabe Enchou"), + Tag(id = 16212, name = "Watari Naomi"), + Tag(id = 16182, name = "Watermarked"), + Tag(id = 16007, name = "Webtoon"), + Tag(id = 16507, name = "Wedding Ring"), + Tag(id = 1756, name = "Weight Gain"), + Tag(id = 16197, name = "Welkin Gunther"), + Tag(id = 4703, name = "Wet Clothes"), + Tag(id = 3719, name = "Whip"), + Tag(id = 264, name = "Widow"), + Tag(id = 17058, name = "Will Powers"), + Tag(id = 16994, name = "Wingjob"), + Tag(id = 404, name = "Wings"), + Tag(id = 926, name = "Witch"), + Tag(id = 1560, name = "Wolf"), + Tag(id = 2066, name = "Wolf Boy"), + Tag(id = 1551, name = "Wolf Girl"), + Tag(id = 2868, name = "Wooden Horse"), + Tag(id = 828, name = "Worm"), + Tag(id = 332, name = "Wormhole"), + Tag(id = 17066, name = "Wrestle Angels Survivor"), + Tag(id = 1990, name = "Wrestling"), + Tag(id = 17042, name = "X-boy"), + Tag(id = 144, name = "X-ray"), + Tag(id = 20575, name = "Xera"), + Tag(id = 16249, name = "Yada Masaka"), + Tag(id = 16883, name = "Yagami"), + Tag(id = 17084, name = "Yagami Baneri"), + Tag(id = 16967, name = "Yahiko"), + Tag(id = 24447, name = "Yamada Botan"), + Tag(id = 18806, name = "Yamada Kana"), + Tag(id = 17470, name = "Yamada Tasaku"), + Tag(id = 16275, name = "Yamamomo Kajitsu"), + Tag(id = 16511, name = "Yamamoto Hideo"), + Tag(id = 18257, name = "Yamane Akira"), + Tag(id = 16006, name = "Yamane Amano"), + Tag(id = 16877, name = "Yami No Matsuri"), + Tag(id = 968, name = "Yandere"), + Tag(id = 283, name = "Yaoi"), + Tag(id = 23158, name = "Yarou Tomo No Bansankai"), + Tag(id = 16015, name = "Yasou Shigeru"), + Tag(id = 16508, name = "Yasu G"), + Tag(id = 22667, name = "Yasuhara Osamu"), + Tag(id = 23460, name = "Yatsugi Teco"), + Tag(id = 17040, name = "Yokohama-ya"), + Tag(id = 16965, name = "Yokotaya"), + Tag(id = 16273, name = "Yoshiki Aya"), + Tag(id = 17459, name = "Yoshizuki Minoru"), + Tag(id = 16817, name = "Youna"), + Tag(id = 18367, name = "Yousei Kanin"), + Tag(id = 22257, name = "Yshtola"), + Tag(id = 20770, name = "Yu Tendo"), + Tag(id = 16862, name = "Yubel"), + Tag(id = 15997, name = "Yui Narumi"), + Tag(id = 17115, name = "Yukai Sachiko"), + Tag(id = 17850, name = "Yukata Kobayakawa"), + Tag(id = 16117, name = "Yuki Hiiragi"), + Tag(id = 21680, name = "Yukiruru"), + Tag(id = 19205, name = "Yume No Omutsu Kissa"), + Tag(id = 16916, name = "Yumego"), + Tag(id = 16454, name = "Yumemigotoki"), + Tag(id = 17542, name = "Yumesaki Ai"), + Tag(id = 24592, name = "Yumeutsutsu Hideki"), + Tag(id = 15900, name = "Yumiko"), + Tag(id = 16420, name = "Yunisuke"), + Tag(id = 14, name = "Yuri"), + Tag(id = 24046, name = "Yuriyura"), + Tag(id = 17798, name = "Yuugaitosho"), + Tag(id = 16130, name = "Yuugi Yami"), + Tag(id = 20140, name = "Yuzurizaki Nero"), + Tag(id = 20767, name = "Zeitaku Zanmai"), + Tag(id = 24430, name = "Ziggurat"), + Tag(id = 21354, name = "Zinkurou"), + Tag(id = 290, name = "Zombie") ).sortedBy { it.name } } diff --git a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentai.kt b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentai.kt index 7be79e9fe..d6f4afcdf 100644 --- a/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentai.kt +++ b/src/all/ninehentai/src/eu/kanade/tachiyomi/extension/all/ninehentai/NineHentai.kt @@ -18,13 +18,13 @@ 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 java.util.Date import okhttp3.MediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody import okhttp3.Response import rx.Observable +import java.util.Date @Nsfw class NineHentai : HttpSource() { @@ -51,26 +51,26 @@ class NineHentai : HttpSource() { override fun fetchPopularManga(page: Int): Observable<MangasPage> { return client.newCall(popularMangaRequest(page)) - .asObservableSuccess() - .map { response -> - getMangaList(response, page) - } + .asObservableSuccess() + .map { response -> + getMangaList(response, page) + } } override fun fetchLatestUpdates(page: Int): Observable<MangasPage> { return client.newCall(latestUpdatesRequest(page)) - .asObservableSuccess() - .map { response -> - getMangaList(response, page) - } + .asObservableSuccess() + .map { response -> + getMangaList(response, page) + } } override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { return client.newCall(searchMangaRequest(page, query, filters)) - .asObservableSuccess() - .map { response -> - getMangaList(response, page) - } + .asObservableSuccess() + .map { response -> + getMangaList(response, page) + } } private fun getMangaList(response: Response, page: Int): MangasPage { @@ -180,13 +180,15 @@ class NineHentai : HttpSource() { private class GenreList(tags: List<Tag>) : Filter.Group<Tag>("Tags", tags) - private class Sorting : Filter.Sort("Sorting", - arrayOf("Newest", "Popular Right now", "Most Fapped", "Most Viewed", "By Title"), - Selection(1, false)) + private class Sorting : Filter.Sort( + "Sorting", + arrayOf("Newest", "Popular Right now", "Most Fapped", "Most Viewed", "By Title"), + Selection(1, false) + ) override fun getFilterList() = FilterList( - Sorting(), - GenreList(NHTags.getTagsList()) + Sorting(), + GenreList(NHTags.getTagsList()) ) override fun imageUrlParse(response: Response): String = throw Exception("Not Used") diff --git a/src/all/ninemanga/src/eu/kanade/tachiyomi/extension/all/ninemanga/NineManga.kt b/src/all/ninemanga/src/eu/kanade/tachiyomi/extension/all/ninemanga/NineManga.kt index 9a6725f25..98ac0203f 100644 --- a/src/all/ninemanga/src/eu/kanade/tachiyomi/extension/all/ninemanga/NineManga.kt +++ b/src/all/ninemanga/src/eu/kanade/tachiyomi/extension/all/ninemanga/NineManga.kt @@ -7,15 +7,15 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale open class NineManga(override val name: String, override val baseUrl: String, override val lang: String) : ParsedHttpSource() { @@ -84,7 +84,7 @@ open class NineManga(override val name: String, override val baseUrl: String, ov if (dateWords.size == 3) { if (dateWords[1].contains(",")) { return try { - SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date).time + SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } @@ -161,21 +161,27 @@ open class NineManga(override val name: String, override val baseUrl: String, ov fun toUriPart() = vals[state].second } - protected open class ContainBeginEndFilter(name: String) : UriPartFilter(name, arrayOf( - Pair("Contain", "contain"), - Pair("Begin", "begin"), - Pair("End", "end") - )) + protected open class ContainBeginEndFilter(name: String) : UriPartFilter( + name, + arrayOf( + Pair("Contain", "contain"), + Pair("Begin", "begin"), + Pair("End", "end") + ) + ) private class QueryCBEFilter : ContainBeginEndFilter("Query") private class AuthorCBEFilter : ContainBeginEndFilter("Author") private class ArtistCBEFilter : ContainBeginEndFilter("Artist") - private class CompletedFilter : UriPartFilter("Completed", arrayOf( - Pair("Either", "either"), - Pair("Yes", "yes"), - Pair("No", "no") - )) + private class CompletedFilter : UriPartFilter( + "Completed", + arrayOf( + Pair("Either", "either"), + Pair("Yes", "yes"), + Pair("No", "no") + ) + ) override fun getFilterList() = FilterList( QueryCBEFilter(), diff --git a/src/all/ninemanga/src/eu/kanade/tachiyomi/extension/all/ninemanga/NineMangaFactory.kt b/src/all/ninemanga/src/eu/kanade/tachiyomi/extension/all/ninemanga/NineMangaFactory.kt index 8044c0849..e8661d836 100644 --- a/src/all/ninemanga/src/eu/kanade/tachiyomi/extension/all/ninemanga/NineMangaFactory.kt +++ b/src/all/ninemanga/src/eu/kanade/tachiyomi/extension/all/ninemanga/NineMangaFactory.kt @@ -4,12 +4,12 @@ import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.Request +import org.jsoup.nodes.Element import java.text.ParseException import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -import okhttp3.Request -import org.jsoup.nodes.Element class NineMangaFactory : SourceFactory { override fun createSources(): List<Source> = listOf( @@ -756,7 +756,7 @@ fun parseChapterDateByLang(date: String): Long { if (dateWords.size == 3) { if (dateWords[1].contains(",")) { return try { - SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date).time + SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } diff --git a/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/Paprika.kt b/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/Paprika.kt index 798668f3d..a26d56419 100644 --- a/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/Paprika.kt +++ b/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/Paprika.kt @@ -8,9 +8,6 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request @@ -18,6 +15,9 @@ import okhttp3.Response import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale abstract class Paprika( override val name: String, @@ -161,8 +161,9 @@ abstract class Paprika( else -> null }?.timeInMillis ?: 0L } - else -> SimpleDateFormat("MMM d yy", Locale.US) - .parse("${this.substringBefore(",")} $currentYear")?.time ?: 0 + else -> + SimpleDateFormat("MMM d yy", Locale.US) + .parse("${this.substringBefore(",")} $currentYear")?.time ?: 0 } } catch (_: Exception) { 0L diff --git a/src/all/thelibraryofohara/src/eu/kanade/tachiyomi/extension/all/thelibraryofohara/TheLibraryOfOhara.kt b/src/all/thelibraryofohara/src/eu/kanade/tachiyomi/extension/all/thelibraryofohara/TheLibraryOfOhara.kt index 168867f82..c32488077 100644 --- a/src/all/thelibraryofohara/src/eu/kanade/tachiyomi/extension/all/thelibraryofohara/TheLibraryOfOhara.kt +++ b/src/all/thelibraryofohara/src/eu/kanade/tachiyomi/extension/all/thelibraryofohara/TheLibraryOfOhara.kt @@ -9,14 +9,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale class TheLibraryOfOhara(override val lang: String, private val siteLang: String) : ParsedHttpSource() { @@ -36,15 +36,16 @@ class TheLibraryOfOhara(override val lang: String, private val siteLang: String) // only show entries which contain pictures only. override fun popularMangaSelector() = when (lang) { - "en" -> "#categories-7 ul li.cat-item-589813936," + // Chapter Secrets - "#categories-7 ul li.cat-item-607613583, " + // Chapter Secrets Specials - "#categories-7 ul li.cat-item-43972770, " + // Charlotte Family - "#categories-7 ul li.cat-item-9363667, " + // Complete Guides - "#categories-7 ul li.cat-item-634609261, " + // Parody Chapter - "#categories-7 ul li.cat-item-699200615, " + // Return to the Reverie - "#categories-7 ul li.cat-item-139757, " + // SBS - "#categories-7 ul li.cat-item-22695, " + // Timeline - "#categories-7 ul li.cat-item-648324575" // Vivre Card Databook + "en" -> + "#categories-7 ul li.cat-item-589813936," + // Chapter Secrets + "#categories-7 ul li.cat-item-607613583, " + // Chapter Secrets Specials + "#categories-7 ul li.cat-item-43972770, " + // Charlotte Family + "#categories-7 ul li.cat-item-9363667, " + // Complete Guides + "#categories-7 ul li.cat-item-634609261, " + // Parody Chapter + "#categories-7 ul li.cat-item-699200615, " + // Return to the Reverie + "#categories-7 ul li.cat-item-139757, " + // SBS + "#categories-7 ul li.cat-item-22695, " + // Timeline + "#categories-7 ul li.cat-item-648324575" // Vivre Card Databook "id" -> "#categories-7 ul li.cat-item-702404482, #categories-7 ul li.cat-item-699200615" // Chapter Secrets Bahasa Indonesia, Return to the Reverie "fr" -> "#categories-7 ul li.cat-item-699200615" // Return to the Reverie "ar" -> "#categories-7 ul li.cat-item-699200615" // Return to the Reverie @@ -144,7 +145,7 @@ class TheLibraryOfOhara(override val lang: String, private val siteLang: String) private fun parseChapterDate(date: String): Long { val parsedDate = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()).parse(date.replace("+00:00", "+0000")) - return parsedDate?.time ?: 0L + return parsedDate?.time ?: 0L } private fun chapterNextPageSelector() = "div.nav-previous a" @@ -180,7 +181,8 @@ class TheLibraryOfOhara(override val lang: String, private val siteLang: String) !it.name.contains("Arabic") && !it.name.contains("Italian") && !it.name.contains("Indonesia") && - !it.name.contains("Spanish") }.toMutableList() + !it.name.contains("Spanish") + }.toMutableList() } } diff --git a/src/all/toomics/src/eu/kanade/tachiyomi/extension/all/toomics/ToomicsGlobal.kt b/src/all/toomics/src/eu/kanade/tachiyomi/extension/all/toomics/ToomicsGlobal.kt index bac34f56b..4c5d3d8dc 100644 --- a/src/all/toomics/src/eu/kanade/tachiyomi/extension/all/toomics/ToomicsGlobal.kt +++ b/src/all/toomics/src/eu/kanade/tachiyomi/extension/all/toomics/ToomicsGlobal.kt @@ -7,10 +7,6 @@ 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 java.net.URLDecoder -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request @@ -18,6 +14,10 @@ import okhttp3.RequestBody import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.net.URLDecoder +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.concurrent.TimeUnit abstract class ToomicsGlobal( private val siteLang: String, @@ -153,7 +153,7 @@ abstract class ToomicsGlobal( private fun parseChapterDate(date: String): Long { return try { - dateFormat.parse(date).time + dateFormat.parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/DongmanManhua.kt b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/DongmanManhua.kt index 0235c4eaf..225de49a9 100644 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/DongmanManhua.kt +++ b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/DongmanManhua.kt @@ -5,13 +5,13 @@ import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.asJsoup -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class DongmanManhua : WebtoonsDefault("zh", "", dateFormat = SimpleDateFormat("yyyy-M-d", Locale.ENGLISH)) { override val baseUrl = "https://www.dongmanmanhua.cn" diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/Webtoons.kt b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/Webtoons.kt index d4ccfed73..40e5c2ff0 100644 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/Webtoons.kt +++ b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/Webtoons.kt @@ -9,7 +9,6 @@ import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup -import java.util.Calendar import okhttp3.Cookie import okhttp3.CookieJar import okhttp3.Headers @@ -19,6 +18,7 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar abstract class Webtoons( override val lang: String, @@ -33,21 +33,23 @@ abstract class Webtoons( override val supportsLatest = true override val client: OkHttpClient = super.client.newBuilder() - .cookieJar(object : CookieJar { - override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {} - override fun loadForRequest(url: HttpUrl): List<Cookie> { - return listOf<Cookie>( - Cookie.Builder() - .domain("www.webtoons.com") - .path("/") - .name("ageGatePass") - .value("true") - .name("locale") - .value(localeForCookie) - .build() - ) + .cookieJar( + object : CookieJar { + override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {} + override fun loadForRequest(url: HttpUrl): List<Cookie> { + return listOf<Cookie>( + Cookie.Builder() + .domain("www.webtoons.com") + .path("/") + .name("ageGatePass") + .value("true") + .name("locale") + .value(localeForCookie) + .build() + ) + } } - }) + ) .build() private val day: String @@ -71,11 +73,11 @@ abstract class Webtoons( override fun latestUpdatesSelector() = "div#dailyList > $day li > a" override fun headersBuilder(): Headers.Builder = super.headersBuilder() - .add("Referer", "https://www.webtoons.com/$langCode/") + .add("Referer", "https://www.webtoons.com/$langCode/") protected val mobileHeaders: Headers = super.headersBuilder() - .add("Referer", "https://m.webtoons.com") - .build() + .add("Referer", "https://m.webtoons.com") + .build() override fun popularMangaRequest(page: Int) = GET("$baseUrl/$langCode/dailySchedule", headers) diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsDefault.kt b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsDefault.kt index b36f991ab..53146bf97 100644 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsDefault.kt +++ b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsDefault.kt @@ -4,11 +4,11 @@ import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga -import java.text.SimpleDateFormat -import java.util.Locale import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale open class WebtoonsDefault( override val lang: String, diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsFactory.kt b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsFactory.kt index 8cf4769bb..1cd9199b6 100644 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsFactory.kt +++ b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsFactory.kt @@ -58,7 +58,8 @@ class WebtoonsIndonesian : WebtoonsDefault("in", "id") { // Android seems to be unable to parse Indonesian dates; we'll use a short hard-coded table // instead. private val dateMap: Array<String> = arrayOf( - "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des") + "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agu", "Sep", "Okt", "Nov", "Des" + ) override fun chapterParseDate(date: String): Long { val expr = Regex("""(\d{4}) ([A-Z][a-z]{2}) (\d+)""").find(date) ?: return 0 diff --git a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsTranslate.kt b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsTranslate.kt index 3ea9efd09..5aa474723 100644 --- a/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsTranslate.kt +++ b/src/all/webtoons/src/eu/kanade/tachiyomi/extension/all/webtoons/WebtoonsTranslate.kt @@ -7,7 +7,6 @@ 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 java.util.ArrayList import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request @@ -16,6 +15,7 @@ import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.util.ArrayList open class WebtoonsTranslate(override val lang: String, private val translateLangCode: String, languageNameExtra: String = "") : Webtoons(lang) { // popularMangaRequest already returns manga sorted by latest update @@ -80,20 +80,20 @@ open class WebtoonsTranslate(override val lang: String, private val translateLan ?: json.getString("thumbnailMobileUrl") return SManga.create().apply { - title = json.getString("representTitle") - author = json.getString("writeAuthorName") - artist = json.getString("pictureAuthorName") ?: author - thumbnail_url = if (relativeThumnailURL != null) "$thumbnailBaseUrl$relativeThumnailURL" else null - status = SManga.UNKNOWN - url = mobileBaseUrl - .resolve("/translate/episodeList")!! - .newBuilder() - .addQueryParameter("titleNo", json.getInt("titleNo").toString()) - .addQueryParameter("languageCode", translateLangCode) - .addQueryParameter("teamVersion", json.optInt("teamVersion", 0).toString()) - .build() - .toString() - } + title = json.getString("representTitle") + author = json.getString("writeAuthorName") + artist = json.getString("pictureAuthorName") ?: author + thumbnail_url = if (relativeThumnailURL != null) "$thumbnailBaseUrl$relativeThumnailURL" else null + status = SManga.UNKNOWN + url = mobileBaseUrl + .resolve("/translate/episodeList")!! + .newBuilder() + .addQueryParameter("titleNo", json.getInt("titleNo").toString()) + .addQueryParameter("languageCode", translateLangCode) + .addQueryParameter("teamVersion", json.optInt("teamVersion", 0).toString()) + .build() + .toString() + } } override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { diff --git a/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComics.kt b/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComics.kt index 8d48faef5..1975c1526 100644 --- a/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComics.kt +++ b/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComics.kt @@ -7,14 +7,14 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale abstract class WPComics( override val name: String, diff --git a/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComicsFactory.kt b/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComicsFactory.kt index 4a7304905..97b86a72c 100644 --- a/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComicsFactory.kt +++ b/src/all/wpcomics/src/eu/kanade/tachiyomi/extension/all/wpcomics/WPComicsFactory.kt @@ -9,12 +9,12 @@ 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.util.asJsoup -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class WPComicsFactory : SourceFactory { override fun createSources(): List<Source> = listOf( @@ -113,9 +113,9 @@ private class ComicLatest : WPComics("ComicLatest", "https://comiclatest.com", " override fun popularMangaFromElement(element: Element) = SManga.create().apply { element.select("h3 a").let { - title = it.text() - setUrlWithoutDomain(it.attr("href")) - } + title = it.text() + setUrlWithoutDomain(it.attr("href")) + } thumbnail_url = element.select("img").attr("data-original") } diff --git a/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStream.kt b/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStream.kt index 401fdb9cc..86387c757 100644 --- a/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStream.kt +++ b/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStream.kt @@ -13,10 +13,6 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -26,6 +22,10 @@ import org.jsoup.nodes.Element import org.jsoup.select.Elements import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import java.util.concurrent.TimeUnit abstract class WPMangaStream( override val name: String, @@ -273,28 +273,37 @@ abstract class WPMangaStream( private class YearFilter : Filter.Text("Year") - protected class TypeFilter : UriPartFilter("Type", arrayOf( - Pair("Default", ""), - Pair("Manga", "Manga"), - Pair("Manhwa", "Manhwa"), - Pair("Manhua", "Manhua"), - Pair("Comic", "Comic") - )) + protected class TypeFilter : UriPartFilter( + "Type", + arrayOf( + Pair("Default", ""), + Pair("Manga", "Manga"), + Pair("Manhwa", "Manhwa"), + Pair("Manhua", "Manhua"), + Pair("Comic", "Comic") + ) + ) - protected class SortByFilter : UriPartFilter("Sort By", arrayOf( - Pair("Default", ""), - Pair("A-Z", "title"), - Pair("Z-A", "titlereverse"), - Pair("Latest Update", "update"), - Pair("Latest Added", "latest"), - Pair("Popular", "popular") - )) + protected class SortByFilter : UriPartFilter( + "Sort By", + arrayOf( + Pair("Default", ""), + Pair("A-Z", "title"), + Pair("Z-A", "titlereverse"), + Pair("Latest Update", "update"), + Pair("Latest Added", "latest"), + Pair("Popular", "popular") + ) + ) - protected class StatusFilter : UriPartFilter("Status", arrayOf( - Pair("All", ""), - Pair("Ongoing", "ongoing"), - Pair("Completed", "completed") - )) + protected class StatusFilter : UriPartFilter( + "Status", + arrayOf( + Pair("All", ""), + Pair("Ongoing", "ongoing"), + Pair("Completed", "completed") + ) + ) protected class Genre(name: String, val id: String = name) : Filter.TriState(name) protected class GenreListFilter(genres: List<Genre>) : Filter.Group<Genre>("Genre", genres) diff --git a/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStreamFactory.kt b/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStreamFactory.kt index 99a8b67ec..439921c20 100644 --- a/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStreamFactory.kt +++ b/src/all/wpmangastream/src/eu/kanade/tachiyomi/extension/all/wpmangastream/WPMangaStreamFactory.kt @@ -10,7 +10,6 @@ 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.util.asJsoup -import java.io.IOException import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Interceptor @@ -20,6 +19,7 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.io.IOException class WPMangaStreamFactory : SourceFactory { override fun createSources(): List<Source> = listOf( @@ -198,66 +198,72 @@ class WestManga : WPMangaStream("West Manga (WP Manga Stream)", "https://westman return manga } - private class SortByFilter : UriPartFilter("Sort By", arrayOf( - Pair("Default", ""), - Pair("A-Z", "A-Z"), - Pair("Latest Added", "latest"), - Pair("Popular", "popular") - )) + private class SortByFilter : UriPartFilter( + "Sort By", + arrayOf( + Pair("Default", ""), + Pair("A-Z", "A-Z"), + Pair("Latest Added", "latest"), + Pair("Popular", "popular") + ) + ) - private class GenreListFilter : UriPartFilter("Genre", arrayOf( - Pair("Default", ""), - Pair("4-Koma", "4-koma"), - Pair("Action", "action"), - Pair("Adventure", "adventure"), - Pair("Comedy", "comedy"), - Pair("Cooking", "cooking"), - Pair("Demons", "demons"), - Pair("Drama", "drama"), - Pair("Ecchi", "ecchi"), - Pair("Fantasy", "fantasy"), - Pair("FantasyAction", "fantasyaction"), - Pair("Game", "game"), - Pair("Gender Bender", "gender-bender"), - Pair("Gore", "gore"), - Pair("Harem", "harem"), - Pair("Historical", "historical"), - Pair("Horro", "horro"), - Pair("Horror", "horror"), - Pair("Isekai", "isekai"), - Pair("Isekai Action", "isekai-action"), - Pair("Josei", "josei"), - Pair("Magic", "magic"), - Pair("Manga", "manga"), - Pair("Manhua", "manhua"), - Pair("Martial arts", "martial-arts"), - Pair("Mature", "mature"), - Pair("Mecha", "mecha"), - Pair("Medical", "medical"), - Pair("Music", "music"), - Pair("Mystery", "mystery"), - Pair("Oneshot", "oneshot"), - Pair("Project", "project"), - Pair("Psychological", "psychological"), - Pair("Romance", "romance"), - Pair("School", "school"), - Pair("School life", "school-life"), - Pair("Sci fi", "sci-fi"), - Pair("Seinen", "seinen"), - Pair("Shoujo", "shoujo"), - Pair("Shoujo Ai", "shoujo-ai"), - Pair("Shounen", "shounen"), - Pair("Slice of Life", "slice-of-life"), - Pair("Sports", "sports"), - Pair("Super Power", "super-power"), - Pair("Supernatural", "supernatural"), - Pair("Suspense", "suspense"), - Pair("Thriller", "thriller"), - Pair("Tragedy", "tragedy"), - Pair("Vampire", "vampire"), - Pair("Webtoons", "webtoons"), - Pair("Yuri", "yuri") - )) + private class GenreListFilter : UriPartFilter( + "Genre", + arrayOf( + Pair("Default", ""), + Pair("4-Koma", "4-koma"), + Pair("Action", "action"), + Pair("Adventure", "adventure"), + Pair("Comedy", "comedy"), + Pair("Cooking", "cooking"), + Pair("Demons", "demons"), + Pair("Drama", "drama"), + Pair("Ecchi", "ecchi"), + Pair("Fantasy", "fantasy"), + Pair("FantasyAction", "fantasyaction"), + Pair("Game", "game"), + Pair("Gender Bender", "gender-bender"), + Pair("Gore", "gore"), + Pair("Harem", "harem"), + Pair("Historical", "historical"), + Pair("Horro", "horro"), + Pair("Horror", "horror"), + Pair("Isekai", "isekai"), + Pair("Isekai Action", "isekai-action"), + Pair("Josei", "josei"), + Pair("Magic", "magic"), + Pair("Manga", "manga"), + Pair("Manhua", "manhua"), + Pair("Martial arts", "martial-arts"), + Pair("Mature", "mature"), + Pair("Mecha", "mecha"), + Pair("Medical", "medical"), + Pair("Music", "music"), + Pair("Mystery", "mystery"), + Pair("Oneshot", "oneshot"), + Pair("Project", "project"), + Pair("Psychological", "psychological"), + Pair("Romance", "romance"), + Pair("School", "school"), + Pair("School life", "school-life"), + Pair("Sci fi", "sci-fi"), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shoujo Ai", "shoujo-ai"), + Pair("Shounen", "shounen"), + Pair("Slice of Life", "slice-of-life"), + Pair("Sports", "sports"), + Pair("Super Power", "super-power"), + Pair("Supernatural", "supernatural"), + Pair("Suspense", "suspense"), + Pair("Thriller", "thriller"), + Pair("Tragedy", "tragedy"), + Pair("Vampire", "vampire"), + Pair("Webtoons", "webtoons"), + Pair("Yuri", "yuri") + ) + ) override fun getFilterList() = FilterList( Filter.Header("NOTE: sort and genre can't be combined and ignored when using text search!"), @@ -384,15 +390,18 @@ class KomikGo : WPMangaStream("Komik GO (WP Manga Stream)", "https://komikgo.com private class TextField(name: String, val key: String) : Filter.Text(name) - private class SortBy : UriPartFilter("Sort by", arrayOf( - Pair("Relevance", ""), - Pair("Latest", "latest"), - Pair("A-Z", "alphabet"), - Pair("Rating", "rating"), - Pair("Trending", "trending"), - Pair("Most View", "views"), - Pair("New", "new-manga") - )) + private class SortBy : UriPartFilter( + "Sort by", + arrayOf( + Pair("Relevance", ""), + Pair("Latest", "latest"), + Pair("A-Z", "alphabet"), + Pair("Rating", "rating"), + Pair("Trending", "trending"), + Pair("Most View", "views"), + Pair("New", "new-manga") + ) + ) private class Status(name: String, val id: String = name) : Filter.TriState(name) private class StatusList(statuses: List<Status>) : Filter.Group<Status>("Status", statuses) diff --git a/src/all/zbulu/src/eu/kanade/tachiyomi/extension/all/zbulu/Zbulu.kt b/src/all/zbulu/src/eu/kanade/tachiyomi/extension/all/zbulu/Zbulu.kt index e0745d037..d2dda2d3c 100644 --- a/src/all/zbulu/src/eu/kanade/tachiyomi/extension/all/zbulu/Zbulu.kt +++ b/src/all/zbulu/src/eu/kanade/tachiyomi/extension/all/zbulu/Zbulu.kt @@ -8,15 +8,15 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit abstract class Zbulu( override val name: String, @@ -82,9 +82,9 @@ abstract class Zbulu( filters.forEach { filter -> when (filter) { is AuthorField -> { - if (filter.state.isNotBlank()) { - ret = "$baseUrl/author/${filter.state.replace(" ", "-")}/page-$page" - } + if (filter.state.isNotBlank()) { + ret = "$baseUrl/author/${filter.state.replace(" ", "-")}/page-$page" + } } is GenreFilter -> { if (filter.toUriPart().isNotBlank() && filter.state != 0) { @@ -193,7 +193,8 @@ abstract class Zbulu( // [...document.querySelectorAll('.sub-menu li a')].map(a => `Pair("${a.textContent}", "${a.getAttribute('href')}")`).join(',\n') // from $baseUrl - private class GenreFilter : UriPartFilter("Genres", + private class GenreFilter : UriPartFilter( + "Genres", arrayOf( Pair("Choose a genre", ""), Pair("Action", "action"), diff --git a/src/ar/andromedascans/src/eu/kanade/tachiyomi/extension/ar/andromedascans/AndromedaScans.kt b/src/ar/andromedascans/src/eu/kanade/tachiyomi/extension/ar/andromedascans/AndromedaScans.kt index a2b736128..d14ad740c 100644 --- a/src/ar/andromedascans/src/eu/kanade/tachiyomi/extension/ar/andromedascans/AndromedaScans.kt +++ b/src/ar/andromedascans/src/eu/kanade/tachiyomi/extension/ar/andromedascans/AndromedaScans.kt @@ -7,13 +7,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.MediaType import okhttp3.Request import okhttp3.RequestBody import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class AndromedaScans : ParsedHttpSource() { override val name = "AndromedaScans" diff --git a/src/ar/mangaae/src/eu/kanade/tachiyomi/extension/ar/mangaae/MangaAe.kt b/src/ar/mangaae/src/eu/kanade/tachiyomi/extension/ar/mangaae/MangaAe.kt index b15e01223..a2134a2c5 100644 --- a/src/ar/mangaae/src/eu/kanade/tachiyomi/extension/ar/mangaae/MangaAe.kt +++ b/src/ar/mangaae/src/eu/kanade/tachiyomi/extension/ar/mangaae/MangaAe.kt @@ -147,13 +147,16 @@ class MangaAe : ParsedHttpSource() { fun toUriPart() = vals[state].second } - private class OrderByFilter : UriPartFilter("الترتيب حسب", arrayOf( - Pair("اختيار", ""), - Pair("اسم المانجا", "english_name"), - Pair("تاريخ النشر", "release_date"), - Pair("عدد الفصول", "chapter_count"), - Pair("الحالة", "status") - )) + private class OrderByFilter : UriPartFilter( + "الترتيب حسب", + arrayOf( + Pair("اختيار", ""), + Pair("اسم المانجا", "english_name"), + Pair("تاريخ النشر", "release_date"), + Pair("عدد الفصول", "chapter_count"), + Pair("الحالة", "status") + ) + ) override fun getFilterList() = FilterList( OrderByFilter() diff --git a/src/ar/mangazen/src/eu/kanade/tachiyomi/extension/ar/mangazen/MangaZen.kt b/src/ar/mangazen/src/eu/kanade/tachiyomi/extension/ar/mangazen/MangaZen.kt index 4c9a05fa4..7c6586602 100644 --- a/src/ar/mangazen/src/eu/kanade/tachiyomi/extension/ar/mangazen/MangaZen.kt +++ b/src/ar/mangazen/src/eu/kanade/tachiyomi/extension/ar/mangazen/MangaZen.kt @@ -6,10 +6,10 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MangaZen : ParsedHttpSource() { diff --git a/src/ar/teamx/src/eu/kanade/tachiyomi/extension/ar/teamx/TeamX.kt b/src/ar/teamx/src/eu/kanade/tachiyomi/extension/ar/teamx/TeamX.kt index 1aa04568b..6404f65cb 100644 --- a/src/ar/teamx/src/eu/kanade/tachiyomi/extension/ar/teamx/TeamX.kt +++ b/src/ar/teamx/src/eu/kanade/tachiyomi/extension/ar/teamx/TeamX.kt @@ -8,12 +8,12 @@ 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 java.util.concurrent.TimeUnit import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.concurrent.TimeUnit class TeamX : ParsedHttpSource() { @@ -44,8 +44,10 @@ class TeamX : ParsedHttpSource() { return SManga.create().apply { title = element.select(titleSelector).text() setUrlWithoutDomain(element.select("a").first().attr("href")) - thumbnail_url = element.select("img").let { if (it.hasAttr("data-src")) - it.attr("abs:data-src") else it.attr("abs:src") } + thumbnail_url = element.select("img").let { + if (it.hasAttr("data-src")) + it.attr("abs:data-src") else it.attr("abs:src") + } } } @@ -106,8 +108,10 @@ class TeamX : ParsedHttpSource() { title = info.select("div.col-md-9").text() description = info.select("div.story p").text() genre = info.select("div.genre a").joinToString { it.text() } - thumbnail_url = info.select("img").let { if (it.hasAttr("data-src")) - it.attr("abs:data-src") else it.attr("abs:src") } + thumbnail_url = info.select("img").let { + if (it.hasAttr("data-src")) + it.attr("abs:data-src") else it.attr("abs:src") + } } } } @@ -128,8 +132,14 @@ class TeamX : ParsedHttpSource() { override fun pageListParse(document: Document): List<Page> { return document.select("div#translationPageall img").mapIndexed { i, img -> - Page(i, "", img.let { if (it.hasAttr("data-src")) - it.attr("abs:data-src") else it.attr("abs:src") }) + Page( + i, + "", + img.let { + if (it.hasAttr("data-src")) + it.attr("abs:data-src") else it.attr("abs:src") + } + ) } } diff --git a/src/de/mangatube/src/eu/kanade/tachiyomi/extension/de/mangatube/MangaTube.kt b/src/de/mangatube/src/eu/kanade/tachiyomi/extension/de/mangatube/MangaTube.kt index 94c34b725..7d6b72314 100644 --- a/src/de/mangatube/src/eu/kanade/tachiyomi/extension/de/mangatube/MangaTube.kt +++ b/src/de/mangatube/src/eu/kanade/tachiyomi/extension/de/mangatube/MangaTube.kt @@ -14,10 +14,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request @@ -26,6 +22,10 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class MangaTube : ParsedHttpSource() { @@ -156,7 +156,7 @@ class MangaTube : ParsedHttpSource() { } date_upload = element.select("p.chapter-date").text().let { try { - SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()).parse(it.substringAfter(" ")).time + SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()).parse(it.substringAfter(" "))?.time ?: 0L } catch (_: ParseException) { 0L } diff --git a/src/de/wiemanga/src/eu/kanade/tachiyomi/extension/de/wiemanga/WieManga.kt b/src/de/wiemanga/src/eu/kanade/tachiyomi/extension/de/wiemanga/WieManga.kt index c327307e0..aa54a9b07 100644 --- a/src/de/wiemanga/src/eu/kanade/tachiyomi/extension/de/wiemanga/WieManga.kt +++ b/src/de/wiemanga/src/eu/kanade/tachiyomi/extension/de/wiemanga/WieManga.kt @@ -6,13 +6,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class WieManga : ParsedHttpSource() { @@ -119,7 +119,7 @@ class WieManga : ParsedHttpSource() { } private fun parseChapterDate(date: String): Long { - return SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).parse(date).time + return SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).parse(date)?.time ?: 0L } override fun pageListParse(document: Document): List<Page> { diff --git a/src/en/clonemanga/src/eu/kanade/tachiyomi/extension/en/clonemanga/CloneManga.kt b/src/en/clonemanga/src/eu/kanade/tachiyomi/extension/en/clonemanga/CloneManga.kt index 5271e8a4f..0f80170f9 100644 --- a/src/en/clonemanga/src/eu/kanade/tachiyomi/extension/en/clonemanga/CloneManga.kt +++ b/src/en/clonemanga/src/eu/kanade/tachiyomi/extension/en/clonemanga/CloneManga.kt @@ -47,8 +47,10 @@ class CloneManga : ParsedHttpSource() { status = SManga.UNKNOWN url = element.select("a").first().attr("href") description = element.select("h4").first()?.text() ?: "" - thumbnail_url = baseUrl + attr.substring(attr.indexOf("site/themes"), - attr.indexOf(")")) + thumbnail_url = baseUrl + attr.substring( + attr.indexOf("site/themes"), + attr.indexOf(")") + ) } } @@ -65,8 +67,10 @@ class CloneManga : ParsedHttpSource() { val document = response.asJsoup() val series = document.location() val numChapters = Regex( - pattern = "&page=(.*)&lang=").findAll( - input = document.getElementsByTag("script")[3].toString()) + pattern = "&page=(.*)&lang=" + ).findAll( + input = document.getElementsByTag("script")[3].toString() + ) .elementAt(3).destructured.component1() .toInt() val chapters = ArrayList<SChapter>() diff --git a/src/en/comicastle/src/eu/kanade/tachiyomi/extension/en/comicastle/Comicastle.kt b/src/en/comicastle/src/eu/kanade/tachiyomi/extension/en/comicastle/Comicastle.kt index c98d232ec..2d0f1d1dc 100644 --- a/src/en/comicastle/src/eu/kanade/tachiyomi/extension/en/comicastle/Comicastle.kt +++ b/src/en/comicastle/src/eu/kanade/tachiyomi/extension/en/comicastle/Comicastle.kt @@ -8,9 +8,6 @@ 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 java.net.URLEncoder -import java.util.Calendar -import java.util.Locale import okhttp3.HttpUrl import okhttp3.MediaType import okhttp3.OkHttpClient @@ -19,6 +16,9 @@ import okhttp3.RequestBody import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.net.URLEncoder +import java.util.Calendar +import java.util.Locale class Comicastle : ParsedHttpSource() { diff --git a/src/en/comicextra/src/eu/kanade/tachiyomi/extension/en/comicextra/ComicExtra.kt b/src/en/comicextra/src/eu/kanade/tachiyomi/extension/en/comicextra/ComicExtra.kt index 902a4903e..5cb1c0fd7 100644 --- a/src/en/comicextra/src/eu/kanade/tachiyomi/extension/en/comicextra/ComicExtra.kt +++ b/src/en/comicextra/src/eu/kanade/tachiyomi/extension/en/comicextra/ComicExtra.kt @@ -8,6 +8,11 @@ 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.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element import java.text.ParseException import java.text.SimpleDateFormat import java.util.ArrayList @@ -15,11 +20,6 @@ import java.util.Calendar import java.util.Date import java.util.Locale import java.util.regex.Pattern -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element class ComicExtra : ParsedHttpSource() { @@ -141,15 +141,13 @@ class ComicExtra : ParsedHttpSource() { } private fun dateParse(dateAsString: String): Long { - val date: Date - date = try { + val date: Date? = try { SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).parse(dateAsString.replace(Regex("(st|nd|rd|th)"), "")) } catch (e: ParseException) { val m = datePattern.matcher(dateAsString) if (dateAsString != "Today" && m.matches()) { - val amount = m.group(1).toInt() - + val amount = m.group(1)!!.toInt() Calendar.getInstance().apply { add(Calendar.DATE, -amount) }.time @@ -158,7 +156,7 @@ class ComicExtra : ParsedHttpSource() { } else return 0 } - return date.time + return date?.time ?: 0L } override fun pageListRequest(chapter: SChapter): Request { diff --git a/src/en/dilbert/src/eu/kanade/tachiyomi/extension/en/dilbert/Dilbert.kt b/src/en/dilbert/src/eu/kanade/tachiyomi/extension/en/dilbert/Dilbert.kt index 420236688..639815d36 100644 --- a/src/en/dilbert/src/eu/kanade/tachiyomi/extension/en/dilbert/Dilbert.kt +++ b/src/en/dilbert/src/eu/kanade/tachiyomi/extension/en/dilbert/Dilbert.kt @@ -11,14 +11,14 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.Headers import okhttp3.OkHttpClient import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class Dilbert : ParsedHttpSource() { @@ -46,20 +46,26 @@ class Dilbert : ParsedHttpSource() { override fun fetchPopularManga(page: Int): Observable<MangasPage> { val currentYear = Calendar.getInstance().get(Calendar.YEAR) - return Observable.just(MangasPage((currentYear downTo 1989).map { - SManga.create().apply { - url = "?$it" - title = "$name ($it)" - artist = "Scott Adams" - author = "Scott Adams" - status = if (it < currentYear) SManga.COMPLETED else SManga.ONGOING - description = """ + return Observable.just( + MangasPage( + (currentYear downTo 1989).map { + SManga.create().apply { + url = "?$it" + title = "$name ($it)" + artist = "Scott Adams" + author = "Scott Adams" + status = if (it < currentYear) SManga.COMPLETED else SManga.ONGOING + description = + """ A satirical comic strip featuring Dilbert, a competent, but seldom recognized engineer. (This entry includes all the chapters published in $it.) - """.trimIndent() - thumbnail_url = "https://dilbert.com/assets/favicon/favicon-196x196-cf4d86b485e628a034ab8b961c1c3520b5969252400a80b9eed544d99403e037.png" - } - }, false)) + """.trimIndent() + thumbnail_url = "https://dilbert.com/assets/favicon/favicon-196x196-cf4d86b485e628a034ab8b961c1c3520b5969252400a80b9eed544d99403e037.png" + } + }, + false + ) + ) } override fun fetchSearchManga(page: Int, query: String, filters: FilterList) = fetchPopularManga(page) @@ -74,7 +80,7 @@ class Dilbert : ParsedHttpSource() { val date = element.first(".comic-title-date").text() url = element.first(".img-comic-link").attr("href") name = element.first(".comic-title-name").text().ifBlank { date } - date_upload = dateFormat.parse(date).time + date_upload = dateFormat.parse(date)?.time ?: 0L } override fun fetchChapterList(manga: SManga): Observable<List<SChapter>> { @@ -93,7 +99,8 @@ class Dilbert : ParsedHttpSource() { if (pages != null) for (page in 2..pages) getChapters(page) return Observable.just( chapters.sortedBy(SChapter::date_upload).mapIndexed { - i, ch -> ch.apply { chapter_number = i + 1f } + i, ch -> + ch.apply { chapter_number = i + 1f } }.reversed() ) } diff --git a/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyDoujins.kt b/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyDoujins.kt index a9d723c7c..bef273b6b 100644 --- a/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyDoujins.kt +++ b/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyDoujins.kt @@ -50,10 +50,12 @@ class DynastyDoujins : DynastyScans() { val chapters = document.select(chapterListSelector()).map { chapterFromElement(it) }.toMutableList() document.select("a.thumbnail img").let { images -> - if (images.isNotEmpty()) chapters.add(SChapter.create().apply { - name = "Images" - setUrlWithoutDomain(document.location() + "/images") - }) + if (images.isNotEmpty()) chapters.add( + SChapter.create().apply { + name = "Images" + setUrlWithoutDomain(document.location() + "/images") + } + ) } return chapters diff --git a/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyFactory.kt b/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyFactory.kt index 7106c92aa..e2482f8bd 100644 --- a/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyFactory.kt +++ b/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyFactory.kt @@ -8,9 +8,10 @@ class DynastyFactory : SourceFactory { } fun getAllDynasty() = - listOf( - DynastyAnthologies(), - DynastyChapters(), - DynastyDoujins(), - DynastyIssues(), - DynastySeries()) + listOf( + DynastyAnthologies(), + DynastyChapters(), + DynastyDoujins(), + DynastyIssues(), + DynastySeries() + ) diff --git a/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyScans.kt b/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyScans.kt index 8d4addde9..469007f46 100644 --- a/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyScans.kt +++ b/src/en/dynasty/src/eu/kanade/tachiyomi/extension/en/dynasty/DynastyScans.kt @@ -8,9 +8,6 @@ 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 java.text.SimpleDateFormat -import java.util.ArrayList -import java.util.Locale import okhttp3.Request import okhttp3.Response import org.json.JSONArray @@ -19,6 +16,9 @@ import org.jsoup.nodes.Element import org.jsoup.nodes.Node import org.jsoup.nodes.TextNode import org.jsoup.select.Elements +import java.text.SimpleDateFormat +import java.util.ArrayList +import java.util.Locale abstract class DynastyScans : ParsedHttpSource() { @@ -70,8 +70,10 @@ abstract class DynastyScans : ParsedHttpSource() { override fun searchMangaNextPageSelector() = "div.pagination > ul > li.active + li > a" private fun buildListfromResponse(): List<Node> { - return client.newCall(Request.Builder().headers(headers) - .url(popularMangaInitialUrl()).build()).execute().asJsoup() + return client.newCall( + Request.Builder().headers(headers) + .url(popularMangaInitialUrl()).build() + ).execute().asJsoup() .select("div#main").first { it.hasText() }.childNodes() } @@ -170,9 +172,9 @@ abstract class DynastyScans : ParsedHttpSource() { val imageUrls = JSONArray("[$imageUrl]") (0 until imageUrls.length()) - .map { imageUrls.getJSONObject(it) } - .map { baseUrl + it.get("image") } - .forEach { pages.add(Page(pages.size, "", it)) } + .map { imageUrls.getJSONObject(it) } + .map { baseUrl + it.get("image") } + .forEach { pages.add(Page(pages.size, "", it)) } } catch (e: Exception) { e.printStackTrace() } @@ -193,32 +195,32 @@ abstract class DynastyScans : ParsedHttpSource() { } if (type == "src") { nodes - .filter { it is Element && it.hasClass("thumbnails") } - .flatMap { it.childNodes() } - .filterIsInstance<Element>() - .filter { it.hasClass("span2") } - .forEach { this.add(it.child(0).child(0).attr(type)) } + .filter { it is Element && it.hasClass("thumbnails") } + .flatMap { it.childNodes() } + .filterIsInstance<Element>() + .filter { it.hasClass("span2") } + .forEach { this.add(it.child(0).child(0).attr(type)) } } if (type == "href") { nodes - .filter { it is Element && it.hasClass("thumbnails") } - .flatMap { it.childNodes() } - .filterIsInstance<Element>() - .filter { it.hasClass("span2") } - .forEach { this.add(it.child(0).attr(type)) } + .filter { it is Element && it.hasClass("thumbnails") } + .flatMap { it.childNodes() } + .filterIsInstance<Element>() + .filter { it.hasClass("span2") } + .forEach { this.add(it.child(0).attr(type)) } } } fun indexOfPartial(partial: String): Int { return (0..this.lastIndex).firstOrNull { this[it].contains(partial) } - ?: -1 + ?: -1 } fun getItem(partial: String): String { return (0..this.lastIndex) - .firstOrNull { super.get(it).contains(partial) } - ?.let { super.get(it) } - ?: "" + .firstOrNull { super.get(it).contains(partial) } + ?.let { super.get(it) } + ?: "" } } diff --git a/src/en/eggporncomics/src/eu/kanade/tachiyomi/extension/en/eggporncomics/Eggporncomics.kt b/src/en/eggporncomics/src/eu/kanade/tachiyomi/extension/en/eggporncomics/Eggporncomics.kt index 71e8adb29..5ede4a1b1 100644 --- a/src/en/eggporncomics/src/eu/kanade/tachiyomi/extension/en/eggporncomics/Eggporncomics.kt +++ b/src/en/eggporncomics/src/eu/kanade/tachiyomi/extension/en/eggporncomics/Eggporncomics.kt @@ -11,7 +11,6 @@ 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 java.util.Calendar import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request @@ -19,6 +18,7 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.util.Calendar @Nsfw class Eggporncomics : ParsedHttpSource() { @@ -129,21 +129,25 @@ class Eggporncomics : ParsedHttpSource() { override fun mangaDetailsParse(document: Document): SManga { return SManga.create().apply { thumbnail_url = document.select(pageListSelector).first().toFullSizeImage() - description = document.select("div.links ul").joinToString("\n") { element -> element.select("a") - .joinToString(prefix = element.select("span").text().replace(descriptionPrefixRegex, ": ")) { it.text() } } + description = document.select("div.links ul").joinToString("\n") { element -> + element.select("a") + .joinToString(prefix = element.select("span").text().replace(descriptionPrefixRegex, ": ")) { it.text() } + } } } // Chapters override fun chapterListParse(response: Response): List<SChapter> { - return listOf(SChapter.create().apply { - setUrlWithoutDomain(response.request().url().toString()) - name = "Chapter" - date_upload = response.asJsoup().select("div.info > div.meta li:contains(days ago)").firstOrNull() - ?.let { Calendar.getInstance().apply { add(Calendar.DAY_OF_YEAR, -(it.text().substringBefore(" ").toIntOrNull() ?: 0)) }.timeInMillis } - ?: 0 - }) + return listOf( + SChapter.create().apply { + setUrlWithoutDomain(response.request().url().toString()) + name = "Chapter" + date_upload = response.asJsoup().select("div.info > div.meta li:contains(days ago)").firstOrNull() + ?.let { Calendar.getInstance().apply { add(Calendar.DAY_OF_YEAR, -(it.text().substringBefore(" ").toIntOrNull() ?: 0)) }.timeInMillis } + ?: 0 + } + ) } override fun chapterListSelector() = throw UnsupportedOperationException("Not used") diff --git a/src/en/explosm/src/eu/kanade/tachiyomi/extension/en/explosm/Explosm.kt b/src/en/explosm/src/eu/kanade/tachiyomi/extension/en/explosm/Explosm.kt index 6486c0496..753fd7568 100644 --- a/src/en/explosm/src/eu/kanade/tachiyomi/extension/en/explosm/Explosm.kt +++ b/src/en/explosm/src/eu/kanade/tachiyomi/extension/en/explosm/Explosm.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale class Explosm : HttpSource() { @@ -92,7 +92,7 @@ class Explosm : HttpSource() { element.select("div#comic-author").text().let { cName -> name = cName date_upload = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()) - .parse(cName.substringBefore(" ")).time + .parse(cName.substringBefore(" "))?.time ?: 0L } } } diff --git a/src/en/gunnerkriggcourt/src/eu/kanade/tachiyomi/extension/en/gunnerkriggcourt/GunnerkriggCourt.kt b/src/en/gunnerkriggcourt/src/eu/kanade/tachiyomi/extension/en/gunnerkriggcourt/GunnerkriggCourt.kt index 7b8f1366d..5379a3568 100644 --- a/src/en/gunnerkriggcourt/src/eu/kanade/tachiyomi/extension/en/gunnerkriggcourt/GunnerkriggCourt.kt +++ b/src/en/gunnerkriggcourt/src/eu/kanade/tachiyomi/extension/en/gunnerkriggcourt/GunnerkriggCourt.kt @@ -46,7 +46,8 @@ class GunnerkriggCourt : ParsedHttpSource() { return Observable.just(manga) } - override fun chapterListSelector() = """div.chapters option[value~=\d*]""" + override fun chapterListSelector() = + """div.chapters option[value~=\d*]""" override fun chapterListParse(response: Response): List<SChapter> { return super.chapterListParse(response).reversed() diff --git a/src/en/guya/src/eu/kanade/tachiyomi/extension/en/guya/Guya.kt b/src/en/guya/src/eu/kanade/tachiyomi/extension/en/guya/Guya.kt index c6f066edb..ea0ecd591 100644 --- a/src/en/guya/src/eu/kanade/tachiyomi/extension/en/guya/Guya.kt +++ b/src/en/guya/src/eu/kanade/tachiyomi/extension/en/guya/Guya.kt @@ -15,9 +15,6 @@ 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 java.io.IOException -import java.util.HashMap -import java.util.concurrent.TimeUnit import okhttp3.Call import okhttp3.Callback import okhttp3.Headers @@ -29,6 +26,9 @@ import org.json.JSONObject import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.io.IOException +import java.util.HashMap +import java.util.concurrent.TimeUnit open class Guya : ConfigurableSource, HttpSource() { @@ -40,10 +40,13 @@ open class Guya : ConfigurableSource, HttpSource() { private val scanlatorCacheUrl = "$baseUrl/api/get_all_groups" override fun headersBuilder() = Headers.Builder().apply { - add("User-Agent", "(Android ${Build.VERSION.RELEASE}; " + - "${Build.MANUFACTURER} ${Build.MODEL}) " + - "Tachiyomi/${BuildConfig.VERSION_NAME} " + - Build.ID) + add( + "User-Agent", + "(Android ${Build.VERSION.RELEASE}; " + + "${Build.MANUFACTURER} ${Build.MODEL}) " + + "Tachiyomi/${BuildConfig.VERSION_NAME} " + + Build.ID + ) } private val scanlators: ScanlatorStore = ScanlatorStore() @@ -131,9 +134,12 @@ open class Guya : ConfigurableSource, HttpSource() { metadata.put("chapter", chapterNum) metadata.put("scanlator", scanlators.getKeyFromValue(chapter.scanlator.toString())) metadata.put("slug", json.getString("slug")) - metadata.put("folder", json.getJSONObject("chapters") - .getJSONObject(chapterNum) - .getString("folder")) + metadata.put( + "folder", + json.getJSONObject("chapters") + .getJSONObject(chapterNum) + .getString("folder") + ) return parsePageFromJson(pages, metadata) } @@ -320,10 +326,16 @@ open class Guya : ConfigurableSource, HttpSource() { val pageArray = ArrayList<Page>() for (i in 0 until pages.length()) { - val page = Page(i + 1, "", pageBuilder(metadata.getString("slug"), - metadata.getString("folder"), - pages[i].toString(), - metadata.getString("scanlator"))) + val page = Page( + i + 1, + "", + pageBuilder( + metadata.getString("slug"), + metadata.getString("folder"), + pages[i].toString(), + metadata.getString("scanlator") + ) + ) pageArray.add(page) } diff --git a/src/en/hbrowse/src/eu/kanade/tachiyomi/extension/en/hbrowse/HBrowse.kt b/src/en/hbrowse/src/eu/kanade/tachiyomi/extension/en/hbrowse/HBrowse.kt index e6171345b..7ba93f27a 100644 --- a/src/en/hbrowse/src/eu/kanade/tachiyomi/extension/en/hbrowse/HBrowse.kt +++ b/src/en/hbrowse/src/eu/kanade/tachiyomi/extension/en/hbrowse/HBrowse.kt @@ -9,13 +9,13 @@ 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 java.io.IOException import okhttp3.CookieJar import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.io.IOException @Nsfw class HBrowse : ParsedHttpSource() { @@ -185,7 +185,7 @@ class HBrowse : ParsedHttpSource() { override fun getFilterList(): FilterList { return FilterList( listOf(Filter.Header("Can't combine with text search!"), Filter.Separator()) + - advFilterMap.map { AdvancedFilter(getAdvTriStateList(it.key, it.value.split(", "))) } + advFilterMap.map { AdvancedFilter(getAdvTriStateList(it.key, it.value.split(", "))) } ) } diff --git a/src/en/hentai2read/src/eu/kanade/tachiyomi/extension/en/hentai2read/Hentai2Read.kt b/src/en/hentai2read/src/eu/kanade/tachiyomi/extension/en/hentai2read/Hentai2Read.kt index 8614b9629..7f5553bdf 100644 --- a/src/en/hentai2read/src/eu/kanade/tachiyomi/extension/en/hentai2read/Hentai2Read.kt +++ b/src/en/hentai2read/src/eu/kanade/tachiyomi/extension/en/hentai2read/Hentai2Read.kt @@ -12,9 +12,6 @@ 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 java.lang.UnsupportedOperationException -import java.util.Calendar -import java.util.regex.Pattern import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request @@ -22,6 +19,9 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.lang.UnsupportedOperationException +import java.util.Calendar +import java.util.regex.Pattern @Nsfw class Hentai2Read : ParsedHttpSource() { @@ -182,7 +182,7 @@ class Hentai2Read : ParsedHttpSource() { chapter.date_upload = element.select("div > small").text()?.let { val matcher = chapterDatePattern.matcher(it) if (matcher.find()) { - parseChapterDate(matcher.group(1)) + parseChapterDate(matcher.group(1)!!) } else { 0L } @@ -216,7 +216,7 @@ class Hentai2Read : ParsedHttpSource() { val m = pagesUrlPattern.matcher(response.body()!!.string()) var i = 0 while (m.find()) { - m.group(1).split(",").forEach { + m.group(1)?.split(",")?.forEach { pages.add(Page(i++, "", imageBaseUrl + it.trim('"').replace("""\/""", "/"))) } } @@ -245,27 +245,27 @@ class Hentai2Read : ParsedHttpSource() { } override fun getFilterList() = FilterList( - SortOrder(getSortOrder()), - MangaNameSelect(), - Filter.Separator(), - ArtistName(), - ArtistNameSelect(), - Filter.Separator(), - CharacterName(), - CharacterNameSelect(), - Filter.Separator(), - ReleaseYear(), - ReleaseYearSelect(), - Filter.Separator(), - Status(), - Filter.Separator(), - TagSearchMode(), - Filter.Separator(), - TagList("Categories", getCategoryList()), - Filter.Separator(), - TagList("Tags", getTagList()), - Filter.Separator(), - TagList("Doujins", getDoujinList()) + SortOrder(getSortOrder()), + MangaNameSelect(), + Filter.Separator(), + ArtistName(), + ArtistNameSelect(), + Filter.Separator(), + CharacterName(), + CharacterNameSelect(), + Filter.Separator(), + ReleaseYear(), + ReleaseYearSelect(), + Filter.Separator(), + Status(), + Filter.Separator(), + TagSearchMode(), + Filter.Separator(), + TagList("Categories", getCategoryList()), + Filter.Separator(), + TagList("Tags", getTagList()), + Filter.Separator(), + TagList("Doujins", getDoujinList()) ) private fun getSortOrder() = arrayOf( diff --git a/src/en/hentaifox/src/eu/kanade/tachiyomi/extension/en/hentaifox/HentaiFox.kt b/src/en/hentaifox/src/eu/kanade/tachiyomi/extension/en/hentaifox/HentaiFox.kt index 77169c288..1243869bb 100644 --- a/src/en/hentaifox/src/eu/kanade/tachiyomi/extension/en/hentaifox/HentaiFox.kt +++ b/src/en/hentaifox/src/eu/kanade/tachiyomi/extension/en/hentaifox/HentaiFox.kt @@ -109,13 +109,15 @@ class HentaiFox : ParsedHttpSource() { // Chapters override fun chapterListParse(response: Response): List<SChapter> { - return listOf(SChapter.create().apply { - name = "Chapter" - // page path with a marker at the end - url = "${response.request().url().toString().replace("/gallery/", "/g/")}#" - // number of pages - url += response.asJsoup().select("[id=load_pages]").attr("value") - }) + return listOf( + SChapter.create().apply { + name = "Chapter" + // page path with a marker at the end + url = "${response.request().url().toString().replace("/gallery/", "/g/")}#" + // number of pages + url += response.asJsoup().select("[id=load_pages]").attr("value") + } + ) } override fun chapterListSelector() = throw UnsupportedOperationException("Not used") @@ -146,59 +148,62 @@ class HentaiFox : ParsedHttpSource() { ) // Top 50 tags - private class GenreFilter : UriPartFilter("Category", arrayOf( - Pair("<select>", "---"), - Pair("Big breasts", "big-breasts"), - Pair("Sole female", "sole-female"), - Pair("Sole male", "sole-male"), - Pair("Anal", "anal"), - Pair("Nakadashi", "nakadashi"), - Pair("Group", "group"), - Pair("Stockings", "stockings"), - Pair("Blowjob", "blowjob"), - Pair("Schoolgirl uniform", "schoolgirl-uniform"), - Pair("Rape", "rape"), - Pair("Lolicon", "lolicon"), - Pair("Glasses", "glasses"), - Pair("Defloration", "defloration"), - Pair("Ahegao", "ahegao"), - Pair("Incest", "incest"), - Pair("Shotacon", "shotacon"), - Pair("X-ray", "x-ray"), - Pair("Bondage", "bondage"), - Pair("Full color", "full-color"), - Pair("Double penetration", "double-penetration"), - Pair("Femdom", "femdom"), - Pair("Milf", "milf"), - Pair("Yaoi", "yaoi"), - Pair("Multi-work series", "multi-work-series"), - Pair("Schoolgirl", "schoolgirl"), - Pair("Mind break", "mind-break"), - Pair("Paizuri", "paizuri"), - Pair("Mosaic censorship", "mosaic-censorship"), - Pair("Impregnation", "impregnation"), - Pair("Males only", "males-only"), - Pair("Sex toys", "sex-toys"), - Pair("Sister", "sister"), - Pair("Dark skin", "dark-skin"), - Pair("Ffm threesome", "ffm-threesome"), - Pair("Hairy", "hairy"), - Pair("Cheating", "cheating"), - Pair("Sweating", "sweating"), - Pair("Yuri", "yuri"), - Pair("Netorare", "netorare"), - Pair("Full censorship", "full-censorship"), - Pair("Schoolboy uniform", "schoolboy-uniform"), - Pair("Dilf", "dilf"), - Pair("Big penis", "big-penis"), - Pair("Futanari", "futanari"), - Pair("Swimsuit", "swimsuit"), - Pair("Collar", "collar"), - Pair("Uncensored", "uncensored"), - Pair("Big ass", "big-ass"), - Pair("Story arc", "story-arc"), - Pair("Teacher", "teacher") - )) + private class GenreFilter : UriPartFilter( + "Category", + arrayOf( + Pair("<select>", "---"), + Pair("Big breasts", "big-breasts"), + Pair("Sole female", "sole-female"), + Pair("Sole male", "sole-male"), + Pair("Anal", "anal"), + Pair("Nakadashi", "nakadashi"), + Pair("Group", "group"), + Pair("Stockings", "stockings"), + Pair("Blowjob", "blowjob"), + Pair("Schoolgirl uniform", "schoolgirl-uniform"), + Pair("Rape", "rape"), + Pair("Lolicon", "lolicon"), + Pair("Glasses", "glasses"), + Pair("Defloration", "defloration"), + Pair("Ahegao", "ahegao"), + Pair("Incest", "incest"), + Pair("Shotacon", "shotacon"), + Pair("X-ray", "x-ray"), + Pair("Bondage", "bondage"), + Pair("Full color", "full-color"), + Pair("Double penetration", "double-penetration"), + Pair("Femdom", "femdom"), + Pair("Milf", "milf"), + Pair("Yaoi", "yaoi"), + Pair("Multi-work series", "multi-work-series"), + Pair("Schoolgirl", "schoolgirl"), + Pair("Mind break", "mind-break"), + Pair("Paizuri", "paizuri"), + Pair("Mosaic censorship", "mosaic-censorship"), + Pair("Impregnation", "impregnation"), + Pair("Males only", "males-only"), + Pair("Sex toys", "sex-toys"), + Pair("Sister", "sister"), + Pair("Dark skin", "dark-skin"), + Pair("Ffm threesome", "ffm-threesome"), + Pair("Hairy", "hairy"), + Pair("Cheating", "cheating"), + Pair("Sweating", "sweating"), + Pair("Yuri", "yuri"), + Pair("Netorare", "netorare"), + Pair("Full censorship", "full-censorship"), + Pair("Schoolboy uniform", "schoolboy-uniform"), + Pair("Dilf", "dilf"), + Pair("Big penis", "big-penis"), + Pair("Futanari", "futanari"), + Pair("Swimsuit", "swimsuit"), + Pair("Collar", "collar"), + Pair("Uncensored", "uncensored"), + Pair("Big ass", "big-ass"), + Pair("Story arc", "story-arc"), + Pair("Teacher", "teacher") + ) + ) private open class UriPartFilter(displayName: String, private val vals: Array<Pair<String, String>>) : Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { diff --git a/src/en/hentainexus/src/eu/kanade/tachiyomi/extension/en/hentainexus/HentaiNexus.kt b/src/en/hentainexus/src/eu/kanade/tachiyomi/extension/en/hentainexus/HentaiNexus.kt index 65de44722..7f85b3b1d 100644 --- a/src/en/hentainexus/src/eu/kanade/tachiyomi/extension/en/hentainexus/HentaiNexus.kt +++ b/src/en/hentainexus/src/eu/kanade/tachiyomi/extension/en/hentainexus/HentaiNexus.kt @@ -8,11 +8,11 @@ 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 java.net.URLEncoder import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.net.URLEncoder @Nsfw class HentaiNexus : ParsedHttpSource() { diff --git a/src/en/hiveworks/src/eu/kanade/tachiyomi/extension/en/hiveworks/Hiveworks.kt b/src/en/hiveworks/src/eu/kanade/tachiyomi/extension/en/hiveworks/Hiveworks.kt index 0708b61d6..4fc6917a1 100644 --- a/src/en/hiveworks/src/eu/kanade/tachiyomi/extension/en/hiveworks/Hiveworks.kt +++ b/src/en/hiveworks/src/eu/kanade/tachiyomi/extension/en/hiveworks/Hiveworks.kt @@ -11,10 +11,6 @@ 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 java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Call import okhttp3.OkHttpClient import okhttp3.Request @@ -22,6 +18,10 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.concurrent.TimeUnit class Hiveworks : ParsedHttpSource() { @@ -290,84 +290,104 @@ class Hiveworks : ParsedHttpSource() { fun addToUri(uri: Uri.Builder) } - private class UpdateDay : UriSelectFilter("Update Day", "update-day", arrayOf( - Pair("all", "All"), - Pair("monday", "Monday"), - Pair("tuesday", "Tuesday"), - Pair("wednesday", "Wednesday"), - Pair("thursday", "Thursday"), - Pair("friday", "Friday"), - Pair("saturday", "Saturday"), - Pair("sunday", "Sunday") - )) + private class UpdateDay : UriSelectFilter( + "Update Day", + "update-day", + arrayOf( + Pair("all", "All"), + Pair("monday", "Monday"), + Pair("tuesday", "Tuesday"), + Pair("wednesday", "Wednesday"), + Pair("thursday", "Thursday"), + Pair("friday", "Friday"), + Pair("saturday", "Saturday"), + Pair("sunday", "Sunday") + ) + ) - private class RatingFilter : UriSelectFilter("Rating", "age", arrayOf( - Pair("all", "All"), - Pair("everyone", "Everyone"), - Pair("teen", "Teen"), - Pair("young-adult", "Young Adult"), - Pair("mature", "Mature") - )) + private class RatingFilter : UriSelectFilter( + "Rating", + "age", + arrayOf( + Pair("all", "All"), + Pair("everyone", "Everyone"), + Pair("teen", "Teen"), + Pair("young-adult", "Young Adult"), + Pair("mature", "Mature") + ) + ) - private class GenreFilter : UriSelectFilter("Genre", "genre", arrayOf( - Pair("all", "All"), - Pair("action/adventure", "Action/Adventure"), - Pair("animated", "Animated"), - Pair("autobio", "Autobio"), - Pair("comedy", "Comedy"), - Pair("drama", "Drama"), - Pair("dystopian", "Dystopian"), - Pair("fairytale", "Fairytale"), - Pair("fantasy", "Fantasy"), - Pair("finished", "Finished"), - Pair("historical-fiction", "Historical Fiction"), - Pair("horror", "Horror"), - Pair("lgbt", "LGBT"), - Pair("mystery", "Mystery"), - Pair("romance", "Romance"), - Pair("sci-fi", "Science Fiction"), - Pair("slice-of-life", "Slice of Life"), - Pair("steampunk", "Steampunk"), - Pair("superhero", "Superhero"), - Pair("urban-fantasy", "Urban Fantasy") - )) + private class GenreFilter : UriSelectFilter( + "Genre", + "genre", + arrayOf( + Pair("all", "All"), + Pair("action/adventure", "Action/Adventure"), + Pair("animated", "Animated"), + Pair("autobio", "Autobio"), + Pair("comedy", "Comedy"), + Pair("drama", "Drama"), + Pair("dystopian", "Dystopian"), + Pair("fairytale", "Fairytale"), + Pair("fantasy", "Fantasy"), + Pair("finished", "Finished"), + Pair("historical-fiction", "Historical Fiction"), + Pair("horror", "Horror"), + Pair("lgbt", "LGBT"), + Pair("mystery", "Mystery"), + Pair("romance", "Romance"), + Pair("sci-fi", "Science Fiction"), + Pair("slice-of-life", "Slice of Life"), + Pair("steampunk", "Steampunk"), + Pair("superhero", "Superhero"), + Pair("urban-fantasy", "Urban Fantasy") + ) + ) - private class TitleFilter : UriSelectFilter("Title", "alpha", arrayOf( - Pair("all", "All"), - Pair("a", "A"), - Pair("b", "B"), - Pair("c", "C"), - Pair("d", "D"), - Pair("e", "E"), - Pair("f", "F"), - Pair("g", "G"), - Pair("h", "H"), - Pair("i", "I"), - Pair("j", "J"), - Pair("k", "K"), - Pair("l", "L"), - Pair("m", "M"), - Pair("n", "N"), - Pair("o", "O"), - Pair("p", "P"), - Pair("q", "Q"), - Pair("r", "R"), - Pair("s", "S"), - Pair("t", "T"), - Pair("u", "U"), - Pair("v", "V"), - Pair("w", "W"), - Pair("x", "X"), - Pair("y", "Y"), - Pair("z", "Z"), - Pair("numbers-symbols", "Numbers / Symbols") - )) + private class TitleFilter : UriSelectFilter( + "Title", + "alpha", + arrayOf( + Pair("all", "All"), + Pair("a", "A"), + Pair("b", "B"), + Pair("c", "C"), + Pair("d", "D"), + Pair("e", "E"), + Pair("f", "F"), + Pair("g", "G"), + Pair("h", "H"), + Pair("i", "I"), + Pair("j", "J"), + Pair("k", "K"), + Pair("l", "L"), + Pair("m", "M"), + Pair("n", "N"), + Pair("o", "O"), + Pair("p", "P"), + Pair("q", "Q"), + Pair("r", "R"), + Pair("s", "S"), + Pair("t", "T"), + Pair("u", "U"), + Pair("v", "V"), + Pair("w", "W"), + Pair("x", "X"), + Pair("y", "Y"), + Pair("z", "Z"), + Pair("numbers-symbols", "Numbers / Symbols") + ) + ) - private class SortFilter : UriSelectFilter("Sort By", "sortby", arrayOf( - Pair("none", "None"), - Pair("a-z", "A-Z"), - Pair("z-a", "Z-A") - )) + private class SortFilter : UriSelectFilter( + "Sort By", + "sortby", + arrayOf( + Pair("none", "None"), + Pair("a-z", "A-Z"), + Pair("z-a", "Z-A") + ) + ) // Other Code diff --git a/src/en/honkaiimpact3/src/eu/kanade/tachiyomi/extension/en/honkaiimpact/Honkaiimpact.kt b/src/en/honkaiimpact3/src/eu/kanade/tachiyomi/extension/en/honkaiimpact/Honkaiimpact.kt index 6492dd3e6..0efdbdfb5 100644 --- a/src/en/honkaiimpact3/src/eu/kanade/tachiyomi/extension/en/honkaiimpact/Honkaiimpact.kt +++ b/src/en/honkaiimpact3/src/eu/kanade/tachiyomi/extension/en/honkaiimpact/Honkaiimpact.kt @@ -13,13 +13,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class Honkaiimpact : ParsedHttpSource() { diff --git a/src/en/madokami/src/eu/kanade/tachiyomi/extension/en/madokami/Madokami.kt b/src/en/madokami/src/eu/kanade/tachiyomi/extension/en/madokami/Madokami.kt index d6bc11cd0..d992bf684 100644 --- a/src/en/madokami/src/eu/kanade/tachiyomi/extension/en/madokami/Madokami.kt +++ b/src/en/madokami/src/eu/kanade/tachiyomi/extension/en/madokami/Madokami.kt @@ -15,12 +15,6 @@ 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 java.io.IOException -import java.net.URLDecoder -import java.net.URLEncoder -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.Credentials import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -30,6 +24,12 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.io.IOException +import java.net.URLDecoder +import java.net.URLEncoder +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class Madokami : ConfigurableSource, ParsedHttpSource() { override val name = "Madokami" @@ -145,7 +145,7 @@ class Madokami : ConfigurableSource, ParsedHttpSource() { } chapter.date_upload = newDate.time.time } else { - chapter.date_upload = dateFormat.parse(date).time + chapter.date_upload = dateFormat.parse(date)?.time ?: 0L } return chapter } diff --git a/src/en/mangacruzers/src/eu/kanade/tachiyomi/extension/en/mangacruzers/mangacruzers.kt b/src/en/mangacruzers/src/eu/kanade/tachiyomi/extension/en/mangacruzers/mangacruzers.kt index 63a3f9bbb..ad4860a2b 100644 --- a/src/en/mangacruzers/src/eu/kanade/tachiyomi/extension/en/mangacruzers/mangacruzers.kt +++ b/src/en/mangacruzers/src/eu/kanade/tachiyomi/extension/en/mangacruzers/mangacruzers.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class mangacruzers : ParsedHttpSource() { @@ -70,16 +70,16 @@ class mangacruzers : ParsedHttpSource() { override fun latestUpdatesFromElement(element: Element) = mangaFromElement(element) override fun searchMangaFromElement(element: Element) = mangaFromElement(element) - private fun mangaFromElement(element: Element): SManga { - val manga = SManga.create() - manga.url = element.select("a").attr("abs:href") - manga.title = element.select("td").first().text().trim() + private fun mangaFromElement(element: Element): SManga { + val manga = SManga.create() + manga.url = element.select("a").attr("abs:href") + manga.title = element.select("td").first().text().trim() return manga } private fun parseDate(date: String): Long { - return SimpleDateFormat("MMM dd, yyyy", Locale.US).parse(date).time + return SimpleDateFormat("MMM dd, yyyy", Locale.US).parse(date)?.time ?: 0L } override fun chapterFromElement(element: Element) = SChapter.create().apply { diff --git a/src/en/mangadog/src/eu/kanade/tachiyomi/extension/en/mangadog/Mangadog.kt b/src/en/mangadog/src/eu/kanade/tachiyomi/extension/en/mangadog/Mangadog.kt index 7d5f5ce41..d1de97901 100644 --- a/src/en/mangadog/src/eu/kanade/tachiyomi/extension/en/mangadog/Mangadog.kt +++ b/src/en/mangadog/src/eu/kanade/tachiyomi/extension/en/mangadog/Mangadog.kt @@ -13,11 +13,11 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response +import java.text.SimpleDateFormat +import java.util.Locale class Mangadog : HttpSource() { @@ -32,7 +32,7 @@ class Mangadog : HttpSource() { override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/index/latestupdate/getUpdateResult?page=$page", headers) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val uri = Uri.parse("$baseUrl/index/keywordsearch/index").buildUpon() - .appendQueryParameter("query", query) + .appendQueryParameter("query", query) return GET(uri.toString(), headers) } @@ -122,7 +122,7 @@ class Mangadog : HttpSource() { } private fun parseDate(date: String): Long { - return SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(date).time + return SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(date)?.time ?: 0L } override fun mangaDetailsParse(response: Response): SManga { diff --git a/src/en/mangaeden/src/eu/kanade/tachiyomi/extension/en/mangaeden/Mangaeden.kt b/src/en/mangaeden/src/eu/kanade/tachiyomi/extension/en/mangaeden/Mangaeden.kt index aed1c7a17..fa3a960cc 100644 --- a/src/en/mangaeden/src/eu/kanade/tachiyomi/extension/en/mangaeden/Mangaeden.kt +++ b/src/en/mangaeden/src/eu/kanade/tachiyomi/extension/en/mangaeden/Mangaeden.kt @@ -7,15 +7,15 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class Mangaeden : ParsedHttpSource() { @@ -52,15 +52,18 @@ class Mangaeden : ParsedHttpSource() { val url = HttpUrl.parse("$baseUrl/en/en-directory/")?.newBuilder()!!.addQueryParameter("title", query) (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> when (filter) { - is StatusList -> filter.state + is StatusList -> + filter.state .filter { it.state } .map { it.id.toString() } .forEach { url.addQueryParameter("status", it) } - is Types -> filter.state + is Types -> + filter.state .filter { it.state } .map { it.id.toString() } .forEach { url.addQueryParameter("type", it) } - is GenreList -> filter.state + is GenreList -> + filter.state .filter { !it.isIgnored() } .forEach { genre -> url.addQueryParameter(if (genre.isIncluded()) "categoriesInc" else "categoriesExcl", genre.id) } is TextField -> url.addQueryParameter(filter.key, filter.state) @@ -129,11 +132,12 @@ class Mangaeden : ParsedHttpSource() { set(Calendar.MILLISECOND, 0) }.timeInMillis } - else -> try { - SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date).time - } catch (e: ParseException) { - 0L - } + else -> + try { + SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date)?.time ?: 0L + } catch (e: ParseException) { + 0L + } } override fun pageListParse(document: Document): List<Page> { @@ -147,69 +151,72 @@ class Mangaeden : ParsedHttpSource() { private class NamedId(name: String, val id: Int) : Filter.CheckBox(name) private class Genre(name: String, val id: String) : Filter.TriState(name) private class TextField(name: String, val key: String) : Filter.Text(name) - private class OrderBy : Filter.Sort("Order by", arrayOf("Manga title", "Views", "Chapters", "Latest chapter"), - Selection(1, false)) + private class OrderBy : Filter.Sort( + "Order by", + arrayOf("Manga title", "Views", "Chapters", "Latest chapter"), + Selection(1, false) + ) private class StatusList(statuses: List<NamedId>) : Filter.Group<NamedId>("Stato", statuses) private class Types(types: List<NamedId>) : Filter.Group<NamedId>("Tipo", types) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - TextField("Author", "author"), - TextField("Artist", "artist"), - OrderBy(), - Types(types()), - StatusList(statuses()), - GenreList(genres()) + TextField("Author", "author"), + TextField("Artist", "artist"), + OrderBy(), + Types(types()), + StatusList(statuses()), + GenreList(genres()) ) private fun types() = listOf( - NamedId("Japanese Manga", 0), - NamedId("Korean Manhwa", 1), - NamedId("Chinese Manhua", 2), - NamedId("Comic", 3), - NamedId("Doujinshi", 4) + NamedId("Japanese Manga", 0), + NamedId("Korean Manhwa", 1), + NamedId("Chinese Manhua", 2), + NamedId("Comic", 3), + NamedId("Doujinshi", 4) ) private fun statuses() = listOf( - NamedId("Ongoing", 1), - NamedId("Completed", 2), - NamedId("Suspended", 0) + NamedId("Ongoing", 1), + NamedId("Completed", 2), + NamedId("Suspended", 0) ) private fun genres() = listOf( - Genre("Action", "4e70e91bc092255ef70016f8"), - Genre("Adult", "4e70e92fc092255ef7001b94"), - Genre("Adventure", "4e70e918c092255ef700168e"), - Genre("Comedy", "4e70e918c092255ef7001675"), - Genre("Doujinshi", "4e70e928c092255ef7001a0a"), - Genre("Drama", "4e70e918c092255ef7001693"), - Genre("Ecchi", "4e70e91ec092255ef700175e"), - Genre("Fantasy", "4e70e918c092255ef7001676"), - Genre("Gender Bender", "4e70e921c092255ef700184b"), - Genre("Harem", "4e70e91fc092255ef7001783"), - Genre("Historical", "4e70e91ac092255ef70016d8"), - Genre("Horror", "4e70e919c092255ef70016a8"), - Genre("Josei", "4e70e920c092255ef70017de"), - Genre("Martial Arts", "4e70e923c092255ef70018d0"), - Genre("Mature", "4e70e91bc092255ef7001705"), - Genre("Mecha", "4e70e922c092255ef7001877"), - Genre("Mystery", "4e70e918c092255ef7001681"), - Genre("One Shot", "4e70e91dc092255ef7001747"), - Genre("Psychological", "4e70e919c092255ef70016a9"), - Genre("Romance", "4e70e918c092255ef7001677"), - Genre("School Life", "4e70e918c092255ef7001688"), - Genre("Sci-fi", "4e70e91bc092255ef7001706"), - Genre("Seinen", "4e70e918c092255ef700168b"), - Genre("Shoujo", "4e70e918c092255ef7001667"), - Genre("Shounen", "4e70e918c092255ef700166f"), - Genre("Slice of Life", "4e70e918c092255ef700167e"), - Genre("Smut", "4e70e922c092255ef700185a"), - Genre("Sports", "4e70e91dc092255ef700172e"), - Genre("Supernatural", "4e70e918c092255ef700166a"), - Genre("Tragedy", "4e70e918c092255ef7001672"), - Genre("Webtoons", "4e70ea70c092255ef7006d9c"), - Genre("Yaoi", "4e70e91ac092255ef70016e5"), - Genre("Yuri", "4e70e92ac092255ef7001a57") + Genre("Action", "4e70e91bc092255ef70016f8"), + Genre("Adult", "4e70e92fc092255ef7001b94"), + Genre("Adventure", "4e70e918c092255ef700168e"), + Genre("Comedy", "4e70e918c092255ef7001675"), + Genre("Doujinshi", "4e70e928c092255ef7001a0a"), + Genre("Drama", "4e70e918c092255ef7001693"), + Genre("Ecchi", "4e70e91ec092255ef700175e"), + Genre("Fantasy", "4e70e918c092255ef7001676"), + Genre("Gender Bender", "4e70e921c092255ef700184b"), + Genre("Harem", "4e70e91fc092255ef7001783"), + Genre("Historical", "4e70e91ac092255ef70016d8"), + Genre("Horror", "4e70e919c092255ef70016a8"), + Genre("Josei", "4e70e920c092255ef70017de"), + Genre("Martial Arts", "4e70e923c092255ef70018d0"), + Genre("Mature", "4e70e91bc092255ef7001705"), + Genre("Mecha", "4e70e922c092255ef7001877"), + Genre("Mystery", "4e70e918c092255ef7001681"), + Genre("One Shot", "4e70e91dc092255ef7001747"), + Genre("Psychological", "4e70e919c092255ef70016a9"), + Genre("Romance", "4e70e918c092255ef7001677"), + Genre("School Life", "4e70e918c092255ef7001688"), + Genre("Sci-fi", "4e70e91bc092255ef7001706"), + Genre("Seinen", "4e70e918c092255ef700168b"), + Genre("Shoujo", "4e70e918c092255ef7001667"), + Genre("Shounen", "4e70e918c092255ef700166f"), + Genre("Slice of Life", "4e70e918c092255ef700167e"), + Genre("Smut", "4e70e922c092255ef700185a"), + Genre("Sports", "4e70e91dc092255ef700172e"), + Genre("Supernatural", "4e70e918c092255ef700166a"), + Genre("Tragedy", "4e70e918c092255ef7001672"), + Genre("Webtoons", "4e70ea70c092255ef7006d9c"), + Genre("Yaoi", "4e70e91ac092255ef70016e5"), + Genre("Yuri", "4e70e92ac092255ef7001a57") ) } diff --git a/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFast.kt b/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFast.kt index ef8bd8fcc..13727b3fe 100644 --- a/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFast.kt +++ b/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFast.kt @@ -6,10 +6,10 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MangaFast : ParsedHttpSource() { override val name = "MangaFast" diff --git a/src/en/mangafreak/src/eu/kanade/tachiyomi/extension/en/mangafreak/Mangafreak.kt b/src/en/mangafreak/src/eu/kanade/tachiyomi/extension/en/mangafreak/Mangafreak.kt index e31fed9c9..4cbec0d1d 100644 --- a/src/en/mangafreak/src/eu/kanade/tachiyomi/extension/en/mangafreak/Mangafreak.kt +++ b/src/en/mangafreak/src/eu/kanade/tachiyomi/extension/en/mangafreak/Mangafreak.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class Mangafreak : ParsedHttpSource() { override val name: String = "Mangafreak" @@ -76,14 +76,16 @@ class Mangafreak : ParsedHttpSource() { uri.appendPath("Genre") when (filter) { is GenreList -> { - uri.appendPath(filter.state.joinToString("") { - when (it.state) { - Filter.TriState.STATE_IGNORE -> "0" - Filter.TriState.STATE_INCLUDE -> "1" - Filter.TriState.STATE_EXCLUDE -> "2" - else -> "0" + uri.appendPath( + filter.state.joinToString("") { + when (it.state) { + Filter.TriState.STATE_IGNORE -> "0" + Filter.TriState.STATE_INCLUDE -> "1" + Filter.TriState.STATE_EXCLUDE -> "2" + else -> "0" + } } - }) + ) } } uri.appendEncodedPath("Status/0/Type/0") @@ -120,7 +122,7 @@ class Mangafreak : ParsedHttpSource() { date_upload = parseDate(element.select(" td:eq(1)").text()) } private fun parseDate(date: String): Long { - return SimpleDateFormat("yyyy/MM/dd", Locale.US).parse(date).time + return SimpleDateFormat("yyyy/MM/dd", Locale.US).parse(date)?.time ?: 0L } override fun chapterListParse(response: Response): List<SChapter> { return super.chapterListParse(response).reversed() @@ -144,7 +146,8 @@ class Mangafreak : ParsedHttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - GenreList(getGenreList())) + GenreList(getGenreList()) + ) private fun getGenreList() = listOf( Genre("Act"), Genre("Adult"), @@ -185,5 +188,5 @@ class Mangafreak : ParsedHttpSource() { Genre("Vampire"), Genre("Yaoi"), Genre("Yuri") - ) + ) } diff --git a/src/en/mangahasu/src/eu/kanade/tachiyomi/extension/en/mangahasu/Mangahasu.kt b/src/en/mangahasu/src/eu/kanade/tachiyomi/extension/en/mangahasu/Mangahasu.kt index 5239d7bdf..85df4b58e 100644 --- a/src/en/mangahasu/src/eu/kanade/tachiyomi/extension/en/mangahasu/Mangahasu.kt +++ b/src/en/mangahasu/src/eu/kanade/tachiyomi/extension/en/mangahasu/Mangahasu.kt @@ -13,14 +13,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class Mangahasu : ParsedHttpSource() { @@ -195,18 +195,24 @@ class Mangahasu : ParsedHttpSource() { fun toUriPart() = vals[state].second } - private class TypeFilter : UriPartFilter("Type", arrayOf( - Pair("Any", ""), - Pair("Manga", "10"), - Pair("Manhwa", "12"), - Pair("Manhua", "19") - )) + private class TypeFilter : UriPartFilter( + "Type", + arrayOf( + Pair("Any", ""), + Pair("Manga", "10"), + Pair("Manhwa", "12"), + Pair("Manhua", "19") + ) + ) - private class StatusFilter : UriPartFilter("Status", arrayOf( - Pair("Any", ""), - Pair("Completed", "1"), - Pair("Ongoing", "2") - )) + private class StatusFilter : UriPartFilter( + "Status", + arrayOf( + Pair("Any", ""), + Pair("Completed", "1"), + Pair("Ongoing", "2") + ) + ) private class Genre(name: String, val id: String) : Filter.TriState(name) private class GenreFilter(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) diff --git a/src/en/mangahere/src/eu/kanade/tachiyomi/extension/en/mangahere/Mangahere.kt b/src/en/mangahere/src/eu/kanade/tachiyomi/extension/en/mangahere/Mangahere.kt index 94207f01d..d0cfaa8d8 100644 --- a/src/en/mangahere/src/eu/kanade/tachiyomi/extension/en/mangahere/Mangahere.kt +++ b/src/en/mangahere/src/eu/kanade/tachiyomi/extension/en/mangahere/Mangahere.kt @@ -9,10 +9,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.Cookie import okhttp3.CookieJar import okhttp3.HttpUrl @@ -20,6 +16,10 @@ import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class Mangahere : ParsedHttpSource() { @@ -34,19 +34,24 @@ class Mangahere : ParsedHttpSource() { override val supportsLatest = true override val client: OkHttpClient = super.client.newBuilder() - .cookieJar(object : CookieJar { + .cookieJar( + object : CookieJar { override fun saveFromResponse(url: HttpUrl, cookies: MutableList<Cookie>) {} override fun loadForRequest(url: HttpUrl): MutableList<Cookie> { return ArrayList<Cookie>().apply { - add(Cookie.Builder() + add( + Cookie.Builder() .domain("www.mangahere.cc") .path("/") .name("isAdult") .value("1") - .build()) } + .build() + ) + } } - }) - .build() + } + ) + .build() override fun popularMangaSelector() = ".manga-list-1-list li" @@ -67,7 +72,7 @@ class Mangahere : ParsedHttpSource() { manga.title = titleElement.attr("title") manga.setUrlWithoutDomain(titleElement.attr("href")) manga.thumbnail_url = element.select("img.manga-list-1-cover") - ?.first()?.attr("src") + ?.first()?.attr("src") return manga } @@ -140,7 +145,7 @@ class Mangahere : ParsedHttpSource() { manga.genre = document.select(".detail-info-right-tag-list > a")?.joinToString { it.text() } manga.description = document.select(".fullcontent")?.first()?.text() manga.thumbnail_url = document.select("img.detail-info-cover-img")?.first() - ?.attr("src") + ?.attr("src") document.select("span.detail-info-right-title-tip")?.first()?.text()?.also { statusText -> when { @@ -186,7 +191,7 @@ class Mangahere : ParsedHttpSource() { }.timeInMillis } else { try { - SimpleDateFormat("MMM dd,yyyy", Locale.ENGLISH).parse(date).time + SimpleDateFormat("MMM dd,yyyy", Locale.ENGLISH).parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } @@ -232,8 +237,9 @@ class Mangahere : ParsedHttpSource() { val chapterIdStartLoc = html.indexOf("chapterid") val chapterId = html.substring( - chapterIdStartLoc + 11, - html.indexOf(";", chapterIdStartLoc)).trim() + chapterIdStartLoc + 11, + html.indexOf(";", chapterIdStartLoc) + ).trim() val chapterPagesElement = document.select(".pager-list-left > span").first() val pagesLinksElements = chapterPagesElement.select("a") @@ -250,15 +256,15 @@ class Mangahere : ParsedHttpSource() { for (tr in 1..3) { val request = Request.Builder() - .url(pageLink) - .addHeader("Referer", link) - .addHeader("Accept", "*/*") - .addHeader("Accept-Language", "en-US,en;q=0.9") - .addHeader("Connection", "keep-alive") - .addHeader("Host", "www.mangahere.cc") - .addHeader("User-Agent", System.getProperty("http.agent") ?: "") - .addHeader("X-Requested-With", "XMLHttpRequest") - .build() + .url(pageLink) + .addHeader("Referer", link) + .addHeader("Accept", "*/*") + .addHeader("Accept-Language", "en-US,en;q=0.9") + .addHeader("Connection", "keep-alive") + .addHeader("Host", "www.mangahere.cc") + .addHeader("User-Agent", System.getProperty("http.agent") ?: "") + .addHeader("X-Requested-With", "XMLHttpRequest") + .build() val response = client.newCall(request).execute() responseText = response.body()!!.string() @@ -298,7 +304,9 @@ class Mangahere : ParsedHttpSource() { val secretKeyEndLoc = secretKeyDeobfuscatedScript.indexOf(";") val secretKeyResultScript = secretKeyDeobfuscatedScript.substring( - secretKeyStartLoc, secretKeyEndLoc) + secretKeyStartLoc, + secretKeyEndLoc + ) return duktape.evaluate(secretKeyResultScript).toString() } @@ -312,56 +320,56 @@ class Mangahere : ParsedHttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - TypeList(types.keys.toList().sorted().toTypedArray()), - CompletionList(completions), - GenreList(genres()) + TypeList(types.keys.toList().sorted().toTypedArray()), + CompletionList(completions), + GenreList(genres()) ) private val types = hashMapOf( - "Japanese Manga" to 1, - "Korean Manhwa" to 2, - "Other Manga" to 4, - "Any" to 0 + "Japanese Manga" to 1, + "Korean Manhwa" to 2, + "Other Manga" to 4, + "Any" to 0 ) private val completions = arrayOf("Either", "No", "Yes") private fun genres() = arrayListOf( - Genre("Action", 1), - Genre("Adventure", 2), - Genre("Comedy", 3), - Genre("Fantasy", 4), - Genre("Historical", 5), - Genre("Horror", 6), - Genre("Martial Arts", 7), - Genre("Mystery", 8), - Genre("Romance", 9), - Genre("Shounen Ai", 10), - Genre("Supernatural", 11), - Genre("Drama", 12), - Genre("Shounen", 13), - Genre("School Life", 14), - Genre("Shoujo", 15), - Genre("Gender Bender", 16), - Genre("Josei", 17), - Genre("Psychological", 18), - Genre("Seinen", 19), - Genre("Slice of Life", 20), - Genre("Sci-fi", 21), - Genre("Ecchi", 22), - Genre("Harem", 23), - Genre("Shoujo Ai", 24), - Genre("Yuri", 25), - Genre("Mature", 26), - Genre("Tragedy", 27), - Genre("Yaoi", 28), - Genre("Doujinshi", 29), - Genre("Sports", 30), - Genre("Adult", 31), - Genre("One Shot", 32), - Genre("Smut", 33), - Genre("Mecha", 34), - Genre("Shotacon", 35), - Genre("Lolicon", 36) + Genre("Action", 1), + Genre("Adventure", 2), + Genre("Comedy", 3), + Genre("Fantasy", 4), + Genre("Historical", 5), + Genre("Horror", 6), + Genre("Martial Arts", 7), + Genre("Mystery", 8), + Genre("Romance", 9), + Genre("Shounen Ai", 10), + Genre("Supernatural", 11), + Genre("Drama", 12), + Genre("Shounen", 13), + Genre("School Life", 14), + Genre("Shoujo", 15), + Genre("Gender Bender", 16), + Genre("Josei", 17), + Genre("Psychological", 18), + Genre("Seinen", 19), + Genre("Slice of Life", 20), + Genre("Sci-fi", 21), + Genre("Ecchi", 22), + Genre("Harem", 23), + Genre("Shoujo Ai", 24), + Genre("Yuri", 25), + Genre("Mature", 26), + Genre("Tragedy", 27), + Genre("Yaoi", 28), + Genre("Doujinshi", 29), + Genre("Sports", 30), + Genre("Adult", 31), + Genre("One Shot", 32), + Genre("Smut", 33), + Genre("Mecha", 34), + Genre("Shotacon", 35), + Genre("Lolicon", 36) ) } diff --git a/src/en/mangahub/src/eu/kanade/tachiyomi/extension/en/mangahub/Mangahub.kt b/src/en/mangahub/src/eu/kanade/tachiyomi/extension/en/mangahub/Mangahub.kt index c8f25490c..3c2dac875 100644 --- a/src/en/mangahub/src/eu/kanade/tachiyomi/extension/en/mangahub/Mangahub.kt +++ b/src/en/mangahub/src/eu/kanade/tachiyomi/extension/en/mangahub/Mangahub.kt @@ -14,17 +14,17 @@ 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 java.net.URL -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.HttpUrl import okhttp3.Request import okhttp3.RequestBody import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.net.URL +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class Mangahub : ParsedHttpSource() { @@ -55,7 +55,7 @@ class Mangahub : ParsedHttpSource() { manga.title = titleElement.text() manga.setUrlWithoutDomain(URL(titleElement.attr("href")).path) manga.thumbnail_url = element.select("img.manga-thumb.list-item-thumb") - ?.first()?.attr("src") + ?.first()?.attr("src") return manga } @@ -78,7 +78,7 @@ class Mangahub : ParsedHttpSource() { manga.genre = document.select("._3Czbn a")?.joinToString { it.text() } manga.description = document.select("div#noanim-content-tab-pane-99 p.ZyMp7")?.first()?.text() manga.thumbnail_url = document.select("img.img-responsive")?.first() - ?.attr("src") + ?.attr("src") document.select("._3QCtP > div:nth-child(2) > div:nth-child(3) > span:nth-child(2)")?.first()?.text()?.also { statusText -> when { @@ -133,7 +133,7 @@ class Mangahub : ParsedHttpSource() { // parses: "12-20-2019" and defaults everything that wasn't taken into account to 0 else -> { try { - parsedDate = SimpleDateFormat("MM-dd-yyyy", Locale.US).parse(date).time + parsedDate = SimpleDateFormat("MM-dd-yyyy", Locale.US).parse(date)?.time ?: 0L } catch (e: ParseException) { /*nothing to do, parsedDate is initialized with 0L*/ } } } @@ -208,16 +208,16 @@ class Mangahub : ParsedHttpSource() { private class GenreList(genres: Array<Genre>) : Filter.Select<Genre>("Genres", genres, 0) override fun getFilterList() = FilterList( - OrderBy(orderBy), - GenreList(genres) + OrderBy(orderBy), + GenreList(genres) ) private val orderBy = arrayOf( - Order("Popular", "POPULAR"), - Order("Updates", "LATEST"), - Order("A-Z", "ALPHABET"), - Order("New", "NEW"), - Order("Completed", "COMPLETED") + Order("Popular", "POPULAR"), + Order("Updates", "LATEST"), + Order("A-Z", "ALPHABET"), + Order("New", "NEW"), + Order("Completed", "COMPLETED") ) private val genres = arrayOf( diff --git a/src/en/mangajar/src/eu/kanade/tachiyomi/extension/en/mangajar/MangaJar.kt b/src/en/mangajar/src/eu/kanade/tachiyomi/extension/en/mangajar/MangaJar.kt index 797621e77..7bf9355cf 100644 --- a/src/en/mangajar/src/eu/kanade/tachiyomi/extension/en/mangajar/MangaJar.kt +++ b/src/en/mangajar/src/eu/kanade/tachiyomi/extension/en/mangajar/MangaJar.kt @@ -7,14 +7,14 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class MangaJar : ParsedHttpSource() { @@ -43,8 +43,10 @@ class MangaJar : ParsedHttpSource() { override fun popularMangaFromElement(element: Element) = SManga.create().apply { setUrlWithoutDomain(element.select("a").attr("href")) title = element.select("img").attr("title") - thumbnail_url = element.select("img").let { if (it.hasAttr("data-src")) - it.attr("data-src") else it.attr("src") } + thumbnail_url = element.select("img").let { + if (it.hasAttr("data-src")) + it.attr("data-src") else it.attr("src") + } } override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element) @@ -63,16 +65,18 @@ class MangaJar : ParsedHttpSource() { url.addQueryParameter("q", query) url.addQueryParameter("page", page.toString()) - (filters.forEach { filter -> - when (filter) { - is OrderBy -> { - url.addQueryParameter("sortBy", filter.toUriPart()) - } - is SortBy -> { - url.addQueryParameter("sortAscending", filter.toUriPart()) + ( + filters.forEach { filter -> + when (filter) { + is OrderBy -> { + url.addQueryParameter("sortBy", filter.toUriPart()) + } + is SortBy -> { + url.addQueryParameter("sortAscending", filter.toUriPart()) + } } } - }) + ) return GET(url.toString(), headers) } @@ -117,7 +121,7 @@ class MangaJar : ParsedHttpSource() { return if ("ago" in string) { parseRelativeDate(string) ?: 0 } else { - dateFormat.parse(string).time + dateFormat.parse(string)?.time ?: 0L } } @@ -146,25 +150,32 @@ class MangaJar : ParsedHttpSource() { override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used") override fun getFilterList() = FilterList( - OrderBy(), - SortBy(), - GenreList() + OrderBy(), + SortBy(), + GenreList() ) - private class SortBy : UriPartFilter("Sort By", arrayOf( + private class SortBy : UriPartFilter( + "Sort By", + arrayOf( Pair("Descending", "0"), Pair("Ascending", "1") - )) + ) + ) - private class OrderBy : UriPartFilter("Order By", arrayOf( + private class OrderBy : UriPartFilter( + "Order By", + arrayOf( Pair("Popularity", "popular"), Pair("Year", "year"), Pair("Alphabet", "name"), Pair("Date added", "published_at"), Pair("Date updated", "last_chapter_at") - )) + ) + ) - private class GenreList : Filter.Select<String>("Select Genre", + private class GenreList : Filter.Select<String>( + "Select Genre", arrayOf( "", "Fantasy", @@ -220,7 +231,7 @@ class MangaJar : ParsedHttpSource() { private inline fun <reified T> Iterable<*>.findInstance() = find { it is T } as? T private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } } diff --git a/src/en/mangakatana/src/eu/kanade/tachiyomi/extension/en/mangakatana/MangaKatana.kt b/src/en/mangakatana/src/eu/kanade/tachiyomi/extension/en/mangakatana/MangaKatana.kt index 9a9a0ab7c..0ebc79979 100644 --- a/src/en/mangakatana/src/eu/kanade/tachiyomi/extension/en/mangakatana/MangaKatana.kt +++ b/src/en/mangakatana/src/eu/kanade/tachiyomi/extension/en/mangakatana/MangaKatana.kt @@ -6,13 +6,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.MediaType import okhttp3.OkHttpClient import okhttp3.ResponseBody import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MangaKatana : ParsedHttpSource() { override val name = "MangaKatana" diff --git a/src/en/mangalife/src/eu/kanade/tachiyomi/extension/en/mangalife/MangaLife.kt b/src/en/mangalife/src/eu/kanade/tachiyomi/extension/en/mangalife/MangaLife.kt index 130ed0cee..276706d28 100644 --- a/src/en/mangalife/src/eu/kanade/tachiyomi/extension/en/mangalife/MangaLife.kt +++ b/src/en/mangalife/src/eu/kanade/tachiyomi/extension/en/mangalife/MangaLife.kt @@ -17,14 +17,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit /** * Source responds to requests with their full database as a JsonArray, then sorts/filters it client-side @@ -89,11 +89,13 @@ class MangaLife : HttpSource() { val endRange = ((page * 24) - 1).let { if (it <= directory.lastIndex) it else directory.lastIndex } for (i in (((page - 1) * 24)..endRange)) { - mangas.add(SManga.create().apply { - title = directory[i]["s"].string - url = "/manga/${directory[i]["i"].string}" - thumbnail_url = "https://cover.mangabeast01.com/cover/${directory[i]["i"].string}.jpg" - }) + mangas.add( + SManga.create().apply { + title = directory[i]["s"].string + url = "/manga/${directory[i]["i"].string}" + thumbnail_url = "https://cover.mangabeast01.com/cover/${directory[i]["i"].string}.jpg" + } + ) } return MangasPage(mangas, endRange < directory.lastIndex) } @@ -281,54 +283,54 @@ class MangaLife : HttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - YearField(), - AuthorField(), - SelectField("Scan Status", arrayOf("Any", "Complete", "Discontinued", "Hiatus", "Incomplete", "Ongoing")), - SelectField("Publish Status", arrayOf("Any", "Cancelled", "Complete", "Discontinued", "Hiatus", "Incomplete", "Ongoing", "Unfinished")), - SelectField("Type", arrayOf("Any", "Doujinshi", "Manga", "Manhua", "Manhwa", "OEL", "One-shot")), - SelectField("Translation", arrayOf("Any", "Official Only")), - Sort(), - GenreList(getGenreList()) + YearField(), + AuthorField(), + SelectField("Scan Status", arrayOf("Any", "Complete", "Discontinued", "Hiatus", "Incomplete", "Ongoing")), + SelectField("Publish Status", arrayOf("Any", "Cancelled", "Complete", "Discontinued", "Hiatus", "Incomplete", "Ongoing", "Unfinished")), + SelectField("Type", arrayOf("Any", "Doujinshi", "Manga", "Manhua", "Manhwa", "OEL", "One-shot")), + SelectField("Translation", arrayOf("Any", "Official Only")), + Sort(), + GenreList(getGenreList()) ) // [...document.querySelectorAll("label.triStateCheckBox input")].map(el => `Filter("${el.getAttribute('name')}", "${el.nextSibling.textContent.trim()}")`).join(',\n') // https://manga4life.com/advanced-search/ private fun getGenreList() = listOf( - Genre("Action"), - Genre("Adult"), - Genre("Adventure"), - Genre("Comedy"), - Genre("Doujinshi"), - Genre("Drama"), - Genre("Ecchi"), - Genre("Fantasy"), - Genre("Gender Bender"), - Genre("Harem"), - Genre("Hentai"), - Genre("Historical"), - Genre("Horror"), - Genre("Josei"), - Genre("Lolicon"), - Genre("Martial Arts"), - Genre("Mature"), - Genre("Mecha"), - Genre("Mystery"), - Genre("Psychological"), - Genre("Romance"), - Genre("School Life"), - Genre("Sci-fi"), - Genre("Seinen"), - Genre("Shotacon"), - Genre("Shoujo"), - Genre("Shoujo Ai"), - Genre("Shounen"), - Genre("Shounen Ai"), - Genre("Slice of Life"), - Genre("Smut"), - Genre("Sports"), - Genre("Supernatural"), - Genre("Tragedy"), - Genre("Yaoi"), - Genre("Yuri") + Genre("Action"), + Genre("Adult"), + Genre("Adventure"), + Genre("Comedy"), + Genre("Doujinshi"), + Genre("Drama"), + Genre("Ecchi"), + Genre("Fantasy"), + Genre("Gender Bender"), + Genre("Harem"), + Genre("Hentai"), + Genre("Historical"), + Genre("Horror"), + Genre("Josei"), + Genre("Lolicon"), + Genre("Martial Arts"), + Genre("Mature"), + Genre("Mecha"), + Genre("Mystery"), + Genre("Psychological"), + Genre("Romance"), + Genre("School Life"), + Genre("Sci-fi"), + Genre("Seinen"), + Genre("Shotacon"), + Genre("Shoujo"), + Genre("Shoujo Ai"), + Genre("Shounen"), + Genre("Shounen Ai"), + Genre("Slice of Life"), + Genre("Smut"), + Genre("Sports"), + Genre("Supernatural"), + Genre("Tragedy"), + Genre("Yaoi"), + Genre("Yuri") ) } diff --git a/src/en/mangalinkz/src/eu/kanade/tachiyomi/extension/en/mangalinkz/MangaLinkz.kt b/src/en/mangalinkz/src/eu/kanade/tachiyomi/extension/en/mangalinkz/MangaLinkz.kt index a0a13e492..205f36718 100644 --- a/src/en/mangalinkz/src/eu/kanade/tachiyomi/extension/en/mangalinkz/MangaLinkz.kt +++ b/src/en/mangalinkz/src/eu/kanade/tachiyomi/extension/en/mangalinkz/MangaLinkz.kt @@ -11,13 +11,13 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class MangaLinkz : ParsedHttpSource() { @@ -126,11 +126,12 @@ class MangaLinkz : ParsedHttpSource() { } } } - else -> try { - SimpleDateFormat("MMM d, yyyy", Locale.US).parse(this).time - } catch (_: Exception) { - 0L - } + else -> + try { + SimpleDateFormat("MMM d, yyyy", Locale.US).parse(this)?.time ?: 0L + } catch (_: Exception) { + 0L + } } } diff --git a/src/en/mangamainac/src/eu/kanade/tachiyomi/extension/en/mangamainac/MangaMainac.kt b/src/en/mangamainac/src/eu/kanade/tachiyomi/extension/en/mangamainac/MangaMainac.kt index 18f026ab9..5a2e451bf 100644 --- a/src/en/mangamainac/src/eu/kanade/tachiyomi/extension/en/mangamainac/MangaMainac.kt +++ b/src/en/mangamainac/src/eu/kanade/tachiyomi/extension/en/mangamainac/MangaMainac.kt @@ -7,11 +7,11 @@ 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 java.util.Calendar import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.util.Calendar // MangaManiac is a network of sites built by Animemaniac.co. diff --git a/src/en/mangamutiny/src/eu/kanade/tachiyomi/extension/en/mangamutiny/MangaMutiny.kt b/src/en/mangamutiny/src/eu/kanade/tachiyomi/extension/en/mangamutiny/MangaMutiny.kt index 7d6f23005..106bdb967 100644 --- a/src/en/mangamutiny/src/eu/kanade/tachiyomi/extension/en/mangamutiny/MangaMutiny.kt +++ b/src/en/mangamutiny/src/eu/kanade/tachiyomi/extension/en/mangamutiny/MangaMutiny.kt @@ -12,14 +12,14 @@ 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 okhttp3.Headers +import okhttp3.Request +import okhttp3.Response import java.lang.Exception import java.text.SimpleDateFormat import java.util.Locale import java.util.TimeZone import kotlin.collections.ArrayList -import okhttp3.Headers -import okhttp3.Request -import okhttp3.Response fun JsonObject.getNullable(key: String): JsonElement? { val value: JsonElement = this.get(key) ?: return null @@ -72,11 +72,13 @@ class MangaMutiny : HttpSource() { for (singleChapterJsonElement in jsonChapters) { val singleChapterJsonObject = singleChapterJsonElement.asJsonObject - chapterList.add(SChapter.create().apply { - name = chapterTitleBuilder(singleChapterJsonObject) - url = singleChapterJsonObject.get("slug").asString - date_upload = parseDate(singleChapterJsonObject.get("releasedAt").asString) - }) + chapterList.add( + SChapter.create().apply { + name = chapterTitleBuilder(singleChapterJsonObject) + url = singleChapterJsonObject.get("slug").asString + date_upload = parseDate(singleChapterJsonObject.get("releasedAt").asString) + } + ) } } @@ -211,11 +213,13 @@ class MangaMutiny : HttpSource() { for (singleItem in itemsArray) { val mangaObject = singleItem.asJsonObject - mangasPage.add(SManga.create().apply { - this.title = mangaObject.get("title").asString - this.thumbnail_url = mangaObject.getNullable("thumbnail")?.asString - this.url = mangaObject.get("slug").asString - }) + mangasPage.add( + SManga.create().apply { + this.title = mangaObject.get("title").asString + this.thumbnail_url = mangaObject.getNullable("thumbnail")?.asString + this.url = mangaObject.get("slug").asString + } + ) } } @@ -303,19 +307,27 @@ class MangaMutiny : HttpSource() { } } - private class StatusFilter : UriSelectFilter("Status", "status", arrayOf( - Pair("", "All"), - Pair("completed", "Completed"), - Pair("ongoing", "Ongoing") - )) + private class StatusFilter : UriSelectFilter( + "Status", + "status", + arrayOf( + Pair("", "All"), + Pair("completed", "Completed"), + Pair("ongoing", "Ongoing") + ) + ) - private class CategoryFilter : UriSelectFilter("Category", "tags", arrayOf( - Pair("", "All"), - Pair("josei", "Josei"), - Pair("seinen", "Seinen"), - Pair("shoujo", "Shoujo"), - Pair("shounen", "Shounen") - )) { + private class CategoryFilter : UriSelectFilter( + "Category", + "tags", + arrayOf( + Pair("", "All"), + Pair("josei", "Josei"), + Pair("seinen", "Seinen"), + Pair("shoujo", "Shoujo"), + Pair("shounen", "Shounen") + ) + ) { override fun potentiallyAddToUriParameterMap(parameterMap: MutableMap<String, String>) = appendValueToKeyInUriParameterMap(parameterMap, uriParam, vals[state].first) } @@ -333,92 +345,104 @@ class MangaMutiny : HttpSource() { } } // Actual genere filter list - private class GenresFilter : GenreFilterList("Genres", listOf( - GenreFilter("action", "action"), - GenreFilter("adult", "adult"), - GenreFilter("adventure", "adventure"), - GenreFilter("aliens", "aliens"), - GenreFilter("animals", "animals"), - GenreFilter("comedy", "comedy"), - GenreFilter("cooking", "cooking"), - GenreFilter("crossdressing", "crossdressing"), - GenreFilter("delinquents", "delinquents"), - GenreFilter("demons", "demons"), - GenreFilter("drama", "drama"), - GenreFilter("ecchi", "ecchi"), - GenreFilter("fantasy", "fantasy"), - GenreFilter("gender_bender", "gender bender"), - GenreFilter("genderswap", "genderswap"), - GenreFilter("ghosts", "ghosts"), - GenreFilter("gore", "gore"), - GenreFilter("gyaru", "gyaru"), - GenreFilter("harem", "harem"), - GenreFilter("historical", "historical"), - GenreFilter("horror", "horror"), - GenreFilter("incest", "incest"), - GenreFilter("isekai", "isekai"), - GenreFilter("loli", "loli"), - GenreFilter("magic", "magic"), - GenreFilter("magical_girls", "magical girls"), - GenreFilter("mangamutiny", "mangamutiny"), - GenreFilter("martial_arts", "martial arts"), - GenreFilter("mature", "mature"), - GenreFilter("mecha", "mecha"), - GenreFilter("medical", "medical"), - GenreFilter("military", "military"), - GenreFilter("monster_girls", "monster girls"), - GenreFilter("monsters", "monsters"), - GenreFilter("mystery", "mystery"), - GenreFilter("ninja", "ninja"), - GenreFilter("office_workers", "office workers"), - GenreFilter("philosophical", "philosophical"), - GenreFilter("psychological", "psychological"), - GenreFilter("reincarnation", "reincarnation"), - GenreFilter("reverse_harem", "reverse harem"), - GenreFilter("romance", "romance"), - GenreFilter("school_life", "school life"), - GenreFilter("sci_fi", "sci fi"), - GenreFilter("sci-fi", "sci-fi"), - GenreFilter("sexual_violence", "sexual violence"), - GenreFilter("shota", "shota"), - GenreFilter("shoujo_ai", "shoujo ai"), - GenreFilter("shounen_ai", "shounen ai"), - GenreFilter("slice_of_life", "slice of life"), - GenreFilter("smut", "smut"), - GenreFilter("sports", "sports"), - GenreFilter("superhero", "superhero"), - GenreFilter("supernatural", "supernatural"), - GenreFilter("survival", "survival"), - GenreFilter("time_travel", "time travel"), - GenreFilter("tragedy", "tragedy"), - GenreFilter("video_games", "video games"), - GenreFilter("virtual_reality", "virtual reality"), - GenreFilter("webtoons", "webtoons"), - GenreFilter("wuxia", "wuxia"), - GenreFilter("zombies", "zombies") - )) + private class GenresFilter : GenreFilterList( + "Genres", + listOf( + GenreFilter("action", "action"), + GenreFilter("adult", "adult"), + GenreFilter("adventure", "adventure"), + GenreFilter("aliens", "aliens"), + GenreFilter("animals", "animals"), + GenreFilter("comedy", "comedy"), + GenreFilter("cooking", "cooking"), + GenreFilter("crossdressing", "crossdressing"), + GenreFilter("delinquents", "delinquents"), + GenreFilter("demons", "demons"), + GenreFilter("drama", "drama"), + GenreFilter("ecchi", "ecchi"), + GenreFilter("fantasy", "fantasy"), + GenreFilter("gender_bender", "gender bender"), + GenreFilter("genderswap", "genderswap"), + GenreFilter("ghosts", "ghosts"), + GenreFilter("gore", "gore"), + GenreFilter("gyaru", "gyaru"), + GenreFilter("harem", "harem"), + GenreFilter("historical", "historical"), + GenreFilter("horror", "horror"), + GenreFilter("incest", "incest"), + GenreFilter("isekai", "isekai"), + GenreFilter("loli", "loli"), + GenreFilter("magic", "magic"), + GenreFilter("magical_girls", "magical girls"), + GenreFilter("mangamutiny", "mangamutiny"), + GenreFilter("martial_arts", "martial arts"), + GenreFilter("mature", "mature"), + GenreFilter("mecha", "mecha"), + GenreFilter("medical", "medical"), + GenreFilter("military", "military"), + GenreFilter("monster_girls", "monster girls"), + GenreFilter("monsters", "monsters"), + GenreFilter("mystery", "mystery"), + GenreFilter("ninja", "ninja"), + GenreFilter("office_workers", "office workers"), + GenreFilter("philosophical", "philosophical"), + GenreFilter("psychological", "psychological"), + GenreFilter("reincarnation", "reincarnation"), + GenreFilter("reverse_harem", "reverse harem"), + GenreFilter("romance", "romance"), + GenreFilter("school_life", "school life"), + GenreFilter("sci_fi", "sci fi"), + GenreFilter("sci-fi", "sci-fi"), + GenreFilter("sexual_violence", "sexual violence"), + GenreFilter("shota", "shota"), + GenreFilter("shoujo_ai", "shoujo ai"), + GenreFilter("shounen_ai", "shounen ai"), + GenreFilter("slice_of_life", "slice of life"), + GenreFilter("smut", "smut"), + GenreFilter("sports", "sports"), + GenreFilter("superhero", "superhero"), + GenreFilter("supernatural", "supernatural"), + GenreFilter("survival", "survival"), + GenreFilter("time_travel", "time travel"), + GenreFilter("tragedy", "tragedy"), + GenreFilter("video_games", "video games"), + GenreFilter("virtual_reality", "virtual reality"), + GenreFilter("webtoons", "webtoons"), + GenreFilter("wuxia", "wuxia"), + GenreFilter("zombies", "zombies") + ) + ) // Actual format filter List - private class FormatsFilter : GenreFilterList("Formats", listOf( - GenreFilter("4-koma", "4-koma"), - GenreFilter("adaptation", "adaptation"), - GenreFilter("anthology", "anthology"), - GenreFilter("award_winning", "award winning"), - GenreFilter("doujinshi", "doujinshi"), - GenreFilter("fan_colored", "fan colored"), - GenreFilter("full_color", "full color"), - GenreFilter("long_strip", "long strip"), - GenreFilter("official_colored", "official colored"), - GenreFilter("oneshot", "oneshot"), - GenreFilter("web_comic", "web comic") - )) + private class FormatsFilter : GenreFilterList( + "Formats", + listOf( + GenreFilter("4-koma", "4-koma"), + GenreFilter("adaptation", "adaptation"), + GenreFilter("anthology", "anthology"), + GenreFilter("award_winning", "award winning"), + GenreFilter("doujinshi", "doujinshi"), + GenreFilter("fan_colored", "fan colored"), + GenreFilter("full_color", "full color"), + GenreFilter("long_strip", "long strip"), + GenreFilter("official_colored", "official colored"), + GenreFilter("oneshot", "oneshot"), + GenreFilter("web_comic", "web comic") + ) + ) - private class SortFilter : UriSelectFilter("Sort", "sort", arrayOf( - Pair("-rating -ratingCount", "Popular"), - Pair("-lastReleasedAt", "Last update"), - Pair("-createdAt", "Newest"), - Pair("title", "Name") - ), firstIsUnspecified = false, defaultValue = 0) + private class SortFilter : UriSelectFilter( + "Sort", + "sort", + arrayOf( + Pair("-rating -ratingCount", "Popular"), + Pair("-lastReleasedAt", "Last update"), + Pair("-createdAt", "Newest"), + Pair("title", "Name") + ), + firstIsUnspecified = false, + defaultValue = 0 + ) private class AuthorFilter : Filter.Text("Manga Author & Artist"), UriFilter { override fun potentiallyAddToUriParameterMap(parameterMap: MutableMap<String, String>) { @@ -429,8 +453,8 @@ class MangaMutiny : HttpSource() { } /**The scanlator filter exists on the mangamutiny website website, however it doesn't work. - This should stay disabled in the extension until it's properly implemented on the website, - otherwise users may be confused by searches that return no results.**/ + This should stay disabled in the extension until it's properly implemented on the website, + otherwise users may be confused by searches that return no results.**/ /* private class ScanlatorFilter : Filter.Text("Scanlator Name"), UriFilter { override fun potentiallyAddToUriParameterMap(parameterMap: MutableMap<String, String>) { diff --git a/src/en/mangaowl/src/eu/kanade/tachiyomi/extension/en/mangaowl/MangaOwl.kt b/src/en/mangaowl/src/eu/kanade/tachiyomi/extension/en/mangaowl/MangaOwl.kt index 8a99fbbf5..c52a2c3a8 100644 --- a/src/en/mangaowl/src/eu/kanade/tachiyomi/extension/en/mangaowl/MangaOwl.kt +++ b/src/en/mangaowl/src/eu/kanade/tachiyomi/extension/en/mangaowl/MangaOwl.kt @@ -6,14 +6,14 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class MangaOwl : ParsedHttpSource() { diff --git a/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt b/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt index a7133d02a..fdd0b6e52 100644 --- a/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt +++ b/src/en/mangapark/src/eu/kanade/tachiyomi/extension/en/mangapark/MangaPark.kt @@ -15,9 +15,6 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.CacheControl import okhttp3.Request import okhttp3.Response @@ -26,6 +23,9 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class MangaPark : ConfigurableSource, ParsedHttpSource() { @@ -154,7 +154,7 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { return when (getSourcePref()) { // source with most chapters along with chapters that source doesn't have "most" -> { - val chapters = mangaBySource.maxBy { it.count() }!! + val chapters = mangaBySource.maxByOrNull { it.count() }!! (chapters + chapters.getMissingChapters(mangaBySource.flatten())).sortedByDescending { it.chapter_number } } // "smart list" - try not to miss a chapter and avoid dupes @@ -280,21 +280,21 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { override fun imageUrlParse(document: Document) = throw UnsupportedOperationException("Not used") override fun getFilterList() = FilterList( - AuthorArtistText(), - SearchTypeFilter("Title query", "name-match"), - SearchTypeFilter("Author/Artist query", "autart-match"), - SortFilter(), - GenreGroup(), - GenreInclusionFilter(), - ChapterCountFilter(), - StatusFilter(), - RatingFilter(), - TypeFilter(), - YearFilter() + AuthorArtistText(), + SearchTypeFilter("Title query", "name-match"), + SearchTypeFilter("Author/Artist query", "autart-match"), + SortFilter(), + GenreGroup(), + GenreInclusionFilter(), + ChapterCountFilter(), + StatusFilter(), + RatingFilter(), + TypeFilter(), + YearFilter() ) private class SearchTypeFilter(name: String, val uriParam: String) : - Filter.Select<String>(name, STATE_MAP), UriFilter { + Filter.Select<String>(name, STATE_MAP), UriFilter { override fun addToUri(uri: Uri.Builder) { if (STATE_MAP[state] != "contain") { uri.appendQueryParameter(uriParam, STATE_MAP[state]) @@ -316,107 +316,112 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { private class GenreFilter(val uriParam: String, displayName: String) : Filter.TriState(displayName) - private class GenreGroup : Filter.Group<GenreFilter>("Genres", listOf( - GenreFilter("4-koma", "4 koma"), - GenreFilter("action", "Action"), - GenreFilter("adaptation", "Adaptation"), - GenreFilter("adult", "Adult"), - GenreFilter("adventure", "Adventure"), - GenreFilter("aliens", "Aliens"), - GenreFilter("animals", "Animals"), - GenreFilter("anthology", "Anthology"), - GenreFilter("award-winning", "Award winning"), - GenreFilter("comedy", "Comedy"), - GenreFilter("cooking", "Cooking"), - GenreFilter("crime", "Crime"), - GenreFilter("crossdressing", "Crossdressing"), - GenreFilter("delinquents", "Delinquents"), - GenreFilter("demons", "Demons"), - GenreFilter("doujinshi", "Doujinshi"), - GenreFilter("drama", "Drama"), - GenreFilter("ecchi", "Ecchi"), - GenreFilter("fan-colored", "Fan colored"), - GenreFilter("fantasy", "Fantasy"), - GenreFilter("food", "Food"), - GenreFilter("full-color", "Full color"), - GenreFilter("game", "Game"), - GenreFilter("gender-bender", "Gender bender"), - GenreFilter("genderswap", "Genderswap"), - GenreFilter("ghosts", "Ghosts"), - GenreFilter("gore", "Gore"), - GenreFilter("gossip", "Gossip"), - GenreFilter("gyaru", "Gyaru"), - GenreFilter("harem", "Harem"), - GenreFilter("historical", "Historical"), - GenreFilter("horror", "Horror"), - GenreFilter("incest", "Incest"), - GenreFilter("isekai", "Isekai"), - GenreFilter("josei", "Josei"), - GenreFilter("kids", "Kids"), - GenreFilter("loli", "Loli"), - GenreFilter("lolicon", "Lolicon"), - GenreFilter("long-strip", "Long strip"), - GenreFilter("mafia", "Mafia"), - GenreFilter("magic", "Magic"), - GenreFilter("magical-girls", "Magical girls"), - GenreFilter("manhwa", "Manhwa"), - GenreFilter("martial-arts", "Martial arts"), - GenreFilter("mature", "Mature"), - GenreFilter("mecha", "Mecha"), - GenreFilter("medical", "Medical"), - GenreFilter("military", "Military"), - GenreFilter("monster-girls", "Monster girls"), - GenreFilter("monsters", "Monsters"), - GenreFilter("music", "Music"), - GenreFilter("mystery", "Mystery"), - GenreFilter("ninja", "Ninja"), - GenreFilter("office-workers", "Office workers"), - GenreFilter("official-colored", "Official colored"), - GenreFilter("one-shot", "One shot"), - GenreFilter("parody", "Parody"), - GenreFilter("philosophical", "Philosophical"), - GenreFilter("police", "Police"), - GenreFilter("post-apocalyptic", "Post apocalyptic"), - GenreFilter("psychological", "Psychological"), - GenreFilter("reincarnation", "Reincarnation"), - GenreFilter("reverse-harem", "Reverse harem"), - GenreFilter("romance", "Romance"), - GenreFilter("samurai", "Samurai"), - GenreFilter("school-life", "School life"), - GenreFilter("sci-fi", "Sci fi"), - GenreFilter("seinen", "Seinen"), - GenreFilter("shota", "Shota"), - GenreFilter("shotacon", "Shotacon"), - GenreFilter("shoujo", "Shoujo"), - GenreFilter("shoujo-ai", "Shoujo ai"), - GenreFilter("shounen", "Shounen"), - GenreFilter("shounen-ai", "Shounen ai"), - GenreFilter("slice-of-life", "Slice of life"), - GenreFilter("smut", "Smut"), - GenreFilter("space", "Space"), - GenreFilter("sports", "Sports"), - GenreFilter("super-power", "Super power"), - GenreFilter("superhero", "Superhero"), - GenreFilter("supernatural", "Supernatural"), - GenreFilter("survival", "Survival"), - GenreFilter("suspense", "Suspense"), - GenreFilter("thriller", "Thriller"), - GenreFilter("time-travel", "Time travel"), - GenreFilter("toomics", "Toomics"), - GenreFilter("traditional-games", "Traditional games"), - GenreFilter("tragedy", "Tragedy"), - GenreFilter("user-created", "User created"), - GenreFilter("vampire", "Vampire"), - GenreFilter("vampires", "Vampires"), - GenreFilter("video-games", "Video games"), - GenreFilter("virtual-reality", "Virtual reality"), - GenreFilter("web-comic", "Web comic"), - GenreFilter("webtoon", "Webtoon"), - GenreFilter("wuxia", "Wuxia"), - GenreFilter("yaoi", "Yaoi"), - GenreFilter("yuri", "Yuri"), - GenreFilter("zombies", "Zombies") - )), UriFilter { + private class GenreGroup : + Filter.Group<GenreFilter>( + "Genres", + listOf( + GenreFilter("4-koma", "4 koma"), + GenreFilter("action", "Action"), + GenreFilter("adaptation", "Adaptation"), + GenreFilter("adult", "Adult"), + GenreFilter("adventure", "Adventure"), + GenreFilter("aliens", "Aliens"), + GenreFilter("animals", "Animals"), + GenreFilter("anthology", "Anthology"), + GenreFilter("award-winning", "Award winning"), + GenreFilter("comedy", "Comedy"), + GenreFilter("cooking", "Cooking"), + GenreFilter("crime", "Crime"), + GenreFilter("crossdressing", "Crossdressing"), + GenreFilter("delinquents", "Delinquents"), + GenreFilter("demons", "Demons"), + GenreFilter("doujinshi", "Doujinshi"), + GenreFilter("drama", "Drama"), + GenreFilter("ecchi", "Ecchi"), + GenreFilter("fan-colored", "Fan colored"), + GenreFilter("fantasy", "Fantasy"), + GenreFilter("food", "Food"), + GenreFilter("full-color", "Full color"), + GenreFilter("game", "Game"), + GenreFilter("gender-bender", "Gender bender"), + GenreFilter("genderswap", "Genderswap"), + GenreFilter("ghosts", "Ghosts"), + GenreFilter("gore", "Gore"), + GenreFilter("gossip", "Gossip"), + GenreFilter("gyaru", "Gyaru"), + GenreFilter("harem", "Harem"), + GenreFilter("historical", "Historical"), + GenreFilter("horror", "Horror"), + GenreFilter("incest", "Incest"), + GenreFilter("isekai", "Isekai"), + GenreFilter("josei", "Josei"), + GenreFilter("kids", "Kids"), + GenreFilter("loli", "Loli"), + GenreFilter("lolicon", "Lolicon"), + GenreFilter("long-strip", "Long strip"), + GenreFilter("mafia", "Mafia"), + GenreFilter("magic", "Magic"), + GenreFilter("magical-girls", "Magical girls"), + GenreFilter("manhwa", "Manhwa"), + GenreFilter("martial-arts", "Martial arts"), + GenreFilter("mature", "Mature"), + GenreFilter("mecha", "Mecha"), + GenreFilter("medical", "Medical"), + GenreFilter("military", "Military"), + GenreFilter("monster-girls", "Monster girls"), + GenreFilter("monsters", "Monsters"), + GenreFilter("music", "Music"), + GenreFilter("mystery", "Mystery"), + GenreFilter("ninja", "Ninja"), + GenreFilter("office-workers", "Office workers"), + GenreFilter("official-colored", "Official colored"), + GenreFilter("one-shot", "One shot"), + GenreFilter("parody", "Parody"), + GenreFilter("philosophical", "Philosophical"), + GenreFilter("police", "Police"), + GenreFilter("post-apocalyptic", "Post apocalyptic"), + GenreFilter("psychological", "Psychological"), + GenreFilter("reincarnation", "Reincarnation"), + GenreFilter("reverse-harem", "Reverse harem"), + GenreFilter("romance", "Romance"), + GenreFilter("samurai", "Samurai"), + GenreFilter("school-life", "School life"), + GenreFilter("sci-fi", "Sci fi"), + GenreFilter("seinen", "Seinen"), + GenreFilter("shota", "Shota"), + GenreFilter("shotacon", "Shotacon"), + GenreFilter("shoujo", "Shoujo"), + GenreFilter("shoujo-ai", "Shoujo ai"), + GenreFilter("shounen", "Shounen"), + GenreFilter("shounen-ai", "Shounen ai"), + GenreFilter("slice-of-life", "Slice of life"), + GenreFilter("smut", "Smut"), + GenreFilter("space", "Space"), + GenreFilter("sports", "Sports"), + GenreFilter("super-power", "Super power"), + GenreFilter("superhero", "Superhero"), + GenreFilter("supernatural", "Supernatural"), + GenreFilter("survival", "Survival"), + GenreFilter("suspense", "Suspense"), + GenreFilter("thriller", "Thriller"), + GenreFilter("time-travel", "Time travel"), + GenreFilter("toomics", "Toomics"), + GenreFilter("traditional-games", "Traditional games"), + GenreFilter("tragedy", "Tragedy"), + GenreFilter("user-created", "User created"), + GenreFilter("vampire", "Vampire"), + GenreFilter("vampires", "Vampires"), + GenreFilter("video-games", "Video games"), + GenreFilter("virtual-reality", "Virtual reality"), + GenreFilter("web-comic", "Web comic"), + GenreFilter("webtoon", "Webtoon"), + GenreFilter("wuxia", "Wuxia"), + GenreFilter("yaoi", "Yaoi"), + GenreFilter("yuri", "Yuri"), + GenreFilter("zombies", "Zombies") + ) + ), + UriFilter { override fun addToUri(uri: Uri.Builder) { val genresParameterValue = state.filter { it.isIncluded() }.joinToString(",") { it.uriParam } if (genresParameterValue.isNotEmpty()) { @@ -430,12 +435,19 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { } } - private class GenreInclusionFilter : UriSelectFilter("Genre inclusion", "genres-mode", arrayOf( + private class GenreInclusionFilter : UriSelectFilter( + "Genre inclusion", + "genres-mode", + arrayOf( Pair("and", "And mode"), Pair("or", "Or mode") - )) + ) + ) - private class ChapterCountFilter : UriSelectFilter("Chapter count", "chapters", arrayOf( + private class ChapterCountFilter : UriSelectFilter( + "Chapter count", + "chapters", + arrayOf( Pair("any", "Any"), Pair("1", "1 +"), Pair("5", "5 +"), @@ -447,15 +459,23 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { Pair("100", "100 +"), Pair("150", "150 +"), Pair("200", "200 +") - )) + ) + ) - private class StatusFilter : UriSelectFilter("Status", "status", arrayOf( + private class StatusFilter : UriSelectFilter( + "Status", + "status", + arrayOf( Pair("any", "Any"), Pair("completed", "Completed"), Pair("ongoing", "Ongoing") - )) + ) + ) - private class RatingFilter : UriSelectFilter("Rating", "rating", arrayOf( + private class RatingFilter : UriSelectFilter( + "Rating", + "rating", + arrayOf( Pair("any", "Any"), Pair("5", "5 stars"), Pair("4", "4 stars"), @@ -463,26 +483,37 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { Pair("2", "2 stars"), Pair("1", "1 star"), Pair("0", "0 stars") - )) + ) + ) - private class TypeFilter : UriSelectFilter("Type", "types", arrayOf( + private class TypeFilter : UriSelectFilter( + "Type", + "types", + arrayOf( Pair("any", "Any"), Pair("manga", "Japanese Manga"), Pair("manhwa", "Korean Manhwa"), Pair("manhua", "Chinese Manhua"), Pair("unknown", "Unknown") - )) - - private class YearFilter : UriSelectFilter("Release year", "years", - arrayOf(Pair("any", "Any"), - // Get all years between today and 1946 - *(Calendar.getInstance().get(Calendar.YEAR) downTo 1946).map { - Pair(it.toString(), it.toString()) - }.toTypedArray() - ) + ) ) - private class SortFilter : UriSelectFilter("Sort", "orderby", arrayOf( + private class YearFilter : UriSelectFilter( + "Release year", + "years", + arrayOf( + Pair("any", "Any"), + // Get all years between today and 1946 + *(Calendar.getInstance().get(Calendar.YEAR) downTo 1946).map { + Pair(it.toString(), it.toString()) + }.toTypedArray() + ) + ) + + private class SortFilter : UriSelectFilter( + "Sort", + "orderby", + arrayOf( Pair("a-z", "A-Z"), Pair("views_a", "Views all-time"), Pair("views_y", "Views last 365 days"), @@ -491,7 +522,10 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { Pair("rating", "Rating"), Pair("update", "Latest"), Pair("create", "New manga") - ), firstIsUnspecified = false, defaultValue = 1) + ), + firstIsUnspecified = false, + defaultValue = 1 + ) /** * Class that creates a select filter. Each entry in the dropdown has a name and a display name. @@ -506,7 +540,7 @@ class MangaPark : ConfigurableSource, ParsedHttpSource() { val firstIsUnspecified: Boolean = true, defaultValue: Int = 0 ) : - Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter { + Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter { override fun addToUri(uri: Uri.Builder) { if (state != 0 || !firstIsUnspecified) uri.appendQueryParameter(uriParam, vals[state].first) diff --git a/src/en/mangareader/src/eu/kanade/tachiyomi/extension/en/mangareader/MRP.kt b/src/en/mangareader/src/eu/kanade/tachiyomi/extension/en/mangareader/MRP.kt index 3c563610a..683ae054a 100644 --- a/src/en/mangareader/src/eu/kanade/tachiyomi/extension/en/mangareader/MRP.kt +++ b/src/en/mangareader/src/eu/kanade/tachiyomi/extension/en/mangareader/MRP.kt @@ -8,13 +8,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale abstract class MRP( override val name: String, diff --git a/src/en/mangareader/src/eu/kanade/tachiyomi/extension/en/mangareader/MRPFactory.kt b/src/en/mangareader/src/eu/kanade/tachiyomi/extension/en/mangareader/MRPFactory.kt index b658e1215..99ac200a3 100644 --- a/src/en/mangareader/src/eu/kanade/tachiyomi/extension/en/mangareader/MRPFactory.kt +++ b/src/en/mangareader/src/eu/kanade/tachiyomi/extension/en/mangareader/MRPFactory.kt @@ -14,8 +14,9 @@ import org.jsoup.nodes.Element class MRPFactory : SourceFactory { override fun createSources(): List<Source> = listOf( - Mangareader(), - Mangapanda()) + Mangareader(), + Mangapanda() + ) } class Mangareader : MRP("Mangareader", "https://www.mangareader.net") { diff --git a/src/en/mangarockes/src/eu/kanade/tachiyomi/extension/en/mangarockes/MangaRockEs.kt b/src/en/mangarockes/src/eu/kanade/tachiyomi/extension/en/mangarockes/MangaRockEs.kt index bd2a851c2..e44901c2c 100644 --- a/src/en/mangarockes/src/eu/kanade/tachiyomi/extension/en/mangarockes/MangaRockEs.kt +++ b/src/en/mangarockes/src/eu/kanade/tachiyomi/extension/en/mangarockes/MangaRockEs.kt @@ -10,11 +10,6 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale -import kotlin.experimental.and -import kotlin.experimental.xor import okhttp3.HttpUrl import okhttp3.MediaType import okhttp3.OkHttpClient @@ -23,6 +18,11 @@ import okhttp3.Response import okhttp3.ResponseBody import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import kotlin.experimental.and +import kotlin.experimental.xor class MangaRockEs : ParsedHttpSource() { @@ -35,16 +35,18 @@ class MangaRockEs : ParsedHttpSource() { override val supportsLatest = true // Handles the page decoding - override val client: OkHttpClient = network.cloudflareClient.newBuilder().addInterceptor(fun(chain): Response { - val url = chain.request().url().toString() - val response = chain.proceed(chain.request()) - if (!url.endsWith(".mri")) return response + override val client: OkHttpClient = network.cloudflareClient.newBuilder().addInterceptor( + fun(chain): Response { + val url = chain.request().url().toString() + val response = chain.proceed(chain.request()) + if (!url.endsWith(".mri")) return response - val decoded: ByteArray = decodeMri(response) - val mediaType = MediaType.parse("image/webp") - val rb = ResponseBody.create(mediaType, decoded) - return response.newBuilder().body(rb).build() - }).build() + val decoded: ByteArray = decodeMri(response) + val mediaType = MediaType.parse("image/webp") + val rb = ResponseBody.create(mediaType, decoded) + return response.newBuilder().body(rb).build() + } + ).build() // Popular @@ -150,7 +152,7 @@ class MangaRockEs : ParsedHttpSource() { calendar.timeInMillis } else { - SimpleDateFormat("MMM d, yyyy", Locale.US).parse(date).time + SimpleDateFormat("MMM d, yyyy", Locale.US).parse(date)?.time ?: 0L } } ?: 0 } @@ -215,13 +217,18 @@ class MangaRockEs : ParsedHttpSource() { // Filters - private class StatusFilter : UriPartFilter("Status", arrayOf( - Pair("All", "all"), - Pair("Completed", "completed"), - Pair("Ongoing", "ongoing") - )) + private class StatusFilter : UriPartFilter( + "Status", + arrayOf( + Pair("All", "all"), + Pair("Completed", "completed"), + Pair("Ongoing", "ongoing") + ) + ) - private class RankFilter : UriPartFilter("Rank", arrayOf( + private class RankFilter : UriPartFilter( + "Rank", + arrayOf( Pair("All", "all"), Pair("1 - 999", "1-999"), Pair("1k - 2k", "1000-2000"), @@ -234,80 +241,84 @@ class MangaRockEs : ParsedHttpSource() { Pair("8k - 9k", "8000-9000"), Pair("9k - 19k", "9000-10000"), Pair("10k - 11k", "10000-11000") - )) + ) + ) - private class SortBy : UriPartFilter("Sort by", arrayOf( + private class SortBy : UriPartFilter( + "Sort by", + arrayOf( Pair("Name", "name"), Pair("Rank", "rank") - )) + ) + ) private class Genre(name: String, val uriPart: String) : Filter.CheckBox(name) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - // Search and filter don't work at the same time - Filter.Header("NOTE: Ignored if using text search!"), - Filter.Separator(), - StatusFilter(), - RankFilter(), - SortBy(), - GenreList(getGenreList()) + // Search and filter don't work at the same time + Filter.Header("NOTE: Ignored if using text search!"), + Filter.Separator(), + StatusFilter(), + RankFilter(), + SortBy(), + GenreList(getGenreList()) ) // [...document.querySelectorAll('._2DMqI .mdl-checkbox')].map(n => `Genre("${n.querySelector('.mdl-checkbox__label').innerText}", "${n.querySelector('input').dataset.oid}")`).sort().join(',\n') // on https://mangarock.com/manga private fun getGenreList() = listOf( - Genre("4-koma", "4-koma"), - Genre("Action", "action"), - Genre("Adult", "adult"), - Genre("Adventure", "adventure"), - Genre("Comedy", "comedy"), - Genre("Demons", "demons"), - Genre("Doujinshi", "doujinshi"), - Genre("Drama", "drama"), - Genre("Ecchi", "ecchi"), - Genre("Fantasy", "fantasy"), - Genre("Gender Bender", "gender-bender"), - Genre("Harem", "harem"), - Genre("Historical", "historical"), - Genre("Horror", "horror"), - Genre("Isekai", "isekai"), - Genre("Josei", "josei"), - Genre("Kids", "kids"), - Genre("Magic", "magic"), - Genre("Martial Arts", "martial-arts"), - Genre("Mature", "mature"), - Genre("Mecha", "mecha"), - Genre("Military", "military"), - Genre("Music", "music"), - Genre("Mystery", "mystery"), - Genre("One Shot", "one-shot"), - Genre("Parody", "parody"), - Genre("Police", "police"), - Genre("Psychological", "psychological"), - Genre("Romance", "romance"), - Genre("School Life", "school-life"), - Genre("Sci-Fi", "sci-fi"), - Genre("Seinen", "seinen"), - Genre("Shoujo Ai", "shoujo-ai"), - Genre("Shoujo", "shoujo"), - Genre("Shounen Ai", "shounen-ai"), - Genre("Shounen", "shounen"), - Genre("Slice of Life", "slice-of-life"), - Genre("Smut", "smut"), - Genre("Space", "space"), - Genre("Sports", "sports"), - Genre("Super Power", "super-power"), - Genre("Supernatural", "supernatural"), - Genre("Tragedy", "tragedy"), - Genre("Vampire", "vampire"), - Genre("Webtoons", "webtoons"), - Genre("Yaoi", "yaoi"), - Genre("Yuri", "yuri") + Genre("4-koma", "4-koma"), + Genre("Action", "action"), + Genre("Adult", "adult"), + Genre("Adventure", "adventure"), + Genre("Comedy", "comedy"), + Genre("Demons", "demons"), + Genre("Doujinshi", "doujinshi"), + Genre("Drama", "drama"), + Genre("Ecchi", "ecchi"), + Genre("Fantasy", "fantasy"), + Genre("Gender Bender", "gender-bender"), + Genre("Harem", "harem"), + Genre("Historical", "historical"), + Genre("Horror", "horror"), + Genre("Isekai", "isekai"), + Genre("Josei", "josei"), + Genre("Kids", "kids"), + Genre("Magic", "magic"), + Genre("Martial Arts", "martial-arts"), + Genre("Mature", "mature"), + Genre("Mecha", "mecha"), + Genre("Military", "military"), + Genre("Music", "music"), + Genre("Mystery", "mystery"), + Genre("One Shot", "one-shot"), + Genre("Parody", "parody"), + Genre("Police", "police"), + Genre("Psychological", "psychological"), + Genre("Romance", "romance"), + Genre("School Life", "school-life"), + Genre("Sci-Fi", "sci-fi"), + Genre("Seinen", "seinen"), + Genre("Shoujo Ai", "shoujo-ai"), + Genre("Shoujo", "shoujo"), + Genre("Shounen Ai", "shounen-ai"), + Genre("Shounen", "shounen"), + Genre("Slice of Life", "slice-of-life"), + Genre("Smut", "smut"), + Genre("Space", "space"), + Genre("Sports", "sports"), + Genre("Super Power", "super-power"), + Genre("Supernatural", "supernatural"), + Genre("Tragedy", "tragedy"), + Genre("Vampire", "vampire"), + Genre("Webtoons", "webtoons"), + Genre("Yaoi", "yaoi"), + Genre("Yuri", "yuri") ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } } diff --git a/src/en/mangasail/src/eu/kanade/tachiyomi/extension/en/mangasail/Mangasail.kt b/src/en/mangasail/src/eu/kanade/tachiyomi/extension/en/mangasail/Mangasail.kt index 26f1b8646..7cf1a4450 100644 --- a/src/en/mangasail/src/eu/kanade/tachiyomi/extension/en/mangasail/Mangasail.kt +++ b/src/en/mangasail/src/eu/kanade/tachiyomi/extension/en/mangasail/Mangasail.kt @@ -12,13 +12,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.Jsoup.parse import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class Mangasail : ParsedHttpSource() { @@ -155,7 +155,7 @@ class Mangasail : ParsedHttpSource() { } private fun parseChapterDate(string: String): Long { - return dateFormat.parse(string.substringAfter("on ")).time + return dateFormat.parse(string.substringAfter("on "))?.time ?: 0L } override fun pageListParse(document: Document): List<Page> { diff --git a/src/en/mangasee/src/eu/kanade/tachiyomi/extension/en/mangasee/Mangasee.kt b/src/en/mangasee/src/eu/kanade/tachiyomi/extension/en/mangasee/Mangasee.kt index ee8319b7d..e1c41f29f 100644 --- a/src/en/mangasee/src/eu/kanade/tachiyomi/extension/en/mangasee/Mangasee.kt +++ b/src/en/mangasee/src/eu/kanade/tachiyomi/extension/en/mangasee/Mangasee.kt @@ -17,14 +17,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit /** * Exact same code as Manga Life except for better chapter names thanks to Regex @@ -92,11 +92,13 @@ class Mangasee : HttpSource() { val endRange = ((page * 24) - 1).let { if (it <= directory.lastIndex) it else directory.lastIndex } for (i in (((page - 1) * 24)..endRange)) { - mangas.add(SManga.create().apply { - title = directory[i]["s"].string - url = "/manga/${directory[i]["i"].string}" - thumbnail_url = "https://cover.mangabeast01.com/cover/${directory[i]["i"].string}.jpg" - }) + mangas.add( + SManga.create().apply { + title = directory[i]["s"].string + url = "/manga/${directory[i]["i"].string}" + thumbnail_url = "https://cover.mangabeast01.com/cover/${directory[i]["i"].string}.jpg" + } + ) } return MangasPage(mangas, endRange < directory.lastIndex) } diff --git a/src/en/mangatown/src/eu/kanade/tachiyomi/extension/en/mangatown/Mangatown.kt b/src/en/mangatown/src/eu/kanade/tachiyomi/extension/en/mangatown/Mangatown.kt index 8ca6fc36c..a911c33ed 100644 --- a/src/en/mangatown/src/eu/kanade/tachiyomi/extension/en/mangatown/Mangatown.kt +++ b/src/en/mangatown/src/eu/kanade/tachiyomi/extension/en/mangatown/Mangatown.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class Mangatown : ParsedHttpSource() { @@ -110,7 +110,7 @@ class Mangatown : ParsedHttpSource() { date.contains("Yesterday") -> Calendar.getInstance().apply { add(Calendar.DAY_OF_MONTH, -1) }.timeInMillis else -> { try { - SimpleDateFormat("MMM dd,yyyy", Locale.US).parse(date).time + SimpleDateFormat("MMM dd,yyyy", Locale.US).parse(date)?.time ?: 0L } catch (e: Exception) { 0L } diff --git a/src/en/manhwatime/src/eu/kanade/tachiyomi/extension/en/manhwatime/ManhwaTime.kt b/src/en/manhwatime/src/eu/kanade/tachiyomi/extension/en/manhwatime/ManhwaTime.kt index d33b616e6..f9b45556d 100644 --- a/src/en/manhwatime/src/eu/kanade/tachiyomi/extension/en/manhwatime/ManhwaTime.kt +++ b/src/en/manhwatime/src/eu/kanade/tachiyomi/extension/en/manhwatime/ManhwaTime.kt @@ -6,13 +6,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.select.Elements +import java.text.SimpleDateFormat +import java.util.Locale class ManhwaTime : ParsedHttpSource() { diff --git a/src/en/manmanga/src/eu/kanade/tachiyomi/extension/en/manmanga/ManManga.kt b/src/en/manmanga/src/eu/kanade/tachiyomi/extension/en/manmanga/ManManga.kt index 3dda9f40f..a26c7a793 100644 --- a/src/en/manmanga/src/eu/kanade/tachiyomi/extension/en/manmanga/ManManga.kt +++ b/src/en/manmanga/src/eu/kanade/tachiyomi/extension/en/manmanga/ManManga.kt @@ -9,12 +9,12 @@ 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 java.text.SimpleDateFormat import okhttp3.OkHttpClient import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.SimpleDateFormat class ManManga : ParsedHttpSource() { override val name = "Man Manga" @@ -82,10 +82,10 @@ class ManManga : ParsedHttpSource() { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { return client.newCall(searchMangaRequest(page, query, filters)) - .asObservableSuccess() - .map { response -> - searchMangaParse(response) - } + .asObservableSuccess() + .map { response -> + searchMangaParse(response) + } } override fun mangaDetailsParse(document: Document) = SManga.create().apply { diff --git a/src/en/merakiscans/src/eu/kanade/tachiyomi/extension/en/merakiscans/MerakiScans.kt b/src/en/merakiscans/src/eu/kanade/tachiyomi/extension/en/merakiscans/MerakiScans.kt index 748366f8d..7539eae29 100644 --- a/src/en/merakiscans/src/eu/kanade/tachiyomi/extension/en/merakiscans/MerakiScans.kt +++ b/src/en/merakiscans/src/eu/kanade/tachiyomi/extension/en/merakiscans/MerakiScans.kt @@ -9,14 +9,14 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class MerakiScans : ParsedHttpSource() { override val name = "MerakiScans" @@ -60,7 +60,7 @@ class MerakiScans : ParsedHttpSource() { override fun latestUpdatesNextPageSelector(): String? = null override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = - GET("$baseUrl/manga", headers) + GET("$baseUrl/manga", headers) override fun searchMangaSelector() = popularMangaSelector() @@ -83,10 +83,10 @@ class MerakiScans : ParsedHttpSource() { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { return client.newCall(searchMangaRequest(page, query, filters)) - .asObservableSuccess() - .map { response -> - searchMangaParse(response, query) - } + .asObservableSuccess() + .map { response -> + searchMangaParse(response, query) + } } override fun mangaDetailsParse(document: Document) = SManga.create().apply { @@ -117,7 +117,7 @@ class MerakiScans : ParsedHttpSource() { private fun parseChapterDate(date: String): Long { return try { - dateFormat.parse(date.replace(Regex("(st|nd|rd|th)"), "")).time + dateFormat.parse(date.replace(Regex("(st|nd|rd|th)"), ""))?.time ?: 0L } catch (e: ParseException) { 0L } diff --git a/src/en/myhentaicomics/src/eu/kanade/tachiyomi/extension/en/myhentaicomics/MyHentaiComics.kt b/src/en/myhentaicomics/src/eu/kanade/tachiyomi/extension/en/myhentaicomics/MyHentaiComics.kt index ef28f7a4e..81209e6d4 100644 --- a/src/en/myhentaicomics/src/eu/kanade/tachiyomi/extension/en/myhentaicomics/MyHentaiComics.kt +++ b/src/en/myhentaicomics/src/eu/kanade/tachiyomi/extension/en/myhentaicomics/MyHentaiComics.kt @@ -146,7 +146,8 @@ class MyHentaiComics : ParsedHttpSource() { GenreFilter() ) - private class GenreFilter : UriPartFilter("Genres", + private class GenreFilter : UriPartFilter( + "Genres", arrayOf( Pair("<Choose a genre>", ""), Pair("3D", "/index.php/tag/2403"), diff --git a/src/en/myhentaigallery/src/eu/kanade/tachiyomi/extension/en/myhentaigallery/MyHentaiGallery.kt b/src/en/myhentaigallery/src/eu/kanade/tachiyomi/extension/en/myhentaigallery/MyHentaiGallery.kt index 109719f53..0f0ff80d5 100644 --- a/src/en/myhentaigallery/src/eu/kanade/tachiyomi/extension/en/myhentaigallery/MyHentaiGallery.kt +++ b/src/en/myhentaigallery/src/eu/kanade/tachiyomi/extension/en/myhentaigallery/MyHentaiGallery.kt @@ -127,10 +127,12 @@ class MyHentaiGallery : ParsedHttpSource() { // Chapters override fun chapterListParse(response: Response): List<SChapter> { - return listOf(SChapter.create().apply { - name = "Chapter" - url = response.request().url().toString().substringAfter(baseUrl) - }) + return listOf( + SChapter.create().apply { + name = "Chapter" + url = response.request().url().toString().substringAfter(baseUrl) + } + ) } override fun chapterListSelector() = throw UnsupportedOperationException("Not used") @@ -155,84 +157,87 @@ class MyHentaiGallery : ParsedHttpSource() { GenreFilter() ) - private class GenreFilter : UriPartFilter("Category", arrayOf( - Pair("<select>", "---"), - Pair("3D Comic", "3"), - Pair("Ahegao", "2740"), - Pair("Anal", "2741"), - Pair("Asian", "4"), - Pair("Ass Expansion", "5"), - Pair("Aunt", "6"), - Pair("BBW", "7"), - Pair("Beastiality", "8"), - Pair("Bimbofication", "3430"), - Pair("Bisexual", "9"), - Pair("Black & Interracial", "10"), - Pair("Body Swap", "11"), - Pair("Bondage", "12"), - Pair("Breast Expansion", "13"), - Pair("Brother", "14"), - Pair("Bukakke", "15"), - Pair("Catgirl", "2742"), - Pair("Cheating", "16"), - Pair("Cousin", "17"), - Pair("Crossdressing", "18"), - Pair("Dad", "19"), - Pair("Daughter", "20"), - Pair("Dick Growth", "21"), - Pair("Ebony", "3533"), - Pair("Elf", "2744"), - Pair("Exhibitionism", "2745"), - Pair("Father", "22"), - Pair("Femdom", "23"), - Pair("Foot Fetish", "3253"), - Pair("Furry", "24"), - Pair("Futanari & Shemale & Dickgirl", "25"), - Pair("Futanari X Female", "3416"), - Pair("Futanari X Futanari", "3415"), - Pair("Futanari X Male", "26"), - Pair("Gangbang", "27"), - Pair("Gay & Yaoi", "28"), - Pair("Gender Bending", "29"), - Pair("Giantess", "30"), - Pair("Gloryhole", "31"), - Pair("Hairy Female", "3418"), - Pair("Hardcore", "36"), - Pair("Harem", "37"), - Pair("Incest", "38"), - Pair("Inseki", "3417"), - Pair("Kemonomimi", "3368"), - Pair("Lactation", "39"), - Pair("Lesbian & Yuri & Girls Only", "40"), - Pair("Milf", "41"), - Pair("Mind Break", "3419"), - Pair("Mind Control & Hypnosis", "42"), - Pair("Mom", "43"), - Pair("Mother", "44"), - Pair("Muscle Girl", "45"), - Pair("Muscle Growth", "46"), - Pair("Nephew", "47"), - Pair("Niece", "48"), - Pair("Orgy", "49"), - Pair("Pegging", "50"), - Pair("Possession", "51"), - Pair("Pregnant & Impregnation", "52"), - Pair("Rape", "53"), - Pair("Sister", "54"), - Pair("Solo", "2746"), - Pair("Son", "55"), - Pair("Spanking", "56"), - Pair("Stomach Bulge", "57"), - Pair("Strap-On", "58"), - Pair("Superheroes", "59"), - Pair("Tentacles", "60"), - Pair("Threesome", "61"), - Pair("Transformation", "62"), - Pair("Uncle", "63"), - Pair("Urination", "64"), - Pair("Vore", "65"), - Pair("Weight Gain", "66") - )) + private class GenreFilter : UriPartFilter( + "Category", + arrayOf( + Pair("<select>", "---"), + Pair("3D Comic", "3"), + Pair("Ahegao", "2740"), + Pair("Anal", "2741"), + Pair("Asian", "4"), + Pair("Ass Expansion", "5"), + Pair("Aunt", "6"), + Pair("BBW", "7"), + Pair("Beastiality", "8"), + Pair("Bimbofication", "3430"), + Pair("Bisexual", "9"), + Pair("Black & Interracial", "10"), + Pair("Body Swap", "11"), + Pair("Bondage", "12"), + Pair("Breast Expansion", "13"), + Pair("Brother", "14"), + Pair("Bukakke", "15"), + Pair("Catgirl", "2742"), + Pair("Cheating", "16"), + Pair("Cousin", "17"), + Pair("Crossdressing", "18"), + Pair("Dad", "19"), + Pair("Daughter", "20"), + Pair("Dick Growth", "21"), + Pair("Ebony", "3533"), + Pair("Elf", "2744"), + Pair("Exhibitionism", "2745"), + Pair("Father", "22"), + Pair("Femdom", "23"), + Pair("Foot Fetish", "3253"), + Pair("Furry", "24"), + Pair("Futanari & Shemale & Dickgirl", "25"), + Pair("Futanari X Female", "3416"), + Pair("Futanari X Futanari", "3415"), + Pair("Futanari X Male", "26"), + Pair("Gangbang", "27"), + Pair("Gay & Yaoi", "28"), + Pair("Gender Bending", "29"), + Pair("Giantess", "30"), + Pair("Gloryhole", "31"), + Pair("Hairy Female", "3418"), + Pair("Hardcore", "36"), + Pair("Harem", "37"), + Pair("Incest", "38"), + Pair("Inseki", "3417"), + Pair("Kemonomimi", "3368"), + Pair("Lactation", "39"), + Pair("Lesbian & Yuri & Girls Only", "40"), + Pair("Milf", "41"), + Pair("Mind Break", "3419"), + Pair("Mind Control & Hypnosis", "42"), + Pair("Mom", "43"), + Pair("Mother", "44"), + Pair("Muscle Girl", "45"), + Pair("Muscle Growth", "46"), + Pair("Nephew", "47"), + Pair("Niece", "48"), + Pair("Orgy", "49"), + Pair("Pegging", "50"), + Pair("Possession", "51"), + Pair("Pregnant & Impregnation", "52"), + Pair("Rape", "53"), + Pair("Sister", "54"), + Pair("Solo", "2746"), + Pair("Son", "55"), + Pair("Spanking", "56"), + Pair("Stomach Bulge", "57"), + Pair("Strap-On", "58"), + Pair("Superheroes", "59"), + Pair("Tentacles", "60"), + Pair("Threesome", "61"), + Pair("Transformation", "62"), + Pair("Uncle", "63"), + Pair("Urination", "64"), + Pair("Vore", "65"), + Pair("Weight Gain", "66") + ) + ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { diff --git a/src/en/naniscans/src/eu/kanade/tachiyomi/extension/en/naniscans/NaniScans.kt b/src/en/naniscans/src/eu/kanade/tachiyomi/extension/en/naniscans/NaniScans.kt index 2179e40bc..61defa2ec 100644 --- a/src/en/naniscans/src/eu/kanade/tachiyomi/extension/en/naniscans/NaniScans.kt +++ b/src/en/naniscans/src/eu/kanade/tachiyomi/extension/en/naniscans/NaniScans.kt @@ -8,14 +8,14 @@ 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 java.lang.UnsupportedOperationException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import okhttp3.Response import org.json.JSONArray import org.json.JSONObject import rx.Observable +import java.lang.UnsupportedOperationException +import java.text.SimpleDateFormat +import java.util.Locale class NaniScans : HttpSource() { override val baseUrl = "https://naniscans.com" @@ -109,12 +109,14 @@ class NaniScans : HttpSource() { for (i in 0 until chaptersJson.length()) { val chapter = chaptersJson.getJSONObject(i) - chaptersList.add(SChapter.create().apply { - chapter_number = chapter.get("number").toString().toFloat() - name = getChapterTitle(chapter) - date_upload = dateParser.parse(chapter.getString("releaseDate"))!!.time - url = "${titleJson.getString("id")}_${chapter.getString("id")}" - }) + chaptersList.add( + SChapter.create().apply { + chapter_number = chapter.get("number").toString().toFloat() + name = getChapterTitle(chapter) + date_upload = dateParser.parse(chapter.getString("releaseDate"))!!.time + url = "${titleJson.getString("id")}_${chapter.getString("id")}" + } + ) } return chaptersList diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/extension/en/nineanime/NineAnime.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/extension/en/nineanime/NineAnime.kt index 53ee97531..9c19c0832 100644 --- a/src/en/nineanime/src/eu/kanade/tachiyomi/extension/en/nineanime/NineAnime.kt +++ b/src/en/nineanime/src/eu/kanade/tachiyomi/extension/en/nineanime/NineAnime.kt @@ -7,15 +7,15 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class NineAnime : ParsedHttpSource() { @@ -140,7 +140,7 @@ class NineAnime : ParsedHttpSource() { else -> 0 } } else { - SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).parse(this).time + SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).parse(this)?.time ?: 0L } } catch (_: ParseException) { 0 @@ -172,7 +172,8 @@ class NineAnime : ParsedHttpSource() { GenreFilter() ) - private class GenreFilter : UriPartFilter("Genres", + private class GenreFilter : UriPartFilter( + "Genres", arrayOf( Pair("All", "All"), Pair("4-Koma", "4-Koma"), diff --git a/src/en/oglaf/src/eu/kanade/tachiyomi/extension/en/oglaf/Oglaf.kt b/src/en/oglaf/src/eu/kanade/tachiyomi/extension/en/oglaf/Oglaf.kt index 0f957efa9..25eaa9d8f 100644 --- a/src/en/oglaf/src/eu/kanade/tachiyomi/extension/en/oglaf/Oglaf.kt +++ b/src/en/oglaf/src/eu/kanade/tachiyomi/extension/en/oglaf/Oglaf.kt @@ -47,14 +47,16 @@ class Oglaf : ParsedHttpSource() { override fun chapterListParse(response: Response): List<SChapter> { val chapterList = super.chapterListParse(response).distinct() return chapterList.mapIndexed { - i, ch -> ch.apply { chapter_number = chapterList.size.toFloat() - i } + i, ch -> + ch.apply { chapter_number = chapterList.size.toFloat() - i } } } override fun chapterListSelector() = "a:has(img[width=400])" override fun chapterFromElement(element: Element): SChapter { - val nameRegex = """/(.*)/""".toRegex() + val nameRegex = + """/(.*)/""".toRegex() val chapter = SChapter.create() chapter.url = element.attr("href") chapter.name = nameRegex.find(element.attr("href"))!!.groupValues[1] @@ -62,7 +64,8 @@ class Oglaf : ParsedHttpSource() { } override fun pageListParse(document: Document): List<Page> { - val urlRegex = """/.*/\d*/""".toRegex() + val urlRegex = + """/.*/\d*/""".toRegex() val pages = mutableListOf<Page>() fun addPage(document: Document) { diff --git a/src/en/perveden/src/eu/kanade/tachiyomi/extension/en/perveden/Perveden.kt b/src/en/perveden/src/eu/kanade/tachiyomi/extension/en/perveden/Perveden.kt index ff694c3db..7822e5542 100644 --- a/src/en/perveden/src/eu/kanade/tachiyomi/extension/en/perveden/Perveden.kt +++ b/src/en/perveden/src/eu/kanade/tachiyomi/extension/en/perveden/Perveden.kt @@ -8,14 +8,14 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale @Nsfw class Perveden : ParsedHttpSource() { @@ -48,11 +48,13 @@ class Perveden : ParsedHttpSource() { val url = HttpUrl.parse("$baseUrl/en/en-directory/")?.newBuilder()!!.addQueryParameter("title", query) (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> when (filter) { - is StatusList -> filter.state + is StatusList -> + filter.state .filter { it.state } .map { it.id.toString() } .forEach { url.addQueryParameter("status", it) } - is Types -> filter.state + is Types -> + filter.state .filter { it.state } .map { it.id.toString() } .forEach { url.addQueryParameter("type", it) } @@ -129,11 +131,12 @@ class Perveden : ParsedHttpSource() { set(Calendar.MILLISECOND, 0) }.timeInMillis } - else -> try { - SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date).time - } catch (e: ParseException) { - 0L - } + else -> + try { + SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH).parse(date)?.time ?: 0L + } catch (e: ParseException) { + 0L + } } override fun pageListParse(document: Document): List<Page> = mutableListOf<Page>().apply { @@ -147,1197 +150,1200 @@ class Perveden : ParsedHttpSource() { private class NamedId(name: String, val id: Int) : Filter.CheckBox(name) private class TextField(name: String, val key: String) : Filter.Text(name) private class GenreField(name: String, val key: String) : Filter.Text(name) - private class OrderBy : Filter.Sort("Order by", arrayOf("Manga title", "Views", "Chapters", "Latest chapter"), - Selection(1, false)) + private class OrderBy : Filter.Sort( + "Order by", + arrayOf("Manga title", "Views", "Chapters", "Latest chapter"), + Selection(1, false) + ) private class StatusList(statuses: List<NamedId>) : Filter.Group<NamedId>("Stato", statuses) private class Types(types: List<NamedId>) : Filter.Group<NamedId>("Tipo", types) override fun getFilterList() = FilterList( - TextField("Author", "author"), - TextField("Artist", "artist"), - GenreField("Included genres", "categoriesInc"), - GenreField("Excluded genres", "categoriesExcl"), - OrderBy(), - Types(types()), - StatusList(statuses()) + TextField("Author", "author"), + TextField("Artist", "artist"), + GenreField("Included genres", "categoriesInc"), + GenreField("Excluded genres", "categoriesExcl"), + OrderBy(), + Types(types()), + StatusList(statuses()) ) private fun types() = listOf( - NamedId("Japanese Manga", 0), - NamedId("Korean Manhwa", 1), - NamedId("Chinese Manhua", 2), - NamedId("Comic", 3), - NamedId("Doujinshi", 4) + NamedId("Japanese Manga", 0), + NamedId("Korean Manhwa", 1), + NamedId("Chinese Manhua", 2), + NamedId("Comic", 3), + NamedId("Doujinshi", 4) ) private fun statuses() = listOf( - NamedId("Ongoing", 1), - NamedId("Completed", 2), - NamedId("Suspended", 0) + NamedId("Ongoing", 1), + NamedId("Completed", 2), + NamedId("Suspended", 0) ) private val genres = mapOf( - Pair("+", "53c5967245b9ef2b85e38cfa"), - Pair("100mjack", "56b8ea8a719a160f1970f592"), - Pair("111 touban", "57e2d1af719a1649a0b6f40e"), - Pair("21st century renaissance", "5899939e719a165a8cf59398"), - Pair("4den hiro", "56c2285d719a168abf0cf302"), - Pair("7days", "56c22ad2719a168abf0d1182"), - Pair("action", "4e70ea24c092255ef7004f85"), - Pair("adult", "4e70e91dc092255ef7001727"), - Pair("adventure", "4e70ea24c092255ef7004f86"), - Pair("ahegao", "51793ded45b9efe88c5e59cd"), - Pair("alien", "5591faf0719a16886c3376b0"), - Pair("amputee", "55925592719a16886c347d02"), - Pair("anilingus", "5591faec719a16886c33769e"), - Pair("animal boy", "577e6173719a1672c697a00a"), - Pair("animal ears", "5591faf0719a16886c3376ac"), - Pair("animal girl", "5591fc1f719a16886c337c0a"), - Pair("armpit", "55920eb7719a16886c33b920"), - Pair("autofellatio", "55920a59719a16886c33ac99"), - Pair("bbm / fat man", "577e5fd2719a1614690bd0f5"), - Pair("bbw", "5591fbcc719a16886c337a85"), - Pair("bdsm", "5591fb8f719a16886c337982"), - Pair("band-aid", "55921508719a16886c33c325"), - Pair("bathroom sex", "5591fafe719a16886c3376e4"), - Pair("bestiality", "5591fed8719a16886c3383f7"), - Pair("big areola", "5591fb8d719a16886c337975"), - Pair("big ass", "5591faf4719a16886c3376c4"), - Pair("bikini", "5591fb7b719a16886c337933"), - Pair("birth", "5591fed8719a16886c3383f5"), - Pair("bisexual", "55921d83719a16886c33da43"), - Pair("blackmail", "5591fc6c719a16886c337d77"), - Pair("blindfold", "5591fbaa719a16886c3379f8"), - Pair("blindness", "55923a7c719a16886c3427fb"), - Pair("bloomers", "5591ff70719a16886c3384e5"), - Pair("blowjob", "5591faed719a16886c3376a4"), - Pair("body painting", "55925589719a16886c347ce4"), - Pair("body swap", "55922ee2719a16886c340825"), - Pair("body writing", "559215a4719a16886c33c602"), - Pair("bodysuit", "5591ff70719a16886c3384e9"), - Pair("breast expansion", "559207e0719a16886c33a1dd"), - Pair("breast sucking", "5591faed719a16886c3376a2"), - Pair("bride", "5591fb7b719a16886c337934"), - Pair("bukkake", "5591fb31719a16886c3377f2"), - Pair("bunny ears", "5591fea4719a16886c3383b6"), - Pair("bunnygirl", "5591fd9d719a16886c338136"), - Pair("cbt", "5591fb8e719a16886c33797b"), - Pair("cat ears", "5591fb7a719a16886c33792c"), - Pair("catgirl", "5591ff70719a16886c3384e6"), - Pair("centaur", "559207e0719a16886c33a1dc"), - Pair("cervical penetration", "577e6176719a1672c697a022"), - Pair("chastity belt", "5592087e719a16886c33a520"), - Pair("childhood friend", "5591ffd8719a16886c33867f"), - Pair("chinese dress", "559202f8719a16886c339044"), - Pair("collar", "5591fbab719a16886c3379fb"), - Pair("comedy", "4e70e91dc092255ef7001728"), - Pair("condom", "5591fb32719a16886c3377f6"), - Pair("cow girl", "5591ff70719a16886c3384e7"), - Pair("crossdressing", "5591fb31719a16886c3377ef"), - Pair("crotchless / breastless", "577e5fe7719a161c005866b7"), - Pair("dandere", "55925dbc719a16886c349758"), - Pair("daughter", "5591fd72719a16886c33807c"), - Pair("deepthroat", "5591fb7b719a16886c33792d"), - Pair("defloration", "5591fb0c719a16886c337709"), - Pair("devil", "5591fc5d719a16886c337d2d"), - Pair("diaper", "55928caa719a16886c3536f7"), - Pair("dirty old man", "5591fb1b719a16886c337762"), - Pair("doctor", "55920cbf719a16886c33b290"), - Pair("dog ears", "5591fe05719a16886c33825b"), - Pair("dog girl", "5591fe03719a16886c338257"), - Pair("dojikko", "5591ff70719a16886c3384e4"), - Pair("doll", "55922f89719a16886c340be4"), - Pair("double penetration", "5591fb1b719a16886c337763"), - Pair("drama", "4e70ea23c092255ef7004f2f"), - Pair("drugs", "5591faf0719a16886c3376b4"), - Pair("drunk", "5591faec719a16886c33769c"), - Pair("ecchi", "4e70ea01c092255ef7004653"), - Pair("egg laying", "55920850719a16886c33a40c"), - Pair("elder sister", "5591ff18719a16886c338487"), - Pair("elf", "5591fb73719a16886c33790e"), - Pair("enema", "5591fc6c719a16886c337d7b"), - Pair("exhibitionism", "5591fb0c719a16886c337710"), - Pair("eyepatch", "5591ff19719a16886c338488"), - Pair("face sitting", "5591faee719a16886c3376a5"), - Pair("fairy", "55921560719a16886c33c4c5"), - Pair("fantasy", "4e70ea23c092255ef7004f5e"), - Pair("fingering", "5591faec719a16886c3376a0"), - Pair("fisting", "559208c0719a16886c33a66d"), - Pair("foot fetish", "5591fbd7719a16886c337acb"), - Pair("footjob", "5591fbab719a16886c3379fd"), - Pair("fox ears", "55921632719a16886c33c8fd"), - Pair("fox girl", "55921632719a16886c33c8fe"), - Pair("freckles", "5592019b719a16886c338dde"), - Pair("french kissing", "577e5fd2719a1614690bd100"), - Pair("frotting", "559211ff719a16886c33be47"), - Pair("full color", "5591faf0719a16886c3376b2"), - Pair("fundoshi", "559215a4719a16886c33c600"), - Pair("furry", "5591fe03719a16886c338258"), - Pair("futa on female", "577e5fd1719a1614690bd0e9"), - Pair("futa on male", "5591fc9c719a16886c337e51"), - Pair("futanari on futanari", "5591fd87719a16886c3380de"), - Pair("gangbang", "5591fb90719a16886c337983"), - Pair("gender bender", "4e70e925c092255ef7001957"), - Pair("ghost", "5591fc0a719a16886c337bbe"), - Pair("giantess", "559253c5719a16886c347648"), - Pair("gloves", "577e5fe8719a161c005866bf"), - Pair("gokkun", "5591fbaa719a16886c3379f6"), - Pair("gothic", "55921f79719a16886c33dfa7"), - Pair("group sex", "5591faed719a16886c3376a3"), - Pair("guro", "5591fe3f719a16886c3382d3"), - Pair("hairjob", "559206a7719a16886c339d7f"), - Pair("hairy armpits", "55920591719a16886c3399e3"), - Pair("handjob", "5591fb8e719a16886c33797a"), - Pair("happy sex", "5591faf0719a16886c3376ae"), - Pair("harem", "4e70ea23c092255ef7004f55"), - Pair("hat", "577e627d719a160f53827289"), - Pair("heterochromia", "559200e4719a16886c338af5"), - Pair("historical", "4e70ea23c092255ef7004f5f"), - Pair("horror", "4e70ea26c092255ef70050a9"), - Pair("hotpants", "55920090719a16886c3389ac"), - Pair("huge breasts", "5591fb8f719a16886c337981"), - Pair("huge penis", "5591fb32719a16886c3377f7"), - Pair("human toilet", "577e5fd2719a1614690bd0f8"), - Pair("hypnosis", "5592044f719a16886c33928e"), - Pair("imouto", "5591fb7b719a16886c337936"), - Pair("impregnation", "5591faf0719a16886c3376af"), - Pair("inverted nipples", "5591fef4719a16886c338434"), - Pair("kimono", "5591fed8719a16886c3383f6"), - Pair("kimono / yukata", "577e5fd1719a1614690bd0ec"), - Pair("kunoichi", "55920071719a16886c33892e"), - Pair("kuudere", "55921679719a16886c33c9d5"), - Pair("lactation", "5591faf0719a16886c3376b7"), - Pair("lamia", "55920850719a16886c33a40d"), - Pair("large breasts", "5591faec719a16886c33769d"), - Pair("legal loli", "577e5fe8719a161c005866c0"), - Pair("licking", "5591fb1b719a16886c337760"), - Pair("lowleg", "5591fb8d719a16886c337974"), - Pair("milf", "5591fb8d719a16886c337972"), - Pair("maebari", "55921a27719a16886c33d237"), - Pair("magical girl", "5591fba4719a16886c3379e2"), - Pair("male on futa", "577e6279719a160f53827278"), - Pair("maledom", "5591fbab719a16886c3379f9"), - Pair("martial arts", "4e70ea27c092255ef70050cd"), - Pair("masturbation", "5591fb23719a16886c337799"), - Pair("mature", "4e70e91dc092255ef700172b"), - Pair("mecha", "4e70ea31c092255ef7005410"), - Pair("menstruation", "55921cc6719a16886c33d7da"), - Pair("mermaid", "5592713f719a16886c34df91"), - Pair("military uniform", "5591fba2719a16886c3379cf"), - Pair("mind break", "5591fb0c719a16886c33770b"), - Pair("mind control", "5591fafe719a16886c3376e6"), - Pair("monster", "5591fafd719a16886c3376e2"), - Pair("mother", "5591fc57719a16886c337cff"), - Pair("mouth gag", "5591fc6c719a16886c337d7a"), - Pair("multiple breasts", "559207e0719a16886c33a1da"), - Pair("multiple insertion", "5591fb8e719a16886c337977"), - Pair("multiple penises", "5591fe3f719a16886c3382d4"), - Pair("muscle", "55920071719a16886c33892d"), - Pair("mystery", "4e70ea29c092255ef70051fa"), - Pair("naked apron", "5591fb7a719a16886c33792b"), - Pair("nipple fuck", "55920242719a16886c338ec0"), - Pair("nipple penetration", "577e5e30719a165576d6a2a4"), - Pair("nun", "55920692719a16886c339d4e"), - Pair("nyotaimori", "559a5ebb719a16532b1e67a9"), - Pair("office lady", "5591fb8e719a16886c33797c"), - Pair("onahole", "55920754719a16886c339f5d"), - Pair("onsen", "5591fe04719a16886c338259"), - Pair("oppai loli", "5591fb4e719a16886c337885"), - Pair("otouto", "55920409719a16886c33922e"), - Pair("pajamas", "55920c39719a16886c33afdd"), - Pair("pantyhose", "5591fb7b719a16886c337931"), - Pair("pet girl", "5591fb1b719a16886c33775e"), - Pair("phimosis", "5591fb8d719a16886c337970"), - Pair("piercings", "559203aa719a16886c3391be"), - Pair("police uniform", "55920545719a16886c3397dd"), - Pair("princess", "5591fba2719a16886c3379ce"), - Pair("prostitution", "5591faf4719a16886c3376c5"), - Pair("psychological", "4e70ea01c092255ef7004650"), - Pair("pubic hair", "5591faf0719a16886c3376b1"), - Pair("race queen", "5591fde9719a16886c33822d"), - Pair("rape", "5591fafe719a16886c3376e5"), - Pair("reverse ntr", "577e5fea719a161c005866ca"), - Pair("reverse rape", "5591fb8d719a16886c33796f"), - Pair("robot girl", "5592068d719a16886c339d47"), - Pair("romance", "4e70e9ffc092255ef70045b4"), - Pair("scat", "55920445719a16886c339268"), - Pair("school life", "4e70e925c092255ef7001958"), - Pair("school swimsuit", "5591ff71719a16886c3384eb"), - Pair("school uniform", "5591faf4719a16886c3376c1"), - Pair("sci-fi", "4e70ea26c092255ef70050c0"), - Pair("sex toys", "5591faec719a16886c33769f"), - Pair("shemale", "55920d30719a16886c33b4f6"), - Pair("shimaidon", "577e62ab719a161e140239e3"), - Pair("shoujo ai", "4e70ea23c092255ef7004f52"), - Pair("shounen ai", "4e70ea01c092255ef7004649"), - Pair("sixty-nine", "5591faef719a16886c3376a7"), - Pair("slave", "5591fb1b719a16886c33775c"), - Pair("sleeping", "5591fb5f719a16886c3378ca"), - Pair("slice of life", "4e70e925c092255ef7001959"), - Pair("slime girl", "559205c7719a16886c339b3a"), - Pair("slut", "577e5fe7719a161c005866b8"), - Pair("small penis", "5591fd87719a16886c3380db"), - Pair("smegma", "5591fb8e719a16886c337976"), - Pair("smut", "4e70ea24c092255ef7004f95"), - Pair("spanking", "559200cf719a16886c338ab4"), - Pair("spitroast", "5591fb1c719a16886c337765"), - Pair("sports", "4e70ea2ac092255ef7005231"), - Pair("squirting", "5591faec719a16886c3376a1"), - Pair("stalking", "559201d6719a16886c338e2c"), - Pair("stomach bulge", "5591fb32719a16886c3377f8"), - Pair("straight shota", "5591fb4e719a16886c337884"), - Pair("strap-on", "5591fbba719a16886c337a3c"), - Pair("succubus", "55920135719a16886c338c97"), - Pair("sumata", "5591fbab719a16886c3379fa"), - Pair("supernatural", "4e70ea24c092255ef7004f7c"), - Pair("suppository", "55925035719a16886c346ed3"), - Pair("symbol shaped pupils", "5591ff71719a16886c3384ed"), - Pair("tan", "559203aa719a16886c3391bf"), - Pair("tattoo", "55920607719a16886c339c73"), - Pair("threesome", "577e5fe5719a161c005866a4"), - Pair("time stop", "559267cf719a16886c34bc59"), - Pair("toddler", "5591fba2719a16886c3379d4"), - Pair("torture", "5591ffe8719a16886c3386c1"), - Pair("tragedy", "4e70ea24c092255ef7004f98"), - Pair("transparent clothing", "5591fe10719a16886c33826f"), - Pair("tribadism", "5591ff10719a16886c338474"), - Pair("twins", "5591ffb9719a16886c3385ed"), - Pair("twintails", "5591faf0719a16886c3376ad"), - Pair("urethra insertion", "55c91399719a1679540946f3"), - Pair("vampire", "5591fb31719a16886c3377f1"), - Pair("virginity (male)", "577e5fd2719a1614690bd0f7"), - Pair("vomit", "5591ffe8719a16886c3386c0"), - Pair("vore", "55920850719a16886c33a40f"), - Pair("voyeurism", "5591fb8d719a16886c337973"), - Pair("waitress", "559208c0719a16886c33a66c"), - Pair("wakamezake", "5592dac3719a16886c360852"), - Pair("watersports", "5591fd58719a16886c338032"), - Pair("widow", "559228f7719a16886c33fd86"), - Pair("witch", "55920864719a16886c33a484"), - Pair("yaoi", "4e70ea01c092255ef700464a"), - Pair("yukata", "55920828719a16886c33a357"), - Pair("yuri", "4e70ea01c092255ef700464d"), - Pair("zombie", "559232df719a16886c34163f"), - Pair("abdg encirclement formation", "57d1056f719a1612b7e9d933"), - Pair("abdg houimou", "57d1056f719a1612b7e9d932"), - Pair("abortion", "581fa0fc719a16211afd5940"), - Pair("absorption", "571f61fe719a167a10f0894e"), - Pair("age progression", "56b8e577719a160f1970b4c8"), - Pair("age regression", "56c22b5f719a168abf0d18c4"), - Pair("ahegao", "556467fa719a1686396e957f"), - Pair("aihara", "56e765d9719a16989a47bf5a"), - Pair("aika tsube", "574dd952719a16606128e055"), - Pair("aka usagi", "574dd9cb719a16606128e3db"), - Pair("akamiro", "56c227d5719a168abf0ced93"), - Pair("akaneko", "56c22861719a168abf0cf334"), - Pair("akari yomatsuri", "570cb2c5719a16861b23ebaa"), - Pair("alien girl", "571f27a2719a16067f34afed"), - Pair("all the way through", "56ddf3f6719a16450f8235ce"), - Pair("almarosso", "5731d49c719a160bac0aa2e7"), - Pair("already uploaded", "56b8e498719a160f1970a92f"), - Pair("alsetro", "5769bfff719a167bb7f3c0a4"), - Pair("amata x 96", "56de2d3a719a166fd66fcdca"), - Pair("ambient", "5796066a719a1604964f9402"), - Pair("amino", "573b2be6719a16738c4183df"), - Pair("anal", "4f00e025c09225131600002b"), - Pair("anal birth", "570cb3da719a16861b23f497"), - Pair("andromeda", "56f0bd99719a16856dd2038e"), - Pair("ane naru mono", "57d3fce0719a1648cd56bd79"), - Pair("anegaoka sanchoume", "56e74ad9719a165d4fe1748d"), - Pair("angel", "4f03ae61c092256d81000ad5"), - Pair("animated", "5590cbe7719a1685eace68ab"), - Pair("anorexic", "578d202e719a168c492c2c2e"), - Pair("antans8092", "57c9c52e719a1647b7d6195f"), - Pair("anthology", "56fa05a9719a1669f2a7bed6"), - Pair("ao kurage", "56fa065b719a1669f2a7c39b"), - Pair("aoi dennou", "58969c4a719a166afdaf135d"), - Pair("aomaru", "56c2297d719a168abf0d0026"), - Pair("aomoto sari", "58292fbf719a164668a6bdb0"), - Pair("apron", "4f03f496c092256d81008769"), - Pair("armpit licking", "56b8e8bc719a160f1970de1c"), - Pair("armpit sex", "56b8e742719a160f1970cc46"), - Pair("artbook", "586f0f3d719a1601e2b5c53a"), - Pair("artistcg", "56b8e438719a160f1970a4e0"), - Pair("asage", "56c22d2e719a168abf0d2edd"), - Pair("ashikoki", "4f00e5b1c09225220600012b"), - Pair("ashikoki", "55646787719a1686396e9425"), - Pair("asian girly", "57287dfd719a1639c2c8583b"), - Pair("asphyxiation", "56b8e46a719a160f1970a716"), - Pair("ass expansion", "574e1088719a164c3b023763"), - Pair("assjob", "56b8e891719a160f1970dbe2"), - Pair("aster", "582146e3719a160217cd422a"), - Pair("ato", "56ddf48a719a16450f823bf9"), - Pair("atoko", "5875fb1c719a16738b9f41a8"), - Pair("aunt", "56b8e4e4719a160f1970ad2a"), - Pair("autopaizuri", "57287e03719a1639c2c8588f"), - Pair("ayumi otosaka", "56b8eaa7719a160f1970f6f9"), - Pair("azusa nakajo", "56b8e648719a160f1970becb"), - Pair("bakunyuu", "5445a92945b9ef840fcdaba8"), - Pair("ball sucking", "56c22d38719a168abf0d2f76"), - Pair("balljob", "57bd3ef3719a163e0da0af16"), - Pair("balls expansion", "5731d538719a160bac0aa780"), - Pair("ban daiki", "589a3c70719a161a1b370941"), - Pair("bandages", "56b8e3c7719a160ccaf2ebfe"), - Pair("banjaku", "570c79ed719a1621f04affab"), - Pair("bara", "52e7a50045b9ef44698f7134"), - Pair("bbm", "56b8e337719a1608ab978ef4"), - Pair("bear", "5744ba6e719a162b60f1051d"), - Pair("bee girl", "57287f06719a1639c2c865fc"), - Pair("bemani", "56cb7ed7719a161b35a6a700"), - Pair("beni", "56b8e79c719a160f1970d03b"), - Pair("big areolae", "56b8e49d719a160f1970a96b"), - Pair("big balls", "56b8e4bc719a160f1970ab0e"), - Pair("big breasts", "56b8e33f719a1608ab978f19"), - Pair("big clit", "56b8e43f719a160f1970a516"), - Pair("big nipples", "56b8e3b8719a160ccaf2eae7"), - Pair("big penis", "56b8e3b8719a160ccaf2eae8"), - Pair("big vagina", "575730f9719a167268694230"), - Pair("bike shorts", "56b8e6ac719a160f1970c3c6"), - Pair("biting", "5493f01f45b9ef2e15b4b845"), - Pair("bittsu", "5769c138719a167bb7f3ce84"), - Pair("blind", "56cb61d6719a167c4e9e8dc0"), - Pair("blink", "56c22a9e719a168abf0d0e53"), - Pair("blood", "56b8e600719a160f1970bad4"), - Pair("blowjob face", "56b8e36a719a160ccaf2e5d9"), - Pair("blue keshi", "577ca8e4719a169cd4768b7e"), - Pair("body modification", "56b8e488719a160f1970a884"), - Pair("bodystocking", "57f59b0d719a167b1dbd5cc6"), - Pair("bojo g. gangster", "5875a6c2719a165b3c314143"), - Pair("boku wa mari no naka", "584a253d719a168a1c1bbcc6"), - Pair("bondage", "55023ecd719a1676c2a42957"), - Pair("bondage", "556467e9719a1686396e953c"), - Pair("booty", "56ad63a2719a164dbd1d4b21"), - Pair("brain fuck", "56de2c65719a166fd66fc488"), - Pair("breast feeding", "56b8e710719a160f1970c952"), - Pair("breast reduction", "58799b45719a162e0a414ec9"), - Pair("brother", "56b8e4fd719a160f1970ae8f"), - Pair("bukakke", "4f01ece8c092253ba7006aab"), - Pair("bull", "57bc41cc719a162732aaee12"), - Pair("bullseye", "57033fdd719a16216ffcd111"), - Pair("bunker k", "577c6e00719a1623436efb73"), - Pair("bunny boy", "56b8e98b719a160f1970e904"), - Pair("business suit", "56b8e4a9719a160f1970aa04"), - Pair("butler", "56b8e69f719a160f1970c32e"), - Pair("c60", "574481c6719a163976f9e62c"), - Pair("c62", "5744840e719a163976fa00c1"), - Pair("c63", "57287e49719a1639c2c85c43"), - Pair("cagliostro", "56b8e8bc719a160f1970de1e"), - Pair("calm atmosphere", "56de2be0719a166fd66fbf15"), - Pair("candy-city", "56de2b3a719a166fd66fb967"), - Pair("cannibalism", "56c22743719a168abf0ce659"), - Pair("carmine", "5703402a719a16216ffcd3f2"), - Pair("cashier", "56d4d4cf719a16848b4cc692"), - Pair("cat", "57034142719a16216ffcde22"), - Pair("catboy", "56b8e6aa719a160f1970c3ae"), - Pair("catfight", "5728b748719a16117c8d08c8"), - Pair("cats claw", "56de2d08719a166fd66fcb8a"), - Pair("censored", "5590b046719a167a01f350e2"), - Pair("cervix penetration", "56b8e3b7719a160ccaf2eadc"), - Pair("chaoroushi", "56c22b00719a168abf0d13bd"), - Pair("charie", "56b8e4ec719a160f1970ada2"), - Pair("cheating", "4f00e1c4c0922515ab000185"), - Pair("cheating", "55646753719a1686396e9359"), - Pair("cheerleader", "4f01f2ddc092253ba7007534"), - Pair("chibita", "56f0a0ab719a166ee74a1a0d"), - Pair("chikan", "4f00ee64c092252206000c93"), - Pair("chloroform", "56b8e726719a160f1970cace"), - Pair("christmas", "567af645719a165958294818"), - Pair("chubby", "53ab31aa45b9efd826b4fe7b"), - Pair("chubby", "556467e9719a1686396e953e"), - Pair("chung seiker", "57dfdaa1719a1686deb8aa8e"), - Pair("ciao baby", "56c229a7719a168abf0d0221"), - Pair("circle ao kurage", "56fa065b719a1669f2a7c39c"), - Pair("claris", "56c22b3c719a168abf0d16e5"), - Pair("clemont", "57bceb55719a1687ea2bc3bb"), - Pair("clit growth", "56b8e488719a160f1970a887"), - Pair("clown", "57b99f11719a163fba895493"), - Pair("coach", "56b8e4bc719a160f1970ab0b"), - Pair("color", "4f00e187c0922515ab000135"), - Pair("color", "55646778719a1686396e93f7"), - Pair("comaku", "56cb7ffd719a161b35a6b2ff"), - Pair("commamion", "56ddf3ea719a16450f823539"), - Pair("commanding eagle", "571f6011719a167a10f07a9b"), - Pair("compilation", "56b8e763719a160f1970cdbb"), - Pair("coprophagia", "56b8e61b719a160f1970bc38"), - Pair("corruption", "56b8e580719a160f1970b539"), - Pair("corset", "56b8e3b3719a160ccaf2ea92"), - Pair("cosplay", "5518d301719a168688910203"), - Pair("cosplaying", "56b8e571719a160f1970b466"), - Pair("cousin", "56b8e4f7719a160f1970ae53"), - Pair("cowman", "56de2c69719a166fd66fc4ad"), - Pair("crotch tattoo", "57f000b1719a162d156df4ed"), - Pair("crown", "56b8e8bc719a160f1970de1d"), - Pair("cum bath", "5728b853719a16117c8d0fe8"), - Pair("cum in eye", "56f0a1d4719a166ee74a27ac"), - Pair("cum swap", "56f0a211719a166ee74a2ab3"), - Pair("cunnilingus", "5490dca045b9efa75b8f6627"), - Pair("cunnilingus", "55646787719a1686396e9427"), - Pair("cuntboy", "589f825c719a167f7d0d0d74"), - Pair("cure magical", "57e02edd719a161a6b8ce14f"), - Pair("cure twinkle", "56b8e8cb719a160f1970ded6"), - Pair("cyan", "56cb80ab719a161b35a6ba6b"), - Pair("dai roku seitetsu", "56f0a13f719a166ee74a2064"), - Pair("dainyu", "56f0a203719a166ee74a2a04"), - Pair("dainyu dougumo", "56f0a203719a166ee74a2a05"), - Pair("daken", "57033fdd719a16216ffcd112"), - Pair("dark avengers", "57033fdd719a16216ffcd113"), - Pair("dark nipples", "56c22c00719a168abf0d207d"), - Pair("dark pit", "57bb44b9719a169ef398c2e5"), - Pair("dark sclera", "5849281e719a1634eef403ca"), - Pair("dark skin", "556467fa719a1686396e957d"), - Pair("darkskin", "4f00ea93c0922522060007e1"), - Pair("date naoto", "5794b4cf719a167e4baa78e4"), - Pair("dearka elsman", "56cb6416719a167c4e9eaa5a"), - Pair("decensored", "54ee5fd5719a1670422d15aa"), - Pair("delmo", "57160a73719a1695b38aaa4b"), - Pair("demon", "56b8e8c3719a160f1970de7c"), - Pair("demongirl", "4f03ae61c092256d81000ad6"), - Pair("denjarasu yamada", "58346488719a1688280d6f18"), - Pair("dick growth", "56b8e352719a1608ab978f68"), - Pair("dickgirl on dickgirl", "56d4b9cb719a164632263b74"), - Pair("dickgirl on male", "56ddf4ef719a16450f824176"), - Pair("dicknipples", "56f9ea3e719a164395bc0f2e"), - Pair("dilf", "56b8e3bf719a160ccaf2eb67"), - Pair("dog", "56b8e42f719a160f1970a498"), - Pair("dog boy", "56ddf302719a16450f822bf6"), - Pair("doggie style", "586e121e719a1621d850fb56"), - Pair("doll joints", "56b8e41b719a160f1970a393"), - Pair("double anal", "56b8e3c3719a160ccaf2eba4"), - Pair("double blowjob", "5728ba1d719a16117c8d1db5"), - Pair("double vaginal", "56b8e45b719a160f1970a652"), - Pair("dougi", "56b8e7d9719a160f1970d33f"), - Pair("doujinshi", "56b8e389719a160ccaf2e7b8"), - Pair("dpe", "56c22c6d719a168abf0d2517"), - Pair("dragon", "56c22970719a168abf0cff71"), - Pair("ear fuck", "5769f893719a1672d0b8946a"), - Pair("ebisawa nira", "56b8ea8a719a160f1970f591"), - Pair("edogawa koubou", "57160ace719a1695b38aad2b"), - Pair("edwin black", "56f0a13f719a166ee74a2065"), - Pair("eggs", "56d4b9ba719a164632263a9b"), - Pair("electric shocks", "5773172a719a166f4297dee6"), - Pair("elizabeth bathory", "57033ffd719a16216ffcd21f"), - Pair("emotionless sex", "56b8e4af719a160f1970aa5f"), - Pair("eren", "56cb7f74719a161b35a6ae68"), - Pair("eye penetration", "585e4025719a1636e2d6b84f"), - Pair("eyemask", "56b8e631719a160f1970bd4d"), - Pair("eyo", "56fa0548719a1669f2a7bc17"), - Pair("ezo renge", "56b8e5d8719a160f1970b906"), - Pair("ezo renkon", "56b8e5d8719a160f1970b907"), - Pair("f.o.f", "56f0a18f719a166ee74a2465"), - Pair("face to face", "582fc748719a16491f6a9cdb"), - Pair("fakers manual", "56b8ecee719a167b52e95a1c"), - Pair("fangs", "546fcb0045b9ef8e2468f3e8"), - Pair("fangs", "556467b6719a1686396e94af"), - Pair("farrah", "5885cd1d719a16181d3a77a3"), - Pair("farting", "56b8e61b719a160f1970bc37"), - Pair("father", "56b8e616719a160f1970bbea"), - Pair("felli", "56b8e718719a160f1970c9d4"), - Pair("females only", "56b8e4b8719a160f1970aad4"), - Pair("femdom", "4f00e673c09225220600022b"), - Pair("femdom", "556467b6719a1686396e94ad"), - Pair("feminization", "56b8e3c3719a160ccaf2eba8"), - Pair("ffm theesome", "5728b799719a16117c8d0b77"), - Pair("ffm threesome", "56b8e36a719a160ccaf2e5da"), - Pair("fft threesome", "56b8e43e719a160f1970a512"), - Pair("filming", "56b8e49d719a160f1970a96c"), - Pair("first person perspective", "56cb7f9a719a161b35a6b000"), - Pair("fish", "56f0a193719a166ee74a2489"), - Pair("foot insertion", "570c972e719a16054fd7c7a0"), - Pair("foot licking", "56b8e654719a160f1970bf76"), - Pair("forbidden content", "56b8e736719a160f1970cba9"), - Pair("forced", "4f00db0ec0922505a6000001"), - Pair("forniphilia", "56de2c55719a166fd66fc3db"), - Pair("fox boy", "57287e89719a1639c2c85fc8"), - Pair("frog", "56cb63ac719a167c4e9ea4eb"), - Pair("frottage", "56b8e8ef719a160f1970e0ce"), - Pair("fsweatfsole", "56f0bd03719a16856dd1fd42"), - Pair("fujii rino", "574dd9d6719a16606128e461"), - Pair("fujimoto go", "56b8e717719a160f1970c9c7"), - Pair("fujiwara yuuka", "56f0a0ab719a166ee74a1a0e"), - Pair("ful lcen", "56d4ba37719a164632264108"), - Pair("full body tattoo", "56b8e47a719a160f1970a7de"), - Pair("full censorship", "56b8e36a719a160ccaf2e5d7"), - Pair("fushimori tonkatsu", "56f0a211719a166ee74a2ab4"), - Pair("futanari", "4f00e7d5c0922522060003d9"), - Pair("futanari", "55646784719a1686396e9417"), - Pair("futanari on male", "56b8e425719a160f1970a40a"), - Pair("fuuka kazaguruma", "57e3260e719a165f19a37b75"), - Pair("gag", "56b8e49c719a160f1970a963"), - Pair("galko", "56c22bb8719a168abf0d1cdb"), - Pair("gaping", "56de2c93719a166fd66fc6a7"), - Pair("garter belt", "56b8e372719a160ccaf2e667"), - Pair("gasmask", "56b8e8e6719a160f1970e061"), - Pair("gass. mosa", "56fa06ac719a1669f2a7c628"), - Pair("genderbend", "54815eff45b9efd7b2d893fc"), - Pair("genussmittel", "58443681719a1685174341c9"), - Pair("getty", "5864d7a0719a16871a28e3c4"), - Pair("giant", "57160a50719a1695b38aa911"), - Pair("giantesskatelyn", "5773181c719a166f4297e8d5"), - Pair("giftkuchen", "56e74a59719a165d4fe16ed3"), - Pair("giiza", "56e74bff719a165d4fe18196"), - Pair("ging freecss", "57287fe5719a1639c2c86fa9"), - Pair("girls only", "56e74999719a165d4fe166b8"), - Pair("glasses", "54752d2345b9ef81e12e2ed6"), - Pair("glasses", "556467f4719a1686396e9567"), - Pair("glastonbury1966", "57f85a49719a1625873c85c3"), - Pair("glory hole", "56b8e616719a160f1970bbe9"), - Pair("goblin", "56cb7e28719a161b35a69ff0"), - Pair("gohan oomori", "56f0bd68719a16856dd201a1"), - Pair("goma brothers", "56e74981719a165d4fe16592"), - Pair("gomabura", "56e74981719a165d4fe16593"), - Pair("good job", "57731838719a166f4297e998"), - Pair("gorilla", "577c6d9c719a1623436ef63b"), - Pair("gothic lolita", "56b8e571719a160f1970b467"), - Pair("granddaughter", "56b8e659719a160f1970bfc7"), - Pair("grandfather", "57320c95719a16693cf46b4e"), - Pair("grandmother", "5744bb4b719a162b60f10eac"), - Pair("grop", "57f1522f719a1629aedc66cc"), - Pair("group", "4f00db0ec0922505a6000002"), - Pair("group", "55646756719a1686396e936d"), - Pair("growth", "56cb6226719a167c4e9e9150"), - Pair("gumiyasan", "56c22d61719a168abf0d31bc"), - Pair("guys only", "56d4b8a5719a16463226304c"), - Pair("gyarin", "5769bfff719a167bb7f3c0a5"), - Pair("gyaru", "54fcf7a7719a164793bf7a1e"), - Pair("gyaru", "556467b6719a1686396e94b0"), - Pair("gyaru-oh", "56b8e4a3719a160f1970a9b8"), - Pair("gymshorts", "56d4d649719a16848b4cd847"), - Pair("gyuo", "5863862d719a165217c26fa3"), - Pair("gyuunyuu linda", "5874a9a6719a1624355ffc0a"), - Pair("hachimitsu orange", "577c6deb719a1623436efa80"), - Pair("hachizaki suigin", "56b8e66c719a160f1970c0e1"), - Pair("hadaka", "57731873719a166f4297eb85"), - Pair("hahaoya shikkaku", "5797ac47719a164c635808ea"), - Pair("hairy", "55816856719a167bf31d5409"), - Pair("hakuchuu doudou", "573b65c1719a1629609e728a"), - Pair("halkrom", "57b6a76d719a168b3febaf31"), - Pair("handicapped", "56b8ea6b719a160f1970f3f5"), - Pair("harazumi tami", "56b8eaac719a160f1970f747"), - Pair("hardcore", "5728b748719a16117c8d08c9"), - Pair("hareta", "57035b76719a161297661786"), - Pair("harpy", "56d4b9ba719a164632263a9a"), - Pair("haruha rutei", "56c229f5719a168abf0d0643"), - Pair("haruka haruno", "56b8e63f719a160f1970be30"), - Pair("haruna mahiru", "56b8e567719a160f1970b3eb"), - Pair("hatake wo tagayasu dake", "57035b76719a161297661787"), - Pair("hatakewotagayasudake", "57035b76719a161297661788"), - Pair("hatanaka", "588fb05c719a1638581fd5f3"), - Pair("hatosable", "5744bab3719a162b60f108c8"), - Pair("headphones", "55022186719a1677296ead9a"), - Pair("headphones", "55646787719a1686396e9429"), - Pair("hentai", "4fdb1154c092250751000000"), - Pair("hentai", "5564674c719a1686396e9327"), - Pair("hidesys", "582340fe719a16683a15a8b7"), - Pair("higashi chinta", "57c57c4d719a16706e04fca3"), - Pair("high fly flow", "5760a41e719a161c54371bf7"), - Pair("high score girl", "573b2bfb719a16738c4184cf"), - Pair("highway61", "57f85a49719a1625873c85c4"), - Pair("hijab", "56b8e842719a160f1970d816"), - Pair("himeno katsuragi", "56f0a1e5719a166ee74a2889"), - Pair("hinatamizu", "578b25ed719a164d0a8b3622"), - Pair("hiro hamada", "5728b934719a16117c8d17c4"), - Pair("hiroko", "5728ba01719a16117c8d1cea"), - Pair("hiroshi nohara", "57df85ed719a1691d5f4ab2c"), - Pair("hiura kyono", "57f6982d719a16796a496724"), - Pair("hiyoubeya", "570cb321719a16861b23ee8b"), - Pair("homuraya pleiades", "56d4b957719a16463226368c"), - Pair("honebuto wasshoi", "574e1074719a164c3b023684"), - Pair("honeyamber", "587c3e64719a1612697d86b5"), - Pair("honeycomb ice cream", "577ca714719a169cd4767b32"), - Pair("hong ban-jang", "577317d7719a166f4297e5bb"), - Pair("honoka ayase", "579e43ae719a16855b671346"), - Pair("hori makoto", "57d845b5719a164697a9b291"), - Pair("horse", "56c22acb719a168abf0d1126"), - Pair("horse boy", "56c22921719a168abf0cfbbb"), - Pair("hougen", "571f6213719a167a10f089d0"), - Pair("housewife", "4f00e1c4c0922515ab000186"), - Pair("housewife", "55646756719a1686396e936e"), - Pair("how to", "57d89a0d719a168be7f092c1"), - Pair("hoyoyodou", "56b8e545719a160f1970b250"), - Pair("human cattle", "56b8e580719a160f1970b53a"), - Pair("human on furry", "56d4b874719a164632262e32"), - Pair("human pet", "56b8e85b719a160f1970d96e"), - Pair("humiliation", "4f00e084c0922513160000ae"), - Pair("humiliation", "556467e9719a1686396e953d"), - Pair("husky guy", "577c6d50719a1623436ef37f"), - Pair("hutamizu kirin", "5823e9bc719a168028c14a21"), - Pair("hyouga.", "56b8e3a9719a160ccaf2e9e3"), - Pair("idol", "543d47f145b9ef9a694a9a6c"), - Pair("ike reibun", "57287e29719a1639c2c85a66"), - Pair("ikechika", "5728ba27719a16117c8d1dea"), - Pair("ikeshita maue", "5728ba27719a16117c8d1deb"), - Pair("iku ikuo", "56c22902719a168abf0cfa3d"), - Pair("incest", "4f00e7ffc09225220600042f"), - Pair("inco", "585e401d719a1636e2d6b79d"), - Pair("incomplete", "56b8e661719a160f1970c04e"), - Pair("ineki", "57576739719a166c7f220913"), - Pair("ineminori", "56c22ad2719a168abf0d1183"), - Pair("infantilism", "57572fbf719a16726869335c"), - Pair("inflation", "56b8e337719a1608ab978ef3"), - Pair("inoue kiyoshi", "56b8e79c719a160f1970d03c"), - Pair("insect", "56c22a78719a168abf0d0c4a"), - Pair("insect boy", "577c6d5d719a1623436ef3fb"), - Pair("insect girl", "56b8e8b2719a160f1970dd8f"), - Pair("inseki", "5515d705719a164a9f01c4b4"), - Pair("interview", "562fd0d9719a16275dce2d0d"), - Pair("invisible", "56b8e4d5719a160f1970ac64"), - Pair("iroitotoiro", "57bbed97719a1645baf57432"), - Pair("irori yui", "57287ee2719a1639c2c86419"), - Pair("irrumatio", "53ddd6f345b9ef9287db6532"), - Pair("isolated island oni", "56cb7e75719a161b35a6a2d5"), - Pair("jikansakougeki", "56de2be1719a166fd66fbf1f"), - Pair("joe higashi", "56d4d4e6719a16848b4cc78d"), - Pair("josou seme", "578ccbce719a164e1d0fc074"), - Pair("juder", "57dfda5a719a1686deb8a71a"), - Pair("jurai andou", "58326a48719a1690831fdcfa"), - Pair("juurokurou", "56fa0548719a1669f2a7bc18"), - Pair("juuryoku shiki youheki", "57731939719a166f4297f35f"), - Pair("k dash", "5760a3a0719a161c54371584"), - Pair("k.tomo", "56de2be0719a166fd66fbf16"), - Pair("kagetsu hakamada", "57035caa719a16129766206f"), - Pair("kaitou yuuhi", "57960678719a1604964f9515"), - Pair("kakizaki kousei", "571608ea719a1695b38a9f3b"), - Pair("kaku tatakaeri", "57ad18a0719a1684b32b9d64"), - Pair("kamatsukatei", "56cb6317719a167c4e9e9cd5"), - Pair("kamikage kirino", "56e74bb3719a165d4fe17dc4"), - Pair("kamogawa", "5760a4a5719a161c54372361"), - Pair("kamogawa taiyaki", "570cb224719a16861b23e689"), - Pair("kangaroo", "57d3fccf719a1648cd56bcbc"), - Pair("kaoru ryuzaki", "570cb48f719a16861b23fb85"), - Pair("kappa", "56c2281c719a168abf0cf049"), - Pair("kasai yukiha", "5837b03f719a165b6e109d77"), - Pair("kebiishi", "56b8ead0719a160f1970f915"), - Pair("kemonomimi", "4f00e0c3c0922515ab000001"), - Pair("kemonomimi", "55646784719a1686396e9419"), - Pair("kenichi", "56d4d578719a16848b4cce7a"), - Pair("kenichi saruyama", "57843a0f719a1695c3045ce1"), - Pair("kigisu", "56c22a85719a168abf0d0cf9"), - Pair("kiiroi tamago", "570340ab719a16216ffcd8a0"), - Pair("kijinoko", "56c22a85719a168abf0d0cfa"), - Pair("kikaider reijiro", "5782b3c9719a169f8b21003e"), - Pair("kimcheese", "56b8e567719a160f1970b3ec"), - Pair("kirimochi niwe", "58375bdd719a1644a7ae2c79"), - Pair("kisaragi-ice", "5874fe2a719a1673c7c6fbc2"), - Pair("kissing", "56b8e4d6719a160f1970ac77"), - Pair("kitano megumi", "57e02ede719a161a6b8ce166"), - Pair("kkc", "56f9e9ae719a164395bc09fb"), - Pair("kneepit sex", "578ec60d719a1602471883d2"), - Pair("koborii", "56f9e8ed719a164395bc04ed"), - Pair("kobuta no yakata", "57db3d18719a165182d33df1"), - Pair("kogasaki yuina", "58837e84719a161bb394d487"), - Pair("komyu", "56b8eadf719a160f1970f9e0"), - Pair("konami risa", "57f6982d719a16796a496722"), - Pair("kono subarashii sekai ni shukufuku wo", "57c32dc2719a163e9f75d6db"), - Pair("kotau", "56b8e8b2719a160f1970dd90"), - Pair("kotee", "57ca6ded719a166fb640d2b1"), - Pair("koukyou gikou", "5899939e719a165a8cf59397"), - Pair("kozountoko", "57287e0d719a1639c2c8593a"), - Pair("kreuz", "570cb317719a16861b23ee23"), - Pair("kuriyama natsuki", "5796066a719a1604964f9403"), - Pair("kurumi ohnuma", "56f0a091719a166ee74a18e0"), - Pair("kusogaki teikoku", "57adc14c719a16504d6868c1"), - Pair("kuusuke matsuno", "57287faa719a1639c2c86d39"), - Pair("kyojinkou", "582fc73c719a16491f6a9c66"), - Pair("lab coat", "56b8e951719a160f1970e5c7"), - Pair("langley", "570cb219719a16861b23e627"), - Pair("lapislazuli", "56c22c10719a168abf0d213a"), - Pair("large insertions", "56b8e488719a160f1970a886"), - Pair("lastcrime", "56ddf460719a16450f8239ec"), - Pair("latex", "56b8e385719a160ccaf2e77b"), - Pair("layer cake", "56b8e7d5719a160f1970d30d"), - Pair("leg lock", "56b8e540719a160f1970b1fa"), - Pair("legjob", "57287e3f719a1639c2c85bc1"), - Pair("leone", "56cb80c4719a161b35a6bba6"), - Pair("leotard", "56b8e372719a160ccaf2e669"), - Pair("liangshan bo", "5715d1ca719a16156436fb08"), - Pair("lingerie", "5515d6bf719a164a9f01c49c"), - Pair("lingerie", "556467e2719a1686396e9523"), - Pair("listless time", "583fedab719a168fb1a71f33"), - Pair("living clothes", "56b8e4c4719a160f1970ab86"), - Pair("lizard girl", "57033ffd719a16216ffcd21e"), - Pair("lizard guy", "56fa20f4719a1685ea9a1fc7"), - Pair("log", "57f643cd719a1606a5a83a1f"), - Pair("loli", "550221c7719a1677296eada6"), - Pair("loli seiyouken", "56e749dc719a165d4fe16986"), - Pair("lolicon", "56b8e337719a1608ab978ef2"), - Pair("long tongue", "56b8e732719a160f1970cb78"), - Pair("love hotel", "5728b748719a16117c8d08ca"), - Pair("low bestiality", "56de2b7f719a166fd66fbbcf"), - Pair("low lolicon", "56d4b940719a1646322635a6"), - Pair("low shotacon", "56c22970719a168abf0cff73"), - Pair("lunacy", "56cb80ac719a161b35a6ba7e"), - Pair("m2 goo", "57f643cd719a1606a5a83a20"), - Pair("machine", "56c22893719a168abf0cf53c"), - Pair("maeda momo", "57c970cc719a165d1d1d28e9"), - Pair("maid", "4f00e032c092251316000049"), - Pair("maji", "57e08339719a1625b30f77c0"), - Pair("majikayo", "57e08339719a1625b30f77c1"), - Pair("makunouchi", "57160ace719a1695b38aad22"), - Pair("male on dickgirl", "56ddf4ef719a16450f824177"), - Pair("male on futanari", "56b8e4cf719a160f1970ac10"), - Pair("males only", "56b8e305719a1607fceb7b6d"), - Pair("mamizo", "56d4b86e719a164632262df9"), - Pair("manga", "56b8e376719a160ccaf2e6a0"), - Pair("manikoro", "570c9600719a16054fd7bd81"), - Pair("mannmaru", "5820f260719a1679c9cd5fde"), - Pair("maraschino", "56e74aa7719a165d4fe17276"), - Pair("marika hoshino", "57735129719a165a1294d95f"), - Pair("masheri", "56b8eadf719a160f1970f9df"), - Pair("mashiba kenta", "5792ba8c719a162fe1be0a15"), - Pair("masked face", "56b8e732719a160f1970cb77"), - Pair("mata kara stream", "56cb7e33719a161b35a6a080"), - Pair("matsu no an", "56c22c66719a168abf0d24b6"), - Pair("maya joukawa", "56cb6314719a167c4e9e9cb6"), - Pair("mecha boy", "56cb7ed6719a161b35a6a6f7"), - Pair("mecha girl", "56b8e98b719a160f1970e909"), - Pair("megane", "4f00e587c0922522060000eb"), - Pair("meganekko", "56ddf4b2719a16450f823dc5"), - Pair("megaton express", "56f0a211719a166ee74a2ab5"), - Pair("megumi natsu", "56cb6314719a167c4e9e9cb5"), - Pair("mei hatsume", "57c2308d719a1677ad7e5ad4"), - Pair("meiji chimera", "56f0a0ab719a166ee74a1a0f"), - Pair("meiko", "588c103c719a1649da625aee"), - Pair("melon no hoshiboshi", "56b8e9fa719a160f1970eed1"), - Pair("ment", "583fedab719a168fb1a71f34"), - Pair("merman", "578e71b0719a16407c66330f"), - Pair("metal armor", "56cb7e26719a161b35a69fe3"), - Pair("midget", "57287dca719a1639c2c8565b"), - Pair("midoriiro", "57573162719a16726869469f"), - Pair("mikado", "56c22ac7719a168abf0d10ec"), - Pair("miko", "4f32dab4c0922569dc000cf4"), - Pair("miku izayoi", "579114bc719a166b15a7c009"), - Pair("military", "56b8e337719a1608ab978ef1"), - Pair("milking", "56b8e726719a160f1970cacb"), - Pair("mille", "56d4b96b719a16463226374d"), - Pair("mimit", "57c9c52e719a1647b7d6195e"), - Pair("minigirl", "56b8e504719a160f1970aee1"), - Pair("miniguy", "56b8e47e719a160f1970a809"), - Pair("minotaur", "570c970d719a16054fd7c62e"), - Pair("mio naruse", "56b8e783719a160f1970cefb"), - Pair("misc", "5731d452719a160bac0aa036"), - Pair("mitsuko", "587c3e64719a1612697d86b4"), - Pair("mitsunoho", "56c22c28719a168abf0d222b"), - Pair("miyoshi hiromi", "570c79eb719a1621f04aff9d"), - Pair("miyuki rei", "57035ba5719a1612976618e3"), - Pair("mizugi", "4f00db5ac0922505f1000001"), - Pair("mizuki kanzaki", "573b650c719a1629609e69ac"), - Pair("mmf threesome", "56b8e337719a1608ab978eee"), - Pair("mohorovicic matako", "56cb7e33719a161b35a6a081"), - Pair("momiyama", "57f0fdcf719a163c0daba6a7"), - Pair("momo yaoyorozu", "56cb63ac719a167c4e9ea4ea"), - Pair("momoishi", "5835b618719a168d2c17820f"), - Pair("monoeye", "578d202e719a168c492c2c2f"), - Pair("monophobia", "56c22bf1719a168abf0d1fad"), - Pair("monster girl", "5564675a719a1686396e9386"), - Pair("monstergirl", "4f00e97bc092252206000612"), - Pair("moral degeneration", "56b8e47a719a160f1970a7dd"), - Pair("moralgear", "56cb62ad719a167c4e9e9797"), - Pair("mosaic censor", "56b8e9e9719a160f1970eddb"), - Pair("mosaic censorship", "56b8e3b7719a160ccaf2eadd"), - Pair("mouse boy", "570c970a719a16054fd7c619"), - Pair("mouse girl", "578c778f719a1691573a0c04"), - Pair("mousou colosseum", "5796af0d719a160e752c2fee"), - Pair("mtf threesome", "56b8e631719a160f1970bd4c"), - Pair("multi-work series", "56b8e33f719a1608ab978f1c"), - Pair("multi-works series", "57df85fc719a1691d5f4abc2"), - Pair("multiple arms", "577ca8db719a169cd4768b19"), - Pair("multiple nipples", "57c9c52e719a1647b7d61960"), - Pair("multiple paizuri", "56c22d38719a168abf0d2f75"), - Pair("musae koyama", "57df85ed719a1691d5f4ab2d"), - Pair("muscles", "555a4e8b719a1651bff3d17d"), - Pair("muscles", "556467fa719a1686396e9581"), - Pair("music box", "5728b748719a16117c8d08cb"), - Pair("mute", "571f5fbb719a167a10f077e5"), - Pair("muto", "57c9c52e719a1647b7d6195c"), - Pair("mx2j", "57f8ae8e719a169ba3a6f397"), - Pair("nagata shinichi", "56b8e647719a160f1970bec2"), - Pair("nagisora riku", "5773181c719a166f4297e8d7"), - Pair("nakadashi", "540cdc7345b9ef6cb3231358"), - Pair("nakadashi", "5564674c719a1686396e9328"), - Pair("nakanishi", "586cc09c719a1629f4914d23"), - Pair("nakasone heidi", "5787da56719a1621f2b2042b"), - Pair("nakata mitsuru", "58438dbd719a16586fea74b6"), - Pair("namanamago", "56c22a93719a168abf0d0db4"), - Pair("nanaki nanatarou", "578b7a4e719a164531bffdc0"), - Pair("natsuki kimura", "5769c167719a167bb7f3d098"), - Pair("natsume benkei", "589993a6719a165a8cf59451"), - Pair("navel fuck", "56ddf3f6719a16450f8235cf"), - Pair("nazi", "5892a7bd719a169e79e8ef68"), - Pair("ncp", "56c228cf719a168abf0cf823"), - Pair("necrophilia", "56f0a0b3719a166ee74a1a70"), - Pair("negative 69", "573b2be6719a16738c4183e0"), - Pair("neitz", "56c2297d719a168abf0d0025"), - Pair("neko no oppai", "56c22a4a719a168abf0d09c6"), - Pair("nekoya marble", "56c22abe719a168abf0d1075"), - Pair("nemu", "56b8e8bb719a160f1970de07"), - Pair("nerigom", "5875a6bc719a165b3c3140d3"), - Pair("nerv", "574e136a719a164c3b0258a5"), - Pair("netorare", "4f00e52cc092252206000054"), - Pair("netorare", "55646799719a1686396e945f"), - Pair("netori", "5426add745b9ef6d7a289a24"), - Pair("nicomarch", "56d4b955719a164632263675"), - Pair("niece", "56c22876719a168abf0cf3eb"), - Pair("ninja", "56cb62d9719a167c4e9e9994"), - Pair("ninnindou", "56d4d616719a16848b4cd5b7"), - Pair("nipple birth", "56c22d46719a168abf0d3043"), - Pair("nipple expansion", "5744bafa719a162b60f10af6"), - Pair("no color", "57731994719a166f4297f709"), - Pair("nobuko yokokawa", "573b656c719a1629609e6eee"), - Pair("non-h", "52e7a80f45b9ef5ed98db192"), - Pair("noriko", "5848d3c7719a1685432d1b72"), - Pair("nose hook", "570c96d9719a16054fd7c3c7"), - Pair("not found 05", "58239562719a161ef54929ef"), - Pair("nounanka", "5744bb4b719a162b60f10eae"), - Pair("number10", "56cb63ba719a167c4e9ea59b"), - Pair("nurse", "4f00e587c0922522060000ec"), - Pair("ochako uraraka", "5782b3d2719a169f8b2100b7"), - Pair("ochine", "57bc9658719a167558cbef60"), - Pair("octopus", "56c22a78719a168abf0d0c49"), - Pair("odd", "5836b326719a166af458a4de"), - Pair("ogawa chise", "57db916d719a164187907c15"), - Pair("oil", "56d4b8c9719a16463226317a"), - Pair("okyuuri", "56e74ad9719a165d4fe1748c"), - Pair("old lady", "58501403719a165eaaf83a4d"), - Pair("old man", "56b8e63f719a160f1970be2f"), - Pair("omega destroyer", "56f0a211719a166ee74a2ab6"), - Pair("onani", "568b0083719a1664807dd93a"), - Pair("oni", "56c2278f719a168abf0cea77"), - Pair("ontsu", "58628903719a166e8c8a4aa7"), - Pair("oppai", "4f00e003c092251316000001"), - Pair("oppai", "5564674c719a1686396e9324"), - Pair("oral", "4f00e00cc092251316000016"), - Pair("oral", "5564674c719a1686396e9323"), - Pair("orc", "56b8e4ae719a160f1970aa52"), - Pair("ore monogatari", "56b8e65b719a160f1970bfe3"), - Pair("ore no natsuyasumi", "5731d50d719a160bac0aa63c"), - Pair("oreichigo", "573b6453719a1629609e6128"), - Pair("oretto", "56d4d529719a16848b4ccb05"), - Pair("orgasm denial", "56b8e488719a160f1970a885"), - Pair("osananajimi", "4f03e821c092256d810079c2"), - Pair("osananajimi", "5564678f719a1686396e9441"), - Pair("oshimi shuuzou", "584a253d719a168a1c1bbcc7"), - Pair("oshiri", "52f863de45b9efa6e8b7e98f"), - Pair("oshiri", "556467ee719a1686396e9552"), - Pair("otonano gu-wa", "5760a269719a161c54370917"), - Pair("out of order", "56b8e527719a160f1970b0d1"), - Pair("oyakodon", "5794b4cf719a167e4baa78e6"), - Pair("paipan", "4f01f2e1c092253ba7007537"), - Pair("paizuri", "4f00e05dc09225131600008f"), - Pair("paizuri", "5564674f719a1686396e933e"), - Pair("pandacorya", "57ee0680719a16345f09c67d"), - Pair("pantyjob", "56b8e4b8719a160f1970aad2"), - Pair("parasite", "56d4ba09719a164632263e8f"), - Pair("pasties", "56b8e955719a160f1970e5ef"), - Pair("pattycake", "57f4f25f719a168e357718ed"), - Pair("pecan", "57160ace719a1695b38aad23"), - Pair("pedocchi", "56f0a1ab719a166ee74a25ac"), - Pair("pegging", "53c596d645b9ef2b85e38e9c"), - Pair("pegging", "556467b6719a1686396e94ae"), - Pair("peko pekoyama", "570cb4c6719a16861b23fe45"), - Pair("petrification", "56b8e41b719a160f1970a394"), - Pair("pettanko", "4f00e00cc092251316000017"), - Pair("pettanko", "5564675e719a1686396e939b"), - Pair("phone sex", "56c22a9e719a168abf0d0e57"), - Pair("piercing", "56b8e3c3719a160ccaf2eba5"), - Pair("pig", "56cb7e28719a161b35a69ff1"), - Pair("pig girl", "56c227f4719a168abf0ceeb8"), - Pair("pig man", "56c2282d719a168abf0cf110"), - Pair("pillory", "56c22970719a168abf0cff72"), - Pair("pirate", "5716094b719a1695b38aa1a4"), - Pair("pirokobo", "56c22b7d719a168abf0d1a19"), - Pair("piss drinking", "56c22a9e719a168abf0d0e58"), - Pair("plant girl", "56b8e527719a160f1970b0cd"), - Pair("plico", "56d4b955719a164632263676"), - Pair("pole dancing", "5715d1bc719a16156436fac1"), - Pair("policeman", "56b8e6b2719a160f1970c422"), - Pair("policewoman", "56cb632b719a167c4e9e9dd9"), - Pair("ponkotsudou", "56c228ac719a168abf0cf68f"), - Pair("poor grammar", "56b8e66c719a160f1970c0e0"), - Pair("porunamin c", "584f6b3f719a162148699f10"), - Pair("possession", "56b8e5f5719a160f1970ba8c"), - Pair("poteto dango", "56c22d2e719a168abf0d2ede"), - Pair("praseodym", "56cb7eb8719a161b35a6a5a7"), - Pair("pregnant", "541616f645b9efe716f55844"), - Pair("pregnant", "556467fa719a1686396e9580"), - Pair("prehensile hair", "56c22dc1719a168abf0d365d"), - Pair("priest", "571f5fcd719a167a10f07886"), - Pair("principal kuno", "56de2c76719a166fd66fc545"), - Pair("prolapse", "56b8e907719a160f1970e22e"), - Pair("prostate massage", "56b8e67d719a160f1970c187"), - Pair("pubic stubble", "56e749f3719a165d4fe16a97"), - Pair("public", "4f03a91cc092256d8100008b"), - Pair("public use", "56b8e907719a160f1970e22d"), - Pair("rabbit", "56c228bb719a168abf0cf735"), - Pair("raccoon girl", "56e7498f719a165d4fe1663d"), - Pair("raichi hoshimiya", "56f9e988719a164395bc08fb"), - Pair("rakuen tsuihou", "56b8ead0719a160f1970f916"), - Pair("random", "4f00e050c092251316000078"), - Pair("random", "5564680d719a1686396e95ce"), - Pair("randoseru", "56b8e8a0719a160f1970dcad"), - Pair("rat park", "56b8e7d9719a160f1970d340"), - Pair("raw", "54c81f9045b9efce8d0fd11a"), - Pair("redraw", "56cb63b9719a167c4e9ea57e"), - Pair("reika hayami", "5835b5fe719a168d2c178127"), - Pair("rem", "577ca70a719a169cd4767aff"), - Pair("replaced", "56b8e374719a160ccaf2e68c"), - Pair("reptile", "5792ba8c719a162fe1be0a14"), - Pair("retoree", "56cb80ab719a161b35a6ba6a"), - Pair("rewrite", "56cb62e5719a167c4e9e9a2d"), - Pair("reyshi", "56cb7eb8719a161b35a6a5a8"), - Pair("rian", "573b65c1719a1629609e728b"), - Pair("ricky-tick", "574dd9d6719a16606128e462"), - Pair("rimjob", "56b8e452719a160f1970a5e1"), - Pair("rina fujimoto", "570cb48f719a16861b23fb83"), - Pair("rindoh", "56b8ecee719a167b52e95a1b"), - Pair("ring memo", "56d4d529719a16848b4ccb07"), - Pair("rinko yamato", "56b8e65b719a160f1970bfe4"), - Pair("risa shirakaba", "57035c04719a161297661b21"), - Pair("robot", "56b8e891719a160f1970dbe1"), - Pair("rokuji", "56f0a13f719a166ee74a2063"), - Pair("rumiko chie", "573b66bc719a1629609e8063"), - Pair("ryoattoryo", "582fc748719a16491f6a9cdc"), - Pair("ryokurin", "57b30750719a1606ccdc81a0"), - Pair("ryona", "56b8e600719a160f1970bad3"), - Pair("saimin pikatto house", "5801e90e719a16309717beec"), - Pair("saitou miya", "585a4ba8719a16178f4f0270"), - Pair("saji-pen", "57287fb3719a1639c2c86d9d"), - Pair("sakaki miya", "57f6982d719a16796a496723"), - Pair("sakkat", "573b6507719a1629609e6952"), - Pair("sakura shirou", "56c22861719a168abf0cf335"), - Pair("sakurabobu", "56b8ea1b719a160f1970f07e"), - Pair("saliva", "5716095f719a1695b38aa21e"), - Pair("sample", "56c22ddb719a168abf0d37da"), - Pair("sangokushi puzzle taisen", "577c6fe0719a1623436f0e11"), - Pair("sanryuu kaigishitsu", "5744bac1719a162b60f10949"), - Pair("sashilot", "56b8ea99719a160f1970f639"), - Pair("sautsu", "57bb44da719a169ef398c4ad"), - Pair("scanmark", "56c22b4a719a168abf0d17c5"), - Pair("scar", "56b8e3c7719a160ccaf2ebfd"), - Pair("scarlet beriko", "5864833e719a1612a25cf783"), - Pair("scathach", "57033ffd719a16216ffcd220"), - Pair("schoolboy", "56e74ad4719a165d4fe17449"), - Pair("schoolboy uniform", "56b8e3a9719a160ccaf2e9e2"), - Pair("schoolgirl", "4f00e05dc092251316000090"), - Pair("schoolgirl", "5564674c719a1686396e9326"), - Pair("schoolgirl uniform", "56b8e36c719a160ccaf2e5f9"), - Pair("scrotal lingerie", "573b6438719a1629609e6020"), - Pair("selfcest", "56b8e78d719a160f1970cf78"), - Pair("sendai oni", "574e1095719a164c3b023814"), - Pair("senhime", "570cb38f719a16861b23f230"), - Pair("shared senses", "56cb61f5719a167c4e9e8f1a"), - Pair("shibainu lab", "57d845b5719a164697a9b292"), - Pair("shibari", "4f00e691c092252206000249"), - Pair("shikniful", "56cb8115719a161b35a6bf71"), - Pair("shima shuu", "56b8e4c0719a160f1970ab46"), - Pair("shimapan", "4f00e0c3c0922515ab000002"), - Pair("shimoyake", "56c22a9e719a168abf0d0e54"), - Pair("shinna", "57b30750719a1606ccdc81a1"), - Pair("shino kuribayashi", "56c22b7d719a168abf0d1a1a"), - Pair("shinseidaiki", "57eeaf56719a163380236b8b"), - Pair("shishioan", "57fe48ee719a16206a91c4b7"), - Pair("shitori", "56e74a59719a165d4fe16ed2"), - Pair("shota", "5569ad57719a16102373a69f"), - Pair("shotacon", "56b8e3c3719a160ccaf2eba7"), - Pair("show by rock", "56cb80ab719a161b35a6ba69"), - Pair("shrinking", "56b8e41b719a160f1970a392"), - Pair("sieyarelow", "56b8e7b9719a160f1970d1b8"), - Pair("sinseong modogi", "5715eca8719a161780dbd1b8"), - Pair("sister", "56b8e41b719a160f1970a387"), - Pair("skinsuit", "56b8e80e719a160f1970d5a6"), - Pair("slime", "56b8e7b9719a160f1970d1b7"), - Pair("slug", "56cb7f7e719a161b35a6aedd"), - Pair("small breasts", "56b8e36c719a160ccaf2e5fb"), - Pair("smell", "56b8e3ae719a160ccaf2ea33"), - Pair("smoking", "58501400719a165eaaf83a1a"), - Pair("snake", "5769c001719a167bb7f3c0b0"), - Pair("snake girl", "56b8e527719a160f1970b0cf"), - Pair("snuff", "56b8e337719a1608ab978eef"), - Pair("socks", "545ec3a945b9ef70f033c4fb"), - Pair("socks", "55646787719a1686396e9426"), - Pair("sole dickgirl", "56b8e3b8719a160ccaf2eae9"), - Pair("sole female", "56b8e33f719a1608ab978f1d"), - Pair("sole male", "56b8e33f719a1608ab978f1e"), - Pair("solo action", "56b8e469719a160f1970a70d"), - Pair("sophie houjou", "571f2766719a16067f34ae64"), - Pair("sori", "56cb6317719a167c4e9e9cd4"), - Pair("soul calibur", "57287e49719a1639c2c85c42"), - Pair("southbamboo", "56c22b00719a168abf0d13be"), - Pair("spats", "555165b8719a168965a40ffa"), - Pair("speculum", "56c22de0719a168abf0d3818"), - Pair("spicaya", "587f35b7719a1680ba7f1995"), - Pair("spider", "5876a3dd719a1614eb5ac658"), - Pair("spider girl", "56b8e527719a160f1970b0d0"), - Pair("spread", "569d758e719a1695484b1082"), - Pair("squid boy", "5808d4fa719a1655df48fc14"), - Pair("squid girl", "56b8e7b2719a160f1970d15c"), - Pair("squirrel girl", "56b8e33f719a1608ab978f1b"), - Pair("steward", "5715ecc6719a161780dbd235"), - Pair("stewardess", "570c9628719a16054fd7be1f"), - Pair("stockings", "4f00e032c09225131600004a"), - Pair("stockings", "5564674c719a1686396e9325"), - Pair("stomach deformation", "56b8e337719a1608ab978ef5"), - Pair("story arc", "56b8e370719a160ccaf2e641"), - Pair("stretching", "570c96d9719a16054fd7c3c6"), - Pair("stuck in wall", "56b8e726719a160f1970cacf"), - Pair("student", "4f03c4ddc092256d81003447"), - Pair("student council", "56d4d655719a16848b4cd8ea"), - Pair("studio crimson", "56f0bc75719a16856dd1f6c9"), - Pair("studio onion", "56b8eade719a160f1970f9cb"), - Pair("suguru kamoshida", "588870b0719a165bccf4115d"), - Pair("sunahama nosame", "573b63fb719a1629609e5d9e"), - Pair("sundress", "56b8e7d5719a160f1970d30c"), - Pair("sunglasses", "56b8e376719a160ccaf2e69f"), - Pair("suzuen", "57fe48ee719a16206a91c4b8"), - Pair("swallow sky", "56b8e6aa719a160f1970c3af"), - Pair("sweating", "56b8e305719a1607fceb7b6c"), - Pair("swimsuit", "54c052a445b9efc62468bbed"), - Pair("swimsuit", "55646764719a1686396e93b3"), - Pair("swinging", "56b8e378719a160ccaf2e6af"), - Pair("syoko hoshi", "570cb48f719a16861b23fb84"), - Pair("syounen kouraku", "5715d113719a16156436f75b"), - Pair("syringe", "56b8e337719a1608ab978ef0"), - Pair("syunzo", "56c22be0719a168abf0d1ee3"), - Pair("table masturbation", "56b8e8f8719a160f1970e15e"), - Pair("tadashi hamada", "5728b934719a16117c8d17c5"), - Pair("tagane", "5794b4cf719a167e4baa78e5"), - Pair("taichi yaegashi", "56b8e56e719a160f1970b43b"), - Pair("tail blue", "574dd92b719a16606128de91"), - Pair("tail plug", "57936393719a1660a6b00805"), - Pair("tail yellow", "574dd92b719a16606128de90"), - Pair("tailjob", "56b8e726719a160f1970cacc"), - Pair("tairame", "573b2bc1719a16738c41823a"), - Pair("taji", "57d2028d719a1699d9a55957"), - Pair("takakura row", "58316d23719a162fb6df6091"), - Pair("takanaga hinako", "571f5fcd719a167a10f07887"), - Pair("takano yumi", "57287de7719a1639c2c85733"), - Pair("takayama non", "573b66ac719a1629609e7f3c"), - Pair("takayamanon", "573b66ac719a1629609e7f3d"), - Pair("takeo gouda", "56b8e65b719a160f1970bfe2"), - Pair("takewan", "586e121e719a1621d850fb57"), - Pair("takoyaki yoshi", "57be907c719a1610094a299b"), - Pair("tall girl", "56b8e378719a160ccaf2e6b0"), - Pair("tall man", "56b8e33f719a1608ab978f1a"), - Pair("tamagohan", "585a4ba8719a16178f4f0271"), - Pair("tamokuteki kuukan", "56cb7ead719a161b35a6a532"), - Pair("tankoubon", "56b8e378719a160ccaf2e6ae"), - Pair("tanlines", "4f00e7bdc0922522060003b2"), - Pair("tanlines", "556467fa719a1686396e957e"), - Pair("tanpopo shunmaru", "56c229ec719a168abf0d05cc"), - Pair("tanukine", "56f9ea32719a164395bc0ebc"), - Pair("taoi", "57735090719a165a1294d288"), - Pair("tasu", "5715ec9b719a161780dbd188"), - Pair("tatsuhide", "56e74982719a165d4fe16599"), - Pair("tatsunokosso", "56d4b99f719a164632263958"), - Pair("teacher", "4f00e084c0922513160000af"), - Pair("teacher", "5564674f719a1686396e9340"), - Pair("tejina senpai", "57e37a6c719a166f0f8735af"), - Pair("tekoki", "4f01e19ec092253ba700585f"), - Pair("tentacles", "4f00e120c0922515ab0000a6"), - Pair("terasu", "5731d615719a160bac0aaf4c"), - Pair("the jinshan", "57f59b21719a167b1dbd5d99"), - Pair("thigh high boots", "56b8e41a719a160f1970a384"), - Pair("tiara", "56b8e580719a160f1970b53b"), - Pair("tickling", "56b8e726719a160f1970cacd"), - Pair("tights", "56f9e9ae719a164395bc09fa"), - Pair("tilia", "56cb7e19719a161b35a69f3d"), - Pair("tocori", "56de2bed719a166fd66fbf87"), - Pair("tomboy", "4f00e910c092252206000534"), - Pair("tomboy", "556467ca719a1686396e94e0"), - Pair("tomgirl", "56b8e3c3719a160ccaf2eba6"), - Pair("tomoya aki", "56cb7e0f719a161b35a69ece"), - Pair("tonsuke", "56d4d616719a16848b4cd5b8"), - Pair("tooku no mura", "56e74b98719a165d4fe17c7f"), - Pair("tooyama hirohito", "57be9073719a1610094a2934"), - Pair("tori himemiya", "5884273c719a162bbe3ccd8e"), - Pair("tottoko mtarou", "589c36ab719a1664dd43105f"), - Pair("toudori no su", "5797ac7b719a164c63580b78"), - Pair("toys", "4f00e54ec09225220600009d"), - Pair("toys", "5564680a719a1686396e95c2"), - Pair("tracksuit", "56b8e36c719a160ccaf2e5fa"), - Pair("trampling", "589e853d719a1631d15960a6"), - Pair("trans", "552ad5d6719a165e97ce8d0a"), - Pair("transformation", "56b8e36b719a160ccaf2e5ee"), - Pair("trap", "4f00e041c092251316000061"), - Pair("triple anal", "56d4d5bf719a16848b4cd1b6"), - Pair("triple penetration", "56b8e337719a1608ab978eed"), - Pair("triple vaginal", "5793634e719a1660a6b004d3"), - Pair("try hougen", "571f6213719a167a10f089d1"), - Pair("ts neinenki", "57d7f14c719a162806043c7d"), - Pair("tsuchinoko", "57320cc3719a16693cf46bcd"), - Pair("tsukimoto kizuki", "56c22b35719a168abf0d167f"), - Pair("tsukishima mist", "56b8e647719a160f1970bec1"), - Pair("tsundere", "4f00e5b1c09225220600012c"), - Pair("tsundere", "55646778719a1686396e93f6"), - Pair("ttf threesome", "56b8e8de719a160f1970dfe4"), - Pair("ttm threesome", "56b8e968719a160f1970e6e9"), - Pair("tube", "56b8e4bc719a160f1970ab0f"), - Pair("tunakan", "5760a4a5719a161c54372362"), - Pair("tutor", "56b8e5b1719a160f1970b751"), - Pair("twoframe", "5715d113719a16156436f75c"), - Pair("tyria", "56cb7e19719a161b35a69f3e"), - Pair("ueno tomoki", "577c6deb719a1623436efa82"), - Pair("unbirth", "56b8e527719a160f1970b0ce"), - Pair("uncensored", "4f00e175c0922515ab00011f"), - Pair("uncensored", "55646778719a1686396e93f8"), - Pair("uncle", "56b8e6e7719a160f1970c70b"), - Pair("underwater", "56b8e726719a160f1970caca"), - Pair("unihoge", "5895f386719a163d654bb665"), - Pair("unusual pupils", "56b8e4ad719a160f1970aa47"), - Pair("unusual teeth", "56cb7fee719a161b35a6b278"), - Pair("urination", "56b8e4b5719a160f1970aaa7"), - Pair("usagi no shippo", "56e74982719a165d4fe1659a"), - Pair("usapyon", "56f0bd67719a16856dd20197"), - Pair("usui hon hitori roudoku kai", "56b8e647719a160f1970bec3"), - Pair("uzuki", "56b8e42f719a160f1970a499"), - Pair("vacbed", "56de2b2d719a166fd66fb8f5"), - Pair("vaginal sticker", "586fb7fd719a168eed7908bb"), - Pair("vanilla", "4f00e003c092251316000002"), - Pair("vanilla", "5564674f719a1686396e933f"), - Pair("vila", "57287dd9719a1639c2c856ac"), - Pair("virginity", "56b8e36a719a160ccaf2e5d6"), - Pair("visual she", "5731d5c5719a160bac0aacd7"), - Pair("vivace", "56c22ac7719a168abf0d10ed"), - Pair("vuttiya", "588578bf719a168a49752b65"), - Pair("waiter", "579854ee719a1648fd01151e"), - Pair("waiter", "579854ee719a1648fd01151c"), - Pair("washizuka sho", "571f6011719a167a10f07a9c"), - Pair("watermarked", "57287fad719a1639c2c86d5c"), - Pair("webtoon", "579eec8e719a169e8bb534ce"), - Pair("weight gain", "573b666a719a1629609e7ad9"), - Pair("western", "5590b089719a167a01f35950"), - Pair("wet clothes", "5805894b719a160616b5863f"), - Pair("whip", "56c22cf2719a168abf0d2bd5"), - Pair("wings", "56b8e5d8719a160f1970b905"), - Pair("wolf", "56b8e598719a160f1970b63b"), - Pair("wolf boy", "56cb7f41719a161b35a6abd0"), - Pair("wolf girl", "56b8e65f719a160f1970c026"), - Pair("wooden horse", "56b8e661719a160f1970c04c"), - Pair("worm", "56e766de719a16989a47c8df"), - Pair("wormhole", "56fa053d719a1669f2a7bbd0"), - Pair("wrestling", "56b8e7b2719a160f1970d165"), - Pair("x-ray", "54ee6537719a1680a4d18331"), - Pair("x-ray", "55646787719a1686396e9428"), - Pair("yakan", "57adc14c719a16504d6868c2"), - Pair("yamamoto doujin", "577ca78a719a169cd4767f72"), - Pair("yamori misaki", "570cb497719a16861b23fbff"), - Pair("yandere", "4f00e5c8c092252206000162"), - Pair("yang-do", "58180c3e719a168510b55736"), - Pair("yayoi", "56c22b10719a168abf0d149d"), - Pair("yomogi", "57bd3f1a719a163e0da0b0c9"), - Pair("yoshizuki minoru", "5731d5c5719a160bac0aacd8"), - Pair("yoyokkun", "57ee0678719a16345f09c62f"), - Pair("yshtola", "5716094b719a1695b38aa1a5"), - Pair("yui komori", "570cb224719a16861b23e688"), - Pair("yukijirushi", "586b1ac0719a161ec7d1a9ef"), - Pair("yukino", "57f000d5719a162d156df669"), - Pair("yukowa kari", "56f0a18f719a166ee74a2464"), - Pair("yurarin", "5886ca3e719a167f77f68a2c"), - Pair("yuri", "55646784719a1686396e9418"), - Pair("yuuyake croissant", "585e401d719a1636e2d6b79e"), - Pair("zeitaku zanmai", "56c22b10719a168abf0d149e"), - Pair("zenjidou momiyama", "57f0fdcf719a163c0daba6a8"), - Pair("zero gravity", "5619c9b2719a16502106c0b2"), - Pair("zooey", "5875fb34719a16738b9f43ac") + Pair("+", "53c5967245b9ef2b85e38cfa"), + Pair("100mjack", "56b8ea8a719a160f1970f592"), + Pair("111 touban", "57e2d1af719a1649a0b6f40e"), + Pair("21st century renaissance", "5899939e719a165a8cf59398"), + Pair("4den hiro", "56c2285d719a168abf0cf302"), + Pair("7days", "56c22ad2719a168abf0d1182"), + Pair("action", "4e70ea24c092255ef7004f85"), + Pair("adult", "4e70e91dc092255ef7001727"), + Pair("adventure", "4e70ea24c092255ef7004f86"), + Pair("ahegao", "51793ded45b9efe88c5e59cd"), + Pair("alien", "5591faf0719a16886c3376b0"), + Pair("amputee", "55925592719a16886c347d02"), + Pair("anilingus", "5591faec719a16886c33769e"), + Pair("animal boy", "577e6173719a1672c697a00a"), + Pair("animal ears", "5591faf0719a16886c3376ac"), + Pair("animal girl", "5591fc1f719a16886c337c0a"), + Pair("armpit", "55920eb7719a16886c33b920"), + Pair("autofellatio", "55920a59719a16886c33ac99"), + Pair("bbm / fat man", "577e5fd2719a1614690bd0f5"), + Pair("bbw", "5591fbcc719a16886c337a85"), + Pair("bdsm", "5591fb8f719a16886c337982"), + Pair("band-aid", "55921508719a16886c33c325"), + Pair("bathroom sex", "5591fafe719a16886c3376e4"), + Pair("bestiality", "5591fed8719a16886c3383f7"), + Pair("big areola", "5591fb8d719a16886c337975"), + Pair("big ass", "5591faf4719a16886c3376c4"), + Pair("bikini", "5591fb7b719a16886c337933"), + Pair("birth", "5591fed8719a16886c3383f5"), + Pair("bisexual", "55921d83719a16886c33da43"), + Pair("blackmail", "5591fc6c719a16886c337d77"), + Pair("blindfold", "5591fbaa719a16886c3379f8"), + Pair("blindness", "55923a7c719a16886c3427fb"), + Pair("bloomers", "5591ff70719a16886c3384e5"), + Pair("blowjob", "5591faed719a16886c3376a4"), + Pair("body painting", "55925589719a16886c347ce4"), + Pair("body swap", "55922ee2719a16886c340825"), + Pair("body writing", "559215a4719a16886c33c602"), + Pair("bodysuit", "5591ff70719a16886c3384e9"), + Pair("breast expansion", "559207e0719a16886c33a1dd"), + Pair("breast sucking", "5591faed719a16886c3376a2"), + Pair("bride", "5591fb7b719a16886c337934"), + Pair("bukkake", "5591fb31719a16886c3377f2"), + Pair("bunny ears", "5591fea4719a16886c3383b6"), + Pair("bunnygirl", "5591fd9d719a16886c338136"), + Pair("cbt", "5591fb8e719a16886c33797b"), + Pair("cat ears", "5591fb7a719a16886c33792c"), + Pair("catgirl", "5591ff70719a16886c3384e6"), + Pair("centaur", "559207e0719a16886c33a1dc"), + Pair("cervical penetration", "577e6176719a1672c697a022"), + Pair("chastity belt", "5592087e719a16886c33a520"), + Pair("childhood friend", "5591ffd8719a16886c33867f"), + Pair("chinese dress", "559202f8719a16886c339044"), + Pair("collar", "5591fbab719a16886c3379fb"), + Pair("comedy", "4e70e91dc092255ef7001728"), + Pair("condom", "5591fb32719a16886c3377f6"), + Pair("cow girl", "5591ff70719a16886c3384e7"), + Pair("crossdressing", "5591fb31719a16886c3377ef"), + Pair("crotchless / breastless", "577e5fe7719a161c005866b7"), + Pair("dandere", "55925dbc719a16886c349758"), + Pair("daughter", "5591fd72719a16886c33807c"), + Pair("deepthroat", "5591fb7b719a16886c33792d"), + Pair("defloration", "5591fb0c719a16886c337709"), + Pair("devil", "5591fc5d719a16886c337d2d"), + Pair("diaper", "55928caa719a16886c3536f7"), + Pair("dirty old man", "5591fb1b719a16886c337762"), + Pair("doctor", "55920cbf719a16886c33b290"), + Pair("dog ears", "5591fe05719a16886c33825b"), + Pair("dog girl", "5591fe03719a16886c338257"), + Pair("dojikko", "5591ff70719a16886c3384e4"), + Pair("doll", "55922f89719a16886c340be4"), + Pair("double penetration", "5591fb1b719a16886c337763"), + Pair("drama", "4e70ea23c092255ef7004f2f"), + Pair("drugs", "5591faf0719a16886c3376b4"), + Pair("drunk", "5591faec719a16886c33769c"), + Pair("ecchi", "4e70ea01c092255ef7004653"), + Pair("egg laying", "55920850719a16886c33a40c"), + Pair("elder sister", "5591ff18719a16886c338487"), + Pair("elf", "5591fb73719a16886c33790e"), + Pair("enema", "5591fc6c719a16886c337d7b"), + Pair("exhibitionism", "5591fb0c719a16886c337710"), + Pair("eyepatch", "5591ff19719a16886c338488"), + Pair("face sitting", "5591faee719a16886c3376a5"), + Pair("fairy", "55921560719a16886c33c4c5"), + Pair("fantasy", "4e70ea23c092255ef7004f5e"), + Pair("fingering", "5591faec719a16886c3376a0"), + Pair("fisting", "559208c0719a16886c33a66d"), + Pair("foot fetish", "5591fbd7719a16886c337acb"), + Pair("footjob", "5591fbab719a16886c3379fd"), + Pair("fox ears", "55921632719a16886c33c8fd"), + Pair("fox girl", "55921632719a16886c33c8fe"), + Pair("freckles", "5592019b719a16886c338dde"), + Pair("french kissing", "577e5fd2719a1614690bd100"), + Pair("frotting", "559211ff719a16886c33be47"), + Pair("full color", "5591faf0719a16886c3376b2"), + Pair("fundoshi", "559215a4719a16886c33c600"), + Pair("furry", "5591fe03719a16886c338258"), + Pair("futa on female", "577e5fd1719a1614690bd0e9"), + Pair("futa on male", "5591fc9c719a16886c337e51"), + Pair("futanari on futanari", "5591fd87719a16886c3380de"), + Pair("gangbang", "5591fb90719a16886c337983"), + Pair("gender bender", "4e70e925c092255ef7001957"), + Pair("ghost", "5591fc0a719a16886c337bbe"), + Pair("giantess", "559253c5719a16886c347648"), + Pair("gloves", "577e5fe8719a161c005866bf"), + Pair("gokkun", "5591fbaa719a16886c3379f6"), + Pair("gothic", "55921f79719a16886c33dfa7"), + Pair("group sex", "5591faed719a16886c3376a3"), + Pair("guro", "5591fe3f719a16886c3382d3"), + Pair("hairjob", "559206a7719a16886c339d7f"), + Pair("hairy armpits", "55920591719a16886c3399e3"), + Pair("handjob", "5591fb8e719a16886c33797a"), + Pair("happy sex", "5591faf0719a16886c3376ae"), + Pair("harem", "4e70ea23c092255ef7004f55"), + Pair("hat", "577e627d719a160f53827289"), + Pair("heterochromia", "559200e4719a16886c338af5"), + Pair("historical", "4e70ea23c092255ef7004f5f"), + Pair("horror", "4e70ea26c092255ef70050a9"), + Pair("hotpants", "55920090719a16886c3389ac"), + Pair("huge breasts", "5591fb8f719a16886c337981"), + Pair("huge penis", "5591fb32719a16886c3377f7"), + Pair("human toilet", "577e5fd2719a1614690bd0f8"), + Pair("hypnosis", "5592044f719a16886c33928e"), + Pair("imouto", "5591fb7b719a16886c337936"), + Pair("impregnation", "5591faf0719a16886c3376af"), + Pair("inverted nipples", "5591fef4719a16886c338434"), + Pair("kimono", "5591fed8719a16886c3383f6"), + Pair("kimono / yukata", "577e5fd1719a1614690bd0ec"), + Pair("kunoichi", "55920071719a16886c33892e"), + Pair("kuudere", "55921679719a16886c33c9d5"), + Pair("lactation", "5591faf0719a16886c3376b7"), + Pair("lamia", "55920850719a16886c33a40d"), + Pair("large breasts", "5591faec719a16886c33769d"), + Pair("legal loli", "577e5fe8719a161c005866c0"), + Pair("licking", "5591fb1b719a16886c337760"), + Pair("lowleg", "5591fb8d719a16886c337974"), + Pair("milf", "5591fb8d719a16886c337972"), + Pair("maebari", "55921a27719a16886c33d237"), + Pair("magical girl", "5591fba4719a16886c3379e2"), + Pair("male on futa", "577e6279719a160f53827278"), + Pair("maledom", "5591fbab719a16886c3379f9"), + Pair("martial arts", "4e70ea27c092255ef70050cd"), + Pair("masturbation", "5591fb23719a16886c337799"), + Pair("mature", "4e70e91dc092255ef700172b"), + Pair("mecha", "4e70ea31c092255ef7005410"), + Pair("menstruation", "55921cc6719a16886c33d7da"), + Pair("mermaid", "5592713f719a16886c34df91"), + Pair("military uniform", "5591fba2719a16886c3379cf"), + Pair("mind break", "5591fb0c719a16886c33770b"), + Pair("mind control", "5591fafe719a16886c3376e6"), + Pair("monster", "5591fafd719a16886c3376e2"), + Pair("mother", "5591fc57719a16886c337cff"), + Pair("mouth gag", "5591fc6c719a16886c337d7a"), + Pair("multiple breasts", "559207e0719a16886c33a1da"), + Pair("multiple insertion", "5591fb8e719a16886c337977"), + Pair("multiple penises", "5591fe3f719a16886c3382d4"), + Pair("muscle", "55920071719a16886c33892d"), + Pair("mystery", "4e70ea29c092255ef70051fa"), + Pair("naked apron", "5591fb7a719a16886c33792b"), + Pair("nipple fuck", "55920242719a16886c338ec0"), + Pair("nipple penetration", "577e5e30719a165576d6a2a4"), + Pair("nun", "55920692719a16886c339d4e"), + Pair("nyotaimori", "559a5ebb719a16532b1e67a9"), + Pair("office lady", "5591fb8e719a16886c33797c"), + Pair("onahole", "55920754719a16886c339f5d"), + Pair("onsen", "5591fe04719a16886c338259"), + Pair("oppai loli", "5591fb4e719a16886c337885"), + Pair("otouto", "55920409719a16886c33922e"), + Pair("pajamas", "55920c39719a16886c33afdd"), + Pair("pantyhose", "5591fb7b719a16886c337931"), + Pair("pet girl", "5591fb1b719a16886c33775e"), + Pair("phimosis", "5591fb8d719a16886c337970"), + Pair("piercings", "559203aa719a16886c3391be"), + Pair("police uniform", "55920545719a16886c3397dd"), + Pair("princess", "5591fba2719a16886c3379ce"), + Pair("prostitution", "5591faf4719a16886c3376c5"), + Pair("psychological", "4e70ea01c092255ef7004650"), + Pair("pubic hair", "5591faf0719a16886c3376b1"), + Pair("race queen", "5591fde9719a16886c33822d"), + Pair("rape", "5591fafe719a16886c3376e5"), + Pair("reverse ntr", "577e5fea719a161c005866ca"), + Pair("reverse rape", "5591fb8d719a16886c33796f"), + Pair("robot girl", "5592068d719a16886c339d47"), + Pair("romance", "4e70e9ffc092255ef70045b4"), + Pair("scat", "55920445719a16886c339268"), + Pair("school life", "4e70e925c092255ef7001958"), + Pair("school swimsuit", "5591ff71719a16886c3384eb"), + Pair("school uniform", "5591faf4719a16886c3376c1"), + Pair("sci-fi", "4e70ea26c092255ef70050c0"), + Pair("sex toys", "5591faec719a16886c33769f"), + Pair("shemale", "55920d30719a16886c33b4f6"), + Pair("shimaidon", "577e62ab719a161e140239e3"), + Pair("shoujo ai", "4e70ea23c092255ef7004f52"), + Pair("shounen ai", "4e70ea01c092255ef7004649"), + Pair("sixty-nine", "5591faef719a16886c3376a7"), + Pair("slave", "5591fb1b719a16886c33775c"), + Pair("sleeping", "5591fb5f719a16886c3378ca"), + Pair("slice of life", "4e70e925c092255ef7001959"), + Pair("slime girl", "559205c7719a16886c339b3a"), + Pair("slut", "577e5fe7719a161c005866b8"), + Pair("small penis", "5591fd87719a16886c3380db"), + Pair("smegma", "5591fb8e719a16886c337976"), + Pair("smut", "4e70ea24c092255ef7004f95"), + Pair("spanking", "559200cf719a16886c338ab4"), + Pair("spitroast", "5591fb1c719a16886c337765"), + Pair("sports", "4e70ea2ac092255ef7005231"), + Pair("squirting", "5591faec719a16886c3376a1"), + Pair("stalking", "559201d6719a16886c338e2c"), + Pair("stomach bulge", "5591fb32719a16886c3377f8"), + Pair("straight shota", "5591fb4e719a16886c337884"), + Pair("strap-on", "5591fbba719a16886c337a3c"), + Pair("succubus", "55920135719a16886c338c97"), + Pair("sumata", "5591fbab719a16886c3379fa"), + Pair("supernatural", "4e70ea24c092255ef7004f7c"), + Pair("suppository", "55925035719a16886c346ed3"), + Pair("symbol shaped pupils", "5591ff71719a16886c3384ed"), + Pair("tan", "559203aa719a16886c3391bf"), + Pair("tattoo", "55920607719a16886c339c73"), + Pair("threesome", "577e5fe5719a161c005866a4"), + Pair("time stop", "559267cf719a16886c34bc59"), + Pair("toddler", "5591fba2719a16886c3379d4"), + Pair("torture", "5591ffe8719a16886c3386c1"), + Pair("tragedy", "4e70ea24c092255ef7004f98"), + Pair("transparent clothing", "5591fe10719a16886c33826f"), + Pair("tribadism", "5591ff10719a16886c338474"), + Pair("twins", "5591ffb9719a16886c3385ed"), + Pair("twintails", "5591faf0719a16886c3376ad"), + Pair("urethra insertion", "55c91399719a1679540946f3"), + Pair("vampire", "5591fb31719a16886c3377f1"), + Pair("virginity (male)", "577e5fd2719a1614690bd0f7"), + Pair("vomit", "5591ffe8719a16886c3386c0"), + Pair("vore", "55920850719a16886c33a40f"), + Pair("voyeurism", "5591fb8d719a16886c337973"), + Pair("waitress", "559208c0719a16886c33a66c"), + Pair("wakamezake", "5592dac3719a16886c360852"), + Pair("watersports", "5591fd58719a16886c338032"), + Pair("widow", "559228f7719a16886c33fd86"), + Pair("witch", "55920864719a16886c33a484"), + Pair("yaoi", "4e70ea01c092255ef700464a"), + Pair("yukata", "55920828719a16886c33a357"), + Pair("yuri", "4e70ea01c092255ef700464d"), + Pair("zombie", "559232df719a16886c34163f"), + Pair("abdg encirclement formation", "57d1056f719a1612b7e9d933"), + Pair("abdg houimou", "57d1056f719a1612b7e9d932"), + Pair("abortion", "581fa0fc719a16211afd5940"), + Pair("absorption", "571f61fe719a167a10f0894e"), + Pair("age progression", "56b8e577719a160f1970b4c8"), + Pair("age regression", "56c22b5f719a168abf0d18c4"), + Pair("ahegao", "556467fa719a1686396e957f"), + Pair("aihara", "56e765d9719a16989a47bf5a"), + Pair("aika tsube", "574dd952719a16606128e055"), + Pair("aka usagi", "574dd9cb719a16606128e3db"), + Pair("akamiro", "56c227d5719a168abf0ced93"), + Pair("akaneko", "56c22861719a168abf0cf334"), + Pair("akari yomatsuri", "570cb2c5719a16861b23ebaa"), + Pair("alien girl", "571f27a2719a16067f34afed"), + Pair("all the way through", "56ddf3f6719a16450f8235ce"), + Pair("almarosso", "5731d49c719a160bac0aa2e7"), + Pair("already uploaded", "56b8e498719a160f1970a92f"), + Pair("alsetro", "5769bfff719a167bb7f3c0a4"), + Pair("amata x 96", "56de2d3a719a166fd66fcdca"), + Pair("ambient", "5796066a719a1604964f9402"), + Pair("amino", "573b2be6719a16738c4183df"), + Pair("anal", "4f00e025c09225131600002b"), + Pair("anal birth", "570cb3da719a16861b23f497"), + Pair("andromeda", "56f0bd99719a16856dd2038e"), + Pair("ane naru mono", "57d3fce0719a1648cd56bd79"), + Pair("anegaoka sanchoume", "56e74ad9719a165d4fe1748d"), + Pair("angel", "4f03ae61c092256d81000ad5"), + Pair("animated", "5590cbe7719a1685eace68ab"), + Pair("anorexic", "578d202e719a168c492c2c2e"), + Pair("antans8092", "57c9c52e719a1647b7d6195f"), + Pair("anthology", "56fa05a9719a1669f2a7bed6"), + Pair("ao kurage", "56fa065b719a1669f2a7c39b"), + Pair("aoi dennou", "58969c4a719a166afdaf135d"), + Pair("aomaru", "56c2297d719a168abf0d0026"), + Pair("aomoto sari", "58292fbf719a164668a6bdb0"), + Pair("apron", "4f03f496c092256d81008769"), + Pair("armpit licking", "56b8e8bc719a160f1970de1c"), + Pair("armpit sex", "56b8e742719a160f1970cc46"), + Pair("artbook", "586f0f3d719a1601e2b5c53a"), + Pair("artistcg", "56b8e438719a160f1970a4e0"), + Pair("asage", "56c22d2e719a168abf0d2edd"), + Pair("ashikoki", "4f00e5b1c09225220600012b"), + Pair("ashikoki", "55646787719a1686396e9425"), + Pair("asian girly", "57287dfd719a1639c2c8583b"), + Pair("asphyxiation", "56b8e46a719a160f1970a716"), + Pair("ass expansion", "574e1088719a164c3b023763"), + Pair("assjob", "56b8e891719a160f1970dbe2"), + Pair("aster", "582146e3719a160217cd422a"), + Pair("ato", "56ddf48a719a16450f823bf9"), + Pair("atoko", "5875fb1c719a16738b9f41a8"), + Pair("aunt", "56b8e4e4719a160f1970ad2a"), + Pair("autopaizuri", "57287e03719a1639c2c8588f"), + Pair("ayumi otosaka", "56b8eaa7719a160f1970f6f9"), + Pair("azusa nakajo", "56b8e648719a160f1970becb"), + Pair("bakunyuu", "5445a92945b9ef840fcdaba8"), + Pair("ball sucking", "56c22d38719a168abf0d2f76"), + Pair("balljob", "57bd3ef3719a163e0da0af16"), + Pair("balls expansion", "5731d538719a160bac0aa780"), + Pair("ban daiki", "589a3c70719a161a1b370941"), + Pair("bandages", "56b8e3c7719a160ccaf2ebfe"), + Pair("banjaku", "570c79ed719a1621f04affab"), + Pair("bara", "52e7a50045b9ef44698f7134"), + Pair("bbm", "56b8e337719a1608ab978ef4"), + Pair("bear", "5744ba6e719a162b60f1051d"), + Pair("bee girl", "57287f06719a1639c2c865fc"), + Pair("bemani", "56cb7ed7719a161b35a6a700"), + Pair("beni", "56b8e79c719a160f1970d03b"), + Pair("big areolae", "56b8e49d719a160f1970a96b"), + Pair("big balls", "56b8e4bc719a160f1970ab0e"), + Pair("big breasts", "56b8e33f719a1608ab978f19"), + Pair("big clit", "56b8e43f719a160f1970a516"), + Pair("big nipples", "56b8e3b8719a160ccaf2eae7"), + Pair("big penis", "56b8e3b8719a160ccaf2eae8"), + Pair("big vagina", "575730f9719a167268694230"), + Pair("bike shorts", "56b8e6ac719a160f1970c3c6"), + Pair("biting", "5493f01f45b9ef2e15b4b845"), + Pair("bittsu", "5769c138719a167bb7f3ce84"), + Pair("blind", "56cb61d6719a167c4e9e8dc0"), + Pair("blink", "56c22a9e719a168abf0d0e53"), + Pair("blood", "56b8e600719a160f1970bad4"), + Pair("blowjob face", "56b8e36a719a160ccaf2e5d9"), + Pair("blue keshi", "577ca8e4719a169cd4768b7e"), + Pair("body modification", "56b8e488719a160f1970a884"), + Pair("bodystocking", "57f59b0d719a167b1dbd5cc6"), + Pair("bojo g. gangster", "5875a6c2719a165b3c314143"), + Pair("boku wa mari no naka", "584a253d719a168a1c1bbcc6"), + Pair("bondage", "55023ecd719a1676c2a42957"), + Pair("bondage", "556467e9719a1686396e953c"), + Pair("booty", "56ad63a2719a164dbd1d4b21"), + Pair("brain fuck", "56de2c65719a166fd66fc488"), + Pair("breast feeding", "56b8e710719a160f1970c952"), + Pair("breast reduction", "58799b45719a162e0a414ec9"), + Pair("brother", "56b8e4fd719a160f1970ae8f"), + Pair("bukakke", "4f01ece8c092253ba7006aab"), + Pair("bull", "57bc41cc719a162732aaee12"), + Pair("bullseye", "57033fdd719a16216ffcd111"), + Pair("bunker k", "577c6e00719a1623436efb73"), + Pair("bunny boy", "56b8e98b719a160f1970e904"), + Pair("business suit", "56b8e4a9719a160f1970aa04"), + Pair("butler", "56b8e69f719a160f1970c32e"), + Pair("c60", "574481c6719a163976f9e62c"), + Pair("c62", "5744840e719a163976fa00c1"), + Pair("c63", "57287e49719a1639c2c85c43"), + Pair("cagliostro", "56b8e8bc719a160f1970de1e"), + Pair("calm atmosphere", "56de2be0719a166fd66fbf15"), + Pair("candy-city", "56de2b3a719a166fd66fb967"), + Pair("cannibalism", "56c22743719a168abf0ce659"), + Pair("carmine", "5703402a719a16216ffcd3f2"), + Pair("cashier", "56d4d4cf719a16848b4cc692"), + Pair("cat", "57034142719a16216ffcde22"), + Pair("catboy", "56b8e6aa719a160f1970c3ae"), + Pair("catfight", "5728b748719a16117c8d08c8"), + Pair("cats claw", "56de2d08719a166fd66fcb8a"), + Pair("censored", "5590b046719a167a01f350e2"), + Pair("cervix penetration", "56b8e3b7719a160ccaf2eadc"), + Pair("chaoroushi", "56c22b00719a168abf0d13bd"), + Pair("charie", "56b8e4ec719a160f1970ada2"), + Pair("cheating", "4f00e1c4c0922515ab000185"), + Pair("cheating", "55646753719a1686396e9359"), + Pair("cheerleader", "4f01f2ddc092253ba7007534"), + Pair("chibita", "56f0a0ab719a166ee74a1a0d"), + Pair("chikan", "4f00ee64c092252206000c93"), + Pair("chloroform", "56b8e726719a160f1970cace"), + Pair("christmas", "567af645719a165958294818"), + Pair("chubby", "53ab31aa45b9efd826b4fe7b"), + Pair("chubby", "556467e9719a1686396e953e"), + Pair("chung seiker", "57dfdaa1719a1686deb8aa8e"), + Pair("ciao baby", "56c229a7719a168abf0d0221"), + Pair("circle ao kurage", "56fa065b719a1669f2a7c39c"), + Pair("claris", "56c22b3c719a168abf0d16e5"), + Pair("clemont", "57bceb55719a1687ea2bc3bb"), + Pair("clit growth", "56b8e488719a160f1970a887"), + Pair("clown", "57b99f11719a163fba895493"), + Pair("coach", "56b8e4bc719a160f1970ab0b"), + Pair("color", "4f00e187c0922515ab000135"), + Pair("color", "55646778719a1686396e93f7"), + Pair("comaku", "56cb7ffd719a161b35a6b2ff"), + Pair("commamion", "56ddf3ea719a16450f823539"), + Pair("commanding eagle", "571f6011719a167a10f07a9b"), + Pair("compilation", "56b8e763719a160f1970cdbb"), + Pair("coprophagia", "56b8e61b719a160f1970bc38"), + Pair("corruption", "56b8e580719a160f1970b539"), + Pair("corset", "56b8e3b3719a160ccaf2ea92"), + Pair("cosplay", "5518d301719a168688910203"), + Pair("cosplaying", "56b8e571719a160f1970b466"), + Pair("cousin", "56b8e4f7719a160f1970ae53"), + Pair("cowman", "56de2c69719a166fd66fc4ad"), + Pair("crotch tattoo", "57f000b1719a162d156df4ed"), + Pair("crown", "56b8e8bc719a160f1970de1d"), + Pair("cum bath", "5728b853719a16117c8d0fe8"), + Pair("cum in eye", "56f0a1d4719a166ee74a27ac"), + Pair("cum swap", "56f0a211719a166ee74a2ab3"), + Pair("cunnilingus", "5490dca045b9efa75b8f6627"), + Pair("cunnilingus", "55646787719a1686396e9427"), + Pair("cuntboy", "589f825c719a167f7d0d0d74"), + Pair("cure magical", "57e02edd719a161a6b8ce14f"), + Pair("cure twinkle", "56b8e8cb719a160f1970ded6"), + Pair("cyan", "56cb80ab719a161b35a6ba6b"), + Pair("dai roku seitetsu", "56f0a13f719a166ee74a2064"), + Pair("dainyu", "56f0a203719a166ee74a2a04"), + Pair("dainyu dougumo", "56f0a203719a166ee74a2a05"), + Pair("daken", "57033fdd719a16216ffcd112"), + Pair("dark avengers", "57033fdd719a16216ffcd113"), + Pair("dark nipples", "56c22c00719a168abf0d207d"), + Pair("dark pit", "57bb44b9719a169ef398c2e5"), + Pair("dark sclera", "5849281e719a1634eef403ca"), + Pair("dark skin", "556467fa719a1686396e957d"), + Pair("darkskin", "4f00ea93c0922522060007e1"), + Pair("date naoto", "5794b4cf719a167e4baa78e4"), + Pair("dearka elsman", "56cb6416719a167c4e9eaa5a"), + Pair("decensored", "54ee5fd5719a1670422d15aa"), + Pair("delmo", "57160a73719a1695b38aaa4b"), + Pair("demon", "56b8e8c3719a160f1970de7c"), + Pair("demongirl", "4f03ae61c092256d81000ad6"), + Pair("denjarasu yamada", "58346488719a1688280d6f18"), + Pair("dick growth", "56b8e352719a1608ab978f68"), + Pair("dickgirl on dickgirl", "56d4b9cb719a164632263b74"), + Pair("dickgirl on male", "56ddf4ef719a16450f824176"), + Pair("dicknipples", "56f9ea3e719a164395bc0f2e"), + Pair("dilf", "56b8e3bf719a160ccaf2eb67"), + Pair("dog", "56b8e42f719a160f1970a498"), + Pair("dog boy", "56ddf302719a16450f822bf6"), + Pair("doggie style", "586e121e719a1621d850fb56"), + Pair("doll joints", "56b8e41b719a160f1970a393"), + Pair("double anal", "56b8e3c3719a160ccaf2eba4"), + Pair("double blowjob", "5728ba1d719a16117c8d1db5"), + Pair("double vaginal", "56b8e45b719a160f1970a652"), + Pair("dougi", "56b8e7d9719a160f1970d33f"), + Pair("doujinshi", "56b8e389719a160ccaf2e7b8"), + Pair("dpe", "56c22c6d719a168abf0d2517"), + Pair("dragon", "56c22970719a168abf0cff71"), + Pair("ear fuck", "5769f893719a1672d0b8946a"), + Pair("ebisawa nira", "56b8ea8a719a160f1970f591"), + Pair("edogawa koubou", "57160ace719a1695b38aad2b"), + Pair("edwin black", "56f0a13f719a166ee74a2065"), + Pair("eggs", "56d4b9ba719a164632263a9b"), + Pair("electric shocks", "5773172a719a166f4297dee6"), + Pair("elizabeth bathory", "57033ffd719a16216ffcd21f"), + Pair("emotionless sex", "56b8e4af719a160f1970aa5f"), + Pair("eren", "56cb7f74719a161b35a6ae68"), + Pair("eye penetration", "585e4025719a1636e2d6b84f"), + Pair("eyemask", "56b8e631719a160f1970bd4d"), + Pair("eyo", "56fa0548719a1669f2a7bc17"), + Pair("ezo renge", "56b8e5d8719a160f1970b906"), + Pair("ezo renkon", "56b8e5d8719a160f1970b907"), + Pair("f.o.f", "56f0a18f719a166ee74a2465"), + Pair("face to face", "582fc748719a16491f6a9cdb"), + Pair("fakers manual", "56b8ecee719a167b52e95a1c"), + Pair("fangs", "546fcb0045b9ef8e2468f3e8"), + Pair("fangs", "556467b6719a1686396e94af"), + Pair("farrah", "5885cd1d719a16181d3a77a3"), + Pair("farting", "56b8e61b719a160f1970bc37"), + Pair("father", "56b8e616719a160f1970bbea"), + Pair("felli", "56b8e718719a160f1970c9d4"), + Pair("females only", "56b8e4b8719a160f1970aad4"), + Pair("femdom", "4f00e673c09225220600022b"), + Pair("femdom", "556467b6719a1686396e94ad"), + Pair("feminization", "56b8e3c3719a160ccaf2eba8"), + Pair("ffm theesome", "5728b799719a16117c8d0b77"), + Pair("ffm threesome", "56b8e36a719a160ccaf2e5da"), + Pair("fft threesome", "56b8e43e719a160f1970a512"), + Pair("filming", "56b8e49d719a160f1970a96c"), + Pair("first person perspective", "56cb7f9a719a161b35a6b000"), + Pair("fish", "56f0a193719a166ee74a2489"), + Pair("foot insertion", "570c972e719a16054fd7c7a0"), + Pair("foot licking", "56b8e654719a160f1970bf76"), + Pair("forbidden content", "56b8e736719a160f1970cba9"), + Pair("forced", "4f00db0ec0922505a6000001"), + Pair("forniphilia", "56de2c55719a166fd66fc3db"), + Pair("fox boy", "57287e89719a1639c2c85fc8"), + Pair("frog", "56cb63ac719a167c4e9ea4eb"), + Pair("frottage", "56b8e8ef719a160f1970e0ce"), + Pair("fsweatfsole", "56f0bd03719a16856dd1fd42"), + Pair("fujii rino", "574dd9d6719a16606128e461"), + Pair("fujimoto go", "56b8e717719a160f1970c9c7"), + Pair("fujiwara yuuka", "56f0a0ab719a166ee74a1a0e"), + Pair("ful lcen", "56d4ba37719a164632264108"), + Pair("full body tattoo", "56b8e47a719a160f1970a7de"), + Pair("full censorship", "56b8e36a719a160ccaf2e5d7"), + Pair("fushimori tonkatsu", "56f0a211719a166ee74a2ab4"), + Pair("futanari", "4f00e7d5c0922522060003d9"), + Pair("futanari", "55646784719a1686396e9417"), + Pair("futanari on male", "56b8e425719a160f1970a40a"), + Pair("fuuka kazaguruma", "57e3260e719a165f19a37b75"), + Pair("gag", "56b8e49c719a160f1970a963"), + Pair("galko", "56c22bb8719a168abf0d1cdb"), + Pair("gaping", "56de2c93719a166fd66fc6a7"), + Pair("garter belt", "56b8e372719a160ccaf2e667"), + Pair("gasmask", "56b8e8e6719a160f1970e061"), + Pair("gass. mosa", "56fa06ac719a1669f2a7c628"), + Pair("genderbend", "54815eff45b9efd7b2d893fc"), + Pair("genussmittel", "58443681719a1685174341c9"), + Pair("getty", "5864d7a0719a16871a28e3c4"), + Pair("giant", "57160a50719a1695b38aa911"), + Pair("giantesskatelyn", "5773181c719a166f4297e8d5"), + Pair("giftkuchen", "56e74a59719a165d4fe16ed3"), + Pair("giiza", "56e74bff719a165d4fe18196"), + Pair("ging freecss", "57287fe5719a1639c2c86fa9"), + Pair("girls only", "56e74999719a165d4fe166b8"), + Pair("glasses", "54752d2345b9ef81e12e2ed6"), + Pair("glasses", "556467f4719a1686396e9567"), + Pair("glastonbury1966", "57f85a49719a1625873c85c3"), + Pair("glory hole", "56b8e616719a160f1970bbe9"), + Pair("goblin", "56cb7e28719a161b35a69ff0"), + Pair("gohan oomori", "56f0bd68719a16856dd201a1"), + Pair("goma brothers", "56e74981719a165d4fe16592"), + Pair("gomabura", "56e74981719a165d4fe16593"), + Pair("good job", "57731838719a166f4297e998"), + Pair("gorilla", "577c6d9c719a1623436ef63b"), + Pair("gothic lolita", "56b8e571719a160f1970b467"), + Pair("granddaughter", "56b8e659719a160f1970bfc7"), + Pair("grandfather", "57320c95719a16693cf46b4e"), + Pair("grandmother", "5744bb4b719a162b60f10eac"), + Pair("grop", "57f1522f719a1629aedc66cc"), + Pair("group", "4f00db0ec0922505a6000002"), + Pair("group", "55646756719a1686396e936d"), + Pair("growth", "56cb6226719a167c4e9e9150"), + Pair("gumiyasan", "56c22d61719a168abf0d31bc"), + Pair("guys only", "56d4b8a5719a16463226304c"), + Pair("gyarin", "5769bfff719a167bb7f3c0a5"), + Pair("gyaru", "54fcf7a7719a164793bf7a1e"), + Pair("gyaru", "556467b6719a1686396e94b0"), + Pair("gyaru-oh", "56b8e4a3719a160f1970a9b8"), + Pair("gymshorts", "56d4d649719a16848b4cd847"), + Pair("gyuo", "5863862d719a165217c26fa3"), + Pair("gyuunyuu linda", "5874a9a6719a1624355ffc0a"), + Pair("hachimitsu orange", "577c6deb719a1623436efa80"), + Pair("hachizaki suigin", "56b8e66c719a160f1970c0e1"), + Pair("hadaka", "57731873719a166f4297eb85"), + Pair("hahaoya shikkaku", "5797ac47719a164c635808ea"), + Pair("hairy", "55816856719a167bf31d5409"), + Pair("hakuchuu doudou", "573b65c1719a1629609e728a"), + Pair("halkrom", "57b6a76d719a168b3febaf31"), + Pair("handicapped", "56b8ea6b719a160f1970f3f5"), + Pair("harazumi tami", "56b8eaac719a160f1970f747"), + Pair("hardcore", "5728b748719a16117c8d08c9"), + Pair("hareta", "57035b76719a161297661786"), + Pair("harpy", "56d4b9ba719a164632263a9a"), + Pair("haruha rutei", "56c229f5719a168abf0d0643"), + Pair("haruka haruno", "56b8e63f719a160f1970be30"), + Pair("haruna mahiru", "56b8e567719a160f1970b3eb"), + Pair("hatake wo tagayasu dake", "57035b76719a161297661787"), + Pair("hatakewotagayasudake", "57035b76719a161297661788"), + Pair("hatanaka", "588fb05c719a1638581fd5f3"), + Pair("hatosable", "5744bab3719a162b60f108c8"), + Pair("headphones", "55022186719a1677296ead9a"), + Pair("headphones", "55646787719a1686396e9429"), + Pair("hentai", "4fdb1154c092250751000000"), + Pair("hentai", "5564674c719a1686396e9327"), + Pair("hidesys", "582340fe719a16683a15a8b7"), + Pair("higashi chinta", "57c57c4d719a16706e04fca3"), + Pair("high fly flow", "5760a41e719a161c54371bf7"), + Pair("high score girl", "573b2bfb719a16738c4184cf"), + Pair("highway61", "57f85a49719a1625873c85c4"), + Pair("hijab", "56b8e842719a160f1970d816"), + Pair("himeno katsuragi", "56f0a1e5719a166ee74a2889"), + Pair("hinatamizu", "578b25ed719a164d0a8b3622"), + Pair("hiro hamada", "5728b934719a16117c8d17c4"), + Pair("hiroko", "5728ba01719a16117c8d1cea"), + Pair("hiroshi nohara", "57df85ed719a1691d5f4ab2c"), + Pair("hiura kyono", "57f6982d719a16796a496724"), + Pair("hiyoubeya", "570cb321719a16861b23ee8b"), + Pair("homuraya pleiades", "56d4b957719a16463226368c"), + Pair("honebuto wasshoi", "574e1074719a164c3b023684"), + Pair("honeyamber", "587c3e64719a1612697d86b5"), + Pair("honeycomb ice cream", "577ca714719a169cd4767b32"), + Pair("hong ban-jang", "577317d7719a166f4297e5bb"), + Pair("honoka ayase", "579e43ae719a16855b671346"), + Pair("hori makoto", "57d845b5719a164697a9b291"), + Pair("horse", "56c22acb719a168abf0d1126"), + Pair("horse boy", "56c22921719a168abf0cfbbb"), + Pair("hougen", "571f6213719a167a10f089d0"), + Pair("housewife", "4f00e1c4c0922515ab000186"), + Pair("housewife", "55646756719a1686396e936e"), + Pair("how to", "57d89a0d719a168be7f092c1"), + Pair("hoyoyodou", "56b8e545719a160f1970b250"), + Pair("human cattle", "56b8e580719a160f1970b53a"), + Pair("human on furry", "56d4b874719a164632262e32"), + Pair("human pet", "56b8e85b719a160f1970d96e"), + Pair("humiliation", "4f00e084c0922513160000ae"), + Pair("humiliation", "556467e9719a1686396e953d"), + Pair("husky guy", "577c6d50719a1623436ef37f"), + Pair("hutamizu kirin", "5823e9bc719a168028c14a21"), + Pair("hyouga.", "56b8e3a9719a160ccaf2e9e3"), + Pair("idol", "543d47f145b9ef9a694a9a6c"), + Pair("ike reibun", "57287e29719a1639c2c85a66"), + Pair("ikechika", "5728ba27719a16117c8d1dea"), + Pair("ikeshita maue", "5728ba27719a16117c8d1deb"), + Pair("iku ikuo", "56c22902719a168abf0cfa3d"), + Pair("incest", "4f00e7ffc09225220600042f"), + Pair("inco", "585e401d719a1636e2d6b79d"), + Pair("incomplete", "56b8e661719a160f1970c04e"), + Pair("ineki", "57576739719a166c7f220913"), + Pair("ineminori", "56c22ad2719a168abf0d1183"), + Pair("infantilism", "57572fbf719a16726869335c"), + Pair("inflation", "56b8e337719a1608ab978ef3"), + Pair("inoue kiyoshi", "56b8e79c719a160f1970d03c"), + Pair("insect", "56c22a78719a168abf0d0c4a"), + Pair("insect boy", "577c6d5d719a1623436ef3fb"), + Pair("insect girl", "56b8e8b2719a160f1970dd8f"), + Pair("inseki", "5515d705719a164a9f01c4b4"), + Pair("interview", "562fd0d9719a16275dce2d0d"), + Pair("invisible", "56b8e4d5719a160f1970ac64"), + Pair("iroitotoiro", "57bbed97719a1645baf57432"), + Pair("irori yui", "57287ee2719a1639c2c86419"), + Pair("irrumatio", "53ddd6f345b9ef9287db6532"), + Pair("isolated island oni", "56cb7e75719a161b35a6a2d5"), + Pair("jikansakougeki", "56de2be1719a166fd66fbf1f"), + Pair("joe higashi", "56d4d4e6719a16848b4cc78d"), + Pair("josou seme", "578ccbce719a164e1d0fc074"), + Pair("juder", "57dfda5a719a1686deb8a71a"), + Pair("jurai andou", "58326a48719a1690831fdcfa"), + Pair("juurokurou", "56fa0548719a1669f2a7bc18"), + Pair("juuryoku shiki youheki", "57731939719a166f4297f35f"), + Pair("k dash", "5760a3a0719a161c54371584"), + Pair("k.tomo", "56de2be0719a166fd66fbf16"), + Pair("kagetsu hakamada", "57035caa719a16129766206f"), + Pair("kaitou yuuhi", "57960678719a1604964f9515"), + Pair("kakizaki kousei", "571608ea719a1695b38a9f3b"), + Pair("kaku tatakaeri", "57ad18a0719a1684b32b9d64"), + Pair("kamatsukatei", "56cb6317719a167c4e9e9cd5"), + Pair("kamikage kirino", "56e74bb3719a165d4fe17dc4"), + Pair("kamogawa", "5760a4a5719a161c54372361"), + Pair("kamogawa taiyaki", "570cb224719a16861b23e689"), + Pair("kangaroo", "57d3fccf719a1648cd56bcbc"), + Pair("kaoru ryuzaki", "570cb48f719a16861b23fb85"), + Pair("kappa", "56c2281c719a168abf0cf049"), + Pair("kasai yukiha", "5837b03f719a165b6e109d77"), + Pair("kebiishi", "56b8ead0719a160f1970f915"), + Pair("kemonomimi", "4f00e0c3c0922515ab000001"), + Pair("kemonomimi", "55646784719a1686396e9419"), + Pair("kenichi", "56d4d578719a16848b4cce7a"), + Pair("kenichi saruyama", "57843a0f719a1695c3045ce1"), + Pair("kigisu", "56c22a85719a168abf0d0cf9"), + Pair("kiiroi tamago", "570340ab719a16216ffcd8a0"), + Pair("kijinoko", "56c22a85719a168abf0d0cfa"), + Pair("kikaider reijiro", "5782b3c9719a169f8b21003e"), + Pair("kimcheese", "56b8e567719a160f1970b3ec"), + Pair("kirimochi niwe", "58375bdd719a1644a7ae2c79"), + Pair("kisaragi-ice", "5874fe2a719a1673c7c6fbc2"), + Pair("kissing", "56b8e4d6719a160f1970ac77"), + Pair("kitano megumi", "57e02ede719a161a6b8ce166"), + Pair("kkc", "56f9e9ae719a164395bc09fb"), + Pair("kneepit sex", "578ec60d719a1602471883d2"), + Pair("koborii", "56f9e8ed719a164395bc04ed"), + Pair("kobuta no yakata", "57db3d18719a165182d33df1"), + Pair("kogasaki yuina", "58837e84719a161bb394d487"), + Pair("komyu", "56b8eadf719a160f1970f9e0"), + Pair("konami risa", "57f6982d719a16796a496722"), + Pair("kono subarashii sekai ni shukufuku wo", "57c32dc2719a163e9f75d6db"), + Pair("kotau", "56b8e8b2719a160f1970dd90"), + Pair("kotee", "57ca6ded719a166fb640d2b1"), + Pair("koukyou gikou", "5899939e719a165a8cf59397"), + Pair("kozountoko", "57287e0d719a1639c2c8593a"), + Pair("kreuz", "570cb317719a16861b23ee23"), + Pair("kuriyama natsuki", "5796066a719a1604964f9403"), + Pair("kurumi ohnuma", "56f0a091719a166ee74a18e0"), + Pair("kusogaki teikoku", "57adc14c719a16504d6868c1"), + Pair("kuusuke matsuno", "57287faa719a1639c2c86d39"), + Pair("kyojinkou", "582fc73c719a16491f6a9c66"), + Pair("lab coat", "56b8e951719a160f1970e5c7"), + Pair("langley", "570cb219719a16861b23e627"), + Pair("lapislazuli", "56c22c10719a168abf0d213a"), + Pair("large insertions", "56b8e488719a160f1970a886"), + Pair("lastcrime", "56ddf460719a16450f8239ec"), + Pair("latex", "56b8e385719a160ccaf2e77b"), + Pair("layer cake", "56b8e7d5719a160f1970d30d"), + Pair("leg lock", "56b8e540719a160f1970b1fa"), + Pair("legjob", "57287e3f719a1639c2c85bc1"), + Pair("leone", "56cb80c4719a161b35a6bba6"), + Pair("leotard", "56b8e372719a160ccaf2e669"), + Pair("liangshan bo", "5715d1ca719a16156436fb08"), + Pair("lingerie", "5515d6bf719a164a9f01c49c"), + Pair("lingerie", "556467e2719a1686396e9523"), + Pair("listless time", "583fedab719a168fb1a71f33"), + Pair("living clothes", "56b8e4c4719a160f1970ab86"), + Pair("lizard girl", "57033ffd719a16216ffcd21e"), + Pair("lizard guy", "56fa20f4719a1685ea9a1fc7"), + Pair("log", "57f643cd719a1606a5a83a1f"), + Pair("loli", "550221c7719a1677296eada6"), + Pair("loli seiyouken", "56e749dc719a165d4fe16986"), + Pair("lolicon", "56b8e337719a1608ab978ef2"), + Pair("long tongue", "56b8e732719a160f1970cb78"), + Pair("love hotel", "5728b748719a16117c8d08ca"), + Pair("low bestiality", "56de2b7f719a166fd66fbbcf"), + Pair("low lolicon", "56d4b940719a1646322635a6"), + Pair("low shotacon", "56c22970719a168abf0cff73"), + Pair("lunacy", "56cb80ac719a161b35a6ba7e"), + Pair("m2 goo", "57f643cd719a1606a5a83a20"), + Pair("machine", "56c22893719a168abf0cf53c"), + Pair("maeda momo", "57c970cc719a165d1d1d28e9"), + Pair("maid", "4f00e032c092251316000049"), + Pair("maji", "57e08339719a1625b30f77c0"), + Pair("majikayo", "57e08339719a1625b30f77c1"), + Pair("makunouchi", "57160ace719a1695b38aad22"), + Pair("male on dickgirl", "56ddf4ef719a16450f824177"), + Pair("male on futanari", "56b8e4cf719a160f1970ac10"), + Pair("males only", "56b8e305719a1607fceb7b6d"), + Pair("mamizo", "56d4b86e719a164632262df9"), + Pair("manga", "56b8e376719a160ccaf2e6a0"), + Pair("manikoro", "570c9600719a16054fd7bd81"), + Pair("mannmaru", "5820f260719a1679c9cd5fde"), + Pair("maraschino", "56e74aa7719a165d4fe17276"), + Pair("marika hoshino", "57735129719a165a1294d95f"), + Pair("masheri", "56b8eadf719a160f1970f9df"), + Pair("mashiba kenta", "5792ba8c719a162fe1be0a15"), + Pair("masked face", "56b8e732719a160f1970cb77"), + Pair("mata kara stream", "56cb7e33719a161b35a6a080"), + Pair("matsu no an", "56c22c66719a168abf0d24b6"), + Pair("maya joukawa", "56cb6314719a167c4e9e9cb6"), + Pair("mecha boy", "56cb7ed6719a161b35a6a6f7"), + Pair("mecha girl", "56b8e98b719a160f1970e909"), + Pair("megane", "4f00e587c0922522060000eb"), + Pair("meganekko", "56ddf4b2719a16450f823dc5"), + Pair("megaton express", "56f0a211719a166ee74a2ab5"), + Pair("megumi natsu", "56cb6314719a167c4e9e9cb5"), + Pair("mei hatsume", "57c2308d719a1677ad7e5ad4"), + Pair("meiji chimera", "56f0a0ab719a166ee74a1a0f"), + Pair("meiko", "588c103c719a1649da625aee"), + Pair("melon no hoshiboshi", "56b8e9fa719a160f1970eed1"), + Pair("ment", "583fedab719a168fb1a71f34"), + Pair("merman", "578e71b0719a16407c66330f"), + Pair("metal armor", "56cb7e26719a161b35a69fe3"), + Pair("midget", "57287dca719a1639c2c8565b"), + Pair("midoriiro", "57573162719a16726869469f"), + Pair("mikado", "56c22ac7719a168abf0d10ec"), + Pair("miko", "4f32dab4c0922569dc000cf4"), + Pair("miku izayoi", "579114bc719a166b15a7c009"), + Pair("military", "56b8e337719a1608ab978ef1"), + Pair("milking", "56b8e726719a160f1970cacb"), + Pair("mille", "56d4b96b719a16463226374d"), + Pair("mimit", "57c9c52e719a1647b7d6195e"), + Pair("minigirl", "56b8e504719a160f1970aee1"), + Pair("miniguy", "56b8e47e719a160f1970a809"), + Pair("minotaur", "570c970d719a16054fd7c62e"), + Pair("mio naruse", "56b8e783719a160f1970cefb"), + Pair("misc", "5731d452719a160bac0aa036"), + Pair("mitsuko", "587c3e64719a1612697d86b4"), + Pair("mitsunoho", "56c22c28719a168abf0d222b"), + Pair("miyoshi hiromi", "570c79eb719a1621f04aff9d"), + Pair("miyuki rei", "57035ba5719a1612976618e3"), + Pair("mizugi", "4f00db5ac0922505f1000001"), + Pair("mizuki kanzaki", "573b650c719a1629609e69ac"), + Pair("mmf threesome", "56b8e337719a1608ab978eee"), + Pair("mohorovicic matako", "56cb7e33719a161b35a6a081"), + Pair("momiyama", "57f0fdcf719a163c0daba6a7"), + Pair("momo yaoyorozu", "56cb63ac719a167c4e9ea4ea"), + Pair("momoishi", "5835b618719a168d2c17820f"), + Pair("monoeye", "578d202e719a168c492c2c2f"), + Pair("monophobia", "56c22bf1719a168abf0d1fad"), + Pair("monster girl", "5564675a719a1686396e9386"), + Pair("monstergirl", "4f00e97bc092252206000612"), + Pair("moral degeneration", "56b8e47a719a160f1970a7dd"), + Pair("moralgear", "56cb62ad719a167c4e9e9797"), + Pair("mosaic censor", "56b8e9e9719a160f1970eddb"), + Pair("mosaic censorship", "56b8e3b7719a160ccaf2eadd"), + Pair("mouse boy", "570c970a719a16054fd7c619"), + Pair("mouse girl", "578c778f719a1691573a0c04"), + Pair("mousou colosseum", "5796af0d719a160e752c2fee"), + Pair("mtf threesome", "56b8e631719a160f1970bd4c"), + Pair("multi-work series", "56b8e33f719a1608ab978f1c"), + Pair("multi-works series", "57df85fc719a1691d5f4abc2"), + Pair("multiple arms", "577ca8db719a169cd4768b19"), + Pair("multiple nipples", "57c9c52e719a1647b7d61960"), + Pair("multiple paizuri", "56c22d38719a168abf0d2f75"), + Pair("musae koyama", "57df85ed719a1691d5f4ab2d"), + Pair("muscles", "555a4e8b719a1651bff3d17d"), + Pair("muscles", "556467fa719a1686396e9581"), + Pair("music box", "5728b748719a16117c8d08cb"), + Pair("mute", "571f5fbb719a167a10f077e5"), + Pair("muto", "57c9c52e719a1647b7d6195c"), + Pair("mx2j", "57f8ae8e719a169ba3a6f397"), + Pair("nagata shinichi", "56b8e647719a160f1970bec2"), + Pair("nagisora riku", "5773181c719a166f4297e8d7"), + Pair("nakadashi", "540cdc7345b9ef6cb3231358"), + Pair("nakadashi", "5564674c719a1686396e9328"), + Pair("nakanishi", "586cc09c719a1629f4914d23"), + Pair("nakasone heidi", "5787da56719a1621f2b2042b"), + Pair("nakata mitsuru", "58438dbd719a16586fea74b6"), + Pair("namanamago", "56c22a93719a168abf0d0db4"), + Pair("nanaki nanatarou", "578b7a4e719a164531bffdc0"), + Pair("natsuki kimura", "5769c167719a167bb7f3d098"), + Pair("natsume benkei", "589993a6719a165a8cf59451"), + Pair("navel fuck", "56ddf3f6719a16450f8235cf"), + Pair("nazi", "5892a7bd719a169e79e8ef68"), + Pair("ncp", "56c228cf719a168abf0cf823"), + Pair("necrophilia", "56f0a0b3719a166ee74a1a70"), + Pair("negative 69", "573b2be6719a16738c4183e0"), + Pair("neitz", "56c2297d719a168abf0d0025"), + Pair("neko no oppai", "56c22a4a719a168abf0d09c6"), + Pair("nekoya marble", "56c22abe719a168abf0d1075"), + Pair("nemu", "56b8e8bb719a160f1970de07"), + Pair("nerigom", "5875a6bc719a165b3c3140d3"), + Pair("nerv", "574e136a719a164c3b0258a5"), + Pair("netorare", "4f00e52cc092252206000054"), + Pair("netorare", "55646799719a1686396e945f"), + Pair("netori", "5426add745b9ef6d7a289a24"), + Pair("nicomarch", "56d4b955719a164632263675"), + Pair("niece", "56c22876719a168abf0cf3eb"), + Pair("ninja", "56cb62d9719a167c4e9e9994"), + Pair("ninnindou", "56d4d616719a16848b4cd5b7"), + Pair("nipple birth", "56c22d46719a168abf0d3043"), + Pair("nipple expansion", "5744bafa719a162b60f10af6"), + Pair("no color", "57731994719a166f4297f709"), + Pair("nobuko yokokawa", "573b656c719a1629609e6eee"), + Pair("non-h", "52e7a80f45b9ef5ed98db192"), + Pair("noriko", "5848d3c7719a1685432d1b72"), + Pair("nose hook", "570c96d9719a16054fd7c3c7"), + Pair("not found 05", "58239562719a161ef54929ef"), + Pair("nounanka", "5744bb4b719a162b60f10eae"), + Pair("number10", "56cb63ba719a167c4e9ea59b"), + Pair("nurse", "4f00e587c0922522060000ec"), + Pair("ochako uraraka", "5782b3d2719a169f8b2100b7"), + Pair("ochine", "57bc9658719a167558cbef60"), + Pair("octopus", "56c22a78719a168abf0d0c49"), + Pair("odd", "5836b326719a166af458a4de"), + Pair("ogawa chise", "57db916d719a164187907c15"), + Pair("oil", "56d4b8c9719a16463226317a"), + Pair("okyuuri", "56e74ad9719a165d4fe1748c"), + Pair("old lady", "58501403719a165eaaf83a4d"), + Pair("old man", "56b8e63f719a160f1970be2f"), + Pair("omega destroyer", "56f0a211719a166ee74a2ab6"), + Pair("onani", "568b0083719a1664807dd93a"), + Pair("oni", "56c2278f719a168abf0cea77"), + Pair("ontsu", "58628903719a166e8c8a4aa7"), + Pair("oppai", "4f00e003c092251316000001"), + Pair("oppai", "5564674c719a1686396e9324"), + Pair("oral", "4f00e00cc092251316000016"), + Pair("oral", "5564674c719a1686396e9323"), + Pair("orc", "56b8e4ae719a160f1970aa52"), + Pair("ore monogatari", "56b8e65b719a160f1970bfe3"), + Pair("ore no natsuyasumi", "5731d50d719a160bac0aa63c"), + Pair("oreichigo", "573b6453719a1629609e6128"), + Pair("oretto", "56d4d529719a16848b4ccb05"), + Pair("orgasm denial", "56b8e488719a160f1970a885"), + Pair("osananajimi", "4f03e821c092256d810079c2"), + Pair("osananajimi", "5564678f719a1686396e9441"), + Pair("oshimi shuuzou", "584a253d719a168a1c1bbcc7"), + Pair("oshiri", "52f863de45b9efa6e8b7e98f"), + Pair("oshiri", "556467ee719a1686396e9552"), + Pair("otonano gu-wa", "5760a269719a161c54370917"), + Pair("out of order", "56b8e527719a160f1970b0d1"), + Pair("oyakodon", "5794b4cf719a167e4baa78e6"), + Pair("paipan", "4f01f2e1c092253ba7007537"), + Pair("paizuri", "4f00e05dc09225131600008f"), + Pair("paizuri", "5564674f719a1686396e933e"), + Pair("pandacorya", "57ee0680719a16345f09c67d"), + Pair("pantyjob", "56b8e4b8719a160f1970aad2"), + Pair("parasite", "56d4ba09719a164632263e8f"), + Pair("pasties", "56b8e955719a160f1970e5ef"), + Pair("pattycake", "57f4f25f719a168e357718ed"), + Pair("pecan", "57160ace719a1695b38aad23"), + Pair("pedocchi", "56f0a1ab719a166ee74a25ac"), + Pair("pegging", "53c596d645b9ef2b85e38e9c"), + Pair("pegging", "556467b6719a1686396e94ae"), + Pair("peko pekoyama", "570cb4c6719a16861b23fe45"), + Pair("petrification", "56b8e41b719a160f1970a394"), + Pair("pettanko", "4f00e00cc092251316000017"), + Pair("pettanko", "5564675e719a1686396e939b"), + Pair("phone sex", "56c22a9e719a168abf0d0e57"), + Pair("piercing", "56b8e3c3719a160ccaf2eba5"), + Pair("pig", "56cb7e28719a161b35a69ff1"), + Pair("pig girl", "56c227f4719a168abf0ceeb8"), + Pair("pig man", "56c2282d719a168abf0cf110"), + Pair("pillory", "56c22970719a168abf0cff72"), + Pair("pirate", "5716094b719a1695b38aa1a4"), + Pair("pirokobo", "56c22b7d719a168abf0d1a19"), + Pair("piss drinking", "56c22a9e719a168abf0d0e58"), + Pair("plant girl", "56b8e527719a160f1970b0cd"), + Pair("plico", "56d4b955719a164632263676"), + Pair("pole dancing", "5715d1bc719a16156436fac1"), + Pair("policeman", "56b8e6b2719a160f1970c422"), + Pair("policewoman", "56cb632b719a167c4e9e9dd9"), + Pair("ponkotsudou", "56c228ac719a168abf0cf68f"), + Pair("poor grammar", "56b8e66c719a160f1970c0e0"), + Pair("porunamin c", "584f6b3f719a162148699f10"), + Pair("possession", "56b8e5f5719a160f1970ba8c"), + Pair("poteto dango", "56c22d2e719a168abf0d2ede"), + Pair("praseodym", "56cb7eb8719a161b35a6a5a7"), + Pair("pregnant", "541616f645b9efe716f55844"), + Pair("pregnant", "556467fa719a1686396e9580"), + Pair("prehensile hair", "56c22dc1719a168abf0d365d"), + Pair("priest", "571f5fcd719a167a10f07886"), + Pair("principal kuno", "56de2c76719a166fd66fc545"), + Pair("prolapse", "56b8e907719a160f1970e22e"), + Pair("prostate massage", "56b8e67d719a160f1970c187"), + Pair("pubic stubble", "56e749f3719a165d4fe16a97"), + Pair("public", "4f03a91cc092256d8100008b"), + Pair("public use", "56b8e907719a160f1970e22d"), + Pair("rabbit", "56c228bb719a168abf0cf735"), + Pair("raccoon girl", "56e7498f719a165d4fe1663d"), + Pair("raichi hoshimiya", "56f9e988719a164395bc08fb"), + Pair("rakuen tsuihou", "56b8ead0719a160f1970f916"), + Pair("random", "4f00e050c092251316000078"), + Pair("random", "5564680d719a1686396e95ce"), + Pair("randoseru", "56b8e8a0719a160f1970dcad"), + Pair("rat park", "56b8e7d9719a160f1970d340"), + Pair("raw", "54c81f9045b9efce8d0fd11a"), + Pair("redraw", "56cb63b9719a167c4e9ea57e"), + Pair("reika hayami", "5835b5fe719a168d2c178127"), + Pair("rem", "577ca70a719a169cd4767aff"), + Pair("replaced", "56b8e374719a160ccaf2e68c"), + Pair("reptile", "5792ba8c719a162fe1be0a14"), + Pair("retoree", "56cb80ab719a161b35a6ba6a"), + Pair("rewrite", "56cb62e5719a167c4e9e9a2d"), + Pair("reyshi", "56cb7eb8719a161b35a6a5a8"), + Pair("rian", "573b65c1719a1629609e728b"), + Pair("ricky-tick", "574dd9d6719a16606128e462"), + Pair("rimjob", "56b8e452719a160f1970a5e1"), + Pair("rina fujimoto", "570cb48f719a16861b23fb83"), + Pair("rindoh", "56b8ecee719a167b52e95a1b"), + Pair("ring memo", "56d4d529719a16848b4ccb07"), + Pair("rinko yamato", "56b8e65b719a160f1970bfe4"), + Pair("risa shirakaba", "57035c04719a161297661b21"), + Pair("robot", "56b8e891719a160f1970dbe1"), + Pair("rokuji", "56f0a13f719a166ee74a2063"), + Pair("rumiko chie", "573b66bc719a1629609e8063"), + Pair("ryoattoryo", "582fc748719a16491f6a9cdc"), + Pair("ryokurin", "57b30750719a1606ccdc81a0"), + Pair("ryona", "56b8e600719a160f1970bad3"), + Pair("saimin pikatto house", "5801e90e719a16309717beec"), + Pair("saitou miya", "585a4ba8719a16178f4f0270"), + Pair("saji-pen", "57287fb3719a1639c2c86d9d"), + Pair("sakaki miya", "57f6982d719a16796a496723"), + Pair("sakkat", "573b6507719a1629609e6952"), + Pair("sakura shirou", "56c22861719a168abf0cf335"), + Pair("sakurabobu", "56b8ea1b719a160f1970f07e"), + Pair("saliva", "5716095f719a1695b38aa21e"), + Pair("sample", "56c22ddb719a168abf0d37da"), + Pair("sangokushi puzzle taisen", "577c6fe0719a1623436f0e11"), + Pair("sanryuu kaigishitsu", "5744bac1719a162b60f10949"), + Pair("sashilot", "56b8ea99719a160f1970f639"), + Pair("sautsu", "57bb44da719a169ef398c4ad"), + Pair("scanmark", "56c22b4a719a168abf0d17c5"), + Pair("scar", "56b8e3c7719a160ccaf2ebfd"), + Pair("scarlet beriko", "5864833e719a1612a25cf783"), + Pair("scathach", "57033ffd719a16216ffcd220"), + Pair("schoolboy", "56e74ad4719a165d4fe17449"), + Pair("schoolboy uniform", "56b8e3a9719a160ccaf2e9e2"), + Pair("schoolgirl", "4f00e05dc092251316000090"), + Pair("schoolgirl", "5564674c719a1686396e9326"), + Pair("schoolgirl uniform", "56b8e36c719a160ccaf2e5f9"), + Pair("scrotal lingerie", "573b6438719a1629609e6020"), + Pair("selfcest", "56b8e78d719a160f1970cf78"), + Pair("sendai oni", "574e1095719a164c3b023814"), + Pair("senhime", "570cb38f719a16861b23f230"), + Pair("shared senses", "56cb61f5719a167c4e9e8f1a"), + Pair("shibainu lab", "57d845b5719a164697a9b292"), + Pair("shibari", "4f00e691c092252206000249"), + Pair("shikniful", "56cb8115719a161b35a6bf71"), + Pair("shima shuu", "56b8e4c0719a160f1970ab46"), + Pair("shimapan", "4f00e0c3c0922515ab000002"), + Pair("shimoyake", "56c22a9e719a168abf0d0e54"), + Pair("shinna", "57b30750719a1606ccdc81a1"), + Pair("shino kuribayashi", "56c22b7d719a168abf0d1a1a"), + Pair("shinseidaiki", "57eeaf56719a163380236b8b"), + Pair("shishioan", "57fe48ee719a16206a91c4b7"), + Pair("shitori", "56e74a59719a165d4fe16ed2"), + Pair("shota", "5569ad57719a16102373a69f"), + Pair("shotacon", "56b8e3c3719a160ccaf2eba7"), + Pair("show by rock", "56cb80ab719a161b35a6ba69"), + Pair("shrinking", "56b8e41b719a160f1970a392"), + Pair("sieyarelow", "56b8e7b9719a160f1970d1b8"), + Pair("sinseong modogi", "5715eca8719a161780dbd1b8"), + Pair("sister", "56b8e41b719a160f1970a387"), + Pair("skinsuit", "56b8e80e719a160f1970d5a6"), + Pair("slime", "56b8e7b9719a160f1970d1b7"), + Pair("slug", "56cb7f7e719a161b35a6aedd"), + Pair("small breasts", "56b8e36c719a160ccaf2e5fb"), + Pair("smell", "56b8e3ae719a160ccaf2ea33"), + Pair("smoking", "58501400719a165eaaf83a1a"), + Pair("snake", "5769c001719a167bb7f3c0b0"), + Pair("snake girl", "56b8e527719a160f1970b0cf"), + Pair("snuff", "56b8e337719a1608ab978eef"), + Pair("socks", "545ec3a945b9ef70f033c4fb"), + Pair("socks", "55646787719a1686396e9426"), + Pair("sole dickgirl", "56b8e3b8719a160ccaf2eae9"), + Pair("sole female", "56b8e33f719a1608ab978f1d"), + Pair("sole male", "56b8e33f719a1608ab978f1e"), + Pair("solo action", "56b8e469719a160f1970a70d"), + Pair("sophie houjou", "571f2766719a16067f34ae64"), + Pair("sori", "56cb6317719a167c4e9e9cd4"), + Pair("soul calibur", "57287e49719a1639c2c85c42"), + Pair("southbamboo", "56c22b00719a168abf0d13be"), + Pair("spats", "555165b8719a168965a40ffa"), + Pair("speculum", "56c22de0719a168abf0d3818"), + Pair("spicaya", "587f35b7719a1680ba7f1995"), + Pair("spider", "5876a3dd719a1614eb5ac658"), + Pair("spider girl", "56b8e527719a160f1970b0d0"), + Pair("spread", "569d758e719a1695484b1082"), + Pair("squid boy", "5808d4fa719a1655df48fc14"), + Pair("squid girl", "56b8e7b2719a160f1970d15c"), + Pair("squirrel girl", "56b8e33f719a1608ab978f1b"), + Pair("steward", "5715ecc6719a161780dbd235"), + Pair("stewardess", "570c9628719a16054fd7be1f"), + Pair("stockings", "4f00e032c09225131600004a"), + Pair("stockings", "5564674c719a1686396e9325"), + Pair("stomach deformation", "56b8e337719a1608ab978ef5"), + Pair("story arc", "56b8e370719a160ccaf2e641"), + Pair("stretching", "570c96d9719a16054fd7c3c6"), + Pair("stuck in wall", "56b8e726719a160f1970cacf"), + Pair("student", "4f03c4ddc092256d81003447"), + Pair("student council", "56d4d655719a16848b4cd8ea"), + Pair("studio crimson", "56f0bc75719a16856dd1f6c9"), + Pair("studio onion", "56b8eade719a160f1970f9cb"), + Pair("suguru kamoshida", "588870b0719a165bccf4115d"), + Pair("sunahama nosame", "573b63fb719a1629609e5d9e"), + Pair("sundress", "56b8e7d5719a160f1970d30c"), + Pair("sunglasses", "56b8e376719a160ccaf2e69f"), + Pair("suzuen", "57fe48ee719a16206a91c4b8"), + Pair("swallow sky", "56b8e6aa719a160f1970c3af"), + Pair("sweating", "56b8e305719a1607fceb7b6c"), + Pair("swimsuit", "54c052a445b9efc62468bbed"), + Pair("swimsuit", "55646764719a1686396e93b3"), + Pair("swinging", "56b8e378719a160ccaf2e6af"), + Pair("syoko hoshi", "570cb48f719a16861b23fb84"), + Pair("syounen kouraku", "5715d113719a16156436f75b"), + Pair("syringe", "56b8e337719a1608ab978ef0"), + Pair("syunzo", "56c22be0719a168abf0d1ee3"), + Pair("table masturbation", "56b8e8f8719a160f1970e15e"), + Pair("tadashi hamada", "5728b934719a16117c8d17c5"), + Pair("tagane", "5794b4cf719a167e4baa78e5"), + Pair("taichi yaegashi", "56b8e56e719a160f1970b43b"), + Pair("tail blue", "574dd92b719a16606128de91"), + Pair("tail plug", "57936393719a1660a6b00805"), + Pair("tail yellow", "574dd92b719a16606128de90"), + Pair("tailjob", "56b8e726719a160f1970cacc"), + Pair("tairame", "573b2bc1719a16738c41823a"), + Pair("taji", "57d2028d719a1699d9a55957"), + Pair("takakura row", "58316d23719a162fb6df6091"), + Pair("takanaga hinako", "571f5fcd719a167a10f07887"), + Pair("takano yumi", "57287de7719a1639c2c85733"), + Pair("takayama non", "573b66ac719a1629609e7f3c"), + Pair("takayamanon", "573b66ac719a1629609e7f3d"), + Pair("takeo gouda", "56b8e65b719a160f1970bfe2"), + Pair("takewan", "586e121e719a1621d850fb57"), + Pair("takoyaki yoshi", "57be907c719a1610094a299b"), + Pair("tall girl", "56b8e378719a160ccaf2e6b0"), + Pair("tall man", "56b8e33f719a1608ab978f1a"), + Pair("tamagohan", "585a4ba8719a16178f4f0271"), + Pair("tamokuteki kuukan", "56cb7ead719a161b35a6a532"), + Pair("tankoubon", "56b8e378719a160ccaf2e6ae"), + Pair("tanlines", "4f00e7bdc0922522060003b2"), + Pair("tanlines", "556467fa719a1686396e957e"), + Pair("tanpopo shunmaru", "56c229ec719a168abf0d05cc"), + Pair("tanukine", "56f9ea32719a164395bc0ebc"), + Pair("taoi", "57735090719a165a1294d288"), + Pair("tasu", "5715ec9b719a161780dbd188"), + Pair("tatsuhide", "56e74982719a165d4fe16599"), + Pair("tatsunokosso", "56d4b99f719a164632263958"), + Pair("teacher", "4f00e084c0922513160000af"), + Pair("teacher", "5564674f719a1686396e9340"), + Pair("tejina senpai", "57e37a6c719a166f0f8735af"), + Pair("tekoki", "4f01e19ec092253ba700585f"), + Pair("tentacles", "4f00e120c0922515ab0000a6"), + Pair("terasu", "5731d615719a160bac0aaf4c"), + Pair("the jinshan", "57f59b21719a167b1dbd5d99"), + Pair("thigh high boots", "56b8e41a719a160f1970a384"), + Pair("tiara", "56b8e580719a160f1970b53b"), + Pair("tickling", "56b8e726719a160f1970cacd"), + Pair("tights", "56f9e9ae719a164395bc09fa"), + Pair("tilia", "56cb7e19719a161b35a69f3d"), + Pair("tocori", "56de2bed719a166fd66fbf87"), + Pair("tomboy", "4f00e910c092252206000534"), + Pair("tomboy", "556467ca719a1686396e94e0"), + Pair("tomgirl", "56b8e3c3719a160ccaf2eba6"), + Pair("tomoya aki", "56cb7e0f719a161b35a69ece"), + Pair("tonsuke", "56d4d616719a16848b4cd5b8"), + Pair("tooku no mura", "56e74b98719a165d4fe17c7f"), + Pair("tooyama hirohito", "57be9073719a1610094a2934"), + Pair("tori himemiya", "5884273c719a162bbe3ccd8e"), + Pair("tottoko mtarou", "589c36ab719a1664dd43105f"), + Pair("toudori no su", "5797ac7b719a164c63580b78"), + Pair("toys", "4f00e54ec09225220600009d"), + Pair("toys", "5564680a719a1686396e95c2"), + Pair("tracksuit", "56b8e36c719a160ccaf2e5fa"), + Pair("trampling", "589e853d719a1631d15960a6"), + Pair("trans", "552ad5d6719a165e97ce8d0a"), + Pair("transformation", "56b8e36b719a160ccaf2e5ee"), + Pair("trap", "4f00e041c092251316000061"), + Pair("triple anal", "56d4d5bf719a16848b4cd1b6"), + Pair("triple penetration", "56b8e337719a1608ab978eed"), + Pair("triple vaginal", "5793634e719a1660a6b004d3"), + Pair("try hougen", "571f6213719a167a10f089d1"), + Pair("ts neinenki", "57d7f14c719a162806043c7d"), + Pair("tsuchinoko", "57320cc3719a16693cf46bcd"), + Pair("tsukimoto kizuki", "56c22b35719a168abf0d167f"), + Pair("tsukishima mist", "56b8e647719a160f1970bec1"), + Pair("tsundere", "4f00e5b1c09225220600012c"), + Pair("tsundere", "55646778719a1686396e93f6"), + Pair("ttf threesome", "56b8e8de719a160f1970dfe4"), + Pair("ttm threesome", "56b8e968719a160f1970e6e9"), + Pair("tube", "56b8e4bc719a160f1970ab0f"), + Pair("tunakan", "5760a4a5719a161c54372362"), + Pair("tutor", "56b8e5b1719a160f1970b751"), + Pair("twoframe", "5715d113719a16156436f75c"), + Pair("tyria", "56cb7e19719a161b35a69f3e"), + Pair("ueno tomoki", "577c6deb719a1623436efa82"), + Pair("unbirth", "56b8e527719a160f1970b0ce"), + Pair("uncensored", "4f00e175c0922515ab00011f"), + Pair("uncensored", "55646778719a1686396e93f8"), + Pair("uncle", "56b8e6e7719a160f1970c70b"), + Pair("underwater", "56b8e726719a160f1970caca"), + Pair("unihoge", "5895f386719a163d654bb665"), + Pair("unusual pupils", "56b8e4ad719a160f1970aa47"), + Pair("unusual teeth", "56cb7fee719a161b35a6b278"), + Pair("urination", "56b8e4b5719a160f1970aaa7"), + Pair("usagi no shippo", "56e74982719a165d4fe1659a"), + Pair("usapyon", "56f0bd67719a16856dd20197"), + Pair("usui hon hitori roudoku kai", "56b8e647719a160f1970bec3"), + Pair("uzuki", "56b8e42f719a160f1970a499"), + Pair("vacbed", "56de2b2d719a166fd66fb8f5"), + Pair("vaginal sticker", "586fb7fd719a168eed7908bb"), + Pair("vanilla", "4f00e003c092251316000002"), + Pair("vanilla", "5564674f719a1686396e933f"), + Pair("vila", "57287dd9719a1639c2c856ac"), + Pair("virginity", "56b8e36a719a160ccaf2e5d6"), + Pair("visual she", "5731d5c5719a160bac0aacd7"), + Pair("vivace", "56c22ac7719a168abf0d10ed"), + Pair("vuttiya", "588578bf719a168a49752b65"), + Pair("waiter", "579854ee719a1648fd01151e"), + Pair("waiter", "579854ee719a1648fd01151c"), + Pair("washizuka sho", "571f6011719a167a10f07a9c"), + Pair("watermarked", "57287fad719a1639c2c86d5c"), + Pair("webtoon", "579eec8e719a169e8bb534ce"), + Pair("weight gain", "573b666a719a1629609e7ad9"), + Pair("western", "5590b089719a167a01f35950"), + Pair("wet clothes", "5805894b719a160616b5863f"), + Pair("whip", "56c22cf2719a168abf0d2bd5"), + Pair("wings", "56b8e5d8719a160f1970b905"), + Pair("wolf", "56b8e598719a160f1970b63b"), + Pair("wolf boy", "56cb7f41719a161b35a6abd0"), + Pair("wolf girl", "56b8e65f719a160f1970c026"), + Pair("wooden horse", "56b8e661719a160f1970c04c"), + Pair("worm", "56e766de719a16989a47c8df"), + Pair("wormhole", "56fa053d719a1669f2a7bbd0"), + Pair("wrestling", "56b8e7b2719a160f1970d165"), + Pair("x-ray", "54ee6537719a1680a4d18331"), + Pair("x-ray", "55646787719a1686396e9428"), + Pair("yakan", "57adc14c719a16504d6868c2"), + Pair("yamamoto doujin", "577ca78a719a169cd4767f72"), + Pair("yamori misaki", "570cb497719a16861b23fbff"), + Pair("yandere", "4f00e5c8c092252206000162"), + Pair("yang-do", "58180c3e719a168510b55736"), + Pair("yayoi", "56c22b10719a168abf0d149d"), + Pair("yomogi", "57bd3f1a719a163e0da0b0c9"), + Pair("yoshizuki minoru", "5731d5c5719a160bac0aacd8"), + Pair("yoyokkun", "57ee0678719a16345f09c62f"), + Pair("yshtola", "5716094b719a1695b38aa1a5"), + Pair("yui komori", "570cb224719a16861b23e688"), + Pair("yukijirushi", "586b1ac0719a161ec7d1a9ef"), + Pair("yukino", "57f000d5719a162d156df669"), + Pair("yukowa kari", "56f0a18f719a166ee74a2464"), + Pair("yurarin", "5886ca3e719a167f77f68a2c"), + Pair("yuri", "55646784719a1686396e9418"), + Pair("yuuyake croissant", "585e401d719a1636e2d6b79e"), + Pair("zeitaku zanmai", "56c22b10719a168abf0d149e"), + Pair("zenjidou momiyama", "57f0fdcf719a163c0daba6a8"), + Pair("zero gravity", "5619c9b2719a16502106c0b2"), + Pair("zooey", "5875fb34719a16738b9f43ac") ) } diff --git a/src/en/questionablecontent/src/eu/kanade/tachiyomi/extension/en/questionablecontent/QuestionableContent.kt b/src/en/questionablecontent/src/eu/kanade/tachiyomi/extension/en/questionablecontent/QuestionableContent.kt index f7e246658..46c034a6b 100644 --- a/src/en/questionablecontent/src/eu/kanade/tachiyomi/extension/en/questionablecontent/QuestionableContent.kt +++ b/src/en/questionablecontent/src/eu/kanade/tachiyomi/extension/en/questionablecontent/QuestionableContent.kt @@ -8,7 +8,6 @@ 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 java.util.Date import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document @@ -16,6 +15,7 @@ import org.jsoup.nodes.Element import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.util.Date class QuestionableContent : ParsedHttpSource() { @@ -64,10 +64,12 @@ class QuestionableContent : ParsedHttpSource() { return chapters } - override fun chapterListSelector() = """div#container a[href^="view.php?comic="]""" + override fun chapterListSelector() = + """div#container a[href^="view.php?comic="]""" override fun chapterFromElement(element: Element): SChapter { - val urlregex = """view\.php\?comic=(.*)""".toRegex() + val urlregex = + """view\.php\?comic=(.*)""".toRegex() val chapterUrl = element.attr("href") val number = urlregex.find(chapterUrl)!!.groupValues[1] diff --git a/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt b/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt index 209bb8ae6..e01548714 100644 --- a/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt +++ b/src/en/readcomiconline/src/eu/kanade/tachiyomi/extension/en/readcomiconline/Readcomiconline.kt @@ -13,8 +13,6 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request @@ -23,6 +21,8 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Locale class Readcomiconline : ConfigurableSource, ParsedHttpSource() { @@ -117,7 +117,7 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() { chapter.setUrlWithoutDomain(urlElement.attr("href")) chapter.name = urlElement.text() chapter.date_upload = element.select("td:eq(1)").first()?.text()?.let { - SimpleDateFormat("MM/dd/yyyy", Locale.getDefault()).parse(it).time + SimpleDateFormat("MM/dd/yyyy", Locale.getDefault()).parse(it)?.time ?: 0L } ?: 0 return chapter } @@ -139,59 +139,59 @@ class Readcomiconline : ConfigurableSource, ParsedHttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - Status(), - GenreList(getGenreList()) + Status(), + GenreList(getGenreList()) ) // $("select[name=\"genres\"]").map((i,el) => `Genre("${$(el).next().text().trim()}", ${i})`).get().join(',\n') // on https://readcomiconline.to/AdvanceSearch private fun getGenreList() = listOf( - Genre("Action"), - Genre("Adventure"), - Genre("Anthology"), - Genre("Anthropomorphic"), - Genre("Biography"), - Genre("Children"), - Genre("Comedy"), - Genre("Crime"), - Genre("Drama"), - Genre("Family"), - Genre("Fantasy"), - Genre("Fighting"), - Genre("Graphic Novels"), - Genre("Historical"), - Genre("Horror"), - Genre("Leading Ladies"), - Genre("LGBTQ"), - Genre("Literature"), - Genre("Manga"), - Genre("Martial Arts"), - Genre("Mature"), - Genre("Military"), - Genre("Movies & TV"), - Genre("Mystery"), - Genre("Mythology"), - Genre("Personal"), - Genre("Political"), - Genre("Post-Apocalyptic"), - Genre("Psychological"), - Genre("Pulp"), - Genre("Religious"), - Genre("Robots"), - Genre("Romance"), - Genre("School Life"), - Genre("Sci-Fi"), - Genre("Slice of Life"), - Genre("Spy"), - Genre("Superhero"), - Genre("Supernatural"), - Genre("Suspense"), - Genre("Thriller"), - Genre("Vampires"), - Genre("Video Games"), - Genre("War"), - Genre("Western"), - Genre("Zombies") + Genre("Action"), + Genre("Adventure"), + Genre("Anthology"), + Genre("Anthropomorphic"), + Genre("Biography"), + Genre("Children"), + Genre("Comedy"), + Genre("Crime"), + Genre("Drama"), + Genre("Family"), + Genre("Fantasy"), + Genre("Fighting"), + Genre("Graphic Novels"), + Genre("Historical"), + Genre("Horror"), + Genre("Leading Ladies"), + Genre("LGBTQ"), + Genre("Literature"), + Genre("Manga"), + Genre("Martial Arts"), + Genre("Mature"), + Genre("Military"), + Genre("Movies & TV"), + Genre("Mystery"), + Genre("Mythology"), + Genre("Personal"), + Genre("Political"), + Genre("Post-Apocalyptic"), + Genre("Psychological"), + Genre("Pulp"), + Genre("Religious"), + Genre("Robots"), + Genre("Romance"), + Genre("School Life"), + Genre("Sci-Fi"), + Genre("Slice of Life"), + Genre("Spy"), + Genre("Superhero"), + Genre("Supernatural"), + Genre("Suspense"), + Genre("Thriller"), + Genre("Vampires"), + Genre("Video Games"), + Genre("War"), + Genre("Western"), + Genre("Zombies") ) // Preferences Code diff --git a/src/en/readjump/src/eu/kanade/tachiyomi/extension/en/readjump/Readjump.kt b/src/en/readjump/src/eu/kanade/tachiyomi/extension/en/readjump/Readjump.kt index 98990ddf4..c9ab35fa7 100644 --- a/src/en/readjump/src/eu/kanade/tachiyomi/extension/en/readjump/Readjump.kt +++ b/src/en/readjump/src/eu/kanade/tachiyomi/extension/en/readjump/Readjump.kt @@ -9,13 +9,13 @@ 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 java.util.Calendar import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.util.Calendar class Readjump : ParsedHttpSource() { diff --git a/src/en/readm/src/eu/kanade/tachiyomi/extension/en/readm/ReadM.kt b/src/en/readm/src/eu/kanade/tachiyomi/extension/en/readm/ReadM.kt index 2aa533a26..f799545ed 100644 --- a/src/en/readm/src/eu/kanade/tachiyomi/extension/en/readm/ReadM.kt +++ b/src/en/readm/src/eu/kanade/tachiyomi/extension/en/readm/ReadM.kt @@ -8,13 +8,13 @@ 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 java.util.Calendar -import java.util.concurrent.TimeUnit import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar +import java.util.concurrent.TimeUnit class ReadM : ParsedHttpSource() { diff --git a/src/en/readmangatoday/src/eu/kanade/tachiyomi/extension/en/readmangatoday/Readmangatoday.kt b/src/en/readmangatoday/src/eu/kanade/tachiyomi/extension/en/readmangatoday/Readmangatoday.kt index d91724eab..23a24d413 100644 --- a/src/en/readmangatoday/src/eu/kanade/tachiyomi/extension/en/readmangatoday/Readmangatoday.kt +++ b/src/en/readmangatoday/src/eu/kanade/tachiyomi/extension/en/readmangatoday/Readmangatoday.kt @@ -8,12 +8,12 @@ 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 java.util.Calendar import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar class Readmangatoday : ParsedHttpSource() { @@ -190,50 +190,50 @@ class Readmangatoday : ParsedHttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - TextField("Author", "author-name"), - TextField("Artist", "artist-name"), - Type(), - Status(), - GenreList(getGenreList()) + TextField("Author", "author-name"), + TextField("Artist", "artist-name"), + Type(), + Status(), + GenreList(getGenreList()) ) // [...document.querySelectorAll("ul.manga-cat span")].map(el => `Genre("${el.nextSibling.textContent.trim()}", ${el.getAttribute('data-id')})`).join(',\n') // https://www.readmng.com/advanced-search private fun getGenreList() = listOf( - Genre("Action", 2), - Genre("Adventure", 4), - Genre("Comedy", 5), - Genre("Doujinshi", 6), - Genre("Drama", 7), - Genre("Ecchi", 8), - Genre("Fantasy", 9), - Genre("Gender Bender", 10), - Genre("Harem", 11), - Genre("Historical", 12), - Genre("Horror", 13), - Genre("Josei", 14), - Genre("Lolicon", 15), - Genre("Martial Arts", 16), - Genre("Mature", 17), - Genre("Mecha", 18), - Genre("Mystery", 19), - Genre("One shot", 20), - Genre("Psychological", 21), - Genre("Romance", 22), - Genre("School Life", 23), - Genre("Sci-fi", 24), - Genre("Seinen", 25), - Genre("Shotacon", 26), - Genre("Shoujo", 27), - Genre("Shoujo Ai", 28), - Genre("Shounen", 29), - Genre("Shounen Ai", 30), - Genre("Slice of Life", 31), - Genre("Smut", 32), - Genre("Sports", 33), - Genre("Supernatural", 34), - Genre("Tragedy", 35), - Genre("Yaoi", 36), - Genre("Yuri", 37) + Genre("Action", 2), + Genre("Adventure", 4), + Genre("Comedy", 5), + Genre("Doujinshi", 6), + Genre("Drama", 7), + Genre("Ecchi", 8), + Genre("Fantasy", 9), + Genre("Gender Bender", 10), + Genre("Harem", 11), + Genre("Historical", 12), + Genre("Horror", 13), + Genre("Josei", 14), + Genre("Lolicon", 15), + Genre("Martial Arts", 16), + Genre("Mature", 17), + Genre("Mecha", 18), + Genre("Mystery", 19), + Genre("One shot", 20), + Genre("Psychological", 21), + Genre("Romance", 22), + Genre("School Life", 23), + Genre("Sci-fi", 24), + Genre("Seinen", 25), + Genre("Shotacon", 26), + Genre("Shoujo", 27), + Genre("Shoujo Ai", 28), + Genre("Shounen", 29), + Genre("Shounen Ai", 30), + Genre("Slice of Life", 31), + Genre("Smut", 32), + Genre("Sports", 33), + Genre("Supernatural", 34), + Genre("Tragedy", 35), + Genre("Yaoi", 36), + Genre("Yuri", 37) ) } diff --git a/src/en/readmanhwa/src/eu/kanade/tachiyomi/extension/en/readmanhwa/ReadManhwa.kt b/src/en/readmanhwa/src/eu/kanade/tachiyomi/extension/en/readmanhwa/ReadManhwa.kt index 9040bcbba..8c27890f7 100644 --- a/src/en/readmanhwa/src/eu/kanade/tachiyomi/extension/en/readmanhwa/ReadManhwa.kt +++ b/src/en/readmanhwa/src/eu/kanade/tachiyomi/extension/en/readmanhwa/ReadManhwa.kt @@ -23,9 +23,6 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -34,6 +31,9 @@ import okhttp3.Response import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale @Nsfw class ReadManhwa : ConfigurableSource, HttpSource() { @@ -106,13 +106,13 @@ class ReadManhwa : ConfigurableSource, HttpSource() { .addQueryParameter("q", query) .addQueryParameter("nsfw", enableNsfw.toString()) - filters.forEach { filter -> - when (filter) { - is SortFilter -> url.addQueryParameter("sort", filter.toUriPart()) - is GenreFilter -> url.addQueryParameter("tags", filter.toUriPart()) - is DurationFilter -> url.addQueryParameter("duration", filter.toUriPart()) - } + filters.forEach { filter -> + when (filter) { + is SortFilter -> url.addQueryParameter("sort", filter.toUriPart()) + is GenreFilter -> url.addQueryParameter("tags", filter.toUriPart()) + is DurationFilter -> url.addQueryParameter("duration", filter.toUriPart()) } + } return GET(url.toString(), headersBuilder(enableNsfw).build()) } diff --git a/src/en/sleepypandascans/src/eu/kanade/tachiyomi/extension/en/sleepypandascans/SleepyPandaScans.kt b/src/en/sleepypandascans/src/eu/kanade/tachiyomi/extension/en/sleepypandascans/SleepyPandaScans.kt index 9cc3dbf81..bc03e672c 100644 --- a/src/en/sleepypandascans/src/eu/kanade/tachiyomi/extension/en/sleepypandascans/SleepyPandaScans.kt +++ b/src/en/sleepypandascans/src/eu/kanade/tachiyomi/extension/en/sleepypandascans/SleepyPandaScans.kt @@ -8,12 +8,12 @@ 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 java.util.Calendar import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar class SleepyPandaScans : ParsedHttpSource() { diff --git a/src/en/swordscomic/src/eu/kanade/tachiyomi/extension/en/swordscomic/SwordsComic.kt b/src/en/swordscomic/src/eu/kanade/tachiyomi/extension/en/swordscomic/SwordsComic.kt index 179b9171f..88274ff36 100644 --- a/src/en/swordscomic/src/eu/kanade/tachiyomi/extension/en/swordscomic/SwordsComic.kt +++ b/src/en/swordscomic/src/eu/kanade/tachiyomi/extension/en/swordscomic/SwordsComic.kt @@ -7,12 +7,12 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale class SwordsComic : HttpSource() { @@ -78,7 +78,7 @@ class SwordsComic : HttpSource() { name = element.select("strong").text() setUrlWithoutDomain(element.attr("href")) date_upload = element.select("small").text() - .let { SimpleDateFormat("dd MMM yyyy", Locale.US).parse(it).time } + .let { SimpleDateFormat("dd MMM yyyy", Locale.US).parse(it)?.time ?: 0L } } } .reversed() diff --git a/src/en/tapastic/src/eu/kanade/tachiyomi/extension/en/tapastic/Tapastic.kt b/src/en/tapastic/src/eu/kanade/tachiyomi/extension/en/tapastic/Tapastic.kt index 3695c3453..6a637c0c5 100644 --- a/src/en/tapastic/src/eu/kanade/tachiyomi/extension/en/tapastic/Tapastic.kt +++ b/src/en/tapastic/src/eu/kanade/tachiyomi/extension/en/tapastic/Tapastic.kt @@ -21,8 +21,6 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import okhttp3.Response import org.jsoup.Jsoup @@ -30,6 +28,8 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Locale class Tapastic : ConfigurableSource, ParsedHttpSource() { @@ -212,7 +212,7 @@ class Tapastic : ConfigurableSource, ParsedHttpSource() { private fun String?.toDate(): Long { this ?: return 0L - return SimpleDateFormat("MMM dd, yyyy", Locale.US).parse(this).time + return SimpleDateFormat("MMM dd, yyyy", Locale.US).parse(this)?.time ?: 0L } // Pages @@ -241,18 +241,24 @@ class Tapastic : ConfigurableSource, ParsedHttpSource() { ) private class FilterFilter : UriSelectFilter( - "Filter", "b", arrayOf( + "Filter", + "b", + arrayOf( Pair("ALL", "None"), Pair("POPULAR", "Popular"), Pair("TRENDING", "Trending"), Pair("FRESH", "Fresh"), Pair("BINGE", "Binge"), Pair("ORIGINAL", "Tapas Originals") - ), firstIsUnspecified = false, defaultValue = 1 + ), + firstIsUnspecified = false, + defaultValue = 1 ) private class GenreFilter : UriSelectFilter( - "Genre", "g", arrayOf( + "Genre", + "g", + arrayOf( Pair("", "Any"), Pair("7", "Action"), Pair("22", "Boys Love"), @@ -271,7 +277,9 @@ class Tapastic : ConfigurableSource, ParsedHttpSource() { ) private class StatusFilter : UriSelectFilter( - "Status", "f", arrayOf( + "Status", + "f", + arrayOf( Pair("NONE", "All"), Pair("F2R", "Free to read"), Pair("PRM", "Premium") @@ -279,7 +287,9 @@ class Tapastic : ConfigurableSource, ParsedHttpSource() { ) private class SortFilter : UriSelectFilter( - "Sort", "s", arrayOf( + "Sort", + "s", + arrayOf( Pair("DATE", "Date"), Pair("LIKE", "Likes"), Pair("SUBSCRIBE", "Subscribers") diff --git a/src/en/timelessleaf/src/eu/kanade/tachiyomi/extension/en/timelessleaf/TimelessLeaf.kt b/src/en/timelessleaf/src/eu/kanade/tachiyomi/extension/en/timelessleaf/TimelessLeaf.kt index 7de6bc033..c49ae381e 100644 --- a/src/en/timelessleaf/src/eu/kanade/tachiyomi/extension/en/timelessleaf/TimelessLeaf.kt +++ b/src/en/timelessleaf/src/eu/kanade/tachiyomi/extension/en/timelessleaf/TimelessLeaf.kt @@ -9,10 +9,10 @@ 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 java.util.Locale import okhttp3.Request import okhttp3.Response import rx.Observable +import java.util.Locale /** * @author Aria Moradi <aria.moradi007@gmail.com> @@ -65,12 +65,15 @@ class TimelessLeaf : HttpSource() { } }.sortedBy { pair -> pair.first } - return MangasPage(combinedLinks.map { p -> - SManga.create().apply { - title = p.first - setUrlWithoutDomain(p.second) - } - }, false) + return MangasPage( + combinedLinks.map { p -> + SManga.create().apply { + title = p.first + setUrlWithoutDomain(p.second) + } + }, + false + ) } // manga details diff --git a/src/en/tsumino/src/eu/kanade/tachiyomi/extension/en/tsumino/Tsumino.kt b/src/en/tsumino/src/eu/kanade/tachiyomi/extension/en/tsumino/Tsumino.kt index 7b487875d..54f2b1595 100644 --- a/src/en/tsumino/src/eu/kanade/tachiyomi/extension/en/tsumino/Tsumino.kt +++ b/src/en/tsumino/src/eu/kanade/tachiyomi/extension/en/tsumino/Tsumino.kt @@ -48,7 +48,7 @@ class Tsumino : ParsedHttpSource() { override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/Search/Operate/?PageNumber=$page&Sort=Newest") override fun latestUpdatesParse(response: Response): MangasPage { - val allManga = mutableListOf<SManga>() + val allManga = mutableListOf<SManga>() val body = response.body()!!.string() val jsonManga = gson.fromJson<JsonObject>(body)["data"].asJsonArray for (i in 0 until jsonManga.size()) { @@ -207,23 +207,23 @@ class Tsumino : ParsedHttpSource() { data class AdvSearchEntry(val type: Int, val text: String, val exclude: Boolean) override fun getFilterList() = FilterList( - Filter.Header("Separate tags with commas (,)"), - Filter.Header("Prepend with dash (-) to exclude"), - TagFilter(), - CategoryFilter(), - CollectionFilter(), - GroupFilter(), - ArtistFilter(), - ParodyFilter(), - CharactersFilter(), - UploaderFilter(), + Filter.Header("Separate tags with commas (,)"), + Filter.Header("Prepend with dash (-) to exclude"), + TagFilter(), + CategoryFilter(), + CollectionFilter(), + GroupFilter(), + ArtistFilter(), + ParodyFilter(), + CharactersFilter(), + UploaderFilter(), - Filter.Separator(), + Filter.Separator(), - SortFilter(), - LengthFilter(), - MinimumRatingFilter(), - ExcludeParodiesFilter() + SortFilter(), + LengthFilter(), + MinimumRatingFilter(), + ExcludeParodiesFilter() ) class TagFilter : AdvSearchEntryFilter("Tags", 1) diff --git a/src/en/vgperson/src/eu/kanade/tachiyomi/extension/en/vgperson/Vgperson.kt b/src/en/vgperson/src/eu/kanade/tachiyomi/extension/en/vgperson/Vgperson.kt index 5f86efca2..2f3db3df6 100644 --- a/src/en/vgperson/src/eu/kanade/tachiyomi/extension/en/vgperson/Vgperson.kt +++ b/src/en/vgperson/src/eu/kanade/tachiyomi/extension/en/vgperson/Vgperson.kt @@ -105,11 +105,11 @@ class Vgperson : ParsedHttpSource() { // get known manga covers from imgur private fun getCover(title: String) = when (title) { - "The Festive Monster's Cheerful Failure" -> "kEK10GL.png" - "Azure and Claude" -> "buXnlmh.jpg" - "Three Days of Happiness" -> "kL5dvnp.jpg" - else -> null - }?.let { "https://i.imgur.com/$it" } + "The Festive Monster's Cheerful Failure" -> "kEK10GL.png" + "Azure and Claude" -> "buXnlmh.jpg" + "Three Days of Happiness" -> "kL5dvnp.jpg" + else -> null + }?.let { "https://i.imgur.com/$it" } override fun latestUpdatesSelector() = "" diff --git a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizImageInterceptor.kt b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizImageInterceptor.kt index 753fd5129..abb0592e8 100644 --- a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizImageInterceptor.kt +++ b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizImageInterceptor.kt @@ -6,14 +6,14 @@ import android.graphics.Canvas import android.graphics.Rect import com.drew.imaging.ImageMetadataReader import com.drew.metadata.exif.ExifSubIFDDirectory -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream -import java.io.IOException -import java.io.InputStream import okhttp3.Interceptor import okhttp3.MediaType import okhttp3.Response import okhttp3.ResponseBody +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.IOException +import java.io.InputStream class VizImageInterceptor : Interceptor { @@ -57,29 +57,40 @@ class VizImageInterceptor : Interceptor { // Top border. canvas.drawImage( from = input, - srcX = 0, srcY = 0, - dstX = 0, dstY = 0, - width = newWidth, height = blockHeight + srcX = 0, + srcY = 0, + dstX = 0, + dstY = 0, + width = newWidth, + height = blockHeight ) // Left border. canvas.drawImage( from = input, - srcX = 0, srcY = blockHeight + 10, - dstX = 0, dstY = blockHeight, - width = blockWidth, height = newHeight - 2 * blockHeight + srcX = 0, + srcY = blockHeight + 10, + dstX = 0, + dstY = blockHeight, + width = blockWidth, + height = newHeight - 2 * blockHeight ) // Bottom border. canvas.drawImage( from = input, - srcX = 0, srcY = (CELL_HEIGHT_COUNT - 1) * (blockHeight + 10), - dstX = 0, dstY = (CELL_HEIGHT_COUNT - 1) * blockHeight, - width = newWidth, height = height - (CELL_HEIGHT_COUNT - 1) * (blockHeight + 10) + srcX = 0, + srcY = (CELL_HEIGHT_COUNT - 1) * (blockHeight + 10), + dstX = 0, + dstY = (CELL_HEIGHT_COUNT - 1) * blockHeight, + width = newWidth, + height = height - (CELL_HEIGHT_COUNT - 1) * (blockHeight + 10) ) // Right border. canvas.drawImage( from = input, - srcX = (CELL_WIDTH_COUNT - 1) * (blockWidth + 10), srcY = blockHeight + 10, - dstX = (CELL_WIDTH_COUNT - 1) * blockWidth, dstY = blockHeight, + srcX = (CELL_WIDTH_COUNT - 1) * (blockWidth + 10), + srcY = blockHeight + 10, + dstX = (CELL_WIDTH_COUNT - 1) * blockWidth, + dstY = blockHeight, width = blockWidth + (newWidth - CELL_WIDTH_COUNT * blockWidth), height = newHeight - 2 * blockHeight ) @@ -92,7 +103,8 @@ class VizImageInterceptor : Interceptor { srcY = (m / INNER_CELL_COUNT + 1) * (blockHeight + 10), dstX = (y % INNER_CELL_COUNT + 1) * blockWidth, dstY = (y / INNER_CELL_COUNT + 1) * blockHeight, - width = blockWidth, height = blockHeight + width = blockWidth, + height = blockHeight ) } diff --git a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt index 696617cb8..414e1a57a 100644 --- a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt +++ b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt @@ -8,9 +8,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.CacheControl import okhttp3.Headers import okhttp3.HttpUrl @@ -20,6 +17,9 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class VizShonenJump : ParsedHttpSource() { diff --git a/src/en/webcomics/src/eu/kanade/tachiyomi/extension/en/webcomics/Webcomics.kt b/src/en/webcomics/src/eu/kanade/tachiyomi/extension/en/webcomics/Webcomics.kt index bc47af5a9..ac477b586 100644 --- a/src/en/webcomics/src/eu/kanade/tachiyomi/extension/en/webcomics/Webcomics.kt +++ b/src/en/webcomics/src/eu/kanade/tachiyomi/extension/en/webcomics/Webcomics.kt @@ -30,7 +30,7 @@ class Webcomics : ParsedHttpSource() { override fun latestUpdatesSelector() = "section.mangas div div.col-md-3" override fun headersBuilder() = super.headersBuilder() - .add("Referer", "https://www.webcomicsapp.com") + .add("Referer", "https://www.webcomicsapp.com") override fun popularMangaRequest(page: Int) = GET("$baseUrl/popular.html", headers) @@ -151,36 +151,36 @@ class Webcomics : ParsedHttpSource() { override fun pageListRequest(chapter: SChapter) = GET(baseUrl + "/" + chapter.url, headers) override fun pageListParse(document: Document) = document - .select("section.book-reader .img-list > li > img") - .mapIndexed { - i, element -> - Page(i, "", element.attr("data-original")) - } + .select("section.book-reader .img-list > li > img") + .mapIndexed { + i, element -> + Page(i, "", element.attr("data-original")) + } override fun imageUrlParse(document: Document) = "" private class GenreFilter(genres: Array<String>) : Filter.Select<String>("Genre", genres) override fun getFilterList() = FilterList( - GenreFilter(getGenreList()) + GenreFilter(getGenreList()) ) // [...$('.row.wiki-book-nav .col-md-8 ul a')].map(el => `"${el.textContent.trim()}"`).join(',\n') // https://www.webcomicsapp.com/wiki.html private fun getGenreList() = arrayOf( - "All", - "Fantasy", - "Comedy", - "Drama", - "Modern", - "Action", - "Monster", - "Romance", - "Boys'Love", - "Harem", - "Thriller", - "Historical", - "Sci-fi", - "Slice of Life" + "All", + "Fantasy", + "Comedy", + "Drama", + "Modern", + "Action", + "Monster", + "Romance", + "Boys'Love", + "Harem", + "Thriller", + "Historical", + "Sci-fi", + "Slice of Life" ) } diff --git a/src/en/xkcd/src/eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt b/src/en/xkcd/src/eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt index 5be9761d7..4e7347f21 100644 --- a/src/en/xkcd/src/eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt +++ b/src/en/xkcd/src/eu/kanade/tachiyomi/extension/en/xkcd/Xkcd.kt @@ -7,12 +7,12 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale class Xkcd : ParsedHttpSource() { @@ -51,7 +51,7 @@ class Xkcd : ParsedHttpSource() { chapter.chapter_number = number.toFloat() chapter.name = number + " - " + element.text() chapter.date_upload = element.attr("title").let { - SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).parse(it).time + SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).parse(it)?.time ?: 0L } return chapter } @@ -64,7 +64,7 @@ class Xkcd : ParsedHttpSource() { // if an HD image is available it'll be the srcset attribute val image = document.select("div#comic img").let { if (it.hasAttr("srcset")) it.attr("abs:srcset").substringBefore(" ") - else it.attr("abs:src") + else it.attr("abs:src") } // create a text image for the alt text diff --git a/src/es/doujinyang/src/eu/kanade/tachiyomi/extension/es/doujinyang/DoujinYang.kt b/src/es/doujinyang/src/eu/kanade/tachiyomi/extension/es/doujinyang/DoujinYang.kt index 786bf4628..609e772c0 100644 --- a/src/es/doujinyang/src/eu/kanade/tachiyomi/extension/es/doujinyang/DoujinYang.kt +++ b/src/es/doujinyang/src/eu/kanade/tachiyomi/extension/es/doujinyang/DoujinYang.kt @@ -12,13 +12,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import okhttp3.RequestBody import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale @Nsfw class DoujinYang : ParsedHttpSource() { @@ -158,7 +158,9 @@ class DoujinYang : ParsedHttpSource() { ) class GenreFilter : UriPartFilter( - "Género", "genero", arrayOf( + "Género", + "genero", + arrayOf( Pair("all", "All"), Pair("1", "Ahegao"), Pair("379", "Alien"), @@ -244,7 +246,9 @@ class DoujinYang : ParsedHttpSource() { ) class LetterFilter : UriPartFilter( - "Letra", "letra", arrayOf( + "Letra", + "letra", + arrayOf( Pair("all", "All"), Pair("a", "A"), Pair("b", "B"), @@ -276,13 +280,19 @@ class DoujinYang : ParsedHttpSource() { ) class StatusFilter : UriPartFilter( - "Estado", "estado", arrayOf( - Pair("all", "All"), Pair("1", "En desarrollo"), Pair("0", "Finalizado") + "Estado", + "estado", + arrayOf( + Pair("all", "All"), + Pair("1", "En desarrollo"), + Pair("0", "Finalizado") ) ) class SortFilter : UriPartFilterreq( - "Sort", "orden", arrayOf( + "Sort", + "orden", + arrayOf( Pair("visitas", "Visitas"), Pair("desc", "Descendente"), Pair("asc", "Ascendente"), diff --git a/src/es/heavenmanga/src/eu/kanade/tachiyomi/extension/es/heavenmanga/HeavenManga.kt b/src/es/heavenmanga/src/eu/kanade/tachiyomi/extension/es/heavenmanga/HeavenManga.kt index 7b60879a8..c739bda97 100644 --- a/src/es/heavenmanga/src/eu/kanade/tachiyomi/extension/es/heavenmanga/HeavenManga.kt +++ b/src/es/heavenmanga/src/eu/kanade/tachiyomi/extension/es/heavenmanga/HeavenManga.kt @@ -90,7 +90,7 @@ class HeavenManga : ParsedHttpSource() { override fun searchMangaParse(response: Response): MangasPage { return if (response.request().url().toString().contains("query=")) super.searchMangaParse(response) - else popularMangaParse(response) + else popularMangaParse(response) } // get contents of a url @@ -157,138 +157,147 @@ class HeavenManga : ParsedHttpSource() { * Array.from(document.querySelectorAll('.categorias a')).map(a => `Pair("${a.textContent}", "${a.getAttribute('href')}")`).join(',\n') * on https://heavenmanga.com/top/ * */ - private class GenreFilter : UriPartFilter("Géneros", arrayOf( - Pair("Todo", ""), - Pair("Accion", "accion"), - Pair("Adulto", "adulto"), - Pair("Aventura", "aventura"), - Pair("Artes Marciales", "artes+marciales"), - Pair("Acontesimientos de la Vida", "acontesimientos+de+la+vida"), - Pair("Bakunyuu", "bakunyuu"), - Pair("Sci-fi", "sci-fi"), - Pair("Comic", "comic"), - Pair("Combate", "combate"), - Pair("Comedia", "comedia"), - Pair("Cooking", "cooking"), - Pair("Cotidiano", "cotidiano"), - Pair("Colegialas", "colegialas"), - Pair("Critica social", "critica+social"), - Pair("Ciencia ficcion", "ciencia+ficcion"), - Pair("Cambio de genero", "cambio+de+genero"), - Pair("Cosas de la Vida", "cosas+de+la+vida"), - Pair("Drama", "drama"), - Pair("Deporte", "deporte"), - Pair("Doujinshi", "doujinshi"), - Pair("Delincuentes", "delincuentes"), - Pair("Ecchi", "ecchi"), - Pair("Escolar", "escolar"), - Pair("Erotico", "erotico"), - Pair("Escuela", "escuela"), - Pair("Estilo de Vida", "estilo+de+vida"), - Pair("Fantasia", "fantasia"), - Pair("Fragmentos de la Vida", "fragmentos+de+la+vida"), - Pair("Gore", "gore"), - Pair("Gender Bender", "gender+bender"), - Pair("Humor", "humor"), - Pair("Harem", "harem"), - Pair("Haren", "haren"), - Pair("Hentai", "hentai"), - Pair("Horror", "horror"), - Pair("Historico", "historico"), - Pair("Josei", "josei"), - Pair("Loli", "loli"), - Pair("Light", "light"), - Pair("Lucha Libre", "lucha+libre"), - Pair("Manga", "manga"), - Pair("Mecha", "mecha"), - Pair("Magia", "magia"), - Pair("Maduro", "maduro"), - Pair("Manhwa", "manhwa"), - Pair("Manwha", "manwha"), - Pair("Mature", "mature"), - Pair("Misterio", "misterio"), - Pair("Mutantes", "mutantes"), - Pair("Novela", "novela"), - Pair("Orgia", "orgia"), - Pair("OneShot", "oneshot"), - Pair("OneShots", "oneshots"), - Pair("Psicologico", "psicologico"), - Pair("Romance", "romance"), - Pair("Recuentos de la vida", "recuentos+de+la+vida"), - Pair("Smut", "smut"), - Pair("Shojo", "shojo"), - Pair("Shonen", "shonen"), - Pair("Seinen", "seinen"), - Pair("Shoujo", "shoujo"), - Pair("Shounen", "shounen"), - Pair("Suspenso", "suspenso"), - Pair("School Life", "school+life"), - Pair("Sobrenatural", "sobrenatural"), - Pair("SuperHeroes", "superheroes"), - Pair("Supernatural", "supernatural"), - Pair("Slice of Life", "slice+of+life"), - Pair("Super Poderes", "ssuper+poderes"), - Pair("Terror", "terror"), - Pair("Torneo", "torneo"), - Pair("Tragedia", "tragedia"), - Pair("Transexual", "transexual"), - Pair("Vida", "vida"), - Pair("Vampiros", "vampiros"), - Pair("Violencia", "violencia"), - Pair("Vida Pasada", "vida+pasada"), - Pair("Vida Cotidiana", "vida+cotidiana"), - Pair("Vida de Escuela", "vida+de+escuela"), - Pair("Webtoon", "webtoon"), - Pair("Webtoons", "webtoons"), - Pair("Yaoi", "yaoi"), - Pair("Yuri", "yuri") - )) + private class GenreFilter : UriPartFilter( + "Géneros", + arrayOf( + Pair("Todo", ""), + Pair("Accion", "accion"), + Pair("Adulto", "adulto"), + Pair("Aventura", "aventura"), + Pair("Artes Marciales", "artes+marciales"), + Pair("Acontesimientos de la Vida", "acontesimientos+de+la+vida"), + Pair("Bakunyuu", "bakunyuu"), + Pair("Sci-fi", "sci-fi"), + Pair("Comic", "comic"), + Pair("Combate", "combate"), + Pair("Comedia", "comedia"), + Pair("Cooking", "cooking"), + Pair("Cotidiano", "cotidiano"), + Pair("Colegialas", "colegialas"), + Pair("Critica social", "critica+social"), + Pair("Ciencia ficcion", "ciencia+ficcion"), + Pair("Cambio de genero", "cambio+de+genero"), + Pair("Cosas de la Vida", "cosas+de+la+vida"), + Pair("Drama", "drama"), + Pair("Deporte", "deporte"), + Pair("Doujinshi", "doujinshi"), + Pair("Delincuentes", "delincuentes"), + Pair("Ecchi", "ecchi"), + Pair("Escolar", "escolar"), + Pair("Erotico", "erotico"), + Pair("Escuela", "escuela"), + Pair("Estilo de Vida", "estilo+de+vida"), + Pair("Fantasia", "fantasia"), + Pair("Fragmentos de la Vida", "fragmentos+de+la+vida"), + Pair("Gore", "gore"), + Pair("Gender Bender", "gender+bender"), + Pair("Humor", "humor"), + Pair("Harem", "harem"), + Pair("Haren", "haren"), + Pair("Hentai", "hentai"), + Pair("Horror", "horror"), + Pair("Historico", "historico"), + Pair("Josei", "josei"), + Pair("Loli", "loli"), + Pair("Light", "light"), + Pair("Lucha Libre", "lucha+libre"), + Pair("Manga", "manga"), + Pair("Mecha", "mecha"), + Pair("Magia", "magia"), + Pair("Maduro", "maduro"), + Pair("Manhwa", "manhwa"), + Pair("Manwha", "manwha"), + Pair("Mature", "mature"), + Pair("Misterio", "misterio"), + Pair("Mutantes", "mutantes"), + Pair("Novela", "novela"), + Pair("Orgia", "orgia"), + Pair("OneShot", "oneshot"), + Pair("OneShots", "oneshots"), + Pair("Psicologico", "psicologico"), + Pair("Romance", "romance"), + Pair("Recuentos de la vida", "recuentos+de+la+vida"), + Pair("Smut", "smut"), + Pair("Shojo", "shojo"), + Pair("Shonen", "shonen"), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shounen", "shounen"), + Pair("Suspenso", "suspenso"), + Pair("School Life", "school+life"), + Pair("Sobrenatural", "sobrenatural"), + Pair("SuperHeroes", "superheroes"), + Pair("Supernatural", "supernatural"), + Pair("Slice of Life", "slice+of+life"), + Pair("Super Poderes", "ssuper+poderes"), + Pair("Terror", "terror"), + Pair("Torneo", "torneo"), + Pair("Tragedia", "tragedia"), + Pair("Transexual", "transexual"), + Pair("Vida", "vida"), + Pair("Vampiros", "vampiros"), + Pair("Violencia", "violencia"), + Pair("Vida Pasada", "vida+pasada"), + Pair("Vida Cotidiana", "vida+cotidiana"), + Pair("Vida de Escuela", "vida+de+escuela"), + Pair("Webtoon", "webtoon"), + Pair("Webtoons", "webtoons"), + Pair("Yaoi", "yaoi"), + Pair("Yuri", "yuri") + ) + ) /** * Array.from(document.querySelectorAll('.letras a')).map(a => `Pair("${a.textContent}", "${a.getAttribute('href')}")`).join(',\n') * on https://heavenmanga.com/top/ * */ - private class AlphabeticoFilter : UriPartFilter("Alfabético", arrayOf( - Pair("Todo", ""), - Pair("A", "a"), - Pair("B", "b"), - Pair("C", "c"), - Pair("D", "d"), - Pair("E", "e"), - Pair("F", "f"), - Pair("G", "g"), - Pair("H", "h"), - Pair("I", "i"), - Pair("J", "j"), - Pair("K", "k"), - Pair("L", "l"), - Pair("M", "m"), - Pair("N", "n"), - Pair("O", "o"), - Pair("P", "p"), - Pair("Q", "q"), - Pair("R", "r"), - Pair("S", "s"), - Pair("T", "t"), - Pair("U", "u"), - Pair("V", "v"), - Pair("W", "w"), - Pair("X", "x"), - Pair("Y", "y"), - Pair("Z", "z"), - Pair("0-9", "0-9") - )) + private class AlphabeticoFilter : UriPartFilter( + "Alfabético", + arrayOf( + Pair("Todo", ""), + Pair("A", "a"), + Pair("B", "b"), + Pair("C", "c"), + Pair("D", "d"), + Pair("E", "e"), + Pair("F", "f"), + Pair("G", "g"), + Pair("H", "h"), + Pair("I", "i"), + Pair("J", "j"), + Pair("K", "k"), + Pair("L", "l"), + Pair("M", "m"), + Pair("N", "n"), + Pair("O", "o"), + Pair("P", "p"), + Pair("Q", "q"), + Pair("R", "r"), + Pair("S", "s"), + Pair("T", "t"), + Pair("U", "u"), + Pair("V", "v"), + Pair("W", "w"), + Pair("X", "x"), + Pair("Y", "y"), + Pair("Z", "z"), + Pair("0-9", "0-9") + ) + ) /** * Array.from(document.querySelectorAll('#t li a')).map(a => `Pair("${a.textContent}", "${a.getAttribute('href')}")`).join(',\n') * on https://heavenmanga.com/top/ * */ - private class ListaCompletasFilter : UriPartFilter("Lista Completa", arrayOf( - Pair("Todo", ""), - Pair("Lista Comis", "comic"), - Pair("Lista Novelas", "novela"), - Pair("Lista Adulto", "adulto") - )) + private class ListaCompletasFilter : UriPartFilter( + "Lista Completa", + arrayOf( + Pair("Todo", ""), + Pair("Lista Comis", "comic"), + Pair("Lista Novelas", "novela"), + Pair("Lista Adulto", "adulto") + ) + ) override fun getFilterList() = FilterList( // Search and filter don't work at the same time diff --git a/src/es/ikuhentai/src/eu/kanade/tachiyomi/extension/es/ikuhentai/Ikuhentai.kt b/src/es/ikuhentai/src/eu/kanade/tachiyomi/extension/es/ikuhentai/Ikuhentai.kt index dc9432ae0..5015b36a1 100755 --- a/src/es/ikuhentai/src/eu/kanade/tachiyomi/extension/es/ikuhentai/Ikuhentai.kt +++ b/src/es/ikuhentai/src/eu/kanade/tachiyomi/extension/es/ikuhentai/Ikuhentai.kt @@ -186,7 +186,9 @@ class Ikuhentai : ParsedHttpSource() { } // private class Status : Filter.TriState("Completed") private class TextField(name: String, val key: String) : Filter.Text(name) - private class SortBy : UriPartFilter("Ordenar por", arrayOf( + private class SortBy : UriPartFilter( + "Ordenar por", + arrayOf( Pair("Relevance", ""), Pair("Latest", "latest"), Pair("A-Z", "alphabet"), @@ -194,7 +196,8 @@ class Ikuhentai : ParsedHttpSource() { Pair("Tendencia", "trending"), Pair("Más visto", "views"), Pair("Nuevo", "new-manga") - )) + ) + ) private class Genre(name: String, val id: String = name) : Filter.TriState(name) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) @@ -203,65 +206,65 @@ class Ikuhentai : ParsedHttpSource() { override fun getFilterList() = FilterList( // TextField("Judul", "title"), - TextField("Autor", "author"), - TextField("Año de publicación", "release"), - SortBy(), - StatusList(getStatusList()), - GenreList(getGenreList()) + TextField("Autor", "author"), + TextField("Año de publicación", "release"), + SortBy(), + StatusList(getStatusList()), + GenreList(getGenreList()) ) private fun getStatusList() = listOf( - Status("Completado", "end"), - Status("En emisión", "on-going"), - Status("Cancelado", "canceled"), - Status("Pausado", "on-hold") + Status("Completado", "end"), + Status("En emisión", "on-going"), + Status("Cancelado", "canceled"), + Status("Pausado", "on-hold") ) private fun getGenreList() = listOf( - Genre("Ahegao", "ahegao"), - Genre("Anal", "anal"), - Genre("Bestiality", "bestialidad"), - Genre("Bondage", "bondage"), - Genre("Bukkake", "bukkake"), - Genre("Chicas monstruo", "chicas-monstruo"), - Genre("Chikan", "chikan"), - Genre("Colegialas", "colegialas"), - Genre("Comics porno", "comics-porno"), - Genre("Dark Skin", "dark-skin"), - Genre("Demonios", "demonios"), - Genre("Ecchi", "ecchi"), - Genre("Embarazadas", "embarazadas"), - Genre("Enfermeras", "enfermeras"), - Genre("Eroges", "eroges"), - Genre("Fantasía", "fantasia"), - Genre("Futanari", "futanari"), - Genre("Gangbang", "gangbang"), - Genre("Gemelas", "gemelas"), - Genre("Gender Bender", "gender-bender"), - Genre("Gore", "gore"), - Genre("Handjob", "handjob"), - Genre("Harem", "harem"), - Genre("Hipnosis", "hipnosis"), - Genre("Incesto", "incesto"), - Genre("Loli", "loli"), - Genre("Maids", "maids"), - Genre("Masturbación", "masturbacion"), - Genre("Milf", "milf"), - Genre("Mind Break", "mind-break"), - Genre("My Hero Academia", "my-hero-academia"), - Genre("Naruto", "naruto"), - Genre("Netorare", "netorare"), - Genre("Paizuri", "paizuri"), - Genre("Pokemon", "pokemon"), - Genre("Profesora", "profesora"), - Genre("Prostitución", "prostitucion"), - Genre("Romance", "romance"), - Genre("Straight Shota", "straight-shota"), - Genre("Tentáculos", "tentaculos"), - Genre("Virgen", "virgen"), - Genre("Yaoi", "yaoi"), - Genre("Yuri", "yuri") + Genre("Ahegao", "ahegao"), + Genre("Anal", "anal"), + Genre("Bestiality", "bestialidad"), + Genre("Bondage", "bondage"), + Genre("Bukkake", "bukkake"), + Genre("Chicas monstruo", "chicas-monstruo"), + Genre("Chikan", "chikan"), + Genre("Colegialas", "colegialas"), + Genre("Comics porno", "comics-porno"), + Genre("Dark Skin", "dark-skin"), + Genre("Demonios", "demonios"), + Genre("Ecchi", "ecchi"), + Genre("Embarazadas", "embarazadas"), + Genre("Enfermeras", "enfermeras"), + Genre("Eroges", "eroges"), + Genre("Fantasía", "fantasia"), + Genre("Futanari", "futanari"), + Genre("Gangbang", "gangbang"), + Genre("Gemelas", "gemelas"), + Genre("Gender Bender", "gender-bender"), + Genre("Gore", "gore"), + Genre("Handjob", "handjob"), + Genre("Harem", "harem"), + Genre("Hipnosis", "hipnosis"), + Genre("Incesto", "incesto"), + Genre("Loli", "loli"), + Genre("Maids", "maids"), + Genre("Masturbación", "masturbacion"), + Genre("Milf", "milf"), + Genre("Mind Break", "mind-break"), + Genre("My Hero Academia", "my-hero-academia"), + Genre("Naruto", "naruto"), + Genre("Netorare", "netorare"), + Genre("Paizuri", "paizuri"), + Genre("Pokemon", "pokemon"), + Genre("Profesora", "profesora"), + Genre("Prostitución", "prostitucion"), + Genre("Romance", "romance"), + Genre("Straight Shota", "straight-shota"), + Genre("Tentáculos", "tentaculos"), + Genre("Virgen", "virgen"), + Genre("Yaoi", "yaoi"), + Genre("Yuri", "yuri") ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } } diff --git a/src/es/inmanga/src/eu/kanade/tachiyomi/extension/es/inmanga/InManga.kt b/src/es/inmanga/src/eu/kanade/tachiyomi/extension/es/inmanga/InManga.kt index a1eaf1fd6..292f95218 100644 --- a/src/es/inmanga/src/eu/kanade/tachiyomi/extension/es/inmanga/InManga.kt +++ b/src/es/inmanga/src/eu/kanade/tachiyomi/extension/es/inmanga/InManga.kt @@ -15,14 +15,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class InManga : ParsedHttpSource() { @@ -170,7 +170,7 @@ class InManga : ParsedHttpSource() { } private fun parseChapterDate(string: String): Long? { - return dateFormat.parse(string).time + return dateFormat.parse(string)?.time ?: 0L } // Pages diff --git a/src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt b/src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt index 081da2e39..e57eb3c97 100755 --- a/src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt +++ b/src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt @@ -16,16 +16,16 @@ 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 java.io.IOException -import java.text.SimpleDateFormat -import java.util.Locale -import kotlin.math.roundToInt import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Element +import java.io.IOException +import java.text.SimpleDateFormat +import java.util.Locale +import kotlin.math.roundToInt class Kumanga : HttpSource() { diff --git a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt index 1a4275bc2..adedc28d3 100755 --- a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt +++ b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt @@ -15,8 +15,6 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request @@ -26,6 +24,8 @@ import org.jsoup.nodes.Element import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Locale /** * Note: this source is similar to TuMangaOnline. @@ -95,32 +95,44 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { } } is WebcomicFilter -> { - url.addQueryParameter("webcomic", when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "true" - Filter.TriState.STATE_EXCLUDE -> "false" - else -> "" - }) + url.addQueryParameter( + "webcomic", + when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + } + ) } is FourKomaFilter -> { - url.addQueryParameter("yonkoma", when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "true" - Filter.TriState.STATE_EXCLUDE -> "false" - else -> "" - }) + url.addQueryParameter( + "yonkoma", + when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + } + ) } is AmateurFilter -> { - url.addQueryParameter("amateur", when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "true" - Filter.TriState.STATE_EXCLUDE -> "false" - else -> "" - }) + url.addQueryParameter( + "amateur", + when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + } + ) } is EroticFilter -> { - url.addQueryParameter("erotic", when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "true" - Filter.TriState.STATE_EXCLUDE -> "false" - else -> "" - }) + url.addQueryParameter( + "erotic", + when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + } + ) } is GenreList -> { filter.state @@ -224,10 +236,16 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { override fun pageListParse(document: Document): List<Page> = mutableListOf<Page>().apply { if (getPageMethod() == "cascade") { document.select("div.viewer-container img").forEach { - add(Page(size, "", it.let { - if (it.hasAttr("data-src")) - it.attr("abs:data-src") else it.attr("abs:src") - })) + add( + Page( + size, + "", + it.let { + if (it.hasAttr("data-src")) + it.attr("abs:data-src") else it.attr("abs:src") + } + ) + ) } } else { val pageList = document.select("#viewer-pages-select").first().select("option").map { it.attr("value").toInt() } @@ -265,31 +283,40 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { } } - private class Types : UriPartFilter("Filtrar por tipo", arrayOf( - Pair("Ver todos", ""), - Pair("Manga", "manga"), - Pair("Manhua", "manhua"), - Pair("Manhwa", "manhwa"), - Pair("Novela", "novel"), - Pair("One shot", "one_shot"), - Pair("Doujinshi", "doujinshi"), - Pair("Oel", "oel") - )) + private class Types : UriPartFilter( + "Filtrar por tipo", + arrayOf( + Pair("Ver todos", ""), + Pair("Manga", "manga"), + Pair("Manhua", "manhua"), + Pair("Manhwa", "manhwa"), + Pair("Novela", "novel"), + Pair("One shot", "one_shot"), + Pair("Doujinshi", "doujinshi"), + Pair("Oel", "oel") + ) + ) - private class Demography : UriPartFilter("Filtrar por demografía", arrayOf( - Pair("Ver todas", ""), - Pair("Seinen", "seinen"), - Pair("Shoujo", "shoujo"), - Pair("Shounen", "shounen"), - Pair("Josei", "josei"), - Pair("Kodomo", "kodomo") - )) + private class Demography : UriPartFilter( + "Filtrar por demografía", + arrayOf( + Pair("Ver todas", ""), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shounen", "shounen"), + Pair("Josei", "josei"), + Pair("Kodomo", "kodomo") + ) + ) - private class FilterBy : UriPartFilter("Campo de orden", arrayOf( - Pair("Título", "title"), - Pair("Autor", "author"), - Pair("Compañia", "company") - )) + private class FilterBy : UriPartFilter( + "Campo de orden", + arrayOf( + Pair("Título", "title"), + Pair("Autor", "author"), + Pair("Compañia", "company") + ) + ) class SortBy : Filter.Sort( "Ordenar por", diff --git a/src/es/mangamx/src/eu/kanade/tachiyomi/extension/es/mangamx/MangaMx.kt b/src/es/mangamx/src/eu/kanade/tachiyomi/extension/es/mangamx/MangaMx.kt index b2db59c5d..0b96d462f 100644 --- a/src/es/mangamx/src/eu/kanade/tachiyomi/extension/es/mangamx/MangaMx.kt +++ b/src/es/mangamx/src/eu/kanade/tachiyomi/extension/es/mangamx/MangaMx.kt @@ -16,14 +16,14 @@ 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 java.nio.charset.Charset -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.FormBody import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.nio.charset.Charset +import java.text.SimpleDateFormat +import java.util.Locale open class MangaMx : ParsedHttpSource() { diff --git a/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt b/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt index 210f8ead9..d3d08026c 100755 --- a/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt +++ b/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt @@ -98,8 +98,8 @@ class TMOHentai : ParsedHttpSource() { } is GenreList -> { filter.state - .filter { genre -> genre.state } - .forEach { genre -> url.addQueryParameter("genders[]", genre.id) } + .filter { genre -> genre.state } + .forEach { genre -> url.addQueryParameter("genders[]", genre.id) } } is FilterBy -> { url.addQueryParameter("search[searchBy]", filter.toUriPart()) @@ -161,25 +161,31 @@ class TMOHentai : ParsedHttpSource() { ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } - private class Types : UriPartFilter("Filtrar por tipo", arrayOf( + private class Types : UriPartFilter( + "Filtrar por tipo", + arrayOf( Pair("Ver todos", "all"), Pair("Manga", "hentai"), Pair("Light Hentai", "light-hentai"), Pair("Doujinshi", "doujinshi"), Pair("One-shot", "one-shot"), Pair("Other", "otro") - )) + ) + ) - private class FilterBy : UriPartFilter("Campo de orden", arrayOf( - Pair("Nombre", "name"), - Pair("Artista", "artist"), - Pair("Revista", "magazine"), - Pair("Tag", "tag") - )) + private class FilterBy : UriPartFilter( + "Campo de orden", + arrayOf( + Pair("Nombre", "name"), + Pair("Artista", "artist"), + Pair("Revista", "magazine"), + Pair("Tag", "tag") + ) + ) class SortBy : Filter.Sort( "Ordenar por", @@ -191,52 +197,52 @@ class TMOHentai : ParsedHttpSource() { // .map(a => `Genre("${a.querySelector('span').innerText.replace(' ', '')}", "${a.querySelector('input').value}")`).join(',\n') // https://tmohentai.com/section/hentai private fun getGenreList() = listOf( - Genre("Romance", "1"), - Genre("Fantasy", "2"), - Genre("Comedy", "3"), - Genre("Parody", "4"), - Genre("Student", "5"), - Genre("Adventure", "6"), - Genre("Milf", "7"), - Genre("Orgy", "8"), - Genre("Big Breasts", "9"), - Genre("Bondage", "10"), - Genre("Tentacles", "11"), - Genre("Incest", "12"), - Genre("Ahegao", "13"), - Genre("Bestiality", "14"), - Genre("Futanari", "15"), - Genre("Rape", "16"), - Genre("Monsters", "17"), - Genre("Pregnant", "18"), - Genre("Small Breast", "19"), - Genre("Bukkake", "20"), - Genre("Femdom", "21"), - Genre("Fetish", "22"), - Genre("Forced", "23"), - Genre("3D", "24"), - Genre("Furry", "25"), - Genre("Adultery", "26"), - Genre("Anal", "27"), - Genre("FootJob", "28"), - Genre("BlowJob", "29"), - Genre("Toys", "30"), - Genre("Vanilla", "31"), - Genre("Colour", "32"), - Genre("Uncensored", "33"), - Genre("Netorare", "34"), - Genre("Virgin", "35"), - Genre("Cheating", "36"), - Genre("Harem", "37"), - Genre("Horror", "38"), - Genre("Lolicon", "39"), - Genre("Mature", "40"), - Genre("Nympho", "41"), - Genre("Public Sex", "42"), - Genre("Sport", "43"), - Genre("Domination", "44"), - Genre("Tsundere", "45"), - Genre("Yandere", "46") + Genre("Romance", "1"), + Genre("Fantasy", "2"), + Genre("Comedy", "3"), + Genre("Parody", "4"), + Genre("Student", "5"), + Genre("Adventure", "6"), + Genre("Milf", "7"), + Genre("Orgy", "8"), + Genre("Big Breasts", "9"), + Genre("Bondage", "10"), + Genre("Tentacles", "11"), + Genre("Incest", "12"), + Genre("Ahegao", "13"), + Genre("Bestiality", "14"), + Genre("Futanari", "15"), + Genre("Rape", "16"), + Genre("Monsters", "17"), + Genre("Pregnant", "18"), + Genre("Small Breast", "19"), + Genre("Bukkake", "20"), + Genre("Femdom", "21"), + Genre("Fetish", "22"), + Genre("Forced", "23"), + Genre("3D", "24"), + Genre("Furry", "25"), + Genre("Adultery", "26"), + Genre("Anal", "27"), + Genre("FootJob", "28"), + Genre("BlowJob", "29"), + Genre("Toys", "30"), + Genre("Vanilla", "31"), + Genre("Colour", "32"), + Genre("Uncensored", "33"), + Genre("Netorare", "34"), + Genre("Virgin", "35"), + Genre("Cheating", "36"), + Genre("Harem", "37"), + Genre("Horror", "38"), + Genre("Lolicon", "39"), + Genre("Mature", "40"), + Genre("Nympho", "41"), + Genre("Public Sex", "42"), + Genre("Sport", "43"), + Genre("Domination", "44"), + Genre("Tsundere", "45"), + Genre("Yandere", "46") ) companion object { diff --git a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt index f22070d47..d30b22a77 100644 --- a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt +++ b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt @@ -15,8 +15,6 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request @@ -26,6 +24,8 @@ import org.jsoup.nodes.Element import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Locale class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { @@ -96,32 +96,44 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { } } is WebcomicFilter -> { - url.addQueryParameter("webcomic", when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "true" - Filter.TriState.STATE_EXCLUDE -> "false" - else -> "" - }) + url.addQueryParameter( + "webcomic", + when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + } + ) } is FourKomaFilter -> { - url.addQueryParameter("yonkoma", when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "true" - Filter.TriState.STATE_EXCLUDE -> "false" - else -> "" - }) + url.addQueryParameter( + "yonkoma", + when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + } + ) } is AmateurFilter -> { - url.addQueryParameter("amateur", when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "true" - Filter.TriState.STATE_EXCLUDE -> "false" - else -> "" - }) + url.addQueryParameter( + "amateur", + when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + } + ) } is EroticFilter -> { - url.addQueryParameter("erotic", when (filter.state) { - Filter.TriState.STATE_INCLUDE -> "true" - Filter.TriState.STATE_EXCLUDE -> "false" - else -> "" - }) + url.addQueryParameter( + "erotic", + when (filter.state) { + Filter.TriState.STATE_INCLUDE -> "true" + Filter.TriState.STATE_EXCLUDE -> "false" + else -> "" + } + ) } is GenreList -> { filter.state @@ -234,10 +246,16 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { override fun pageListParse(document: Document): List<Page> = mutableListOf<Page>().apply { if (getPageMethod() == "cascade") { document.select("div.viewer-container img").forEach { - add(Page(size, "", it.let { - if (it.hasAttr("data-src")) - it.attr("abs:data-src") else it.attr("abs:src") - })) + add( + Page( + size, + "", + it.let { + if (it.hasAttr("data-src")) + it.attr("abs:data-src") else it.attr("abs:src") + } + ) + ) } } else { val pageList = document.select("#viewer-pages-select").first().select("option").map { it.attr("value").toInt() } @@ -277,31 +295,40 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { } } - private class Types : UriPartFilter("Filtrar por tipo", arrayOf( - Pair("Ver todo", ""), - Pair("Manga", "manga"), - Pair("Manhua", "manhua"), - Pair("Manhwa", "manhwa"), - Pair("Novela", "novel"), - Pair("One shot", "one_shot"), - Pair("Doujinshi", "doujinshi"), - Pair("Oel", "oel") - )) + private class Types : UriPartFilter( + "Filtrar por tipo", + arrayOf( + Pair("Ver todo", ""), + Pair("Manga", "manga"), + Pair("Manhua", "manhua"), + Pair("Manhwa", "manhwa"), + Pair("Novela", "novel"), + Pair("One shot", "one_shot"), + Pair("Doujinshi", "doujinshi"), + Pair("Oel", "oel") + ) + ) - private class Demography : UriPartFilter("Filtrar por demografía", arrayOf( - Pair("Ver todo", ""), - Pair("Seinen", "seinen"), - Pair("Shoujo", "shoujo"), - Pair("Shounen", "shounen"), - Pair("Josei", "josei"), - Pair("Kodomo", "kodomo") - )) + private class Demography : UriPartFilter( + "Filtrar por demografía", + arrayOf( + Pair("Ver todo", ""), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shounen", "shounen"), + Pair("Josei", "josei"), + Pair("Kodomo", "kodomo") + ) + ) - private class FilterBy : UriPartFilter("Campo de orden", arrayOf( - Pair("Título", "title"), - Pair("Autor", "author"), - Pair("Compañia", "company") - )) + private class FilterBy : UriPartFilter( + "Campo de orden", + arrayOf( + Pair("Título", "title"), + Pair("Autor", "author"), + Pair("Compañia", "company") + ) + ) class SortBy : Filter.Sort( "Ordenar por", diff --git a/src/es/vcpvmp/src/eu/kanade/tachiyomi/extension/es/vcpvmp/VCPVMP.kt b/src/es/vcpvmp/src/eu/kanade/tachiyomi/extension/es/vcpvmp/VCPVMP.kt index 377d9b39f..bc92c1466 100644 --- a/src/es/vcpvmp/src/eu/kanade/tachiyomi/extension/es/vcpvmp/VCPVMP.kt +++ b/src/es/vcpvmp/src/eu/kanade/tachiyomi/extension/es/vcpvmp/VCPVMP.kt @@ -119,363 +119,369 @@ open class VCPVMP(override val name: String, override val baseUrl: String) : Par // Array.from(document.querySelectorAll('div.tagcloud a.tag-cloud-link')).map(a => `Pair("${a.innerText}", "${a.href.replace('https://vercomicsporno.com/etiqueta/', '')}")`).join(',\n') // from https://vercomicsporno.com/ - private class Genre : UriPartFilter("Filtrar por categoría", arrayOf( - Pair("Ver todos", ""), - Pair("Anales", "anales"), - Pair("Comics Porno", "comics-porno"), - Pair("Culonas", "culonas"), - Pair("Doujins", "doujins"), - Pair("Furry", "furry"), - Pair("Incesto", "incesto"), - Pair("Lesbianas", "lesbianas"), - Pair("Madre Hijo", "madre-hijo"), - Pair("Mamadas", "mamadas"), - Pair("Manga Hentai", "manga-hentai"), - Pair("Milfs", "milfs"), - Pair("Milftoon", "milftoon-comics"), - Pair("Orgias", "orgias"), - Pair("Parodias Porno", "parodias-porno"), - Pair("Rubias", "rubias"), - Pair("Series De Tv", "series-de-tv"), - Pair("Tetonas", "tetonas"), - Pair("Trios", "trios"), - Pair("Videojuegos", "videojuegos"), - Pair("Yuri", "yuri-2") - )) + private class Genre : UriPartFilter( + "Filtrar por categoría", + arrayOf( + Pair("Ver todos", ""), + Pair("Anales", "anales"), + Pair("Comics Porno", "comics-porno"), + Pair("Culonas", "culonas"), + Pair("Doujins", "doujins"), + Pair("Furry", "furry"), + Pair("Incesto", "incesto"), + Pair("Lesbianas", "lesbianas"), + Pair("Madre Hijo", "madre-hijo"), + Pair("Mamadas", "mamadas"), + Pair("Manga Hentai", "manga-hentai"), + Pair("Milfs", "milfs"), + Pair("Milftoon", "milftoon-comics"), + Pair("Orgias", "orgias"), + Pair("Parodias Porno", "parodias-porno"), + Pair("Rubias", "rubias"), + Pair("Series De Tv", "series-de-tv"), + Pair("Tetonas", "tetonas"), + Pair("Trios", "trios"), + Pair("Videojuegos", "videojuegos"), + Pair("Yuri", "yuri-2") + ) + ) // Array.from(document.querySelectorAll('form select#cat option.level-0')).map(a => `Pair("${a.innerText}", "${a.value}")`).join(',\n') // from https://vercomicsporno.com/ - private class Category : UriPartFilter("Filtrar por categoría", arrayOf( - Pair("Ver todos", ""), - Pair("5ish", "2853"), - Pair("69", "1905"), - Pair("8muses", "856"), - Pair("Aarokira", "2668"), - Pair("ABBB", "3058"), - Pair("Absurd Stories", "2846"), - Pair("Adam 00", "1698"), - Pair("Aeolus", "2831"), - Pair("Afrobull", "3032"), - Pair("Alcor", "2837"), - Pair("angstrom", "2996"), - Pair("Anonymouse", "2851"), - Pair("Aoino Broom", "3086"), - Pair("Aquarina", "2727"), - Pair("Arabatos", "1780"), - Pair("Aroma Sensei", "2663"), - Pair("Art of jaguar", "167"), - Pair("Atreyu Studio", "3040"), - Pair("Awaerr", "2921"), - Pair("Bakuhaku", "2866"), - Pair("Bashfulbeckon", "2841"), - Pair("Bear123", "2814"), - Pair("Black and White", "361"), - Pair("Black House", "3044"), - Pair("Blackadder", "83"), - Pair("Blacky Chan", "2901"), - Pair("Blargsnarf", "2728"), - Pair("BlueVersusRed", "2963"), - Pair("Bnouait", "2706"), - Pair("Born to Die", "2982"), - Pair("Buena trama", "2579"), - Pair("Buru", "2736"), - Pair("Cagri", "2751"), - Pair("CallMePlisskin", "2960"), - Pair("Catfightcentral", "2691"), - Pair("cecyartbytenshi", "2799"), - Pair("Cheka.art", "2999"), - Pair("Cherry Mouse Street", "2891"), - Pair("cherry-gig", "2679"), - Pair("Chochi", "3085"), - Pair("ClaraLaine", "2697"), - Pair("Clasicos", "2553"), - Pair("Cobatsart", "2729"), - Pair("Comics porno", "6"), - Pair("Comics Porno 3D", "1910"), - Pair("Comics porno mexicano", "511"), - Pair("Comics XXX", "119"), - Pair("CrazyDad3d", "2657"), - Pair("Creeeen", "2922"), - Pair("Croc", "1684"), - Pair("Crock", "3004"), - Pair("Cyberunique", "2801"), - Pair("Danaelus", "3080"), - Pair("DankoDeadZone", "3055"), - Pair("Darkhatboy", "2856"), - Pair("DarkShadow", "2845"), - Pair("DarkToons Cave", "2893"), - Pair("Dasan", "2692"), - Pair("David Willis", "2816"), - Pair("Dboy", "3094"), - Pair("Dconthedancefloor", "2905"), - Pair("Degenerate", "2923"), - Pair("Diathorn", "2894"), - Pair("Dicasty", "2983"), - Pair("Dimedrolly", "3017"), - Pair("Dirtycomics", "2957"), - Pair("DMAYaichi", "2924"), - Pair("Dony", "2769"), - Pair("Doxy", "2698"), - Pair("Drawnsex", "9"), - Pair("DrCockula", "2708"), - Pair("Dude-doodle-do", "2984"), - Pair("ebluberry", "2842"), - Pair("Ecchi Kimochiii", "1948"), - Pair("EcchiFactor 2.0", "1911"), - Pair("Eirhjien", "2817"), - Pair("Eliana Asato", "2878"), - Pair("Ender Selya", "2774"), - Pair("Enessef-UU", "3124"), - Pair("ERN", "3010"), - Pair("Erotibot", "2711"), - Pair("Escoria", "2945"), - Pair("Evil Rick", "2946"), - Pair("FearingFun", "3057"), - Pair("Felsala", "2138"), - Pair("Fetishhand", "2932"), - Pair("Fikomi", "2887"), - Pair("Fixxxer", "2737"), - Pair("FLBL", "3050"), - Pair("Folo", "2762"), - Pair("Forked Tail", "2830"), - Pair("Fotonovelas XXX", "320"), - Pair("Freckles", "3095"), - Pair("Fred Perry", "2832"), - Pair("Freehand", "400"), - Pair("FrozenParody", "1766"), - Pair("Fuckit", "2883"), - Pair("Funsexydragonball", "2786"), - Pair("Futanari", "1732"), - Pair("Futanari Fan", "2787"), - Pair("Garabatoz", "2877"), - Pair("Gerph", "2889"), - Pair("GFI", "3123"), - Pair("Ghettoyouth", "2730"), - Pair("Gilftoon", "2619"), - Pair("Glassfish", "84"), - Pair("GNAW", "3084"), - Pair("Goat-Head", "3011"), - Pair("Greivs", "3136"), - Pair("Grigori", "2775"), - Pair("Grose", "2876"), - Pair("Gundam888", "2681"), - Pair("Hagfish", "2599"), - Pair("Hary Draws", "2752"), - Pair("Hioshiru", "2673"), - Pair("Hmage", "2822"), - Pair("Horny-Oni", "2947"), - Pair("Hoteggs102", "2925"), - Pair("InCase", "1927"), - Pair("Incest Candy", "3126"), - Pair("Incesto 3d", "310"), - Pair("Incognitymous", "2693"), - Pair("Inker Shike", "2895"), - Pair("Interracial", "364"), - Pair("Inusen", "2854"), - Pair("Inuyuru", "2699"), - Pair("isakishi", "2721"), - Pair("Jadenkaiba", "2064"), - Pair("javisuzumiya", "2823"), - Pair("Jay Marvel", "2135"), - Pair("Jay Naylor", "174"), - Pair("Jellcaps", "2818"), - Pair("Jhon Person", "135"), - Pair("Jitsch", "2835"), - Pair("Jkr", "718"), - Pair("JLullaby", "2680"), - Pair("John North", "2927"), - Pair("JohnJoseco", "2906"), - Pair("JooJoo", "3026"), - Pair("Joru", "2798"), - Pair("JZerosk", "2757"), - Pair("K/DA", "2667"), - Pair("Ka-iN", "2874"), - Pair("Kadath", "2700"), - Pair("Kannel", "2836"), - Pair("Kaos", "1994"), - Pair("Karmagik", "2943"), - Pair("Karmakaze", "2968"), - Pair("Katoto Chan", "2916"), - Pair("Kimmundo", "2669"), - Pair("Kinkamashe", "2873"), - Pair("Kinkymation", "2733"), - Pair("Kirtu", "107"), - Pair("Kiselrok", "3075"), - Pair("Kogeikun", "2738"), - Pair("KrasH", "2958"), - Pair("Krazy Krow", "2848"), - Pair("Kumi Pumi", "2771"), - Pair("l", "1"), - Pair("Lady Astaroth", "2722"), - Pair("LaundryMom", "2926"), - Pair("LawyBunne", "2744"), - Pair("Laz", "2933"), - Pair("Lemon Font", "2750"), - Pair("Lewdua", "2734"), - Pair("LilithN", "2991"), - Pair("Locofuria", "2578"), - Pair("Loonyjams", "2935"), - Pair("Los Simpsons XXX", "94"), - Pair("Lumo", "2858"), - Pair("MAD-Project", "2890"), - Pair("Magnificent Sexy Gals", "2942"), - Pair("Manaworld", "85"), - Pair("Manaworldcomics", "164"), - Pair("Manga hentai", "152"), - Pair("Maoukouichi", "2910"), - Pair("Marcos Crot", "3025"), - Pair("Matemi", "2741"), - Pair("Mavruda", "2865"), - Pair("MCC", "2843"), - Pair("Meesh", "2740"), - Pair("Meinfischer", "3063"), - Pair("Melkor Mancin", "169"), - Pair("Meowwithme", "2936"), - Pair("Metal Owl", "2694"), - Pair("Miles-DF", "2864"), - Pair("Milffur", "140"), - Pair("Milftoon", "13"), - Pair("Milftoonbeach", "1712"), - Pair("Milky Bunny", "3066"), - Pair("MissBehaviour", "2997"), - Pair("Mojarte", "1417"), - Pair("Moose", "2939"), - Pair("morganagod", "2917"), - Pair("Moval-X", "2785"), - Pair("Mr. E Comics", "2562"), - Pair("Mr. Estella", "3068"), - Pair("MrPotatoParty", "2712"), - Pair("My Bad Bunny", "2989"), - Pair("Myster Box", "2670"), - Pair("Nastee34", "2930"), - Pair("Neal D Anderson", "2725"), - Pair("nearphotison", "3039"), - Pair("nicekotatsu", "2749"), - Pair("nihaotomita", "2998"), - Pair("Nikipostat", "2824"), - Pair("NiniiDawns", "2937"), - Pair("Nisego", "2768"), - Pair("Norasuko", "2800"), - Pair("Noticias", "1664"), - Pair("nsfyosu", "2859"), - Pair("Nyoronyan", "2758"), - Pair("NyuroraXBigdon", "3134"), - Pair("O-tako Studios", "2723"), - Pair("Oh!Nice", "2896"), - Pair("OldFlameShotgun", "2884"), - Pair("Otomo-San", "2788"), - Pair("Pack Imagenes", "654"), - Pair("Pak009", "2819"), - Pair("Palcomix", "48"), - Pair("Pandora Box", "155"), - Pair("peculiart", "3000"), - Pair("Pegasus Smith", "2682"), - Pair("Personalami", "2789"), - Pair("PeterAndWhitney", "2860"), - Pair("Pia-Sama", "2797"), - Pair("PinkPawg", "2861"), - Pair("Pinktoon", "2868"), - Pair("Pixelboy", "2840"), - Pair("pleasure castle", "3081"), - Pair("Pokeporn", "1914"), - Pair("Polyle", "2952"), - Pair("Poonet", "648"), - Pair("Prism Girls", "1926"), - Pair("Privados", "858"), - Pair("PTDMCA", "2949"), - Pair("QTsunade", "2770"), - Pair("quad", "3051"), - Pair("Quarko-Muon", "2872"), - Pair("Queenchikki", "3062"), - Pair("QueenComplex", "2951"), - Pair("QueenTsunade", "2811"), - Pair("Queervanire", "2871"), - Pair("r_ex", "2898"), - Pair("Raidon-san", "2962"), - Pair("RanmaBooks", "1974"), - Pair("Razter", "2689"), - Pair("recreator 2099", "2671"), - Pair("Redboard", "2803"), - Pair("reddanmanic", "2867"), - Pair("Reinbach", "2888"), - Pair("Relatedguy", "2829"), - Pair("ReloadHB", "3012"), - Pair("Revolverwing", "2790"), - Pair("RickFoxxx", "1411"), - Pair("Rino99", "2934"), - Pair("Ripperelite", "2820"), - Pair("RobCiveCat", "2739"), - Pair("RogueArtLove", "2812"), - Pair("Rousfairly", "2776"), - Pair("Rukasu", "2778"), - Pair("Rupalulu", "3135"), - Pair("SakuSaku Panic", "2907"), - Pair("SaMelodii", "2701"), - Pair("SanePerson", "2683"), - Pair("SatyQ", "3024"), - Pair("Saurian", "2950"), - Pair("Selrock", "2886"), - Pair("Shadako26", "2780"), - Pair("Shadbase", "1713"), - Pair("Shadow2007x", "2781"), - Pair("ShadowFenrir", "3132"), - Pair("Sheela", "2690"), - Pair("Sillygirl", "2129"), - Pair("Sin Porno", "2266"), - Pair("Sinner", "2897"), - Pair("Sinope", "2985"), - Pair("Sirkowski", "2802"), - Pair("Skulltitti", "2918"), - Pair("SleepyGimp", "2911"), - Pair("Slipshine", "2791"), - Pair("Slypon", "2912"), - Pair("Smutichi", "2821"), - Pair("Snaketrap", "2940"), - Pair("Sorje", "2961"), - Pair("Spirale", "2870"), - Pair("Stereoscope Comics", "3054"), - Pair("Stormfeder", "2759"), - Pair("Sun1Sol", "2782"), - Pair("SunsetRiders7", "1705"), - Pair("Super Melons", "2850"), - Pair("Taboolicious", "88"), - Pair("Tease Comix", "2948"), - Pair("Tekuho", "2601"), - Pair("Tentabat", "2862"), - Pair("the dark mangaka", "2783"), - Pair("The Pit", "2792"), - Pair("thegoodbadart", "2684"), - Pair("TheKite", "2825"), - Pair("Theminus", "2828"), - Pair("TheNewGuy", "3018"), - Pair("TheOtherHalf", "2666"), - Pair("Tim Fischer", "2763"), - Pair("Totempole", "2746"), - Pair("TotesFleisch8", "2764"), - Pair("Tovio Rogers", "3056"), - Pair("Tracy Scops", "2648"), - Pair("Transmorpher DDS", "2672"), - Pair("Turtlechan", "2796"), - Pair("TvMx", "2793"), - Pair("Urakan", "3043"), - Pair("Uzonegro", "2695"), - Pair("V3rnon", "2973"), - Pair("Vaiderman", "3031"), - Pair("VentZX", "2575"), - Pair("Vercomicsporno", "1376"), - Pair("Watsup", "2863"), - Pair("Whargleblargle", "2844"), - Pair("Wherewolf", "2685"), - Pair("Witchking00", "1815"), - Pair("Wulfsaga", "2931"), - Pair("Xamrock", "2686"), - Pair("Xierra099", "2702"), - Pair("Xkit", "2703"), - Pair("Y3df", "86"), - Pair("Yamamoto", "3019"), - Pair("Yusioka", "3082"), - Pair("Zillionaire", "2807"), - Pair("Zzomp", "252"), - Pair("ZZZ Comics", "2839") - )) + private class Category : UriPartFilter( + "Filtrar por categoría", + arrayOf( + Pair("Ver todos", ""), + Pair("5ish", "2853"), + Pair("69", "1905"), + Pair("8muses", "856"), + Pair("Aarokira", "2668"), + Pair("ABBB", "3058"), + Pair("Absurd Stories", "2846"), + Pair("Adam 00", "1698"), + Pair("Aeolus", "2831"), + Pair("Afrobull", "3032"), + Pair("Alcor", "2837"), + Pair("angstrom", "2996"), + Pair("Anonymouse", "2851"), + Pair("Aoino Broom", "3086"), + Pair("Aquarina", "2727"), + Pair("Arabatos", "1780"), + Pair("Aroma Sensei", "2663"), + Pair("Art of jaguar", "167"), + Pair("Atreyu Studio", "3040"), + Pair("Awaerr", "2921"), + Pair("Bakuhaku", "2866"), + Pair("Bashfulbeckon", "2841"), + Pair("Bear123", "2814"), + Pair("Black and White", "361"), + Pair("Black House", "3044"), + Pair("Blackadder", "83"), + Pair("Blacky Chan", "2901"), + Pair("Blargsnarf", "2728"), + Pair("BlueVersusRed", "2963"), + Pair("Bnouait", "2706"), + Pair("Born to Die", "2982"), + Pair("Buena trama", "2579"), + Pair("Buru", "2736"), + Pair("Cagri", "2751"), + Pair("CallMePlisskin", "2960"), + Pair("Catfightcentral", "2691"), + Pair("cecyartbytenshi", "2799"), + Pair("Cheka.art", "2999"), + Pair("Cherry Mouse Street", "2891"), + Pair("cherry-gig", "2679"), + Pair("Chochi", "3085"), + Pair("ClaraLaine", "2697"), + Pair("Clasicos", "2553"), + Pair("Cobatsart", "2729"), + Pair("Comics porno", "6"), + Pair("Comics Porno 3D", "1910"), + Pair("Comics porno mexicano", "511"), + Pair("Comics XXX", "119"), + Pair("CrazyDad3d", "2657"), + Pair("Creeeen", "2922"), + Pair("Croc", "1684"), + Pair("Crock", "3004"), + Pair("Cyberunique", "2801"), + Pair("Danaelus", "3080"), + Pair("DankoDeadZone", "3055"), + Pair("Darkhatboy", "2856"), + Pair("DarkShadow", "2845"), + Pair("DarkToons Cave", "2893"), + Pair("Dasan", "2692"), + Pair("David Willis", "2816"), + Pair("Dboy", "3094"), + Pair("Dconthedancefloor", "2905"), + Pair("Degenerate", "2923"), + Pair("Diathorn", "2894"), + Pair("Dicasty", "2983"), + Pair("Dimedrolly", "3017"), + Pair("Dirtycomics", "2957"), + Pair("DMAYaichi", "2924"), + Pair("Dony", "2769"), + Pair("Doxy", "2698"), + Pair("Drawnsex", "9"), + Pair("DrCockula", "2708"), + Pair("Dude-doodle-do", "2984"), + Pair("ebluberry", "2842"), + Pair("Ecchi Kimochiii", "1948"), + Pair("EcchiFactor 2.0", "1911"), + Pair("Eirhjien", "2817"), + Pair("Eliana Asato", "2878"), + Pair("Ender Selya", "2774"), + Pair("Enessef-UU", "3124"), + Pair("ERN", "3010"), + Pair("Erotibot", "2711"), + Pair("Escoria", "2945"), + Pair("Evil Rick", "2946"), + Pair("FearingFun", "3057"), + Pair("Felsala", "2138"), + Pair("Fetishhand", "2932"), + Pair("Fikomi", "2887"), + Pair("Fixxxer", "2737"), + Pair("FLBL", "3050"), + Pair("Folo", "2762"), + Pair("Forked Tail", "2830"), + Pair("Fotonovelas XXX", "320"), + Pair("Freckles", "3095"), + Pair("Fred Perry", "2832"), + Pair("Freehand", "400"), + Pair("FrozenParody", "1766"), + Pair("Fuckit", "2883"), + Pair("Funsexydragonball", "2786"), + Pair("Futanari", "1732"), + Pair("Futanari Fan", "2787"), + Pair("Garabatoz", "2877"), + Pair("Gerph", "2889"), + Pair("GFI", "3123"), + Pair("Ghettoyouth", "2730"), + Pair("Gilftoon", "2619"), + Pair("Glassfish", "84"), + Pair("GNAW", "3084"), + Pair("Goat-Head", "3011"), + Pair("Greivs", "3136"), + Pair("Grigori", "2775"), + Pair("Grose", "2876"), + Pair("Gundam888", "2681"), + Pair("Hagfish", "2599"), + Pair("Hary Draws", "2752"), + Pair("Hioshiru", "2673"), + Pair("Hmage", "2822"), + Pair("Horny-Oni", "2947"), + Pair("Hoteggs102", "2925"), + Pair("InCase", "1927"), + Pair("Incest Candy", "3126"), + Pair("Incesto 3d", "310"), + Pair("Incognitymous", "2693"), + Pair("Inker Shike", "2895"), + Pair("Interracial", "364"), + Pair("Inusen", "2854"), + Pair("Inuyuru", "2699"), + Pair("isakishi", "2721"), + Pair("Jadenkaiba", "2064"), + Pair("javisuzumiya", "2823"), + Pair("Jay Marvel", "2135"), + Pair("Jay Naylor", "174"), + Pair("Jellcaps", "2818"), + Pair("Jhon Person", "135"), + Pair("Jitsch", "2835"), + Pair("Jkr", "718"), + Pair("JLullaby", "2680"), + Pair("John North", "2927"), + Pair("JohnJoseco", "2906"), + Pair("JooJoo", "3026"), + Pair("Joru", "2798"), + Pair("JZerosk", "2757"), + Pair("K/DA", "2667"), + Pair("Ka-iN", "2874"), + Pair("Kadath", "2700"), + Pair("Kannel", "2836"), + Pair("Kaos", "1994"), + Pair("Karmagik", "2943"), + Pair("Karmakaze", "2968"), + Pair("Katoto Chan", "2916"), + Pair("Kimmundo", "2669"), + Pair("Kinkamashe", "2873"), + Pair("Kinkymation", "2733"), + Pair("Kirtu", "107"), + Pair("Kiselrok", "3075"), + Pair("Kogeikun", "2738"), + Pair("KrasH", "2958"), + Pair("Krazy Krow", "2848"), + Pair("Kumi Pumi", "2771"), + Pair("l", "1"), + Pair("Lady Astaroth", "2722"), + Pair("LaundryMom", "2926"), + Pair("LawyBunne", "2744"), + Pair("Laz", "2933"), + Pair("Lemon Font", "2750"), + Pair("Lewdua", "2734"), + Pair("LilithN", "2991"), + Pair("Locofuria", "2578"), + Pair("Loonyjams", "2935"), + Pair("Los Simpsons XXX", "94"), + Pair("Lumo", "2858"), + Pair("MAD-Project", "2890"), + Pair("Magnificent Sexy Gals", "2942"), + Pair("Manaworld", "85"), + Pair("Manaworldcomics", "164"), + Pair("Manga hentai", "152"), + Pair("Maoukouichi", "2910"), + Pair("Marcos Crot", "3025"), + Pair("Matemi", "2741"), + Pair("Mavruda", "2865"), + Pair("MCC", "2843"), + Pair("Meesh", "2740"), + Pair("Meinfischer", "3063"), + Pair("Melkor Mancin", "169"), + Pair("Meowwithme", "2936"), + Pair("Metal Owl", "2694"), + Pair("Miles-DF", "2864"), + Pair("Milffur", "140"), + Pair("Milftoon", "13"), + Pair("Milftoonbeach", "1712"), + Pair("Milky Bunny", "3066"), + Pair("MissBehaviour", "2997"), + Pair("Mojarte", "1417"), + Pair("Moose", "2939"), + Pair("morganagod", "2917"), + Pair("Moval-X", "2785"), + Pair("Mr. E Comics", "2562"), + Pair("Mr. Estella", "3068"), + Pair("MrPotatoParty", "2712"), + Pair("My Bad Bunny", "2989"), + Pair("Myster Box", "2670"), + Pair("Nastee34", "2930"), + Pair("Neal D Anderson", "2725"), + Pair("nearphotison", "3039"), + Pair("nicekotatsu", "2749"), + Pair("nihaotomita", "2998"), + Pair("Nikipostat", "2824"), + Pair("NiniiDawns", "2937"), + Pair("Nisego", "2768"), + Pair("Norasuko", "2800"), + Pair("Noticias", "1664"), + Pair("nsfyosu", "2859"), + Pair("Nyoronyan", "2758"), + Pair("NyuroraXBigdon", "3134"), + Pair("O-tako Studios", "2723"), + Pair("Oh!Nice", "2896"), + Pair("OldFlameShotgun", "2884"), + Pair("Otomo-San", "2788"), + Pair("Pack Imagenes", "654"), + Pair("Pak009", "2819"), + Pair("Palcomix", "48"), + Pair("Pandora Box", "155"), + Pair("peculiart", "3000"), + Pair("Pegasus Smith", "2682"), + Pair("Personalami", "2789"), + Pair("PeterAndWhitney", "2860"), + Pair("Pia-Sama", "2797"), + Pair("PinkPawg", "2861"), + Pair("Pinktoon", "2868"), + Pair("Pixelboy", "2840"), + Pair("pleasure castle", "3081"), + Pair("Pokeporn", "1914"), + Pair("Polyle", "2952"), + Pair("Poonet", "648"), + Pair("Prism Girls", "1926"), + Pair("Privados", "858"), + Pair("PTDMCA", "2949"), + Pair("QTsunade", "2770"), + Pair("quad", "3051"), + Pair("Quarko-Muon", "2872"), + Pair("Queenchikki", "3062"), + Pair("QueenComplex", "2951"), + Pair("QueenTsunade", "2811"), + Pair("Queervanire", "2871"), + Pair("r_ex", "2898"), + Pair("Raidon-san", "2962"), + Pair("RanmaBooks", "1974"), + Pair("Razter", "2689"), + Pair("recreator 2099", "2671"), + Pair("Redboard", "2803"), + Pair("reddanmanic", "2867"), + Pair("Reinbach", "2888"), + Pair("Relatedguy", "2829"), + Pair("ReloadHB", "3012"), + Pair("Revolverwing", "2790"), + Pair("RickFoxxx", "1411"), + Pair("Rino99", "2934"), + Pair("Ripperelite", "2820"), + Pair("RobCiveCat", "2739"), + Pair("RogueArtLove", "2812"), + Pair("Rousfairly", "2776"), + Pair("Rukasu", "2778"), + Pair("Rupalulu", "3135"), + Pair("SakuSaku Panic", "2907"), + Pair("SaMelodii", "2701"), + Pair("SanePerson", "2683"), + Pair("SatyQ", "3024"), + Pair("Saurian", "2950"), + Pair("Selrock", "2886"), + Pair("Shadako26", "2780"), + Pair("Shadbase", "1713"), + Pair("Shadow2007x", "2781"), + Pair("ShadowFenrir", "3132"), + Pair("Sheela", "2690"), + Pair("Sillygirl", "2129"), + Pair("Sin Porno", "2266"), + Pair("Sinner", "2897"), + Pair("Sinope", "2985"), + Pair("Sirkowski", "2802"), + Pair("Skulltitti", "2918"), + Pair("SleepyGimp", "2911"), + Pair("Slipshine", "2791"), + Pair("Slypon", "2912"), + Pair("Smutichi", "2821"), + Pair("Snaketrap", "2940"), + Pair("Sorje", "2961"), + Pair("Spirale", "2870"), + Pair("Stereoscope Comics", "3054"), + Pair("Stormfeder", "2759"), + Pair("Sun1Sol", "2782"), + Pair("SunsetRiders7", "1705"), + Pair("Super Melons", "2850"), + Pair("Taboolicious", "88"), + Pair("Tease Comix", "2948"), + Pair("Tekuho", "2601"), + Pair("Tentabat", "2862"), + Pair("the dark mangaka", "2783"), + Pair("The Pit", "2792"), + Pair("thegoodbadart", "2684"), + Pair("TheKite", "2825"), + Pair("Theminus", "2828"), + Pair("TheNewGuy", "3018"), + Pair("TheOtherHalf", "2666"), + Pair("Tim Fischer", "2763"), + Pair("Totempole", "2746"), + Pair("TotesFleisch8", "2764"), + Pair("Tovio Rogers", "3056"), + Pair("Tracy Scops", "2648"), + Pair("Transmorpher DDS", "2672"), + Pair("Turtlechan", "2796"), + Pair("TvMx", "2793"), + Pair("Urakan", "3043"), + Pair("Uzonegro", "2695"), + Pair("V3rnon", "2973"), + Pair("Vaiderman", "3031"), + Pair("VentZX", "2575"), + Pair("Vercomicsporno", "1376"), + Pair("Watsup", "2863"), + Pair("Whargleblargle", "2844"), + Pair("Wherewolf", "2685"), + Pair("Witchking00", "1815"), + Pair("Wulfsaga", "2931"), + Pair("Xamrock", "2686"), + Pair("Xierra099", "2702"), + Pair("Xkit", "2703"), + Pair("Y3df", "86"), + Pair("Yamamoto", "3019"), + Pair("Yusioka", "3082"), + Pair("Zillionaire", "2807"), + Pair("Zzomp", "252"), + Pair("ZZZ Comics", "2839") + ) + ) } diff --git a/src/es/vcpvmp/src/eu/kanade/tachiyomi/extension/es/vcpvmp/VCPVMPFactory.kt b/src/es/vcpvmp/src/eu/kanade/tachiyomi/extension/es/vcpvmp/VCPVMPFactory.kt index 4eefdbfb9..5214fca5a 100644 --- a/src/es/vcpvmp/src/eu/kanade/tachiyomi/extension/es/vcpvmp/VCPVMPFactory.kt +++ b/src/es/vcpvmp/src/eu/kanade/tachiyomi/extension/es/vcpvmp/VCPVMPFactory.kt @@ -21,352 +21,358 @@ class VMP : VCPVMP("VMP", "https://vermangasporno.com") { // Array.from(document.querySelectorAll('div.tagcloud a.tag-cloud-link')) // .map(a => `Pair("${a.innerText}", "${a.href.replace('https://vermangasporno.com/genero/', '')}")`).join(',\n') // from https://vermangasporno.com/ - private class Genre : UriPartFilter("Filtrar por generos", arrayOf( - Pair("Ver todos", ""), - Pair("Ahegao", "ahegao"), - Pair("Anal", "anal"), - Pair("Big Ass", "big-ass"), - Pair("Big Breasts", "big-breasts"), - Pair("Blowjob", "blowjob"), - Pair("Cheating", "cheating"), - Pair("Colegiala", "colegiala"), - Pair("Fullcolor", "fullcolor"), - Pair("Group", "group"), - Pair("Incest", "incest"), - Pair("loli", "loli"), - Pair("Lolicon", "lolicon"), - Pair("Milf", "milf"), - Pair("Nakadashi", "nakadashi"), - Pair("Paizuri", "paizuri"), - Pair("Schoolgirl Uniform", "schoolgirl-uniform"), - Pair("Sole Female", "sole-female"), - Pair("Stockings", "stockings"), - Pair("Tetona", "tetona"), - Pair("Tetonas", "tetonas") - )) + private class Genre : UriPartFilter( + "Filtrar por generos", + arrayOf( + Pair("Ver todos", ""), + Pair("Ahegao", "ahegao"), + Pair("Anal", "anal"), + Pair("Big Ass", "big-ass"), + Pair("Big Breasts", "big-breasts"), + Pair("Blowjob", "blowjob"), + Pair("Cheating", "cheating"), + Pair("Colegiala", "colegiala"), + Pair("Fullcolor", "fullcolor"), + Pair("Group", "group"), + Pair("Incest", "incest"), + Pair("loli", "loli"), + Pair("Lolicon", "lolicon"), + Pair("Milf", "milf"), + Pair("Nakadashi", "nakadashi"), + Pair("Paizuri", "paizuri"), + Pair("Schoolgirl Uniform", "schoolgirl-uniform"), + Pair("Sole Female", "sole-female"), + Pair("Stockings", "stockings"), + Pair("Tetona", "tetona"), + Pair("Tetonas", "tetonas") + ) + ) // Array.from(document.querySelectorAll('form select#cat option.level-0')).map(a => `Pair("${a.innerText}", "${a.value}")`).join(',\n') // from https://vermangasporno.com/ - private class Category : UriPartFilter("Filtrar por categoría", arrayOf( - Pair("Ver todos", ""), - Pair("3×3 Eyes", "1325"), - Pair("Accel World", "175"), - Pair("Aikatsu!", "1983"), - Pair("Akame ga Kill!", "2235"), - Pair("Akaruku Tanoshiku Kimochiyoku", "2268"), - Pair("Amagami", "1194"), - Pair("Amagi Brilliant Park", "209"), - Pair("Amano Megumi ha Sukidarake!", "888"), - Pair("Ane Doki", "1121"), - Pair("Angel Beats!", "176"), - Pair("Ano Hi Mita Hana no Namae wo Bokutachi wa Mada Shiranai", "1097"), - Pair("Another", "177"), - Pair("Ansatsu Kyoushitsu", "2"), - Pair("Aoi Hana", "1256"), - Pair("Aquarion EVOL", "2089"), - Pair("Arcana Heart", "934"), - Pair("Arslan senki", "2068"), - Pair("Asobi ni Iku yo!", "1280"), - Pair("Azur Lane", "2076"), - Pair("Baka to Test to Shoukanjuu", "1202"), - Pair("Baka to Test to Shoukanjuu | Autor: Kurosawa Kiyotaka", "1201"), - Pair("Bakemonogatari", "931"), - Pair("Bakuman", "1259"), - Pair("BanG Dream!", "1863"), - Pair("Batman", "184"), - Pair("bijin onna joushi takizawa-san", "2104"), - Pair("Bishoujo Senshi Sailor Moon", "745"), - Pair("Bleach", "82"), - Pair("Blend S", "2102"), - Pair("Blood+", "189"), - Pair("Boku no Hero Academia", "245"), - Pair("Boku wa tomodachi ga sukunai", "674"), - Pair("Bokutachi wa Benkyou ga Dekinai", "2180"), - Pair("Boruto", "2071"), - Pair("Capcom", "251"), - Pair("Charlotte", "1444"), - Pair("Clannad", "102"), - Pair("Claymore", "170"), - Pair("Code Geass", "171"), - Pair("Cyberbots", "981"), - Pair("Dagashi Kashi", "733"), - Pair("Danganronpa", "92"), - Pair("Danmachi", "1042"), - Pair("Darker than Black", "995"), - Pair("Darker than Black: The Black Contractor", "1086"), - Pair("Darkstalkers", "1996"), - Pair("Date A Live", "670"), - Pair("Dead Or Alive", "233"), - Pair("Deadman Wonderland", "900"), - Pair("Denpa Onna to Seishun Otoko", "952"), - Pair("Dokidoki! Precure", "1919"), - Pair("Dr. Slump", "977"), - Pair("Dragon Quest", "3"), - Pair("dragon quest iii", "239"), - Pair("Dragonball", "4"), - Pair("Dragon’s Crown", "1064"), - Pair("DREAM C CLUB", "941"), - Pair("Dungeon Ni Deai O Motomeru No Wa Machigatteiru Darou Ka", "226"), - Pair("Dungeon ni Deai wo Motomeru no wa Machigatteiru Darou ka", "127"), - Pair("Dungeon Travelers", "1951"), - Pair("Dynasty Warriors", "1885"), - Pair("Enen no Shouboutai", "2169"), - Pair("Eromanga Sensei", "901"), - Pair("Evangelion", "172"), - Pair("Fairy Tail", "348"), - Pair("Fantasy Earth Zero", "1433"), - Pair("Fate Kaleid Liner Prisma Illya", "237"), - Pair("Fate Stay Night", "235"), - Pair("Fate/Grand Order", "891"), - Pair("Fate/hollow ataraxia", "1294"), - Pair("Fate/stay night", "722"), - Pair("Final Fantasy", "591"), - Pair("Final Figh", "1215"), - Pair("Freezing", "190"), - Pair("Full Metal Daemon: Muramasa", "122"), - Pair("Full Metal Panic", "167"), - Pair("Fullmetal Alchemist", "118"), - Pair("Furry", "1972"), - Pair("Gabriel Dropout", "884"), - Pair("Gakkou Gurashi!", "1047"), - Pair("Gate: Jieitai Kano Chi nite Kaku Tatakaeri", "761"), - Pair("Gate: Jieitai Kanochi nite", "241"), - Pair("Gate: Jieitai Kanochi nite Kaku Tatakaeri", "243"), - Pair("Gegege no Kitarou", "1862"), - Pair("Getsuyoubi no Tawawa", "250"), - Pair("Ghost In The Shell", "1898"), - Pair("Girls und Panzer", "904"), - Pair("Goblin Slayer", "2143"), - Pair("Gochuumon wa Usagi Desu ka?", "5"), - Pair("Golden Kamuy", "2227"), - Pair("Gotoubun no Hanayome", "2251"), - Pair("Granblue Fantasy", "257"), - Pair("Grisaia no Kajitsu", "6"), - Pair("Guilty Gear", "727"), - Pair("Gundam 00", "857"), - Pair("Gundam Build Divers", "2137"), - Pair("Gundam Build Fighters", "7"), - Pair("Gundam SEED Destiny", "103"), - Pair("Hanasaku Iroha", "1104"), - Pair("Hanayamata", "1947"), - Pair("Hatsujou no Genri", "2139"), - Pair("Hatsukoi Delusion", "1930"), - Pair("Hayate no Gotoku!", "595"), - Pair("He Is My Master", "104"), - Pair("Hentai Ouji to Warawanai Neko.", "8"), - Pair("Hibike! Euphonium", "9"), - Pair("Highschool Dead", "168"), - Pair("Highschool DxD", "105"), - Pair("Highschool of the Dead", "937"), - Pair("Himouto! Umaru-chan", "1039"), - Pair("Hokenshitsu no Shinigami", "1105"), - Pair("Honkai Gakuen", "2165"), - Pair("Hyperdimension Neptunia", "1567"), - Pair("Ichigo 100%", "151"), - Pair("Incesto", "182"), - Pair("Infinite Stratos", "786"), - Pair("Isekai Maou to Shoukan Shoujo no Dorei Majutsu", "2170"), - Pair("K-ON", "150"), - Pair("Kaguya Luna", "2249"), - Pair("Kaguya-sama wa Kokurasetai", "2157"), - Pair("Kaichou wa Maid-sama!", "1129"), - Pair("Kaiten Mutenmaru", "911"), - Pair("Kami Nomi zo Shiru Sekai", "1091"), - Pair("Kämpfer", "1120"), - Pair("Kangoku Gakuen", "1036"), - Pair("Kanon", "65"), - Pair("Kantai Collection: KanColle", "10"), - Pair("Kara no Kyoukai", "731"), - Pair("Kenichi", "96"), - Pair("Keroro Gunsou", "11"), - Pair("Kidou Senshi Gundam 00", "960"), - Pair("Kill la Kill", "1851"), - Pair("Kimetsu no Yaiba", "2149"), - Pair("Kimi ni Todoke", "1127"), - Pair("Kimi no Na wa", "2147"), - Pair("KimiKiss", "1182"), - Pair("King of fighter", "155"), - Pair("King of Fighters", "788"), - Pair("Kiratto Pri Chan", "2182"), - Pair("Kobayashi-san-chi no Maid Dragon", "299"), - Pair("Koihime Musou", "1188"), - Pair("Kono Subarashii Sekai Ni Syukufuku O", "259"), - Pair("Kono Subarashii Sekai ni Syukufuku o!", "853"), - Pair("Konosuba!", "2128"), - Pair("Kurogane no Linebarrels", "1150"), - Pair("Kyoukai Senjou no Horizon", "660"), - Pair("Ladies Versus Butlers", "204"), - Pair("Little Witch Academia", "2127"), - Pair("Love Hina", "94"), - Pair("Love Live Sunshine", "207"), - Pair("Love Live!", "716"), - Pair("Love Live! School Idol Project", "12"), - Pair("Love Plus", "1013"), - Pair("Lucky Star", "893"), - Pair("Macross Frontier", "157"), - Pair("Mahou Sensei Negima", "61"), - Pair("Mahou Sensei Negima!", "1331"), - Pair("Mahou Shoujo Lyrical Nanoha", "13"), - Pair("Mahouka Koukou no Rettousei", "93"), - Pair("Mai-Otome", "2271"), - Pair("Maji de Watashi ni Koi Shinasai!", "1218"), - Pair("Maria-sama ga Miteru", "902"), - Pair("Mayo Chiki!", "137"), - Pair("Medaka Box", "615"), - Pair("Minecraft", "2098"), - Pair("Mirai Nikki", "1138"), - Pair("Mitsuboshi Colors", "2307"), - Pair("Mobile Suit Gundam Tekketsu No Orphans", "297"), - Pair("Mondaiji-tachi ga Isekai Kara Kuru Sou Desu yo?", "1403"), - Pair("Monster Hunter", "1742"), - Pair("Monster Musume no Iru Nichijou", "683"), - Pair("Moyashimon", "1509"), - Pair("Musaigen no Phantom World", "298"), - Pair("Nagi no Asukara", "1830"), - Pair("Nanatsu no Taizai", "2299"), - Pair("Naruto", "14"), - Pair("Nazo no Kanojo X", "1247"), - Pair("Neon Genesis Evangelion", "62"), - Pair("Nisekoi", "246"), - Pair("Nyan Koi!", "978"), - Pair("Oboro Muramasa", "1116"), - Pair("Ojousama to Maid no Midarana Seikatsu", "1931"), - Pair("Okusan", "998"), - Pair("One Piece", "68"), - Pair("One Punch Man", "188"), - Pair("Onegai Teacher", "1076"), - Pair("Ookami to Koushinryou", "958"), - Pair("Ookami-san to Shichinin no Nakama-tachi", "1244"), - Pair("Ore no Imouto ga Konna ni Kawaii Wake ga Nai", "328"), - Pair("Original", "15"), - Pair("Oshiete! Galko-chan", "2136"), - Pair("Overlord", "686"), - Pair("Overwatch", "260"), - Pair("Panty & Stocking with Garterbelt", "1176"), - Pair("Papa no Iu Koto o Kikinasai!", "976"), - Pair("Parasyte", "1911"), - Pair("Persona 3", "255"), - Pair("Persona 4", "953"), - Pair("Persona 5", "2265"), - Pair("Pokemon", "148"), - Pair("Princess crown", "983"), - Pair("Princess Lover!", "1175"), - Pair("Prison School", "164"), - Pair("Psycho-Pass", "2275"), - Pair("Puella Magi Madoka Magica", "948"), - Pair("Queen’s Blade", "656"), - Pair("Ragnarok Online", "1243"), - Pair("Rakudai Kishi no Cavalry", "765"), - Pair("Rakuen Tsuihou -Expelled from Paradise-", "1045"), - Pair("Ranma 1/2", "767"), - Pair("Re:Zero kara Hajimeru Isekai Seikatsu", "161"), - Pair("Real Drive", "261"), - Pair("Rebuild of evangelion", "149"), - Pair("Renkin San-kyuu Magical? Pokaan", "737"), - Pair("Resident Evil", "1118"), - Pair("Rockman DASH", "1242"), - Pair("Rokka no Yuusha", "1600"), - Pair("Rosario + Vampire", "1204"), - Pair("Rosario Vampire", "234"), - Pair("Rozen Maiden", "1240"), - Pair("Rurouni Kenshin", "1520"), - Pair("Saber Marionette", "73"), - Pair("Saenai Heroine no Sodatekata", "926"), - Pair("Sailor Moon", "186"), - Pair("Saint Seiya", "66"), - Pair("Saki", "258"), - Pair("School Rumble", "191"), - Pair("Sekirei", "180"), - Pair("Sekiro: Shadows Die Twice", "2152"), - Pair("Serial Experiments Lain", "1498"), - Pair("Seto No Hanayome", "219"), - Pair("Shadowverse", "1957"), - Pair("Shantae", "1050"), - Pair("Shijou Saikyou no Deshi Kenichi", "1144"), - Pair("Shingeki no Kyojin", "169"), - Pair("Shingetsutan Tsukihime", "16"), - Pair("Shinmai Fukei Kiruko-san", "2207"), - Pair("Shinmai Maou no Testament", "17"), - Pair("Shinra Bansho", "18"), - Pair("Shinrabansho", "2063"), - Pair("Shinrabanshou", "1979"), - Pair("Shinryaku! Ika Musume", "1160"), - Pair("shirokuma cafe", "2074"), - Pair("Shitsuke Ai", "1630"), - Pair("Shokugeki no Soma", "152"), - Pair("Smile Precure", "858"), - Pair("Smile PreCure!", "1841"), - Pair("SNK", "252"), - Pair("Sora no Otoshimono", "20"), - Pair("Soul Eater", "158"), - Pair("Space Dandy", "1826"), - Pair("Spice and wolf", "154"), - Pair("Spider-man", "2140"), - Pair("Star Twinkle PreCure", "2310"), - Pair("Steins;Gate", "992"), - Pair("Street Fighter", "101"), - Pair("Strike Witches", "642"), - Pair("Subarashii Sekai ni Shukufuku wo!", "739"), - Pair("Suite Precure♪", "145"), - Pair("Super Sonico", "1102"), - Pair("Super Street Fighter IV", "802"), - Pair("Suzumiya Haruhi No Yuuutsu", "314"), - Pair("Sword art online", "147"), - Pair("taimanin asagi", "1869"), - Pair("Taimanin Yukikaze", "826"), - Pair("Tales of the Abyss", "1148"), - Pair("Tamako Market", "770"), - Pair("Tate no Yuusha no Nariagari", "2184"), - Pair("Teen Titans", "21"), - Pair("Tengen Toppa Gurren Lagann", "1190"), - Pair("Tengen Toppa Gurren-Lagann", "100"), - Pair("Tera", "2215"), - Pair("TERA The Exiled Realm of Arborea", "2214"), - Pair("Terra Formars", "2073"), - Pair("The iDOLM@STER", "22"), - Pair("the loud house", "2054"), - Pair("The OneChanbara", "1053"), - Pair("The Seven Deadly Sins", "620"), - Pair("To Love-Ru", "23"), - Pair("To Love-Ru Darkness", "1135"), - Pair("Toaru Kagaku no Railgun", "769"), - Pair("Toaru Majutsu no Index", "741"), - Pair("ToHeart", "1164"), - Pair("ToHeart2", "905"), - Pair("ToHeart2 AnotherDays", "97"), - Pair("Tokyo 7th Sisters", "762"), - Pair("Tokyo Ghoul", "864"), - Pair("Tonari no Seki-kun", "1768"), - Pair("Toradora", "192"), - Pair("Toradora!", "1152"), - Pair("Touhou Project", "24"), - Pair("Traducción Exclusiva", "2285"), - Pair("Tsujou Kougeki ga Zentai Kougeki de 2-kai Kougeki no Okaasan wa Suki desu ka?", "2131"), - Pair("Tsukihime", "877"), - Pair("Uchuu no Stellvia", "715"), - Pair("Utawarerumono", "1905"), - Pair("Uzaki-chan wa Asobitai!", "2146"), - Pair("Valkyria Chronicles", "1084"), - Pair("Vampire savior", "982"), - Pair("Vocaloid", "912"), - Pair("Watashi ga Motenai no wa Dou Kangaetemo Omaera ga Warui!", "1032"), - Pair("Witch Craft Works", "552"), - Pair("Witchblade", "1302"), - Pair("Wizard of Oz", "723"), - Pair("Yahari Ore no Seishun Love Come wa Machigatteiru", "967"), - Pair("Yakitate!! Japan", "1409"), - Pair("yatterman", "984"), - Pair("Yotsubato!", "1429"), - Pair("Yu-Gi-Oh! ZEXAL", "196"), - Pair("Yuru Yuri", "25"), - Pair("YuruYuri", "894"), - Pair("Zegapain", "1330"), - Pair("Zero no Tsukaima", "26"), - Pair("Zettai Junpaku Mahou Shoujo", "1918"), - Pair("Zettai Karen Children", "1417"), - Pair("Zoids Shinseiki Zero", "153"), - Pair("Zombieland Saga", "2059") - )) + private class Category : UriPartFilter( + "Filtrar por categoría", + arrayOf( + Pair("Ver todos", ""), + Pair("3×3 Eyes", "1325"), + Pair("Accel World", "175"), + Pair("Aikatsu!", "1983"), + Pair("Akame ga Kill!", "2235"), + Pair("Akaruku Tanoshiku Kimochiyoku", "2268"), + Pair("Amagami", "1194"), + Pair("Amagi Brilliant Park", "209"), + Pair("Amano Megumi ha Sukidarake!", "888"), + Pair("Ane Doki", "1121"), + Pair("Angel Beats!", "176"), + Pair("Ano Hi Mita Hana no Namae wo Bokutachi wa Mada Shiranai", "1097"), + Pair("Another", "177"), + Pair("Ansatsu Kyoushitsu", "2"), + Pair("Aoi Hana", "1256"), + Pair("Aquarion EVOL", "2089"), + Pair("Arcana Heart", "934"), + Pair("Arslan senki", "2068"), + Pair("Asobi ni Iku yo!", "1280"), + Pair("Azur Lane", "2076"), + Pair("Baka to Test to Shoukanjuu", "1202"), + Pair("Baka to Test to Shoukanjuu | Autor: Kurosawa Kiyotaka", "1201"), + Pair("Bakemonogatari", "931"), + Pair("Bakuman", "1259"), + Pair("BanG Dream!", "1863"), + Pair("Batman", "184"), + Pair("bijin onna joushi takizawa-san", "2104"), + Pair("Bishoujo Senshi Sailor Moon", "745"), + Pair("Bleach", "82"), + Pair("Blend S", "2102"), + Pair("Blood+", "189"), + Pair("Boku no Hero Academia", "245"), + Pair("Boku wa tomodachi ga sukunai", "674"), + Pair("Bokutachi wa Benkyou ga Dekinai", "2180"), + Pair("Boruto", "2071"), + Pair("Capcom", "251"), + Pair("Charlotte", "1444"), + Pair("Clannad", "102"), + Pair("Claymore", "170"), + Pair("Code Geass", "171"), + Pair("Cyberbots", "981"), + Pair("Dagashi Kashi", "733"), + Pair("Danganronpa", "92"), + Pair("Danmachi", "1042"), + Pair("Darker than Black", "995"), + Pair("Darker than Black: The Black Contractor", "1086"), + Pair("Darkstalkers", "1996"), + Pair("Date A Live", "670"), + Pair("Dead Or Alive", "233"), + Pair("Deadman Wonderland", "900"), + Pair("Denpa Onna to Seishun Otoko", "952"), + Pair("Dokidoki! Precure", "1919"), + Pair("Dr. Slump", "977"), + Pair("Dragon Quest", "3"), + Pair("dragon quest iii", "239"), + Pair("Dragonball", "4"), + Pair("Dragon’s Crown", "1064"), + Pair("DREAM C CLUB", "941"), + Pair("Dungeon Ni Deai O Motomeru No Wa Machigatteiru Darou Ka", "226"), + Pair("Dungeon ni Deai wo Motomeru no wa Machigatteiru Darou ka", "127"), + Pair("Dungeon Travelers", "1951"), + Pair("Dynasty Warriors", "1885"), + Pair("Enen no Shouboutai", "2169"), + Pair("Eromanga Sensei", "901"), + Pair("Evangelion", "172"), + Pair("Fairy Tail", "348"), + Pair("Fantasy Earth Zero", "1433"), + Pair("Fate Kaleid Liner Prisma Illya", "237"), + Pair("Fate Stay Night", "235"), + Pair("Fate/Grand Order", "891"), + Pair("Fate/hollow ataraxia", "1294"), + Pair("Fate/stay night", "722"), + Pair("Final Fantasy", "591"), + Pair("Final Figh", "1215"), + Pair("Freezing", "190"), + Pair("Full Metal Daemon: Muramasa", "122"), + Pair("Full Metal Panic", "167"), + Pair("Fullmetal Alchemist", "118"), + Pair("Furry", "1972"), + Pair("Gabriel Dropout", "884"), + Pair("Gakkou Gurashi!", "1047"), + Pair("Gate: Jieitai Kano Chi nite Kaku Tatakaeri", "761"), + Pair("Gate: Jieitai Kanochi nite", "241"), + Pair("Gate: Jieitai Kanochi nite Kaku Tatakaeri", "243"), + Pair("Gegege no Kitarou", "1862"), + Pair("Getsuyoubi no Tawawa", "250"), + Pair("Ghost In The Shell", "1898"), + Pair("Girls und Panzer", "904"), + Pair("Goblin Slayer", "2143"), + Pair("Gochuumon wa Usagi Desu ka?", "5"), + Pair("Golden Kamuy", "2227"), + Pair("Gotoubun no Hanayome", "2251"), + Pair("Granblue Fantasy", "257"), + Pair("Grisaia no Kajitsu", "6"), + Pair("Guilty Gear", "727"), + Pair("Gundam 00", "857"), + Pair("Gundam Build Divers", "2137"), + Pair("Gundam Build Fighters", "7"), + Pair("Gundam SEED Destiny", "103"), + Pair("Hanasaku Iroha", "1104"), + Pair("Hanayamata", "1947"), + Pair("Hatsujou no Genri", "2139"), + Pair("Hatsukoi Delusion", "1930"), + Pair("Hayate no Gotoku!", "595"), + Pair("He Is My Master", "104"), + Pair("Hentai Ouji to Warawanai Neko.", "8"), + Pair("Hibike! Euphonium", "9"), + Pair("Highschool Dead", "168"), + Pair("Highschool DxD", "105"), + Pair("Highschool of the Dead", "937"), + Pair("Himouto! Umaru-chan", "1039"), + Pair("Hokenshitsu no Shinigami", "1105"), + Pair("Honkai Gakuen", "2165"), + Pair("Hyperdimension Neptunia", "1567"), + Pair("Ichigo 100%", "151"), + Pair("Incesto", "182"), + Pair("Infinite Stratos", "786"), + Pair("Isekai Maou to Shoukan Shoujo no Dorei Majutsu", "2170"), + Pair("K-ON", "150"), + Pair("Kaguya Luna", "2249"), + Pair("Kaguya-sama wa Kokurasetai", "2157"), + Pair("Kaichou wa Maid-sama!", "1129"), + Pair("Kaiten Mutenmaru", "911"), + Pair("Kami Nomi zo Shiru Sekai", "1091"), + Pair("Kämpfer", "1120"), + Pair("Kangoku Gakuen", "1036"), + Pair("Kanon", "65"), + Pair("Kantai Collection: KanColle", "10"), + Pair("Kara no Kyoukai", "731"), + Pair("Kenichi", "96"), + Pair("Keroro Gunsou", "11"), + Pair("Kidou Senshi Gundam 00", "960"), + Pair("Kill la Kill", "1851"), + Pair("Kimetsu no Yaiba", "2149"), + Pair("Kimi ni Todoke", "1127"), + Pair("Kimi no Na wa", "2147"), + Pair("KimiKiss", "1182"), + Pair("King of fighter", "155"), + Pair("King of Fighters", "788"), + Pair("Kiratto Pri Chan", "2182"), + Pair("Kobayashi-san-chi no Maid Dragon", "299"), + Pair("Koihime Musou", "1188"), + Pair("Kono Subarashii Sekai Ni Syukufuku O", "259"), + Pair("Kono Subarashii Sekai ni Syukufuku o!", "853"), + Pair("Konosuba!", "2128"), + Pair("Kurogane no Linebarrels", "1150"), + Pair("Kyoukai Senjou no Horizon", "660"), + Pair("Ladies Versus Butlers", "204"), + Pair("Little Witch Academia", "2127"), + Pair("Love Hina", "94"), + Pair("Love Live Sunshine", "207"), + Pair("Love Live!", "716"), + Pair("Love Live! School Idol Project", "12"), + Pair("Love Plus", "1013"), + Pair("Lucky Star", "893"), + Pair("Macross Frontier", "157"), + Pair("Mahou Sensei Negima", "61"), + Pair("Mahou Sensei Negima!", "1331"), + Pair("Mahou Shoujo Lyrical Nanoha", "13"), + Pair("Mahouka Koukou no Rettousei", "93"), + Pair("Mai-Otome", "2271"), + Pair("Maji de Watashi ni Koi Shinasai!", "1218"), + Pair("Maria-sama ga Miteru", "902"), + Pair("Mayo Chiki!", "137"), + Pair("Medaka Box", "615"), + Pair("Minecraft", "2098"), + Pair("Mirai Nikki", "1138"), + Pair("Mitsuboshi Colors", "2307"), + Pair("Mobile Suit Gundam Tekketsu No Orphans", "297"), + Pair("Mondaiji-tachi ga Isekai Kara Kuru Sou Desu yo?", "1403"), + Pair("Monster Hunter", "1742"), + Pair("Monster Musume no Iru Nichijou", "683"), + Pair("Moyashimon", "1509"), + Pair("Musaigen no Phantom World", "298"), + Pair("Nagi no Asukara", "1830"), + Pair("Nanatsu no Taizai", "2299"), + Pair("Naruto", "14"), + Pair("Nazo no Kanojo X", "1247"), + Pair("Neon Genesis Evangelion", "62"), + Pair("Nisekoi", "246"), + Pair("Nyan Koi!", "978"), + Pair("Oboro Muramasa", "1116"), + Pair("Ojousama to Maid no Midarana Seikatsu", "1931"), + Pair("Okusan", "998"), + Pair("One Piece", "68"), + Pair("One Punch Man", "188"), + Pair("Onegai Teacher", "1076"), + Pair("Ookami to Koushinryou", "958"), + Pair("Ookami-san to Shichinin no Nakama-tachi", "1244"), + Pair("Ore no Imouto ga Konna ni Kawaii Wake ga Nai", "328"), + Pair("Original", "15"), + Pair("Oshiete! Galko-chan", "2136"), + Pair("Overlord", "686"), + Pair("Overwatch", "260"), + Pair("Panty & Stocking with Garterbelt", "1176"), + Pair("Papa no Iu Koto o Kikinasai!", "976"), + Pair("Parasyte", "1911"), + Pair("Persona 3", "255"), + Pair("Persona 4", "953"), + Pair("Persona 5", "2265"), + Pair("Pokemon", "148"), + Pair("Princess crown", "983"), + Pair("Princess Lover!", "1175"), + Pair("Prison School", "164"), + Pair("Psycho-Pass", "2275"), + Pair("Puella Magi Madoka Magica", "948"), + Pair("Queen’s Blade", "656"), + Pair("Ragnarok Online", "1243"), + Pair("Rakudai Kishi no Cavalry", "765"), + Pair("Rakuen Tsuihou -Expelled from Paradise-", "1045"), + Pair("Ranma 1/2", "767"), + Pair("Re:Zero kara Hajimeru Isekai Seikatsu", "161"), + Pair("Real Drive", "261"), + Pair("Rebuild of evangelion", "149"), + Pair("Renkin San-kyuu Magical? Pokaan", "737"), + Pair("Resident Evil", "1118"), + Pair("Rockman DASH", "1242"), + Pair("Rokka no Yuusha", "1600"), + Pair("Rosario + Vampire", "1204"), + Pair("Rosario Vampire", "234"), + Pair("Rozen Maiden", "1240"), + Pair("Rurouni Kenshin", "1520"), + Pair("Saber Marionette", "73"), + Pair("Saenai Heroine no Sodatekata", "926"), + Pair("Sailor Moon", "186"), + Pair("Saint Seiya", "66"), + Pair("Saki", "258"), + Pair("School Rumble", "191"), + Pair("Sekirei", "180"), + Pair("Sekiro: Shadows Die Twice", "2152"), + Pair("Serial Experiments Lain", "1498"), + Pair("Seto No Hanayome", "219"), + Pair("Shadowverse", "1957"), + Pair("Shantae", "1050"), + Pair("Shijou Saikyou no Deshi Kenichi", "1144"), + Pair("Shingeki no Kyojin", "169"), + Pair("Shingetsutan Tsukihime", "16"), + Pair("Shinmai Fukei Kiruko-san", "2207"), + Pair("Shinmai Maou no Testament", "17"), + Pair("Shinra Bansho", "18"), + Pair("Shinrabansho", "2063"), + Pair("Shinrabanshou", "1979"), + Pair("Shinryaku! Ika Musume", "1160"), + Pair("shirokuma cafe", "2074"), + Pair("Shitsuke Ai", "1630"), + Pair("Shokugeki no Soma", "152"), + Pair("Smile Precure", "858"), + Pair("Smile PreCure!", "1841"), + Pair("SNK", "252"), + Pair("Sora no Otoshimono", "20"), + Pair("Soul Eater", "158"), + Pair("Space Dandy", "1826"), + Pair("Spice and wolf", "154"), + Pair("Spider-man", "2140"), + Pair("Star Twinkle PreCure", "2310"), + Pair("Steins;Gate", "992"), + Pair("Street Fighter", "101"), + Pair("Strike Witches", "642"), + Pair("Subarashii Sekai ni Shukufuku wo!", "739"), + Pair("Suite Precure♪", "145"), + Pair("Super Sonico", "1102"), + Pair("Super Street Fighter IV", "802"), + Pair("Suzumiya Haruhi No Yuuutsu", "314"), + Pair("Sword art online", "147"), + Pair("taimanin asagi", "1869"), + Pair("Taimanin Yukikaze", "826"), + Pair("Tales of the Abyss", "1148"), + Pair("Tamako Market", "770"), + Pair("Tate no Yuusha no Nariagari", "2184"), + Pair("Teen Titans", "21"), + Pair("Tengen Toppa Gurren Lagann", "1190"), + Pair("Tengen Toppa Gurren-Lagann", "100"), + Pair("Tera", "2215"), + Pair("TERA The Exiled Realm of Arborea", "2214"), + Pair("Terra Formars", "2073"), + Pair("The iDOLM@STER", "22"), + Pair("the loud house", "2054"), + Pair("The OneChanbara", "1053"), + Pair("The Seven Deadly Sins", "620"), + Pair("To Love-Ru", "23"), + Pair("To Love-Ru Darkness", "1135"), + Pair("Toaru Kagaku no Railgun", "769"), + Pair("Toaru Majutsu no Index", "741"), + Pair("ToHeart", "1164"), + Pair("ToHeart2", "905"), + Pair("ToHeart2 AnotherDays", "97"), + Pair("Tokyo 7th Sisters", "762"), + Pair("Tokyo Ghoul", "864"), + Pair("Tonari no Seki-kun", "1768"), + Pair("Toradora", "192"), + Pair("Toradora!", "1152"), + Pair("Touhou Project", "24"), + Pair("Traducción Exclusiva", "2285"), + Pair("Tsujou Kougeki ga Zentai Kougeki de 2-kai Kougeki no Okaasan wa Suki desu ka?", "2131"), + Pair("Tsukihime", "877"), + Pair("Uchuu no Stellvia", "715"), + Pair("Utawarerumono", "1905"), + Pair("Uzaki-chan wa Asobitai!", "2146"), + Pair("Valkyria Chronicles", "1084"), + Pair("Vampire savior", "982"), + Pair("Vocaloid", "912"), + Pair("Watashi ga Motenai no wa Dou Kangaetemo Omaera ga Warui!", "1032"), + Pair("Witch Craft Works", "552"), + Pair("Witchblade", "1302"), + Pair("Wizard of Oz", "723"), + Pair("Yahari Ore no Seishun Love Come wa Machigatteiru", "967"), + Pair("Yakitate!! Japan", "1409"), + Pair("yatterman", "984"), + Pair("Yotsubato!", "1429"), + Pair("Yu-Gi-Oh! ZEXAL", "196"), + Pair("Yuru Yuri", "25"), + Pair("YuruYuri", "894"), + Pair("Zegapain", "1330"), + Pair("Zero no Tsukaima", "26"), + Pair("Zettai Junpaku Mahou Shoujo", "1918"), + Pair("Zettai Karen Children", "1417"), + Pair("Zoids Shinseiki Zero", "153"), + Pair("Zombieland Saga", "2059") + ) + ) } open class UriPartFilter(displayName: String, private val vals: Array<Pair<String, String>>) : diff --git a/src/es/zahard/src/eu/kanade/tachiyomi/extension/es/zahard/Zahard.kt b/src/es/zahard/src/eu/kanade/tachiyomi/extension/es/zahard/Zahard.kt index c31ea68ca..b7e37e644 100644 --- a/src/es/zahard/src/eu/kanade/tachiyomi/extension/es/zahard/Zahard.kt +++ b/src/es/zahard/src/eu/kanade/tachiyomi/extension/es/zahard/Zahard.kt @@ -100,66 +100,74 @@ class Zahard : ParsedHttpSource() { TypeFilter(), GenreFilter() ) - private class TypeFilter : UriSelectFilter("Type", "biblioteca", arrayOf( - Pair("all", "All"), - Pair("manga", "Manga"), - Pair("manhwa", "Manhwa"), - Pair("manhua", "Manhua") - )) + private class TypeFilter : UriSelectFilter( + "Type", + "biblioteca", + arrayOf( + Pair("all", "All"), + Pair("manga", "Manga"), + Pair("manhwa", "Manhwa"), + Pair("manhua", "Manhua") + ) + ) - private class GenreFilter : UriSelectFilter("Genre", "genero", arrayOf( - Pair("all", "ALL"), - Pair("accion", "Acción"), - Pair("aventura", "Aventura"), - Pair("comedia", "Comedia"), - Pair("drama", "Drama"), - Pair("recuentos-de-la-vida", "Recuentos de la vida"), - Pair("ecchi", "Ecchi"), - Pair("fantasia", "Fantasia"), - Pair("magia", "Magia"), - Pair("sobrenatural", "Sobrenatural"), - Pair("horror", "Horror"), - Pair("misterio", "Misterio"), - Pair("psicologico", "Psicológico"), - Pair("romance", "Romance"), - Pair("ciencia-ficcion", "Ciencia Ficción"), - Pair("thriller", "Thriller"), - Pair("deporte", "Deporte"), - Pair("girls-love", "Girls Love"), - Pair("boys-love", "Boys Love"), - Pair("harem", "Harem"), - Pair("mecha", "Mecha"), - Pair("supervivencia", "Supervivencia"), - Pair("reencarnacion", "Reencarnación"), - Pair("gore", "Gore"), - Pair("apocaliptico", "Apocalíptico"), - Pair("tragedia", "Tragedia"), - Pair("vida-escolar", "Vida Escolar"), - Pair("historia", "Historia"), - Pair("militar", "Militar"), - Pair("policiaco", "Policiaco"), - Pair("crimen", "Crimen"), - Pair("superpoderes", "Superpoderes"), - Pair("vampiros", "Vampiros"), - Pair("artes-marciales", "Artes Marciales"), - Pair("samurai", "Samurái"), - Pair("genero-bender", "Género Bender"), - Pair("realidad-virtual", "Realidad Virtual"), - Pair("ciberpunk", "Ciberpunk"), - Pair("musica", "Musica"), - Pair("parodia", "Parodia"), - Pair("animacion", "Animación"), - Pair("demonios", "Demonios"), - Pair("familia", "Familia"), - Pair("extranjero", "Extranjero"), - Pair("ni%C3%B1os", "Niños"), - Pair("realidad", "Realidad"), - Pair("telenovela", "Telenovela"), - Pair("guerra", "Guerra"), - Pair("oeste", "Oeste"), - Pair("hentai", "hentai"), - Pair("Comics", "Comics") - )) + private class GenreFilter : UriSelectFilter( + "Genre", + "genero", + arrayOf( + Pair("all", "ALL"), + Pair("accion", "Acción"), + Pair("aventura", "Aventura"), + Pair("comedia", "Comedia"), + Pair("drama", "Drama"), + Pair("recuentos-de-la-vida", "Recuentos de la vida"), + Pair("ecchi", "Ecchi"), + Pair("fantasia", "Fantasia"), + Pair("magia", "Magia"), + Pair("sobrenatural", "Sobrenatural"), + Pair("horror", "Horror"), + Pair("misterio", "Misterio"), + Pair("psicologico", "Psicológico"), + Pair("romance", "Romance"), + Pair("ciencia-ficcion", "Ciencia Ficción"), + Pair("thriller", "Thriller"), + Pair("deporte", "Deporte"), + Pair("girls-love", "Girls Love"), + Pair("boys-love", "Boys Love"), + Pair("harem", "Harem"), + Pair("mecha", "Mecha"), + Pair("supervivencia", "Supervivencia"), + Pair("reencarnacion", "Reencarnación"), + Pair("gore", "Gore"), + Pair("apocaliptico", "Apocalíptico"), + Pair("tragedia", "Tragedia"), + Pair("vida-escolar", "Vida Escolar"), + Pair("historia", "Historia"), + Pair("militar", "Militar"), + Pair("policiaco", "Policiaco"), + Pair("crimen", "Crimen"), + Pair("superpoderes", "Superpoderes"), + Pair("vampiros", "Vampiros"), + Pair("artes-marciales", "Artes Marciales"), + Pair("samurai", "Samurái"), + Pair("genero-bender", "Género Bender"), + Pair("realidad-virtual", "Realidad Virtual"), + Pair("ciberpunk", "Ciberpunk"), + Pair("musica", "Musica"), + Pair("parodia", "Parodia"), + Pair("animacion", "Animación"), + Pair("demonios", "Demonios"), + Pair("familia", "Familia"), + Pair("extranjero", "Extranjero"), + Pair("ni%C3%B1os", "Niños"), + Pair("realidad", "Realidad"), + Pair("telenovela", "Telenovela"), + Pair("guerra", "Guerra"), + Pair("oeste", "Oeste"), + Pair("hentai", "hentai"), + Pair("Comics", "Comics") + ) + ) private open class UriSelectFilter( displayName: String, diff --git a/src/fr/kangaryu/src/eu/kanade/tachiyomi/extension/fr/kangaryu/Kangaryu.kt b/src/fr/kangaryu/src/eu/kanade/tachiyomi/extension/fr/kangaryu/Kangaryu.kt index 8399ae1ef..52be60e49 100644 --- a/src/fr/kangaryu/src/eu/kanade/tachiyomi/extension/fr/kangaryu/Kangaryu.kt +++ b/src/fr/kangaryu/src/eu/kanade/tachiyomi/extension/fr/kangaryu/Kangaryu.kt @@ -13,13 +13,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class Kangaryu : ParsedHttpSource() { diff --git a/src/fr/mangakawaii/src/eu/kanade/tachiyomi/extension/fr/mangakawaii/MangaKawaii.kt b/src/fr/mangakawaii/src/eu/kanade/tachiyomi/extension/fr/mangakawaii/MangaKawaii.kt index f1c2fd1f3..2863f4d42 100644 --- a/src/fr/mangakawaii/src/eu/kanade/tachiyomi/extension/fr/mangakawaii/MangaKawaii.kt +++ b/src/fr/mangakawaii/src/eu/kanade/tachiyomi/extension/fr/mangakawaii/MangaKawaii.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MangaKawaii : ParsedHttpSource() { @@ -75,7 +75,7 @@ class MangaKawaii : ParsedHttpSource() { } private fun parseDate(date: String): Long { - return SimpleDateFormat("dd.MM.yyyy", Locale.US).parse(date).time + return SimpleDateFormat("dd.MM.yyyy", Locale.US).parse(date)?.time ?: 0L } override fun mangaDetailsParse(document: Document): SManga { diff --git a/src/fr/scantrad/src/eu/kanade/tachiyomi/extension/fr/scantrad/Scantrad.kt b/src/fr/scantrad/src/eu/kanade/tachiyomi/extension/fr/scantrad/Scantrad.kt index 799d4a813..1ed006d90 100644 --- a/src/fr/scantrad/src/eu/kanade/tachiyomi/extension/fr/scantrad/Scantrad.kt +++ b/src/fr/scantrad/src/eu/kanade/tachiyomi/extension/fr/scantrad/Scantrad.kt @@ -9,15 +9,15 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class Scantrad : ParsedHttpSource() { diff --git a/src/fr/scantradunion/src/eu/kanade/tachiyomi/extension/fr/scantradunion/ScantradUnion.kt b/src/fr/scantradunion/src/eu/kanade/tachiyomi/extension/fr/scantradunion/ScantradUnion.kt index 0160ff5bb..a6fa56044 100644 --- a/src/fr/scantradunion/src/eu/kanade/tachiyomi/extension/fr/scantradunion/ScantradUnion.kt +++ b/src/fr/scantradunion/src/eu/kanade/tachiyomi/extension/fr/scantradunion/ScantradUnion.kt @@ -6,12 +6,12 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class ScantradUnion : ParsedHttpSource() { override val name = "Scantrad Union" diff --git a/src/id/bacakomik/src/eu/kanade/tachiyomi/extension/id/bacakomik/Bacakomik.kt b/src/id/bacakomik/src/eu/kanade/tachiyomi/extension/id/bacakomik/Bacakomik.kt index 4019de8bf..a915d9566 100644 --- a/src/id/bacakomik/src/eu/kanade/tachiyomi/extension/id/bacakomik/Bacakomik.kt +++ b/src/id/bacakomik/src/eu/kanade/tachiyomi/extension/id/bacakomik/Bacakomik.kt @@ -86,24 +86,24 @@ class Bacakomik : ParsedHttpSource() { } return GET(url.build().toString(), headers) } -override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div.infoanime").first() - val descElement = document.select("div.desc > .entry-content.entry-content-single").first() - val sepName = infoElement.select(".infox > .spe > span:nth-child(2)").last() - val manga = SManga.create() - manga.author = sepName.ownText() - manga.artist = sepName.ownText() - val genres = mutableListOf<String>() - infoElement.select(".infox > .genre-info > a").forEach { element -> - val genre = element.text() - genres.add(genre) + override fun mangaDetailsParse(document: Document): SManga { + val infoElement = document.select("div.infoanime").first() + val descElement = document.select("div.desc > .entry-content.entry-content-single").first() + val sepName = infoElement.select(".infox > .spe > span:nth-child(2)").last() + val manga = SManga.create() + manga.author = sepName.ownText() + manga.artist = sepName.ownText() + val genres = mutableListOf<String>() + infoElement.select(".infox > .genre-info > a").forEach { element -> + val genre = element.text() + genres.add(genre) + } + manga.genre = genres.joinToString(", ") + manga.status = parseStatus(infoElement.select(".infox > .spe > span:nth-child(1)").text()) + manga.description = descElement.select("p").text() + manga.thumbnail_url = document.select(".thumb > img:nth-child(1)").attr("src") + return manga } - manga.genre = genres.joinToString(", ") - manga.status = parseStatus(infoElement.select(".infox > .spe > span:nth-child(1)").text()) - manga.description = descElement.select("p").text() - manga.thumbnail_url = document.select(".thumb > img:nth-child(1)").attr("src") - return manga -} private fun parseStatus(element: String): Int = when { element.toLowerCase().contains("ongoing") -> SManga.ONGOING @@ -160,28 +160,37 @@ override fun mangaDetailsParse(document: Document): SManga { private class YearFilter : Filter.Text("Year") - private class TypeFilter : UriPartFilter("Type", arrayOf( - Pair("Default", ""), - Pair("Manga", "Manga"), - Pair("Manhwa", "Manhwa"), - Pair("Manhua", "Manhua"), - Pair("Comic", "Comic") - )) + private class TypeFilter : UriPartFilter( + "Type", + arrayOf( + Pair("Default", ""), + Pair("Manga", "Manga"), + Pair("Manhwa", "Manhwa"), + Pair("Manhua", "Manhua"), + Pair("Comic", "Comic") + ) + ) - private class SortByFilter : UriPartFilter("Sort By", arrayOf( - Pair("Default", ""), - Pair("A-Z", "title"), - Pair("Z-A", "titlereverse"), - Pair("Latest Update", "update"), - Pair("Latest Added", "latest"), - Pair("Popular", "popular") - )) + private class SortByFilter : UriPartFilter( + "Sort By", + arrayOf( + Pair("Default", ""), + Pair("A-Z", "title"), + Pair("Z-A", "titlereverse"), + Pair("Latest Update", "update"), + Pair("Latest Added", "latest"), + Pair("Popular", "popular") + ) + ) - private class StatusFilter : UriPartFilter("Status", arrayOf( - Pair("All", ""), - Pair("Ongoing", "ongoing"), - Pair("Completed", "completed") - )) + private class StatusFilter : UriPartFilter( + "Status", + arrayOf( + Pair("All", ""), + Pair("Ongoing", "ongoing"), + Pair("Completed", "completed") + ) + ) private class Genre(name: String, val id: String = name) : Filter.TriState(name) private class GenreListFilter(genres: List<Genre>) : Filter.Group<Genre>("Genre", genres) diff --git a/src/id/bacamanga/src/eu/kanade/tachiyomi/extension/id/bacamanga/BacaManga.kt b/src/id/bacamanga/src/eu/kanade/tachiyomi/extension/id/bacamanga/BacaManga.kt index c5f49d2c1..37c02226f 100644 --- a/src/id/bacamanga/src/eu/kanade/tachiyomi/extension/id/bacamanga/BacaManga.kt +++ b/src/id/bacamanga/src/eu/kanade/tachiyomi/extension/id/bacamanga/BacaManga.kt @@ -9,10 +9,6 @@ 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 java.io.UnsupportedEncodingException -import java.net.URLDecoder -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -22,6 +18,10 @@ import org.json.JSONObject import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.io.UnsupportedEncodingException +import java.net.URLDecoder +import java.text.SimpleDateFormat +import java.util.Locale class BacaManga : ParsedHttpSource() { @@ -133,7 +133,7 @@ class BacaManga : ParsedHttpSource() { } private fun parseDate(date: String): Long { - return SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH).parse(date).time + return SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH).parse(date)?.time ?: 0L } override fun chapterListSelector() = ".lchx" @@ -186,101 +186,107 @@ class BacaManga : ParsedHttpSource() { private class YearFilter : Filter.Text("Year") - private class OrderByFilter : UriPartFilter("Sort by", arrayOf( + private class OrderByFilter : UriPartFilter( + "Sort by", + arrayOf( Pair("Default", ""), Pair("A-Z", "title"), Pair("Z-A", "titlereverse"), Pair("Latest Update", "update"), Pair("Latest Added", "latest"), Pair("Popular", "popular") - )) + ) + ) private class StatusFilter : Filter.TriState("Completed") - private class TypeFilter : UriPartFilter("Type", arrayOf( + private class TypeFilter : UriPartFilter( + "Type", + arrayOf( Pair("All", ""), Pair("Manga", "Manga"), Pair("Manhua", "Manhua"), Pair("Manhwa", "Manhwa") - )) + ) + ) private class Genre(name: String, val id: String = name) : Filter.CheckBox(name) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - Filter.Header("NOTE: Ignored if using text search!"), - Filter.Separator(), - AuthorFilter(), - Filter.Separator(), - YearFilter(), - Filter.Separator(), - StatusFilter(), - Filter.Separator(), - OrderByFilter(), - Filter.Separator(), - TypeFilter(), - Filter.Separator(), - GenreList(getGenreList()) + Filter.Header("NOTE: Ignored if using text search!"), + Filter.Separator(), + AuthorFilter(), + Filter.Separator(), + YearFilter(), + Filter.Separator(), + StatusFilter(), + Filter.Separator(), + OrderByFilter(), + Filter.Separator(), + TypeFilter(), + Filter.Separator(), + GenreList(getGenreList()) ) private fun getGenreList() = listOf( - Genre("Action", "action"), - Genre("Adult", "adult"), - Genre("Adventure", "adventure"), - Genre("Comedy", "comedy"), - Genre("Crime", "crime"), - Genre("Demons", "demons"), - Genre("Doujinshi", "doujinshi"), - Genre("Drama", "drama"), - Genre("Ecchi", "ecchi"), - Genre("Echi", "echi"), - Genre("Fantasy", "fantasy"), - Genre("Game", "game"), - Genre("Gender Bender", "gender-bender"), - Genre("Harem", "harem"), - Genre("Historical", "historical"), - Genre("Horor", "horor"), - Genre("Horror", "horror"), - Genre("Isekai", "isekai"), - Genre("Josei", "josei"), - Genre("Magic", "magic"), - Genre("Manhua", "manhua"), - Genre("Manhwa", "manhwa"), - Genre("Martial Art", "martial-art"), - Genre("Martial Arts", "martial-arts"), - Genre("Mature", "mature"), - Genre("Mecha", "mecha"), - Genre("Medical", "medical"), - Genre("Military", "military"), - Genre("Monster", "monster"), - Genre("Monster Girls", "monster-girls"), - Genre("Music", "music"), - Genre("Mystery", "mystery"), - Genre("Post-Apocalyptic", "post-apocalyptic"), - Genre("Psychological", "psychological"), - Genre("Romance", "romance"), - Genre("School", "school"), - Genre("School Life", "school-life"), - Genre("Sci-Fi", "sci-fi"), - Genre("Seinen", "seinen"), - Genre("Shoujo Ai", "shoujo-ai"), - Genre("Shoujo", "shoujo"), - Genre("Shounen Ai", "shounen-ai"), - Genre("Shounen", "shounen"), - Genre("Si-fi", "si-fi"), - Genre("Slice of Life", "slice-of-life"), - Genre("Smut", "smut"), - Genre("Sports", "sports"), - Genre("Super Power", "super-power"), - Genre("Supernatural", "supernatural"), - Genre("Thriller", "thriller"), - Genre("Tragedy", "tragedy"), - Genre("Vampire", "vampire"), - Genre("Webtoon", "webtoon"), - Genre("Webtoons", "webtoons"), - Genre("Yaoi", "yaoi"), - Genre("Yuri", "yuri"), - Genre("Zombies", "zombies") + Genre("Action", "action"), + Genre("Adult", "adult"), + Genre("Adventure", "adventure"), + Genre("Comedy", "comedy"), + Genre("Crime", "crime"), + Genre("Demons", "demons"), + Genre("Doujinshi", "doujinshi"), + Genre("Drama", "drama"), + Genre("Ecchi", "ecchi"), + Genre("Echi", "echi"), + Genre("Fantasy", "fantasy"), + Genre("Game", "game"), + Genre("Gender Bender", "gender-bender"), + Genre("Harem", "harem"), + Genre("Historical", "historical"), + Genre("Horor", "horor"), + Genre("Horror", "horror"), + Genre("Isekai", "isekai"), + Genre("Josei", "josei"), + Genre("Magic", "magic"), + Genre("Manhua", "manhua"), + Genre("Manhwa", "manhwa"), + Genre("Martial Art", "martial-art"), + Genre("Martial Arts", "martial-arts"), + Genre("Mature", "mature"), + Genre("Mecha", "mecha"), + Genre("Medical", "medical"), + Genre("Military", "military"), + Genre("Monster", "monster"), + Genre("Monster Girls", "monster-girls"), + Genre("Music", "music"), + Genre("Mystery", "mystery"), + Genre("Post-Apocalyptic", "post-apocalyptic"), + Genre("Psychological", "psychological"), + Genre("Romance", "romance"), + Genre("School", "school"), + Genre("School Life", "school-life"), + Genre("Sci-Fi", "sci-fi"), + Genre("Seinen", "seinen"), + Genre("Shoujo Ai", "shoujo-ai"), + Genre("Shoujo", "shoujo"), + Genre("Shounen Ai", "shounen-ai"), + Genre("Shounen", "shounen"), + Genre("Si-fi", "si-fi"), + Genre("Slice of Life", "slice-of-life"), + Genre("Smut", "smut"), + Genre("Sports", "sports"), + Genre("Super Power", "super-power"), + Genre("Supernatural", "supernatural"), + Genre("Thriller", "thriller"), + Genre("Tragedy", "tragedy"), + Genre("Vampire", "vampire"), + Genre("Webtoon", "webtoon"), + Genre("Webtoons", "webtoons"), + Genre("Yaoi", "yaoi"), + Genre("Yuri", "yuri"), + Genre("Zombies", "zombies") ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : diff --git a/src/id/kiryuu/src/eu/kanade/tachiyomi/extension/id/kiryuu/Kiryuu.kt b/src/id/kiryuu/src/eu/kanade/tachiyomi/extension/id/kiryuu/Kiryuu.kt index f7bed8b3c..0d80ca1c8 100644 --- a/src/id/kiryuu/src/eu/kanade/tachiyomi/extension/id/kiryuu/Kiryuu.kt +++ b/src/id/kiryuu/src/eu/kanade/tachiyomi/extension/id/kiryuu/Kiryuu.kt @@ -164,28 +164,37 @@ class Kiryuu : ParsedHttpSource() { private class YearFilter : Filter.Text("Year") - private class TypeFilter : UriPartFilter("Type", arrayOf( - Pair("Default", ""), - Pair("Manga", "Manga"), - Pair("Manhwa", "Manhwa"), - Pair("Manhua", "Manhua"), - Pair("Comic", "Comic") - )) + private class TypeFilter : UriPartFilter( + "Type", + arrayOf( + Pair("Default", ""), + Pair("Manga", "Manga"), + Pair("Manhwa", "Manhwa"), + Pair("Manhua", "Manhua"), + Pair("Comic", "Comic") + ) + ) - private class SortByFilter : UriPartFilter("Sort By", arrayOf( - Pair("Default", ""), - Pair("A-Z", "title"), - Pair("Z-A", "titlereverse"), - Pair("Latest Update", "update"), - Pair("Latest Added", "latest"), - Pair("Popular", "popular") - )) + private class SortByFilter : UriPartFilter( + "Sort By", + arrayOf( + Pair("Default", ""), + Pair("A-Z", "title"), + Pair("Z-A", "titlereverse"), + Pair("Latest Update", "update"), + Pair("Latest Added", "latest"), + Pair("Popular", "popular") + ) + ) - private class StatusFilter : UriPartFilter("Status", arrayOf( - Pair("All", ""), - Pair("Ongoing", "ongoing"), - Pair("Completed", "completed") - )) + private class StatusFilter : UriPartFilter( + "Status", + arrayOf( + Pair("All", ""), + Pair("Ongoing", "ongoing"), + Pair("Completed", "completed") + ) + ) private class Genre(name: String, val id: String = name) : Filter.TriState(name) private class GenreListFilter(genres: List<Genre>) : Filter.Group<Genre>("Genre", genres) diff --git a/src/id/komikcast/src/eu/kanade/tachiyomi/extension/id/komikcast/Komikcast.kt b/src/id/komikcast/src/eu/kanade/tachiyomi/extension/id/komikcast/Komikcast.kt index a83ecb9aa..654b6e753 100644 --- a/src/id/komikcast/src/eu/kanade/tachiyomi/extension/id/komikcast/Komikcast.kt +++ b/src/id/komikcast/src/eu/kanade/tachiyomi/extension/id/komikcast/Komikcast.kt @@ -7,13 +7,13 @@ 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 java.util.Calendar import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar class Komikcast : ParsedHttpSource() { @@ -218,83 +218,89 @@ class Komikcast : ParsedHttpSource() { return GET(page.imageUrl!!, headers.build()) } - private class SortBy : UriPartFilter("Sort by", arrayOf( + private class SortBy : UriPartFilter( + "Sort by", + arrayOf( Pair("Default", ""), Pair("A-Z", "title"), Pair("Z-A", "titlereverse"), Pair("Latest Update", "update"), Pair("Latest Added", "latest"), Pair("Popular", "popular") - )) + ) + ) - private class Status : UriPartFilter("Status", arrayOf( + private class Status : UriPartFilter( + "Status", + arrayOf( Pair("All", ""), Pair("Ongoing", "Ongoing"), Pair("Completed", "Completed") - )) + ) + ) private class Genre(name: String, val id: String = name) : Filter.TriState(name) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Genres", genres) override fun getFilterList() = FilterList( - Filter.Header("NOTE: Ignored if using text search!"), - Filter.Separator(), - SortBy(), - Filter.Separator(), - Status(), - Filter.Separator(), - GenreList(getGenreList()) + Filter.Header("NOTE: Ignored if using text search!"), + Filter.Separator(), + SortBy(), + Filter.Separator(), + Status(), + Filter.Separator(), + GenreList(getGenreList()) ) private fun getGenreList() = listOf( - Genre("4-Koma", "4-koma"), - Genre("Action", "action"), - Genre("Adventure", "adventure"), - Genre("Comedy", "comedy"), - Genre("Cooking", "cooking"), - Genre("Demons", "demons"), - Genre("Drama", "drama"), - Genre("Ecchi", "ecchi"), - Genre("Fantasy", "fantasy"), - Genre("Game", "game"), - Genre("Gender Bender", "gender-bender"), - Genre("Harem", "harem"), - Genre("Historical", "historical"), - Genre("Horror", "horror"), - Genre("Isekai ", "isekai"), - Genre("Josei", "josei"), - Genre("Magic", "magic"), - Genre("Martial Arts", "martial-arts"), - Genre("Mature", "mature"), - Genre("Mecha", "mecha"), - Genre("Medical", "medical"), - Genre("Military", "military"), - Genre("Mistery", "mistery"), - Genre("Music", "music"), - Genre("Mystery", "mystery"), - Genre("Psychological", "psychological"), - Genre("Romance", "romance"), - Genre("School", "school"), - Genre("School Life", "school-life"), - Genre("Sci-Fi", "sci-fi"), - Genre("Seinen", "seinen"), - Genre("Shoujo", "shoujo"), - Genre("Shoujo Ai", "shoujo-ai"), - Genre("Shounen", "shounen"), - Genre("Shounen Ai", "shounen-ai"), - Genre("Slice of Life", "slice-of-life"), - Genre("Sports", "sports"), - Genre("Super Power", "super-power"), - Genre("Supernatural", "supernatural"), - Genre("Thriller", "thriller"), - Genre("Tragedy", "tragedy"), - Genre("Vampire", "vampire"), - Genre("Webtoons", "webtoons"), - Genre("Yuri", "yuri") + Genre("4-Koma", "4-koma"), + Genre("Action", "action"), + Genre("Adventure", "adventure"), + Genre("Comedy", "comedy"), + Genre("Cooking", "cooking"), + Genre("Demons", "demons"), + Genre("Drama", "drama"), + Genre("Ecchi", "ecchi"), + Genre("Fantasy", "fantasy"), + Genre("Game", "game"), + Genre("Gender Bender", "gender-bender"), + Genre("Harem", "harem"), + Genre("Historical", "historical"), + Genre("Horror", "horror"), + Genre("Isekai ", "isekai"), + Genre("Josei", "josei"), + Genre("Magic", "magic"), + Genre("Martial Arts", "martial-arts"), + Genre("Mature", "mature"), + Genre("Mecha", "mecha"), + Genre("Medical", "medical"), + Genre("Military", "military"), + Genre("Mistery", "mistery"), + Genre("Music", "music"), + Genre("Mystery", "mystery"), + Genre("Psychological", "psychological"), + Genre("Romance", "romance"), + Genre("School", "school"), + Genre("School Life", "school-life"), + Genre("Sci-Fi", "sci-fi"), + Genre("Seinen", "seinen"), + Genre("Shoujo", "shoujo"), + Genre("Shoujo Ai", "shoujo-ai"), + Genre("Shounen", "shounen"), + Genre("Shounen Ai", "shounen-ai"), + Genre("Slice of Life", "slice-of-life"), + Genre("Sports", "sports"), + Genre("Super Power", "super-power"), + Genre("Supernatural", "supernatural"), + Genre("Thriller", "thriller"), + Genre("Tragedy", "tragedy"), + Genre("Vampire", "vampire"), + Genre("Webtoons", "webtoons"), + Genre("Yuri", "yuri") ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } } diff --git a/src/id/komikindo/src/eu/kanade/tachiyomi/extension/id/komikindo/KomikIndo.kt b/src/id/komikindo/src/eu/kanade/tachiyomi/extension/id/komikindo/KomikIndo.kt index 92862d9a6..ec1cdb5f1 100644 --- a/src/id/komikindo/src/eu/kanade/tachiyomi/extension/id/komikindo/KomikIndo.kt +++ b/src/id/komikindo/src/eu/kanade/tachiyomi/extension/id/komikindo/KomikIndo.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Calendar class KomikIndo : ParsedHttpSource() { @@ -128,9 +128,8 @@ class KomikIndo : ParsedHttpSource() { @SuppressLint("SimpleDateFormat") private fun parseChapterDate(date: String): Long { val sdf = SimpleDateFormat("MMM dd, yyyy") - val parse = sdf.parse(date) val cal = Calendar.getInstance() - cal.time = parse + cal.time = sdf.parse(date)!! return cal.timeInMillis } @@ -168,58 +167,61 @@ class KomikIndo : ParsedHttpSource() { return GET(page.imageUrl!!, imgHeader) } - private class GenreListFilter : UriPartFilter("Genre", arrayOf( - Pair("Default", ""), - Pair("4-Koma", "4-koma"), - Pair("Action", "action"), - Pair("Adventure", "adventure"), - Pair("Comedy", "comedy"), - Pair("Cooking", "cooking"), - Pair("Crime", "crime"), - Pair("Dark Fantasy", "dark-fantasy"), - Pair("Demons", "demons"), - Pair("Drama", "drama"), - Pair("Ecchi", "ecchi"), - Pair("Fantasy", "fantasy"), - Pair("Game", "game"), - Pair("Gender Bender", "gender-bender"), - Pair("Harem", "harem"), - Pair("Historical", "historical"), - Pair("Horor", "horor"), - Pair("Horror", "horror"), - Pair("Isekai", "isekai"), - Pair("Josei", "josei"), - Pair("Komik Tamat", "komik-tamat"), - Pair("Life", "life"), - Pair("Magic", "magic"), - Pair("Manhua", "manhua"), - Pair("Martial Art", "martial-art"), - Pair("Martial Arts", "martial-arts"), - Pair("Mature", "mature"), - Pair("Mecha", "mecha"), - Pair("Military", "military"), - Pair("Music", "music"), - Pair("Mystery", "mystery"), - Pair("Post-Apocalyptic", "post-apocalyptic"), - Pair("Psychological", "psychological"), - Pair("Romance", "romance"), - Pair("School", "school"), - Pair("School Life", "school-life"), - Pair("Sci-Fi", "sci-fi"), - Pair("Seinen", "seinen"), - Pair("Shonen", "shonen"), - Pair("Shoujo", "shoujo"), - Pair("Shounen", "shounen"), - Pair("Slice of Life", "slice-of-life"), - Pair("Sports", "sports"), - Pair("Super Power", "super-power"), - Pair("Superheroes", "superheroes"), - Pair("Supernatural", "supernatural"), - Pair("Survival", "survival"), - Pair("Thriller", "thriller"), - Pair("Tragedy", "tragedy"), - Pair("Zombies", "zombies") - )) + private class GenreListFilter : UriPartFilter( + "Genre", + arrayOf( + Pair("Default", ""), + Pair("4-Koma", "4-koma"), + Pair("Action", "action"), + Pair("Adventure", "adventure"), + Pair("Comedy", "comedy"), + Pair("Cooking", "cooking"), + Pair("Crime", "crime"), + Pair("Dark Fantasy", "dark-fantasy"), + Pair("Demons", "demons"), + Pair("Drama", "drama"), + Pair("Ecchi", "ecchi"), + Pair("Fantasy", "fantasy"), + Pair("Game", "game"), + Pair("Gender Bender", "gender-bender"), + Pair("Harem", "harem"), + Pair("Historical", "historical"), + Pair("Horor", "horor"), + Pair("Horror", "horror"), + Pair("Isekai", "isekai"), + Pair("Josei", "josei"), + Pair("Komik Tamat", "komik-tamat"), + Pair("Life", "life"), + Pair("Magic", "magic"), + Pair("Manhua", "manhua"), + Pair("Martial Art", "martial-art"), + Pair("Martial Arts", "martial-arts"), + Pair("Mature", "mature"), + Pair("Mecha", "mecha"), + Pair("Military", "military"), + Pair("Music", "music"), + Pair("Mystery", "mystery"), + Pair("Post-Apocalyptic", "post-apocalyptic"), + Pair("Psychological", "psychological"), + Pair("Romance", "romance"), + Pair("School", "school"), + Pair("School Life", "school-life"), + Pair("Sci-Fi", "sci-fi"), + Pair("Seinen", "seinen"), + Pair("Shonen", "shonen"), + Pair("Shoujo", "shoujo"), + Pair("Shounen", "shounen"), + Pair("Slice of Life", "slice-of-life"), + Pair("Sports", "sports"), + Pair("Super Power", "super-power"), + Pair("Superheroes", "superheroes"), + Pair("Supernatural", "supernatural"), + Pair("Survival", "survival"), + Pair("Thriller", "thriller"), + Pair("Tragedy", "tragedy"), + Pair("Zombies", "zombies") + ) + ) override fun getFilterList() = FilterList( Filter.Header("NOTE: filter will be ignored when using text search!"), diff --git a/src/id/komiku/src/eu/kanade/tachiyomi/extension/id/komiku/Komiku.kt b/src/id/komiku/src/eu/kanade/tachiyomi/extension/id/komiku/Komiku.kt index 3a18f5e5a..12298acfe 100644 --- a/src/id/komiku/src/eu/kanade/tachiyomi/extension/id/komiku/Komiku.kt +++ b/src/id/komiku/src/eu/kanade/tachiyomi/extension/id/komiku/Komiku.kt @@ -6,10 +6,10 @@ 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 java.util.Calendar import okhttp3.OkHttpClient import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar class Komiku : ParsedHttpSource() { override val name = "Komiku" diff --git a/src/id/maidmanga/src/eu/kanade/tachiyomi/extension/id/maidmanga/MaidManga.kt b/src/id/maidmanga/src/eu/kanade/tachiyomi/extension/id/maidmanga/MaidManga.kt index e4a05bd53..d407f8f85 100644 --- a/src/id/maidmanga/src/eu/kanade/tachiyomi/extension/id/maidmanga/MaidManga.kt +++ b/src/id/maidmanga/src/eu/kanade/tachiyomi/extension/id/maidmanga/MaidManga.kt @@ -7,13 +7,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MaidManga : ParsedHttpSource() { @@ -76,8 +76,8 @@ class MaidManga : ParsedHttpSource() { } is GenreList -> { filter.state - .filter { it.state } - .forEach { url.addQueryParameter("genre[]", it.id) } + .filter { it.state } + .forEach { url.addQueryParameter("genre[]", it.id) } } } } @@ -114,7 +114,7 @@ class MaidManga : ParsedHttpSource() { } private fun parseDate(date: String): Long { - return SimpleDateFormat("MMM d, yyyy", Locale("id")).parse(date).time + return SimpleDateFormat("MMM d, yyyy", Locale("id")).parse(date)?.time ?: 0L } // careful not to include download links @@ -137,14 +137,14 @@ class MaidManga : ParsedHttpSource() { override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used") override fun getFilterList() = FilterList( - Filter.Header("You can combine filter."), - Filter.Separator(), - AuthorFilter(), - YearFilter(), - StatusFilter(), - TypeFilter(), - OrderByFilter(), - GenreList(getGenreList()) + Filter.Header("You can combine filter."), + Filter.Separator(), + AuthorFilter(), + YearFilter(), + StatusFilter(), + TypeFilter(), + OrderByFilter(), + GenreList(getGenreList()) ) private class AuthorFilter : Filter.Text("Author") @@ -153,15 +153,20 @@ class MaidManga : ParsedHttpSource() { private class StatusFilter : Filter.TriState("Completed") - private class TypeFilter : UriPartFilter("Type", arrayOf( + private class TypeFilter : UriPartFilter( + "Type", + arrayOf( Pair("All", ""), Pair("Manga", "Manga"), Pair("Manhua", "Manhua"), Pair("Manhwa", "Manhwa"), Pair("One-Shot", "One-Shot"), Pair("Doujin", "Doujin") - )) - private class OrderByFilter : UriPartFilter("Order By", arrayOf( + ) + ) + private class OrderByFilter : UriPartFilter( + "Order By", + arrayOf( Pair("<select>", ""), Pair("A-Z", "title"), Pair("Z-A", "titlereverse"), @@ -169,68 +174,69 @@ class MaidManga : ParsedHttpSource() { Pair("Latest Added", "latest"), Pair("Popular", "popular"), Pair("Rating", "rating") - )) + ) + ) private fun getGenreList() = listOf( - Tag("4-koma", "4-Koma"), - Tag("4-koma-comedy", "4-Koma Comedy"), - Tag("action", "Action"), - Tag("adult", "Adult"), - Tag("adventure", "Adventure"), - Tag("comedy", "Comedy"), - Tag("demons", "Demons"), - Tag("drama", "Drama"), - Tag("ecchi", "Ecchi"), - Tag("fantasy", "Fantasy"), - Tag("game", "Game"), - Tag("gender-bender", "Gender bender"), - Tag("gore", "Gore"), - Tag("harem", "Harem"), - Tag("historical", "Historical"), - Tag("horror", "Horror"), - Tag("isekai", "Isekai"), - Tag("josei", "Josei"), - Tag("loli", "Loli"), - Tag("magic", "Magic"), - Tag("manga", "Manga"), - Tag("manhua", "Manhua"), - Tag("manhwa", "Manhwa"), - Tag("martial-arts", "Martial Arts"), - Tag("mature", "Mature"), - Tag("mecha", "Mecha"), - Tag("military", "Military"), - Tag("monster-girls", "Monster Girls"), - Tag("music", "Music"), - Tag("mystery", "Mystery"), - Tag("one-shot", "One Shot"), - Tag("parody", "Parody"), - Tag("police", "Police"), - Tag("psychological", "Psychological"), - Tag("romance", "Romance"), - Tag("school", "School"), - Tag("school-life", "School Life"), - Tag("sci-fi", "Sci-Fi"), - Tag("socks", "Socks"), - Tag("seinen", "Seinen"), - Tag("shoujo", "Shoujo"), - Tag("shoujo-ai", "Shoujo Ai"), - Tag("shounen", "Shounen"), - Tag("shounen-ai", "Shounen Ai"), - Tag("slice-of-life", "Slice of Life"), - Tag("smut", "Smut"), - Tag("sports", "Sports"), - Tag("super-power", "Super Power"), - Tag("supernatural", "Supernatural"), - Tag("survival", "Survival"), - Tag("thriller", "Thriller"), - Tag("tragedy", "Tragedy"), - Tag("vampire", "Vampire"), - Tag("webtoons", "Webtoons"), - Tag("yuri", "Yuri") + Tag("4-koma", "4-Koma"), + Tag("4-koma-comedy", "4-Koma Comedy"), + Tag("action", "Action"), + Tag("adult", "Adult"), + Tag("adventure", "Adventure"), + Tag("comedy", "Comedy"), + Tag("demons", "Demons"), + Tag("drama", "Drama"), + Tag("ecchi", "Ecchi"), + Tag("fantasy", "Fantasy"), + Tag("game", "Game"), + Tag("gender-bender", "Gender bender"), + Tag("gore", "Gore"), + Tag("harem", "Harem"), + Tag("historical", "Historical"), + Tag("horror", "Horror"), + Tag("isekai", "Isekai"), + Tag("josei", "Josei"), + Tag("loli", "Loli"), + Tag("magic", "Magic"), + Tag("manga", "Manga"), + Tag("manhua", "Manhua"), + Tag("manhwa", "Manhwa"), + Tag("martial-arts", "Martial Arts"), + Tag("mature", "Mature"), + Tag("mecha", "Mecha"), + Tag("military", "Military"), + Tag("monster-girls", "Monster Girls"), + Tag("music", "Music"), + Tag("mystery", "Mystery"), + Tag("one-shot", "One Shot"), + Tag("parody", "Parody"), + Tag("police", "Police"), + Tag("psychological", "Psychological"), + Tag("romance", "Romance"), + Tag("school", "School"), + Tag("school-life", "School Life"), + Tag("sci-fi", "Sci-Fi"), + Tag("socks", "Socks"), + Tag("seinen", "Seinen"), + Tag("shoujo", "Shoujo"), + Tag("shoujo-ai", "Shoujo Ai"), + Tag("shounen", "Shounen"), + Tag("shounen-ai", "Shounen Ai"), + Tag("slice-of-life", "Slice of Life"), + Tag("smut", "Smut"), + Tag("sports", "Sports"), + Tag("super-power", "Super Power"), + Tag("supernatural", "Supernatural"), + Tag("survival", "Survival"), + Tag("thriller", "Thriller"), + Tag("tragedy", "Tragedy"), + Tag("vampire", "Vampire"), + Tag("webtoons", "Webtoons"), + Tag("yuri", "Yuri") ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } diff --git a/src/id/mangaindo/src/eu/kanade/tachiyomi/extension/id/mangaindo/MangaIndo.kt b/src/id/mangaindo/src/eu/kanade/tachiyomi/extension/id/mangaindo/MangaIndo.kt index e6fdd363a..8a63171a4 100644 --- a/src/id/mangaindo/src/eu/kanade/tachiyomi/extension/id/mangaindo/MangaIndo.kt +++ b/src/id/mangaindo/src/eu/kanade/tachiyomi/extension/id/mangaindo/MangaIndo.kt @@ -12,13 +12,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MangaIndo : ParsedHttpSource() { @@ -133,7 +133,7 @@ class MangaIndo : ParsedHttpSource() { private fun parseChapterDate(date: String): Long { return try { - SimpleDateFormat("MMM dd, yyyy", Locale.getDefault()).parse(date).time + SimpleDateFormat("MMM dd, yyyy", Locale.getDefault()).parse(date)?.time ?: 0L } catch (e: Exception) { 0L } diff --git a/src/id/mangashiro/src/eu/kanade/tachiyomi/extension/id/mangashiro/Mangashiro.kt b/src/id/mangashiro/src/eu/kanade/tachiyomi/extension/id/mangashiro/Mangashiro.kt index 5dd7a6ec4..98d9ddfc5 100644 --- a/src/id/mangashiro/src/eu/kanade/tachiyomi/extension/id/mangashiro/Mangashiro.kt +++ b/src/id/mangashiro/src/eu/kanade/tachiyomi/extension/id/mangashiro/Mangashiro.kt @@ -162,28 +162,37 @@ class Mangashiro : ParsedHttpSource() { private class YearFilter : Filter.Text("Year") - private class TypeFilter : UriPartFilter("Type", arrayOf( - Pair("Default", ""), - Pair("Manga", "Manga"), - Pair("Manhwa", "Manhwa"), - Pair("Manhua", "Manhua"), - Pair("Comic", "Comic") - )) + private class TypeFilter : UriPartFilter( + "Type", + arrayOf( + Pair("Default", ""), + Pair("Manga", "Manga"), + Pair("Manhwa", "Manhwa"), + Pair("Manhua", "Manhua"), + Pair("Comic", "Comic") + ) + ) - private class SortByFilter : UriPartFilter("Sort By", arrayOf( - Pair("Default", ""), - Pair("A-Z", "title"), - Pair("Z-A", "titlereverse"), - Pair("Latest Update", "update"), - Pair("Latest Added", "latest"), - Pair("Popular", "popular") - )) + private class SortByFilter : UriPartFilter( + "Sort By", + arrayOf( + Pair("Default", ""), + Pair("A-Z", "title"), + Pair("Z-A", "titlereverse"), + Pair("Latest Update", "update"), + Pair("Latest Added", "latest"), + Pair("Popular", "popular") + ) + ) - private class StatusFilter : UriPartFilter("Status", arrayOf( - Pair("All", ""), - Pair("Ongoing", "ongoing"), - Pair("Completed", "completed") - )) + private class StatusFilter : UriPartFilter( + "Status", + arrayOf( + Pair("All", ""), + Pair("Ongoing", "ongoing"), + Pair("Completed", "completed") + ) + ) private class Genre(name: String, val id: String = name) : Filter.TriState(name) private class GenreListFilter(genres: List<Genre>) : Filter.Group<Genre>("Genre", genres) @@ -200,69 +209,69 @@ class Mangashiro : ParsedHttpSource() { ) private fun getGenreList() = listOf( - Genre("4-Koma", "4-koma"), - Genre("4-Koma. Comedy", "4-koma-comedy"), - Genre("Action", "action"), - Genre("Action. Adventure", "action-adventure"), - Genre("Adult", "adult"), - Genre("Adventure", "adventure"), - Genre("Comedy", "comedy"), - Genre("Cooking", "cooking"), - Genre("Demons", "demons"), - Genre("Doujinshi", "doujinshi"), - Genre("Drama", "drama"), - Genre("Ecchi", "ecchi"), - Genre("Echi", "echi"), - Genre("Fantasy", "fantasy"), - Genre("Game", "game"), - Genre("Gender Bender", "gender-bender"), - Genre("Gore", "gore"), - Genre("Harem", "harem"), - Genre("Historical", "historical"), - Genre("Horror", "horror"), - Genre("Isekai", "isekai"), - Genre("Josei", "josei"), - Genre("Magic", "magic"), - Genre("Manga", "manga"), - Genre("Manhua", "manhua"), - Genre("Manhwa", "manhwa"), - Genre("Martial Arts", "martial-arts"), - Genre("Mature", "mature"), - Genre("Mecha", "mecha"), - Genre("Medical", "medical"), - Genre("Military", "military"), - Genre("Music", "music"), - Genre("Mystery", "mystery"), - Genre("One Shot", "one-shot"), - Genre("Oneshot", "oneshot"), - Genre("Parody", "parody"), - Genre("Police", "police"), - Genre("Psychological", "psychological"), - Genre("Romance", "romance"), - Genre("Samurai", "samurai"), - Genre("School", "school"), - Genre("School Life", "school-life"), - Genre("Sci-fi", "sci-fi"), - Genre("Seinen", "seinen"), - Genre("Shoujo", "shoujo"), - Genre("Shoujo Ai", "shoujo-ai"), - Genre("Shounen", "shounen"), - Genre("Shounen Ai", "shounen-ai"), - Genre("Slice of Life", "slice-of-life"), - Genre("Smut", "smut"), - Genre("Sports", "sports"), - Genre("Super Power", "super-power"), - Genre("Supernatural", "supernatural"), - Genre("Thriller", "thriller"), - Genre("Tragedy", "tragedy"), - Genre("Vampire", "vampire"), - Genre("Webtoon", "webtoon"), - Genre("Webtoons", "webtoons"), - Genre("Yuri", "yuri") + Genre("4-Koma", "4-koma"), + Genre("4-Koma. Comedy", "4-koma-comedy"), + Genre("Action", "action"), + Genre("Action. Adventure", "action-adventure"), + Genre("Adult", "adult"), + Genre("Adventure", "adventure"), + Genre("Comedy", "comedy"), + Genre("Cooking", "cooking"), + Genre("Demons", "demons"), + Genre("Doujinshi", "doujinshi"), + Genre("Drama", "drama"), + Genre("Ecchi", "ecchi"), + Genre("Echi", "echi"), + Genre("Fantasy", "fantasy"), + Genre("Game", "game"), + Genre("Gender Bender", "gender-bender"), + Genre("Gore", "gore"), + Genre("Harem", "harem"), + Genre("Historical", "historical"), + Genre("Horror", "horror"), + Genre("Isekai", "isekai"), + Genre("Josei", "josei"), + Genre("Magic", "magic"), + Genre("Manga", "manga"), + Genre("Manhua", "manhua"), + Genre("Manhwa", "manhwa"), + Genre("Martial Arts", "martial-arts"), + Genre("Mature", "mature"), + Genre("Mecha", "mecha"), + Genre("Medical", "medical"), + Genre("Military", "military"), + Genre("Music", "music"), + Genre("Mystery", "mystery"), + Genre("One Shot", "one-shot"), + Genre("Oneshot", "oneshot"), + Genre("Parody", "parody"), + Genre("Police", "police"), + Genre("Psychological", "psychological"), + Genre("Romance", "romance"), + Genre("Samurai", "samurai"), + Genre("School", "school"), + Genre("School Life", "school-life"), + Genre("Sci-fi", "sci-fi"), + Genre("Seinen", "seinen"), + Genre("Shoujo", "shoujo"), + Genre("Shoujo Ai", "shoujo-ai"), + Genre("Shounen", "shounen"), + Genre("Shounen Ai", "shounen-ai"), + Genre("Slice of Life", "slice-of-life"), + Genre("Smut", "smut"), + Genre("Sports", "sports"), + Genre("Super Power", "super-power"), + Genre("Supernatural", "supernatural"), + Genre("Thriller", "thriller"), + Genre("Tragedy", "tragedy"), + Genre("Vampire", "vampire"), + Genre("Webtoon", "webtoon"), + Genre("Webtoons", "webtoons"), + Genre("Yuri", "yuri") ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } } diff --git a/src/id/neumanga/src/eu/kanade/tachiyomi/extension/id/neumanga/Neumanga.kt b/src/id/neumanga/src/eu/kanade/tachiyomi/extension/id/neumanga/Neumanga.kt index 65f78e1c5..5547a0a95 100644 --- a/src/id/neumanga/src/eu/kanade/tachiyomi/extension/id/neumanga/Neumanga.kt +++ b/src/id/neumanga/src/eu/kanade/tachiyomi/extension/id/neumanga/Neumanga.kt @@ -7,15 +7,15 @@ 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 java.security.SecureRandom -import java.security.cert.X509Certificate -import javax.net.ssl.SSLContext -import javax.net.ssl.X509TrustManager import okhttp3.HttpUrl import okhttp3.Request import org.json.JSONArray import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.security.SecureRandom +import java.security.cert.X509Certificate +import javax.net.ssl.SSLContext +import javax.net.ssl.X509TrustManager class Neumanga : ParsedHttpSource() { @@ -44,8 +44,8 @@ class Neumanga : ParsedHttpSource() { } override val client = super.client.newBuilder() - .sslSocketFactory(sslContext.socketFactory, trustManager) - .build() + .sslSocketFactory(sslContext.socketFactory, trustManager) + .build() override fun popularMangaSelector() = "div#gov-result div.bolx" @@ -82,13 +82,13 @@ class Neumanga : ParsedHttpSource() { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val url = HttpUrl.parse("$baseUrl/advanced_search")!!.newBuilder() - .addQueryParameter("advpage", page.toString()) - .addQueryParameter("name_search_mode", "contain") - .addQueryParameter("artist_search_mode", "contain") - .addQueryParameter("author_search_mode", "contain") - .addQueryParameter("year_search_mode", "on") - .addQueryParameter("rating_search_mode", "is") - .addQueryParameter("name_search_query", query) + .addQueryParameter("advpage", page.toString()) + .addQueryParameter("name_search_mode", "contain") + .addQueryParameter("artist_search_mode", "contain") + .addQueryParameter("author_search_mode", "contain") + .addQueryParameter("year_search_mode", "on") + .addQueryParameter("rating_search_mode", "is") + .addQueryParameter("name_search_query", query) (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> when (filter) { diff --git a/src/id/ngomik/src/eu/kanade/tachiyomi/extension/id/ngomik/Ngomik.kt b/src/id/ngomik/src/eu/kanade/tachiyomi/extension/id/ngomik/Ngomik.kt index 9e1e248a8..69a7d93fa 100644 --- a/src/id/ngomik/src/eu/kanade/tachiyomi/extension/id/ngomik/Ngomik.kt +++ b/src/id/ngomik/src/eu/kanade/tachiyomi/extension/id/ngomik/Ngomik.kt @@ -93,20 +93,25 @@ class Ngomik : ParsedHttpSource() { override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used") override fun getFilterList() = FilterList( - Filter.Header("Order by filter cannot be used with others"), - OrderByFilter(), - Filter.Separator(), - GenreList() + Filter.Header("Order by filter cannot be used with others"), + OrderByFilter(), + Filter.Separator(), + GenreList() ) - private class OrderByFilter : UriPartFilter("Order By", arrayOf( + private class OrderByFilter : UriPartFilter( + "Order By", + arrayOf( Pair("", "<select>"), Pair("title", "A-Z"), Pair("update", "Latest Update"), Pair("create", "Latest Added") - )) + ) + ) - private class GenreList : UriPartFilter("Select Genre", arrayOf( + private class GenreList : UriPartFilter( + "Select Genre", + arrayOf( Pair("", "<select>"), Pair("4-koma", "4-Koma"), Pair("action", "Action"), @@ -190,10 +195,11 @@ class Ngomik : ParsedHttpSource() { Pair("webtoons", "Webtoons"), Pair("yuri", "Yuri"), Pair("zombies", "Zombies") - )) + ) + ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray()) { fun toUriPart() = vals[state].first } diff --git a/src/it/hentaifantasy/src/eu/kanade/tachiyomi/extension/it/hentaifantasy/HentaiFantasy.kt b/src/it/hentaifantasy/src/eu/kanade/tachiyomi/extension/it/hentaifantasy/HentaiFantasy.kt index 4db0f3355..47f208d38 100644 --- a/src/it/hentaifantasy/src/eu/kanade/tachiyomi/extension/it/hentaifantasy/HentaiFantasy.kt +++ b/src/it/hentaifantasy/src/eu/kanade/tachiyomi/extension/it/hentaifantasy/HentaiFantasy.kt @@ -9,16 +9,16 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.regex.Pattern import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.regex.Pattern @Nsfw class HentaiFantasy : ParsedHttpSource() { @@ -74,13 +74,14 @@ class HentaiFantasy : ParsedHttpSource() { val paths = mutableListOf<String>() for (filter in if (filters.isEmpty()) getFilterList() else filters) { when (filter) { - is TagList -> filter.state - .filter { it.state } - .map { - paths.add(it.name.toLowerCase().replace(" ", "_")) - it.id.toString() - } - .forEach { tags.add(it) } + is TagList -> + filter.state + .filter { it.state } + .map { + paths.add(it.name.toLowerCase().replace(" ", "_")) + it.id.toString() + } + .forEach { tags.add(it) } } } @@ -162,7 +163,7 @@ class HentaiFantasy : ParsedHttpSource() { } else -> { try { - dateFormat.parse(date).time + dateFormat.parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } @@ -181,7 +182,7 @@ class HentaiFantasy : ParsedHttpSource() { var i = 0 while (m.find()) { - pages.add(Page(i++, "", m.group(1).replace("""\\""", ""))) + pages.add(Page(i++, "", m.group(1)?.replace("""\\""", ""))) } return pages } diff --git a/src/it/mangaeden/src/eu/kanade/tachiyomi/extension/it/mangaeden/Mangaeden.kt b/src/it/mangaeden/src/eu/kanade/tachiyomi/extension/it/mangaeden/Mangaeden.kt index f945f6ca4..93dc5011c 100644 --- a/src/it/mangaeden/src/eu/kanade/tachiyomi/extension/it/mangaeden/Mangaeden.kt +++ b/src/it/mangaeden/src/eu/kanade/tachiyomi/extension/it/mangaeden/Mangaeden.kt @@ -7,15 +7,15 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale class Mangaeden : ParsedHttpSource() { @@ -52,17 +52,20 @@ class Mangaeden : ParsedHttpSource() { val url = HttpUrl.parse("$baseUrl/it/it-directory/")?.newBuilder()!!.addQueryParameter("title", query) (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> when (filter) { - is StatusList -> filter.state - .filter { it.state } - .map { it.id.toString() } - .forEach { url.addQueryParameter("status", it) } - is Types -> filter.state - .filter { it.state } - .map { it.id.toString() } - .forEach { url.addQueryParameter("type", it) } - is GenreList -> filter.state - .filter { !it.isIgnored() } - .forEach { genre -> url.addQueryParameter(if (genre.isIncluded()) "categoriesInc" else "categoriesExcl", genre.id) } + is StatusList -> + filter.state + .filter { it.state } + .map { it.id.toString() } + .forEach { url.addQueryParameter("status", it) } + is Types -> + filter.state + .filter { it.state } + .map { it.id.toString() } + .forEach { url.addQueryParameter("type", it) } + is GenreList -> + filter.state + .filter { !it.isIgnored() } + .forEach { genre -> url.addQueryParameter(if (genre.isIncluded()) "categoriesInc" else "categoriesExcl", genre.id) } is TextField -> url.addQueryParameter(filter.key, filter.state) is OrderBy -> filter.state?.let { val sortId = it.index @@ -129,11 +132,12 @@ class Mangaeden : ParsedHttpSource() { set(Calendar.MILLISECOND, 0) }.timeInMillis } - else -> try { - SimpleDateFormat("d MMM yyyy", Locale.ITALIAN).parse(date).time - } catch (e: ParseException) { - 0L - } + else -> + try { + SimpleDateFormat("d MMM yyyy", Locale.ITALIAN).parse(date)?.time ?: 0L + } catch (e: ParseException) { + 0L + } } override fun pageListParse(document: Document): List<Page> { @@ -147,8 +151,11 @@ class Mangaeden : ParsedHttpSource() { private class NamedId(name: String, val id: Int) : Filter.CheckBox(name) private class Genre(name: String, val id: String) : Filter.TriState(name) private class TextField(name: String, val key: String) : Filter.Text(name) - private class OrderBy : Filter.Sort("Order by", arrayOf("Titolo manga", "Visite", "Capitoli", "Ultimo capitolo"), - Selection(1, false)) + private class OrderBy : Filter.Sort( + "Order by", + arrayOf("Titolo manga", "Visite", "Capitoli", "Ultimo capitolo"), + Selection(1, false) + ) private class StatusList(statuses: List<NamedId>) : Filter.Group<NamedId>("Stato", statuses) private class Types(types: List<NamedId>) : Filter.Group<NamedId>("Tipo", types) diff --git a/src/it/perveden/src/eu/kanade/tachiyomi/extension/it/perveden/Perveden.kt b/src/it/perveden/src/eu/kanade/tachiyomi/extension/it/perveden/Perveden.kt index 7c0e9fa2d..e4e2fcff4 100644 --- a/src/it/perveden/src/eu/kanade/tachiyomi/extension/it/perveden/Perveden.kt +++ b/src/it/perveden/src/eu/kanade/tachiyomi/extension/it/perveden/Perveden.kt @@ -8,14 +8,14 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale @Nsfw class Perveden : ParsedHttpSource() { @@ -48,11 +48,13 @@ class Perveden : ParsedHttpSource() { val url = HttpUrl.parse("$baseUrl/it/it-directory/")?.newBuilder()!!.addQueryParameter("title", query) (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> when (filter) { - is StatusList -> filter.state + is StatusList -> + filter.state .filter { it.state } .map { it.id.toString() } .forEach { url.addQueryParameter("status", it) } - is Types -> filter.state + is Types -> + filter.state .filter { it.state } .map { it.id.toString() } .forEach { url.addQueryParameter("type", it) } @@ -129,11 +131,12 @@ class Perveden : ParsedHttpSource() { set(Calendar.MILLISECOND, 0) }.timeInMillis } - else -> try { - SimpleDateFormat("d MMM yyyy", Locale.ITALIAN).parse(date).time - } catch (e: ParseException) { - 0L - } + else -> + try { + SimpleDateFormat("d MMM yyyy", Locale.ITALIAN).parse(date)?.time ?: 0L + } catch (e: ParseException) { + 0L + } } override fun pageListParse(document: Document): List<Page> = mutableListOf<Page>().apply { @@ -147,265 +150,268 @@ class Perveden : ParsedHttpSource() { private class NamedId(name: String, val id: Int) : Filter.CheckBox(name) private class TextField(name: String, val key: String) : Filter.Text(name) private class GenreField(name: String, val key: String) : Filter.Text(name) - private class OrderBy : Filter.Sort("Ordina per", arrayOf("Titolo manga", "Visite", "Capitoli", "Ultimo capitolo"), - Selection(1, false)) + private class OrderBy : Filter.Sort( + "Ordina per", + arrayOf("Titolo manga", "Visite", "Capitoli", "Ultimo capitolo"), + Selection(1, false) + ) private class StatusList(statuses: List<NamedId>) : Filter.Group<NamedId>("Stato", statuses) private class Types(types: List<NamedId>) : Filter.Group<NamedId>("Tipo", types) override fun getFilterList() = FilterList( - TextField("Autore", "author"), - TextField("Artista", "artist"), - GenreField("Generi inclusi", "categoriesInc"), - GenreField("Generi esclusi", "categoriesExcl"), - OrderBy(), - Types(types()), - StatusList(statuses()) + TextField("Autore", "author"), + TextField("Artista", "artist"), + GenreField("Generi inclusi", "categoriesInc"), + GenreField("Generi esclusi", "categoriesExcl"), + OrderBy(), + Types(types()), + StatusList(statuses()) ) private fun types() = listOf( - NamedId("Japanese Manga", 0), - NamedId("Korean Manhwa", 1), - NamedId("Chinese Manhua", 2), - NamedId("Comic", 3), - NamedId("Doujinshi", 4) + NamedId("Japanese Manga", 0), + NamedId("Korean Manhwa", 1), + NamedId("Chinese Manhua", 2), + NamedId("Comic", 3), + NamedId("Doujinshi", 4) ) private fun statuses() = listOf( - NamedId("In corso", 1), - NamedId("Completato", 2), - NamedId("Sospeso", 0) + NamedId("In corso", 1), + NamedId("Completato", 2), + NamedId("Sospeso", 0) ) private val genres = mapOf( - Pair("commedia", "4e70ea9ac092255ef70075d8"), - Pair("ecchi", "4e70ea9ac092255ef70075d9"), - Pair("age progression", "5782b043719a16947390104a"), - Pair("ahegao", "577e6f90719a168e7d256a3f"), - Pair("anal", "577e6f90719a168e7d256a3b"), - Pair("angel", "577e724a719a168ef96a74d6"), - Pair("apron", "577e720a719a166f4719a7be"), - Pair("armpit licking", "577e71db719a166f4719a3e7"), - Pair("assjob", "58474a08719a1668eeeea29b"), - Pair("aunt", "577e6f8d719a168e7d256a20"), - Pair("bbw", "5782ae42719a1675f68a6e29"), - Pair("bdsm", "577e723d719a168ef96a7416"), - Pair("bestiality", "57ad8919719a1629a0a327cf"), - Pair("big areolae", "577e7226719a166f4719a9d0"), - Pair("big ass", "577e6f8d719a168e7d256a21"), - Pair("big balls", "577e7267719a168ef96a76ee"), - Pair("big breasts", "577e6f8d719a168e7d256a1c"), - Pair("big clit", "57ef0396719a163dffb8fdff"), - Pair("big nipples", "5782ae42719a1675f68a6e2a"), - Pair("big penis", "577e7267719a168ef96a76ef"), - Pair("bike shorts", "577e7210719a166f4719a820"), - Pair("bikini", "577e6f91719a168e7d256a77"), - Pair("birth", "577e7273719a168ef96a77cf"), - Pair("blackmail", "577e6f91719a168e7d256a78"), - Pair("blindfold", "577e7208719a166f4719a78d"), - Pair("blood", "577e7295719a168ef96a79e6"), - Pair("bloomers", "5782b051719a1694739010ee"), - Pair("blowjob", "577e6f8d719a168e7d256a22"), - Pair("blowjob face", "577e71eb719a166f4719a544"), - Pair("body modification", "577e6f93719a168e7d256a8e"), - Pair("bodystocking", "5782b05c719a169473901151"), - Pair("bodysuit", "577e6f90719a168e7d256a42"), - Pair("bondage", "577e6f90719a168e7d256a45"), - Pair("breast expansion", "577e71c3719a166f4719a235"), - Pair("bukkake", "577e7210719a166f4719a821"), - Pair("bunny girl", "577e7224719a166f4719a9b9"), - Pair("business suit", "577e71e5719a166f4719a4b2"), - Pair("catgirl", "577e71d5719a166f4719a366"), - Pair("centaur", "577e7297719a168ef96a7a06"), - Pair("cervix penetration", "577e7273719a168ef96a77d0"), - Pair("cheating", "577e71b5719a166f4719a13b"), - Pair("cheerleader", "57c0a6de719a1641240e9257"), - Pair("chikan", "5782b0c6719a1679528762ac"), - Pair("chinese dress", "5782b059719a169473901131"), - Pair("chloroform", "577e6f92719a168e7d256a7f"), - Pair("christmas", "5782af2b719a169473900752"), - Pair("clit growth", "57ef0396719a163dffb8fe00"), - Pair("collar", "577e6f93719a168e7d256a8f"), - Pair("condom", "577e71d5719a166f4719a36c"), - Pair("corruption", "577e6f90719a168e7d256a41"), - Pair("cosplaying", "5782b185719a167952876944"), - Pair("cousin", "577e7283719a168ef96a78c3"), - Pair("cow", "5865d767719a162cce299571"), - Pair("cunnilingus", "577e6f8d719a168e7d256a23"), - Pair("dark skin", "577e6f90719a168e7d256a55"), - Pair("daughter", "577e7250719a168ef96a7539"), - Pair("deepthroat", "577e6f90719a168e7d256a3c"), - Pair("defloration", "577e6f92719a168e7d256a82"), - Pair("demon girl", "577e7218719a166f4719a8c8"), - Pair("dick growth", "577e6f93719a168e7d256a90"), - Pair("dickgirl on dickgirl", "5782af0e719a16947390067a"), - Pair("dog girl", "577e7218719a166f4719a8c9"), - Pair("double penetration", "577e6f90719a168e7d256a3d"), - Pair("double vaginal", "577e7226719a166f4719a9d1"), - Pair("drugs", "577e71da719a166f4719a3cb"), - Pair("drunk", "577e7199719a16697b9853ea"), - Pair("elf", "577e6f93719a168e7d256a91"), - Pair("enema", "5782aff7719a169473900d8a"), - Pair("exhibitionism", "577e72a7719a168ef96a7b26"), - Pair("eyemask", "577e7208719a166f4719a78e"), - Pair("facesitting", "577e7230719a166f4719aa8c"), - Pair("females only", "577e6f90719a168e7d256a44"), - Pair("femdom", "577e6f8c719a168e7d256a13"), - Pair("filming", "577e7242719a168ef96a7465"), - Pair("fingering", "577e6f90719a168e7d256a5d"), - Pair("fisting", "57c349e1719a1625b42603f4"), - Pair("foot licking", "5782b152719a16795287677d"), - Pair("footjob", "577e6f8d719a168e7d256a17"), - Pair("freckles", "5782ae42719a1675f68a6e2b"), - Pair("fundoshi", "577e71d9719a166f4719a3bf"), - Pair("furry", "5782ae45719a1675f68a6e49"), - Pair("futanari", "577e6f92719a168e7d256a80"), - Pair("gag", "577e6f90719a168e7d256a56"), - Pair("gaping", "577e7210719a166f4719a822"), - Pair("garter belt", "577e7201719a166f4719a704"), - Pair("glasses", "577e6f90719a168e7d256a5e"), - Pair("gothic lolita", "577e7201719a166f4719a705"), - Pair("group", "577e726e719a168ef96a7764"), - Pair("gyaru", "577e6f91719a168e7d256a79"), - Pair("hairjob", "57bcea9f719a1687ea2bc092"), - Pair("hairy", "577e7250719a168ef96a753a"), - Pair("hairy armpits", "5782b13c719a16795287669c"), - Pair("handjob", "577e71c8719a166f4719a29b"), - Pair("harem", "577e71c3719a166f4719a239"), - Pair("heterochromia", "577e7201719a166f4719a706"), - Pair("hotpants", "585b302d719a1648da4f0389"), - Pair("huge breasts", "577e71d9719a166f4719a3c0"), - Pair("huge penis", "585b302d719a1648da4f038a"), - Pair("human on furry", "577e7203719a166f4719a722"), - Pair("human pet", "577e6f90719a168e7d256a57"), - Pair("humiliation", "577e7210719a166f4719a823"), - Pair("impregnation", "577e6f90719a168e7d256a47"), - Pair("incest", "577e6f93719a168e7d256a92"), - Pair("inflation", "577e7273719a168ef96a77d1"), - Pair("insect girl", "577e71fc719a166f4719a692"), - Pair("inverted nipples", "5813993a719a165f236ddacd"), - Pair("kimono", "577e723d719a168ef96a7417"), - Pair("kissing", "5782ae4f719a1675f68a6ece"), - Pair("lactation", "577e6f93719a168e7d256a93"), - Pair("latex", "577e6f90719a168e7d256a58"), - Pair("layer cake", "577e7230719a166f4719aa8d"), - Pair("leg lock", "57b7c0c2719a169265b768bd"), - Pair("leotard", "579b141e719a16881d14ccfe"), - Pair("lingerie", "577e71fc719a166f4719a693"), - Pair("living clothes", "577e6f90719a168e7d256a49"), - Pair("lizard girl", "5782b127719a1679528765e9"), - Pair("lolicon", "5782af84719a1694739009b5"), - Pair("long tongue", "5782b158719a1679528767d5"), - Pair("machine", "57ef0396719a163dffb8fe01"), - Pair("magical girl", "577e71c3719a166f4719a236"), - Pair("maid", "5782ae3f719a1675f68a6e19"), - Pair("male on dickgirl", "577e7267719a168ef96a76f0"), - Pair("masked face", "57c349e1719a1625b42603f5"), - Pair("masturbation", "577e71b5719a166f4719a13c"), - Pair("mermaid", "578d3c5b719a164fa798c09e"), - Pair("metal armor", "5782b158719a1679528767d6"), - Pair("miko", "577e726e719a168ef96a7765"), - Pair("milf", "577e6f8d719a168e7d256a24"), - Pair("military", "577e6f8d719a168e7d256a18"), - Pair("milking", "577e6f93719a168e7d256a94"), - Pair("mind break", "577e6f90719a168e7d256a4b"), - Pair("mind control", "577e6f90719a168e7d256a4d"), - Pair("monster girl", "577e6f90719a168e7d256a4f"), - Pair("monster girl", "577e6f90719a168e7d256a46"), - Pair("moral degeneration", "577e71da719a166f4719a3cc"), - Pair("mother", "577e71c7719a166f4719a293"), - Pair("mouse girl", "5782ae45719a1675f68a6e4a"), - Pair("multiple breasts", "5782ae45719a1675f68a6e4b"), - Pair("multiple penises", "577e722a719a166f4719aa29"), - Pair("muscle", "577e7250719a168ef96a753c"), - Pair("nakadashi", "577e6f8e719a168e7d256a26"), - Pair("netorare", "577e71c7719a166f4719a294"), - Pair("niece", "5782b10a719a1679528764b5"), - Pair("nurse", "577e6f8d719a168e7d256a1d"), - Pair("oil", "5782af5e719a1694739008b1"), - Pair("onahole", "582324e5719a1674f99b3444"), - Pair("orgasm denial", "577e725d719a168ef96a762f"), - Pair("paizuri", "577e6f90719a168e7d256a3e"), - Pair("pantyhose", "577e6f8d719a168e7d256a19"), - Pair("pantyjob", "577e7276719a168ef96a77f9"), - Pair("parasite", "577e6f90719a168e7d256a50"), - Pair("pasties", "5782b029719a169473900f3b"), - Pair("piercing", "577e6f90719a168e7d256a59"), - Pair("plant girl", "577e71f4719a166f4719a5fa"), - Pair("policewoman", "57af673b719a1655a6ca8b58"), - Pair("ponygirl", "577e6f90719a168e7d256a5a"), - Pair("possession", "5782aff7719a169473900d8b"), - Pair("pregnant", "577e71da719a166f4719a3cd"), - Pair("prolapse", "5782cc79719a165f600844e0"), - Pair("prostitution", "577e7242719a168ef96a7466"), - Pair("pubic stubble", "577e71da719a166f4719a3ce"), - Pair("public use", "5782cc79719a165f600844e1"), - Pair("rape", "577e6f90719a168e7d256a51"), - Pair("rimjob", "577e725f719a168ef96a765e"), - Pair("robot", "5782b144719a1679528766f3"), - Pair("ryona", "577e723e719a168ef96a7424"), - Pair("saliva", "5884ed6f719a1678dfbb2258"), - Pair("scar", "5782b081719a167952876168"), - Pair("school swimsuit", "5782b05f719a169473901177"), - Pair("schoolgirl uniform", "577e7199719a16697b9853e6"), - Pair("selfcest", "5782b152719a16795287677e"), - Pair("sex toys", "577e6f90719a168e7d256a5b"), - Pair("sheep girl", "5782affa719a169473900da2"), - Pair("shemale", "577e7267719a168ef96a76f1"), - Pair("shibari", "577e72a6719a168ef96a7b18"), - Pair("shimapan", "5782aebd719a1694739004c5"), - Pair("sister", "577e6f8c719a168e7d256a14"), - Pair("slave", "577e71b4719a166f4719a138"), - Pair("sleeping", "577e71e5719a166f4719a4b3"), - Pair("slime", "577e6f93719a168e7d256a95"), - Pair("slime girl", "577e6f90719a168e7d256a48"), - Pair("small breasts", "577e6f90719a168e7d256a5f"), - Pair("smell", "577e7210719a166f4719a824"), - Pair("snake girl", "577e721e719a166f4719a94b"), - Pair("sole dickgirl", "582324e5719a1674f99b3445"), - Pair("sole female", "577e6f91719a168e7d256a7a"), - Pair("solo action", "5782afbf719a169473900ba2"), - Pair("spanking", "577e7199719a16697b9853e7"), - Pair("squirting", "577e7250719a168ef96a753d"), - Pair("stockings", "577e6f8d719a168e7d256a1a"), - Pair("stomach deformation", "5782aef2719a169473900606"), - Pair("strap-on", "577e71d5719a166f4719a367"), - Pair("stuck in wall", "5782aecf719a16947390055b"), - Pair("sundress", "577e7216719a166f4719a8a2"), - Pair("sweating", "577e71b5719a166f4719a13d"), - Pair("swimsuit", "577e71d3719a166f4719a342"), - Pair("swinging", "577e7203719a166f4719a723"), - Pair("syringe", "577e71da719a166f4719a3cf"), - Pair("tall girl", "577e71d9719a166f4719a3c1"), - Pair("tanlines", "577e6f91719a168e7d256a7b"), - Pair("teacher", "577e7199719a16697b9853e8"), - Pair("tentacles", "577e6f90719a168e7d256a52"), - Pair("thigh high boots", "577e6f93719a168e7d256a96"), - Pair("tiara", "5782cc74719a165f600844d3"), - Pair("tights", "5782b059719a169473901132"), - Pair("tomboy", "577e7201719a166f4719a6fb"), - Pair("torture", "577e725d719a168ef96a7630"), - Pair("tracksuit", "5782b146719a167952876708"), - Pair("transformation", "577e6f90719a168e7d256a4a"), - Pair("tribadism", "577e6f90719a168e7d256a60"), - Pair("tube", "577e7208719a166f4719a78f"), - Pair("tutor", "5782af34719a1694739007a3"), - Pair("twins", "577e726a719a168ef96a7729"), - Pair("unusual pupils", "577e6f90719a168e7d256a53"), - Pair("urethra insertion", "5877c07f719a163627a2ceb0"), - Pair("urination", "577e7210719a166f4719a825"), - Pair("vaginal sticker", "577e721c719a166f4719a930"), - Pair("vomit", "5782ae45719a1675f68a6e4c"), - Pair("vore", "577e6f8c719a168e7d256a15"), - Pair("voyeurism", "583ca1ef719a161795a60847"), - Pair("waitress", "5782ae3f719a1675f68a6e1a"), - Pair("widow", "5782b13c719a16795287669d"), - Pair("wings", "5782b158719a1679528767d7"), - Pair("witch", "577e6f93719a168e7d256a97"), - Pair("wolf girl", "577e724c719a168ef96a74fd"), - Pair("wrestling", "577e7230719a166f4719aa8e"), - Pair("x-ray", "577e6f90719a168e7d256a40"), - Pair("yandere", "577e7295719a168ef96a79e7"), - Pair("yuri", "577e6f90719a168e7d256a4c") + Pair("commedia", "4e70ea9ac092255ef70075d8"), + Pair("ecchi", "4e70ea9ac092255ef70075d9"), + Pair("age progression", "5782b043719a16947390104a"), + Pair("ahegao", "577e6f90719a168e7d256a3f"), + Pair("anal", "577e6f90719a168e7d256a3b"), + Pair("angel", "577e724a719a168ef96a74d6"), + Pair("apron", "577e720a719a166f4719a7be"), + Pair("armpit licking", "577e71db719a166f4719a3e7"), + Pair("assjob", "58474a08719a1668eeeea29b"), + Pair("aunt", "577e6f8d719a168e7d256a20"), + Pair("bbw", "5782ae42719a1675f68a6e29"), + Pair("bdsm", "577e723d719a168ef96a7416"), + Pair("bestiality", "57ad8919719a1629a0a327cf"), + Pair("big areolae", "577e7226719a166f4719a9d0"), + Pair("big ass", "577e6f8d719a168e7d256a21"), + Pair("big balls", "577e7267719a168ef96a76ee"), + Pair("big breasts", "577e6f8d719a168e7d256a1c"), + Pair("big clit", "57ef0396719a163dffb8fdff"), + Pair("big nipples", "5782ae42719a1675f68a6e2a"), + Pair("big penis", "577e7267719a168ef96a76ef"), + Pair("bike shorts", "577e7210719a166f4719a820"), + Pair("bikini", "577e6f91719a168e7d256a77"), + Pair("birth", "577e7273719a168ef96a77cf"), + Pair("blackmail", "577e6f91719a168e7d256a78"), + Pair("blindfold", "577e7208719a166f4719a78d"), + Pair("blood", "577e7295719a168ef96a79e6"), + Pair("bloomers", "5782b051719a1694739010ee"), + Pair("blowjob", "577e6f8d719a168e7d256a22"), + Pair("blowjob face", "577e71eb719a166f4719a544"), + Pair("body modification", "577e6f93719a168e7d256a8e"), + Pair("bodystocking", "5782b05c719a169473901151"), + Pair("bodysuit", "577e6f90719a168e7d256a42"), + Pair("bondage", "577e6f90719a168e7d256a45"), + Pair("breast expansion", "577e71c3719a166f4719a235"), + Pair("bukkake", "577e7210719a166f4719a821"), + Pair("bunny girl", "577e7224719a166f4719a9b9"), + Pair("business suit", "577e71e5719a166f4719a4b2"), + Pair("catgirl", "577e71d5719a166f4719a366"), + Pair("centaur", "577e7297719a168ef96a7a06"), + Pair("cervix penetration", "577e7273719a168ef96a77d0"), + Pair("cheating", "577e71b5719a166f4719a13b"), + Pair("cheerleader", "57c0a6de719a1641240e9257"), + Pair("chikan", "5782b0c6719a1679528762ac"), + Pair("chinese dress", "5782b059719a169473901131"), + Pair("chloroform", "577e6f92719a168e7d256a7f"), + Pair("christmas", "5782af2b719a169473900752"), + Pair("clit growth", "57ef0396719a163dffb8fe00"), + Pair("collar", "577e6f93719a168e7d256a8f"), + Pair("condom", "577e71d5719a166f4719a36c"), + Pair("corruption", "577e6f90719a168e7d256a41"), + Pair("cosplaying", "5782b185719a167952876944"), + Pair("cousin", "577e7283719a168ef96a78c3"), + Pair("cow", "5865d767719a162cce299571"), + Pair("cunnilingus", "577e6f8d719a168e7d256a23"), + Pair("dark skin", "577e6f90719a168e7d256a55"), + Pair("daughter", "577e7250719a168ef96a7539"), + Pair("deepthroat", "577e6f90719a168e7d256a3c"), + Pair("defloration", "577e6f92719a168e7d256a82"), + Pair("demon girl", "577e7218719a166f4719a8c8"), + Pair("dick growth", "577e6f93719a168e7d256a90"), + Pair("dickgirl on dickgirl", "5782af0e719a16947390067a"), + Pair("dog girl", "577e7218719a166f4719a8c9"), + Pair("double penetration", "577e6f90719a168e7d256a3d"), + Pair("double vaginal", "577e7226719a166f4719a9d1"), + Pair("drugs", "577e71da719a166f4719a3cb"), + Pair("drunk", "577e7199719a16697b9853ea"), + Pair("elf", "577e6f93719a168e7d256a91"), + Pair("enema", "5782aff7719a169473900d8a"), + Pair("exhibitionism", "577e72a7719a168ef96a7b26"), + Pair("eyemask", "577e7208719a166f4719a78e"), + Pair("facesitting", "577e7230719a166f4719aa8c"), + Pair("females only", "577e6f90719a168e7d256a44"), + Pair("femdom", "577e6f8c719a168e7d256a13"), + Pair("filming", "577e7242719a168ef96a7465"), + Pair("fingering", "577e6f90719a168e7d256a5d"), + Pair("fisting", "57c349e1719a1625b42603f4"), + Pair("foot licking", "5782b152719a16795287677d"), + Pair("footjob", "577e6f8d719a168e7d256a17"), + Pair("freckles", "5782ae42719a1675f68a6e2b"), + Pair("fundoshi", "577e71d9719a166f4719a3bf"), + Pair("furry", "5782ae45719a1675f68a6e49"), + Pair("futanari", "577e6f92719a168e7d256a80"), + Pair("gag", "577e6f90719a168e7d256a56"), + Pair("gaping", "577e7210719a166f4719a822"), + Pair("garter belt", "577e7201719a166f4719a704"), + Pair("glasses", "577e6f90719a168e7d256a5e"), + Pair("gothic lolita", "577e7201719a166f4719a705"), + Pair("group", "577e726e719a168ef96a7764"), + Pair("gyaru", "577e6f91719a168e7d256a79"), + Pair("hairjob", "57bcea9f719a1687ea2bc092"), + Pair("hairy", "577e7250719a168ef96a753a"), + Pair("hairy armpits", "5782b13c719a16795287669c"), + Pair("handjob", "577e71c8719a166f4719a29b"), + Pair("harem", "577e71c3719a166f4719a239"), + Pair("heterochromia", "577e7201719a166f4719a706"), + Pair("hotpants", "585b302d719a1648da4f0389"), + Pair("huge breasts", "577e71d9719a166f4719a3c0"), + Pair("huge penis", "585b302d719a1648da4f038a"), + Pair("human on furry", "577e7203719a166f4719a722"), + Pair("human pet", "577e6f90719a168e7d256a57"), + Pair("humiliation", "577e7210719a166f4719a823"), + Pair("impregnation", "577e6f90719a168e7d256a47"), + Pair("incest", "577e6f93719a168e7d256a92"), + Pair("inflation", "577e7273719a168ef96a77d1"), + Pair("insect girl", "577e71fc719a166f4719a692"), + Pair("inverted nipples", "5813993a719a165f236ddacd"), + Pair("kimono", "577e723d719a168ef96a7417"), + Pair("kissing", "5782ae4f719a1675f68a6ece"), + Pair("lactation", "577e6f93719a168e7d256a93"), + Pair("latex", "577e6f90719a168e7d256a58"), + Pair("layer cake", "577e7230719a166f4719aa8d"), + Pair("leg lock", "57b7c0c2719a169265b768bd"), + Pair("leotard", "579b141e719a16881d14ccfe"), + Pair("lingerie", "577e71fc719a166f4719a693"), + Pair("living clothes", "577e6f90719a168e7d256a49"), + Pair("lizard girl", "5782b127719a1679528765e9"), + Pair("lolicon", "5782af84719a1694739009b5"), + Pair("long tongue", "5782b158719a1679528767d5"), + Pair("machine", "57ef0396719a163dffb8fe01"), + Pair("magical girl", "577e71c3719a166f4719a236"), + Pair("maid", "5782ae3f719a1675f68a6e19"), + Pair("male on dickgirl", "577e7267719a168ef96a76f0"), + Pair("masked face", "57c349e1719a1625b42603f5"), + Pair("masturbation", "577e71b5719a166f4719a13c"), + Pair("mermaid", "578d3c5b719a164fa798c09e"), + Pair("metal armor", "5782b158719a1679528767d6"), + Pair("miko", "577e726e719a168ef96a7765"), + Pair("milf", "577e6f8d719a168e7d256a24"), + Pair("military", "577e6f8d719a168e7d256a18"), + Pair("milking", "577e6f93719a168e7d256a94"), + Pair("mind break", "577e6f90719a168e7d256a4b"), + Pair("mind control", "577e6f90719a168e7d256a4d"), + Pair("monster girl", "577e6f90719a168e7d256a4f"), + Pair("monster girl", "577e6f90719a168e7d256a46"), + Pair("moral degeneration", "577e71da719a166f4719a3cc"), + Pair("mother", "577e71c7719a166f4719a293"), + Pair("mouse girl", "5782ae45719a1675f68a6e4a"), + Pair("multiple breasts", "5782ae45719a1675f68a6e4b"), + Pair("multiple penises", "577e722a719a166f4719aa29"), + Pair("muscle", "577e7250719a168ef96a753c"), + Pair("nakadashi", "577e6f8e719a168e7d256a26"), + Pair("netorare", "577e71c7719a166f4719a294"), + Pair("niece", "5782b10a719a1679528764b5"), + Pair("nurse", "577e6f8d719a168e7d256a1d"), + Pair("oil", "5782af5e719a1694739008b1"), + Pair("onahole", "582324e5719a1674f99b3444"), + Pair("orgasm denial", "577e725d719a168ef96a762f"), + Pair("paizuri", "577e6f90719a168e7d256a3e"), + Pair("pantyhose", "577e6f8d719a168e7d256a19"), + Pair("pantyjob", "577e7276719a168ef96a77f9"), + Pair("parasite", "577e6f90719a168e7d256a50"), + Pair("pasties", "5782b029719a169473900f3b"), + Pair("piercing", "577e6f90719a168e7d256a59"), + Pair("plant girl", "577e71f4719a166f4719a5fa"), + Pair("policewoman", "57af673b719a1655a6ca8b58"), + Pair("ponygirl", "577e6f90719a168e7d256a5a"), + Pair("possession", "5782aff7719a169473900d8b"), + Pair("pregnant", "577e71da719a166f4719a3cd"), + Pair("prolapse", "5782cc79719a165f600844e0"), + Pair("prostitution", "577e7242719a168ef96a7466"), + Pair("pubic stubble", "577e71da719a166f4719a3ce"), + Pair("public use", "5782cc79719a165f600844e1"), + Pair("rape", "577e6f90719a168e7d256a51"), + Pair("rimjob", "577e725f719a168ef96a765e"), + Pair("robot", "5782b144719a1679528766f3"), + Pair("ryona", "577e723e719a168ef96a7424"), + Pair("saliva", "5884ed6f719a1678dfbb2258"), + Pair("scar", "5782b081719a167952876168"), + Pair("school swimsuit", "5782b05f719a169473901177"), + Pair("schoolgirl uniform", "577e7199719a16697b9853e6"), + Pair("selfcest", "5782b152719a16795287677e"), + Pair("sex toys", "577e6f90719a168e7d256a5b"), + Pair("sheep girl", "5782affa719a169473900da2"), + Pair("shemale", "577e7267719a168ef96a76f1"), + Pair("shibari", "577e72a6719a168ef96a7b18"), + Pair("shimapan", "5782aebd719a1694739004c5"), + Pair("sister", "577e6f8c719a168e7d256a14"), + Pair("slave", "577e71b4719a166f4719a138"), + Pair("sleeping", "577e71e5719a166f4719a4b3"), + Pair("slime", "577e6f93719a168e7d256a95"), + Pair("slime girl", "577e6f90719a168e7d256a48"), + Pair("small breasts", "577e6f90719a168e7d256a5f"), + Pair("smell", "577e7210719a166f4719a824"), + Pair("snake girl", "577e721e719a166f4719a94b"), + Pair("sole dickgirl", "582324e5719a1674f99b3445"), + Pair("sole female", "577e6f91719a168e7d256a7a"), + Pair("solo action", "5782afbf719a169473900ba2"), + Pair("spanking", "577e7199719a16697b9853e7"), + Pair("squirting", "577e7250719a168ef96a753d"), + Pair("stockings", "577e6f8d719a168e7d256a1a"), + Pair("stomach deformation", "5782aef2719a169473900606"), + Pair("strap-on", "577e71d5719a166f4719a367"), + Pair("stuck in wall", "5782aecf719a16947390055b"), + Pair("sundress", "577e7216719a166f4719a8a2"), + Pair("sweating", "577e71b5719a166f4719a13d"), + Pair("swimsuit", "577e71d3719a166f4719a342"), + Pair("swinging", "577e7203719a166f4719a723"), + Pair("syringe", "577e71da719a166f4719a3cf"), + Pair("tall girl", "577e71d9719a166f4719a3c1"), + Pair("tanlines", "577e6f91719a168e7d256a7b"), + Pair("teacher", "577e7199719a16697b9853e8"), + Pair("tentacles", "577e6f90719a168e7d256a52"), + Pair("thigh high boots", "577e6f93719a168e7d256a96"), + Pair("tiara", "5782cc74719a165f600844d3"), + Pair("tights", "5782b059719a169473901132"), + Pair("tomboy", "577e7201719a166f4719a6fb"), + Pair("torture", "577e725d719a168ef96a7630"), + Pair("tracksuit", "5782b146719a167952876708"), + Pair("transformation", "577e6f90719a168e7d256a4a"), + Pair("tribadism", "577e6f90719a168e7d256a60"), + Pair("tube", "577e7208719a166f4719a78f"), + Pair("tutor", "5782af34719a1694739007a3"), + Pair("twins", "577e726a719a168ef96a7729"), + Pair("unusual pupils", "577e6f90719a168e7d256a53"), + Pair("urethra insertion", "5877c07f719a163627a2ceb0"), + Pair("urination", "577e7210719a166f4719a825"), + Pair("vaginal sticker", "577e721c719a166f4719a930"), + Pair("vomit", "5782ae45719a1675f68a6e4c"), + Pair("vore", "577e6f8c719a168e7d256a15"), + Pair("voyeurism", "583ca1ef719a161795a60847"), + Pair("waitress", "5782ae3f719a1675f68a6e1a"), + Pair("widow", "5782b13c719a16795287669d"), + Pair("wings", "5782b158719a1679528767d7"), + Pair("witch", "577e6f93719a168e7d256a97"), + Pair("wolf girl", "577e724c719a168ef96a74fd"), + Pair("wrestling", "577e7230719a166f4719aa8e"), + Pair("x-ray", "577e6f90719a168e7d256a40"), + Pair("yandere", "577e7295719a168ef96a79e7"), + Pair("yuri", "577e6f90719a168e7d256a4c") ) } diff --git a/src/ja/nikkangecchan/src/eu/kanade/tachiyomi/extension/ja/nikkangecchan/Nikkangecchan.kt b/src/ja/nikkangecchan/src/eu/kanade/tachiyomi/extension/ja/nikkangecchan/Nikkangecchan.kt index 3f44d8763..ca0228600 100644 --- a/src/ja/nikkangecchan/src/eu/kanade/tachiyomi/extension/ja/nikkangecchan/Nikkangecchan.kt +++ b/src/ja/nikkangecchan/src/eu/kanade/tachiyomi/extension/ja/nikkangecchan/Nikkangecchan.kt @@ -25,11 +25,11 @@ class Nikkangecchan : ParsedHttpSource() { override val supportsLatest = false private val catalogHeaders = Headers.Builder() - .apply { - add("User-Agent", USER_AGENT) - add("Referer", baseUrl) - } - .build() + .apply { + add("User-Agent", USER_AGENT) + add("Referer", baseUrl) + } + .build() override fun popularMangaRequest(page: Int): Request = GET(baseUrl, catalogHeaders) @@ -50,15 +50,15 @@ class Nikkangecchan : ParsedHttpSource() { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { return super.fetchSearchManga(page, query, filters) - .map { - val filtered = it.mangas.filter { e -> e.title.contains(query, true) } - MangasPage(filtered, false) - } + .map { + val filtered = it.mangas.filter { e -> e.title.contains(query, true) } + MangasPage(filtered, false) + } } // Does not have search, use complete list (in popular) instead. override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = - popularMangaRequest(page) + popularMangaRequest(page) override fun searchMangaSelector() = popularMangaSelector() @@ -81,7 +81,7 @@ class Nikkangecchan : ParsedHttpSource() { override fun chapterListSelector(): String = ".episodeBox" override fun chapterListParse(response: Response): List<SChapter> = - super.chapterListParse(response).reversed() + super.chapterListParse(response).reversed() override fun chapterFromElement(element: Element): SChapter { val episodePage = element.select(".episode-page").first() @@ -104,10 +104,10 @@ class Nikkangecchan : ParsedHttpSource() { override fun imageRequest(page: Page): Request { val headers = Headers.Builder() - .apply { - add("User-Agent", USER_AGENT) - add("Referer", baseUrl + page.url.substringBeforeLast("/")) - } + .apply { + add("User-Agent", USER_AGENT) + add("Referer", baseUrl + page.url.substringBeforeLast("/")) + } return GET(page.imageUrl!!, headers.build()) } diff --git a/src/ja/rawdevart/src/eu/kanade/tachiyomi/extension/ja/rawdevart/Rawdevart.kt b/src/ja/rawdevart/src/eu/kanade/tachiyomi/extension/ja/rawdevart/Rawdevart.kt index fc7d37eca..c9541b02c 100644 --- a/src/ja/rawdevart/src/eu/kanade/tachiyomi/extension/ja/rawdevart/Rawdevart.kt +++ b/src/ja/rawdevart/src/eu/kanade/tachiyomi/extension/ja/rawdevart/Rawdevart.kt @@ -8,15 +8,15 @@ 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 java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale class Rawdevart : ParsedHttpSource() { @@ -81,12 +81,18 @@ class Rawdevart : ParsedHttpSource() { typeToInclude.add(content.id) } if (typeToExclude.isNotEmpty()) { - url.addQueryParameter("ctype_exc", typeToExclude - .joinToString(",")) + url.addQueryParameter( + "ctype_exc", + typeToExclude + .joinToString(",") + ) } if (typeToInclude.isNotEmpty()) { - url.addQueryParameter("ctype_inc", typeToInclude - .joinToString(",")) + url.addQueryParameter( + "ctype_inc", + typeToInclude + .joinToString(",") + ) } } is StatusFilter -> { @@ -99,12 +105,18 @@ class Rawdevart : ParsedHttpSource() { statusToInclude.add(content.id) } if (statusToExclude.isNotEmpty()) { - url.addQueryParameter("status_exc", statusToExclude - .joinToString(",")) + url.addQueryParameter( + "status_exc", + statusToExclude + .joinToString(",") + ) } if (statusToInclude.isNotEmpty()) { - url.addQueryParameter("status_inc", statusToInclude - .joinToString(",")) + url.addQueryParameter( + "status_inc", + statusToInclude + .joinToString(",") + ) } } is GenreFilter -> { @@ -117,12 +129,18 @@ class Rawdevart : ParsedHttpSource() { genreToInclude.add(content.id) } if (genreToExclude.isNotEmpty()) { - url.addQueryParameter("genre_exc", genreToExclude - .joinToString(",")) + url.addQueryParameter( + "genre_exc", + genreToExclude + .joinToString(",") + ) } if (genreToInclude.isNotEmpty()) { - url.addQueryParameter("genre_inc", genreToInclude - .joinToString(",")) + url.addQueryParameter( + "genre_inc", + genreToInclude + .joinToString(",") + ) } } } @@ -206,8 +224,8 @@ class Rawdevart : ParsedHttpSource() { when { it.contains("ago") -> Date(System.currentTimeMillis() - it.split("\\s".toRegex())[0].toLong() * 60 * 60 * 1000).time it.contains("Yesterday") -> Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000).time - it.contains(".") -> SimpleDateFormat("MMM. dd, yyyy", Locale.US).parse(it).time - else -> SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it).time + it.contains(".") -> SimpleDateFormat("MMM. dd, yyyy", Locale.US).parse(it)?.time ?: 0L + else -> SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it)?.time ?: 0L } } catch (e: Exception) { Date(System.currentTimeMillis()).time @@ -231,7 +249,9 @@ class Rawdevart : ParsedHttpSource() { private class ArtistFilter : Filter.Text("Artist") - private class SortFilter : UriPartFilter("Sort By", arrayOf( + private class SortFilter : UriPartFilter( + "Sort By", + arrayOf( Pair("<select>", ""), Pair("Latest", "0"), Pair("A-Z", "1"), @@ -239,7 +259,8 @@ class Rawdevart : ParsedHttpSource() { Pair("Star", "3"), Pair("Bookmark", "4"), Pair("View", "5") - )) + ) + ) private class TypeFilter(type: List<Tag>) : Filter.Group<Tag>("Types", type) @@ -248,77 +269,77 @@ class Rawdevart : ParsedHttpSource() { private class GenreFilter(genres: List<Tag>) : Filter.Group<Tag>("Genres", genres) override fun getFilterList() = FilterList( - Filter.Header("Combine Sort filter with other filters."), - Filter.Separator(), - AuthorFilter(), - ArtistFilter(), - SortFilter(), - TypeFilter(getTypeList()), - StatusFilter(getStatusList()), - GenreFilter(getGenreList()) + Filter.Header("Combine Sort filter with other filters."), + Filter.Separator(), + AuthorFilter(), + ArtistFilter(), + SortFilter(), + TypeFilter(getTypeList()), + StatusFilter(getStatusList()), + GenreFilter(getGenreList()) ) private fun getTypeList() = listOf( - Tag("0", "Manga"), - Tag("1", "Webtoon"), - Tag("2", "Manhwa - Korean"), - Tag("3", "Manhua - Chinese"), - Tag("4", "Comic"), - Tag("5", "Doujinshi") + Tag("0", "Manga"), + Tag("1", "Webtoon"), + Tag("2", "Manhwa - Korean"), + Tag("3", "Manhua - Chinese"), + Tag("4", "Comic"), + Tag("5", "Doujinshi") ) private fun getStatusList() = listOf( - Tag("0", "Ongoing"), - Tag("1", "Haitus"), - Tag("2", "Axed"), - Tag("3", "Unknown"), - Tag("4", "Finished") + Tag("0", "Ongoing"), + Tag("1", "Haitus"), + Tag("2", "Axed"), + Tag("3", "Unknown"), + Tag("4", "Finished") ) private fun getGenreList() = listOf( - Tag("29", "4-koma"), - Tag("1", "Action"), - Tag("37", "Adult"), - Tag("2", "Adventure"), - Tag("3", "Comedy"), - Tag("33", "Cooking"), - Tag("4", "Crime"), - Tag("5", "Drama"), - Tag("30", "Ecchi"), - Tag("6", "Fantasy"), - Tag("34", "Gender Bender"), - Tag("31", "Gore"), - Tag("39", "Harem"), - Tag("7", "Historical"), - Tag("8", "Horror"), - Tag("9", "Isekai"), - Tag("42", "Josei"), - Tag("35", "Martial Arts"), - Tag("36", "Mature"), - Tag("10", "Mecha"), - Tag("11", "Medical"), - Tag("38", "Music"), - Tag("12", "Mystery"), - Tag("13", "Philosophical"), - Tag("14", "Psychological"), - Tag("15", "Romance"), - Tag("40", "School Life"), - Tag("16", "Sci-Fi"), - Tag("41", "Seinen"), - Tag("28", "Shoujo"), - Tag("17", "Shoujo Ai"), - Tag("27", "Shounen"), - Tag("18", "Shounen Ai"), - Tag("19", "Slice of Life"), - Tag("32", "Smut"), - Tag("20", "Sports"), - Tag("21", "Super Powers"), - Tag("43", "Supernatural"), - Tag("22", "Thriller"), - Tag("23", "Tragedy"), - Tag("24", "Wuxia"), - Tag("25", "Yaoi"), - Tag("26", "Yuri") + Tag("29", "4-koma"), + Tag("1", "Action"), + Tag("37", "Adult"), + Tag("2", "Adventure"), + Tag("3", "Comedy"), + Tag("33", "Cooking"), + Tag("4", "Crime"), + Tag("5", "Drama"), + Tag("30", "Ecchi"), + Tag("6", "Fantasy"), + Tag("34", "Gender Bender"), + Tag("31", "Gore"), + Tag("39", "Harem"), + Tag("7", "Historical"), + Tag("8", "Horror"), + Tag("9", "Isekai"), + Tag("42", "Josei"), + Tag("35", "Martial Arts"), + Tag("36", "Mature"), + Tag("10", "Mecha"), + Tag("11", "Medical"), + Tag("38", "Music"), + Tag("12", "Mystery"), + Tag("13", "Philosophical"), + Tag("14", "Psychological"), + Tag("15", "Romance"), + Tag("40", "School Life"), + Tag("16", "Sci-Fi"), + Tag("41", "Seinen"), + Tag("28", "Shoujo"), + Tag("17", "Shoujo Ai"), + Tag("27", "Shounen"), + Tag("18", "Shounen Ai"), + Tag("19", "Slice of Life"), + Tag("32", "Smut"), + Tag("20", "Sports"), + Tag("21", "Super Powers"), + Tag("43", "Supernatural"), + Tag("22", "Thriller"), + Tag("23", "Tragedy"), + Tag("24", "Wuxia"), + Tag("25", "Yaoi"), + Tag("26", "Yuri") ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : diff --git a/src/ja/rawkuma/src/eu/kanade/tachiyomi/extension/ja/rawkuma/Rawkuma.kt b/src/ja/rawkuma/src/eu/kanade/tachiyomi/extension/ja/rawkuma/Rawkuma.kt index ed699bf34..0f54a51c1 100644 --- a/src/ja/rawkuma/src/eu/kanade/tachiyomi/extension/ja/rawkuma/Rawkuma.kt +++ b/src/ja/rawkuma/src/eu/kanade/tachiyomi/extension/ja/rawkuma/Rawkuma.kt @@ -8,15 +8,15 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class Rawkuma : ParsedHttpSource() { @@ -89,8 +89,8 @@ class Rawkuma : ParsedHttpSource() { } is GenreList -> { filter.state - .filter { it.state != Filter.TriState.STATE_IGNORE } - .forEach { url.addQueryParameter("genre[]", it.id) } + .filter { it.state != Filter.TriState.STATE_IGNORE } + .forEach { url.addQueryParameter("genre[]", it.id) } } } } @@ -169,7 +169,7 @@ class Rawkuma : ParsedHttpSource() { private fun parseDate(date: String): Long { return try { - SimpleDateFormat("MMM dd, yyyy", Locale.US).parse(date).time + SimpleDateFormat("MMM dd, yyyy", Locale.US).parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } @@ -204,14 +204,14 @@ class Rawkuma : ParsedHttpSource() { override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used") override fun getFilterList() = FilterList( - Filter.Header("You can combine filter."), - Filter.Separator(), - AuthorFilter(), - YearFilter(), - StatusFilter(), - TypeFilter(), - OrderByFilter(), - GenreList(getGenreList()) + Filter.Header("You can combine filter."), + Filter.Separator(), + AuthorFilter(), + YearFilter(), + StatusFilter(), + TypeFilter(), + OrderByFilter(), + GenreList(getGenreList()) ) private class AuthorFilter : Filter.Text("Author") @@ -220,61 +220,67 @@ class Rawkuma : ParsedHttpSource() { private class StatusFilter : Filter.TriState("Completed") - private class TypeFilter : UriPartFilter("Type", arrayOf( + private class TypeFilter : UriPartFilter( + "Type", + arrayOf( Pair("All", ""), Pair("Manga", "Manga"), Pair("Manhwa", "Manhwa"), Pair("Manhua", "Manhua") - )) - private class OrderByFilter : UriPartFilter("Order By", arrayOf( + ) + ) + private class OrderByFilter : UriPartFilter( + "Order By", + arrayOf( Pair("<select>", ""), Pair("A-Z", "title"), Pair("Z-A", "titlereverse"), Pair("Latest Update", "update"), Pair("Latest Added", "latest"), Pair("Popular", "popular") - )) + ) + ) private fun getGenreList() = listOf( - Tag("action", "Action"), - Tag("adult", "Adult"), - Tag("adventure", "Adventure"), - Tag("blood", "Blood"), - Tag("comedy", "Comedy"), - Tag("drama", "Drama"), - Tag("ecchi", "Ecchi"), - Tag("fanta", "Fanta"), - Tag("fantasy", "Fantasy"), - Tag("gender-bender", "Gender Bender"), - Tag("harem", "Harem"), - Tag("historical", "Historical"), - Tag("horror", "Horror"), - Tag("isekai", "Isekai"), - Tag("josei", "Josei"), - Tag("lolicon", "Lolicon"), - Tag("martial-arts", "Martial Arts"), - Tag("mature", "Mature"), - Tag("mecha", "Mecha"), - Tag("mystery", "Mystery"), - Tag("parody", "Parody"), - Tag("psychological", "Psychological"), - Tag("romance", "Romance"), - Tag("school-life", "School Life"), - Tag("sci-fi", "Sci-fi"), - Tag("seinen", "Seinen"), - Tag("shoujo", "Shoujo"), - Tag("shoujo-ai", "Shoujo Ai"), - Tag("shounen", "Shounen"), - Tag("slice-of-life", "Slice of Life"), - Tag("sports", "Sports"), - Tag("supernatural", "Supernatural"), - Tag("thriller", "Thriller"), - Tag("tragedy", "Tragedy"), - Tag("yuri", "Yuri") + Tag("action", "Action"), + Tag("adult", "Adult"), + Tag("adventure", "Adventure"), + Tag("blood", "Blood"), + Tag("comedy", "Comedy"), + Tag("drama", "Drama"), + Tag("ecchi", "Ecchi"), + Tag("fanta", "Fanta"), + Tag("fantasy", "Fantasy"), + Tag("gender-bender", "Gender Bender"), + Tag("harem", "Harem"), + Tag("historical", "Historical"), + Tag("horror", "Horror"), + Tag("isekai", "Isekai"), + Tag("josei", "Josei"), + Tag("lolicon", "Lolicon"), + Tag("martial-arts", "Martial Arts"), + Tag("mature", "Mature"), + Tag("mecha", "Mecha"), + Tag("mystery", "Mystery"), + Tag("parody", "Parody"), + Tag("psychological", "Psychological"), + Tag("romance", "Romance"), + Tag("school-life", "School Life"), + Tag("sci-fi", "Sci-fi"), + Tag("seinen", "Seinen"), + Tag("shoujo", "Shoujo"), + Tag("shoujo-ai", "Shoujo Ai"), + Tag("shounen", "Shounen"), + Tag("slice-of-life", "Slice of Life"), + Tag("sports", "Sports"), + Tag("supernatural", "Supernatural"), + Tag("thriller", "Thriller"), + Tag("tragedy", "Tragedy"), + Tag("yuri", "Yuri") ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { fun toUriPart() = vals[state].second } diff --git a/src/ja/senmanga/src/eu/kanade/tachiyomi/extension/ja/senmanga/SenManga.kt b/src/ja/senmanga/src/eu/kanade/tachiyomi/extension/ja/senmanga/SenManga.kt index 38e1a53d4..4cc36e8f0 100644 --- a/src/ja/senmanga/src/eu/kanade/tachiyomi/extension/ja/senmanga/SenManga.kt +++ b/src/ja/senmanga/src/eu/kanade/tachiyomi/extension/ja/senmanga/SenManga.kt @@ -8,11 +8,11 @@ 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 java.util.Calendar import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar /** * Sen Manga source @@ -31,10 +31,13 @@ class SenManga : ParsedHttpSource() { // Enables bandwidth stealing feature val request = if (it.request().url().pathSegments().firstOrNull()?.trim()?.toLowerCase() == "viewer") { it.request().newBuilder() - .addHeader("Referer", it.request().url().newBuilder() - .removePathSegment(0) - .toString()) - .build() + .addHeader( + "Referer", + it.request().url().newBuilder() + .removePathSegment(0) + .toString() + ) + .build() } else it.request() it.proceed(request) }.build()!! @@ -161,7 +164,7 @@ class SenManga : ParsedHttpSource() { } override fun imageUrlParse(document: Document) = - throw UnsupportedOperationException("This method should not be called!") + throw UnsupportedOperationException("This method should not be called!") override fun getFilterList() = FilterList( GenreFilter(getGenreList()), @@ -176,12 +179,15 @@ class SenManga : ParsedHttpSource() { fun toUriPart() = vals[state].first } - private class SortFilter : UriPartFilter("Sort By", arrayOf( - Pair("total_views", "Total Views"), - Pair("title", "Title"), - Pair("rank", "Rank"), - Pair("last_update", "Last Update") - )) + private class SortFilter : UriPartFilter( + "Sort By", + arrayOf( + Pair("total_views", "Total Views"), + Pair("title", "Title"), + Pair("rank", "Rank"), + Pair("last_update", "Last Update") + ) + ) private fun getGenreList(): List<Genre> = listOf( Genre("Action", "Action"), diff --git a/src/ja/shonenjumpplus/src/eu/kanade/tachiyomi/extension/ja/shonenjumpplus/ShonenJumpPlus.kt b/src/ja/shonenjumpplus/src/eu/kanade/tachiyomi/extension/ja/shonenjumpplus/ShonenJumpPlus.kt index 08fb461c5..c5be2d3cf 100644 --- a/src/ja/shonenjumpplus/src/eu/kanade/tachiyomi/extension/ja/shonenjumpplus/ShonenJumpPlus.kt +++ b/src/ja/shonenjumpplus/src/eu/kanade/tachiyomi/extension/ja/shonenjumpplus/ShonenJumpPlus.kt @@ -18,13 +18,6 @@ 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 java.io.ByteArrayOutputStream -import java.io.InputStream -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale -import kotlin.math.floor import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Interceptor @@ -36,6 +29,13 @@ import okhttp3.ResponseBody import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.io.ByteArrayOutputStream +import java.io.InputStream +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import kotlin.math.floor class ShonenJumpPlus : ParsedHttpSource() { @@ -201,8 +201,10 @@ class ShonenJumpPlus : ParsedHttpSource() { return GET(page.imageUrl!!, newHeaders) } - private class SeriesListModeFilter : Filter.Select<String>("一覧", - LIST_MODES.map { it.first }.toTypedArray()) + private class SeriesListModeFilter : Filter.Select<String>( + "一覧", + LIST_MODES.map { it.first }.toTypedArray() + ) override fun getFilterList(): FilterList = FilterList(SeriesListModeFilter()) diff --git a/src/ko/jmana/src/eu/kanade/tachiyomi/extension/ko/jmana/JMana.kt b/src/ko/jmana/src/eu/kanade/tachiyomi/extension/ko/jmana/JMana.kt index d4eb009eb..47978a2e7 100644 --- a/src/ko/jmana/src/eu/kanade/tachiyomi/extension/ko/jmana/JMana.kt +++ b/src/ko/jmana/src/eu/kanade/tachiyomi/extension/ko/jmana/JMana.kt @@ -15,8 +15,6 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request @@ -25,6 +23,8 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Locale /** * JMana Source @@ -77,14 +77,14 @@ class JMana : ConfigurableSource, ParsedHttpSource() { val manga = SManga.create() descriptionElement - .map { it.text() } - .forEach { text -> - when { - DETAIL_TITLE in text -> manga.title = text.substringAfter(DETAIL_TITLE).trim() - DETAIL_AUTHOR in text -> manga.author = text.substringAfter(DETAIL_AUTHOR).trim() - DETAIL_GENRE in text -> manga.genre = text.substringAfter("장르 : [").substringBefore("]").trim() - } + .map { it.text() } + .forEach { text -> + when { + DETAIL_TITLE in text -> manga.title = text.substringAfter(DETAIL_TITLE).trim() + DETAIL_AUTHOR in text -> manga.author = text.substringAfter(DETAIL_AUTHOR).trim() + DETAIL_GENRE in text -> manga.genre = text.substringAfter("장르 : [").substringBefore("]").trim() } + } manga.description = descriptionElement.select("#desc").text().substringAfter(DETAIL_DESCRIPTION).trim() manga.thumbnail_url = document.select("div.media-left img").attr("abs:src") manga.status = SManga.UNKNOWN diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMFilters.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMFilters.kt index b12e9965a..370accd0e 100644 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMFilters.kt +++ b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMFilters.kt @@ -159,8 +159,10 @@ fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: St */ if (query.isEmpty() && nameFilter == null && statusFilter == null && orderFilter == 0 && matchFilter == 1 && genresFilter.isEmpty()) { - return GET("$baseUrl/bbs/page.php?hid=manga_list" + - if (page > 1) "&page=${page - 1}" else "") + return GET( + "$baseUrl/bbs/page.php?hid=manga_list" + + if (page > 1) "&page=${page - 1}" else "" + ) } val url = HttpUrl.parse("$baseUrl/bbs/page.php?hid=manga_list")!!.newBuilder() diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMImageDecoder.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMImageDecoder.kt index 27ed20518..3f251b20a 100644 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMImageDecoder.kt +++ b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMImageDecoder.kt @@ -4,6 +4,10 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Rect +import okhttp3.Interceptor +import okhttp3.MediaType +import okhttp3.Response +import okhttp3.ResponseBody import java.io.ByteArrayOutputStream import java.io.IOException import java.io.InputStream @@ -11,10 +15,6 @@ import kotlin.math.cos import kotlin.math.floor import kotlin.math.sin import kotlin.math.tan -import okhttp3.Interceptor -import okhttp3.MediaType -import okhttp3.Response -import okhttp3.ResponseBody /* * `v1` means url padding of image host. @@ -132,10 +132,12 @@ internal class ImageDecoderInterceptor : Interceptor { val destX = (tx * rowWidth) + sx val destY = ty * rowHeight - canvas.drawBitmap(input, + canvas.drawBitmap( + input, Rect(srcX, srcY, srcX + rowWidth, srcY + rowHeight), Rect(destX, destY, destX + rowWidth, destY + rowHeight), - null) + null + ) } return output @@ -160,8 +162,10 @@ internal class ImageDecoderInterceptor : Interceptor { val n = 1000 * cos((13 * seed).toDouble()) val a = 10000 * tan((14 * seed).toDouble()) - return (floor(100 * (t - floor(t))) + - floor(1000 * (n - floor(n))) + - floor(10000 * (a - floor(a)))).toInt() + return ( + floor(100 * (t - floor(t))) + + floor(1000 * (n - floor(n))) + + floor(10000 * (a - floor(a))) + ).toInt() } } diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMmageUrlHandler.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMmageUrlHandler.kt index c66534b6a..aec9d7b2f 100644 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMmageUrlHandler.kt +++ b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMmageUrlHandler.kt @@ -51,11 +51,11 @@ private class RequestHandler(val chain: Interceptor.Chain) { } private fun proceedRequest(url: String): Response = chain.proceed( - req.newBuilder()!! - .url(url) - .removeHeader("ImageRequest") - .removeHeader("ImageDecodeRequest") - .removeHeader("SecondUrlToRequest") - .build()!! + req.newBuilder()!! + .url(url) + .removeHeader("ImageRequest") + .removeHeader("ImageDecodeRequest") + .removeHeader("SecondUrlToRequest") + .build()!! ) } diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoa.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoa.kt index 375db082e..7e1130874 100644 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoa.kt +++ b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoa.kt @@ -20,11 +20,6 @@ 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 java.io.IOException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.concurrent.CompletableFuture -import java.util.concurrent.TimeUnit import okhttp3.Call import okhttp3.Callback import okhttp3.OkHttpClient @@ -37,6 +32,11 @@ import org.jsoup.select.Elements import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.io.IOException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.concurrent.CompletableFuture +import java.util.concurrent.TimeUnit /** * ManaMoa Source @@ -85,8 +85,10 @@ class ManaMoa : ConfigurableSource, ParsedHttpSource() { override fun popularMangaNextPageSelector() = "ul.pagination > li:not(.disabled)" // Do not add page parameter if page is 1 to prevent tracking. - override fun popularMangaRequest(page: Int) = GET("$baseUrl/bbs/page.php?hid=manga_list" + - if (page > 1) "&page=${page - 1}" else "") + override fun popularMangaRequest(page: Int) = GET( + "$baseUrl/bbs/page.php?hid=manga_list" + + if (page > 1) "&page=${page - 1}" else "" + ) override fun popularMangaParse(response: Response): MangasPage { val document = response.asJsoup() @@ -150,10 +152,10 @@ class ManaMoa : ConfigurableSource, ParsedHttpSource() { manga.thumbnail_url = urlFinder(thumbnailElement.attr("style")) manga.description = "\uD83D\uDCDD: $publishTypeText\n" + - "👍: $mangaLike ($mangaChaptersLike)\n" + - // "\uD83D\uDD0D: $mangaViews\n" + - "\uD83D\uDCAC: $mangaComments ($mangaChaptersComments)\n" + - "\uD83D\uDD16: $mangaBookmarks" + "👍: $mangaLike ($mangaChaptersLike)\n" + + // "\uD83D\uDD0D: $mangaViews\n" + + "\uD83D\uDCAC: $mangaComments ($mangaChaptersComments)\n" + + "\uD83D\uDD16: $mangaBookmarks" manga.author = authorText manga.genre = genres.joinToString(", ") manga.status = parseStatus(publishTypeText) @@ -169,9 +171,12 @@ class ManaMoa : ConfigurableSource, ParsedHttpSource() { private fun mangaElementsSum(element: Elements?): String { if (element.isNullOrEmpty()) return "0" return try { - String.format("%,d", element.map { - it.text().toInt() - }.sum()) + String.format( + "%,d", + element.map { + it.text().toInt() + }.sum() + ) } catch (_: Exception) { "0" } @@ -217,7 +222,7 @@ class ManaMoa : ConfigurableSource, ParsedHttpSource() { val currYear = calendar.get(Calendar.YEAR) val year = if (month > calendar.get(Calendar.MONTH) + 1) // Before December now, // and Retrieved month is December == 2018. currYear - 1 else currYear - SimpleDateFormat("yyyy-MM-dd").parse("$year-$date").time + SimpleDateFormat("yyyy-MM-dd").parse("$year-$date")?.time ?: 0L } catch (e: Exception) { e.printStackTrace() 0 diff --git a/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComic.kt b/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComic.kt index 764d0e87f..a9c9fd204 100644 --- a/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComic.kt +++ b/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComic.kt @@ -5,11 +5,11 @@ import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Response +import org.jsoup.nodes.Element import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -import okhttp3.Response -import org.jsoup.nodes.Element class NaverWebtoon : NaverComicBase("webtoon") { override val name = "Naver Webtoon" @@ -81,10 +81,11 @@ class NaverChallenge : NaverComicChallengeBase("challenge") { @SuppressLint("SimpleDateFormat") private fun parseChapterDate(date: String): Long { - return if (date.contains(":")) { Calendar.getInstance().timeInMillis + return if (date.contains(":")) { + Calendar.getInstance().timeInMillis } else { return try { - SimpleDateFormat("yyyy.MM.dd", Locale.KOREA).parse(date).time + SimpleDateFormat("yyyy.MM.dd", Locale.KOREA).parse(date)?.time ?: 0L } catch (e: Exception) { e.printStackTrace() 0 diff --git a/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComicBase.kt b/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComicBase.kt index 355266ac2..8285b7506 100644 --- a/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComicBase.kt +++ b/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComicBase.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale abstract class NaverComicBase(protected val mType: String) : ParsedHttpSource() { override val lang: String = "ko" @@ -91,10 +91,11 @@ abstract class NaverComicBase(protected val mType: String) : ParsedHttpSource() @SuppressLint("SimpleDateFormat") private fun parseChapterDate(date: String): Long { - return if (date.contains(":")) { Calendar.getInstance().timeInMillis + return if (date.contains(":")) { + Calendar.getInstance().timeInMillis } else { return try { - SimpleDateFormat("yy.MM.dd", Locale.KOREA).parse(date).time + SimpleDateFormat("yy.MM.dd", Locale.KOREA).parse(date)?.time ?: 0L } catch (e: Exception) { e.printStackTrace() 0 @@ -118,12 +119,12 @@ abstract class NaverComicBase(protected val mType: String) : ParsedHttpSource() val pages = mutableListOf<Page>() try { document.select(".wt_viewer img") - .map { - it.attr("src") - } - .forEach { - pages.add(Page(pages.size, "", it)) - } + .map { + it.attr("src") + } + .forEach { + pages.add(Page(pages.size, "", it)) + } } catch (e: Exception) { e.printStackTrace() } diff --git a/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComicFactory.kt b/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComicFactory.kt index 1e6e9630f..0daff2d19 100644 --- a/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComicFactory.kt +++ b/src/ko/navercomic/src/eu/kanade/tachiyomi/extension/ko/navercomic/NaverComicFactory.kt @@ -5,8 +5,8 @@ import eu.kanade.tachiyomi.source.SourceFactory class NaverComicFactory : SourceFactory { override fun createSources(): List<Source> = listOf( - NaverWebtoon(), - NaverBestChallenge(), - NaverChallenge() + NaverWebtoon(), + NaverBestChallenge(), + NaverChallenge() ) } diff --git a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt index d40e4d0b9..17c824712 100644 --- a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt +++ b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt @@ -16,8 +16,6 @@ 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 java.text.SimpleDateFormat -import java.util.Calendar import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response @@ -25,6 +23,8 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Calendar /** * NewToki Source diff --git a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewTokiFactory.kt b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewTokiFactory.kt index 4f489cdd8..4c949bda8 100644 --- a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewTokiFactory.kt +++ b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewTokiFactory.kt @@ -6,14 +6,14 @@ import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.Page -import java.security.MessageDigest -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.Jsoup import org.jsoup.nodes.Document +import java.security.MessageDigest +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale /** * Source changes domain names every few days (e.g. newtoki31.net to newtoki32.net) @@ -27,8 +27,8 @@ private val domainNumber = 33 + ((Date().time - SimpleDateFormat("yyyy-MM-dd", L class NewTokiFactory : SourceFactory { override fun createSources(): List<Source> = listOf( - NewTokiManga(), - NewTokiWebtoon() + NewTokiManga(), + NewTokiWebtoon() ) } @@ -70,76 +70,85 @@ class NewTokiManga : NewToki("ManaToki", "https://manatoki$domainNumber.net", "c } // [...document.querySelectorAll("form.form td")[2].querySelectorAll("a")].map((el, i) => `"${el.innerText.trim()}"`).join(',\n') - private class SearchPublishTypeList : Filter.Select<String>("Publish", arrayOf( - "전체", - "미분류", - "주간", - "격주", - "월간", - "격월/비정기", - "단편", - "단행본", - "완결" - )) + private class SearchPublishTypeList : Filter.Select<String>( + "Publish", + arrayOf( + "전체", + "미분류", + "주간", + "격주", + "월간", + "격월/비정기", + "단편", + "단행본", + "완결" + ) + ) // [...document.querySelectorAll("form.form td")[3].querySelectorAll("a")].map((el, i) => `"${el.innerText.trim()}"`).join(',\n') - private class SearchJaumTypeList : Filter.Select<String>("Jaum", arrayOf( - "전체", - "ㄱ", - "ㄴ", - "ㄷ", - "ㄹ", - "ㅁ", - "ㅂ", - "ㅅ", - "ㅇ", - "ㅈ", - "ㅊ", - "ㅋ", - "ㅌ", - "ㅍ", - "ㅎ", - "0-9", - "a-z" - )) + private class SearchJaumTypeList : Filter.Select<String>( + "Jaum", + arrayOf( + "전체", + "ㄱ", + "ㄴ", + "ㄷ", + "ㄹ", + "ㅁ", + "ㅂ", + "ㅅ", + "ㅇ", + "ㅈ", + "ㅊ", + "ㅋ", + "ㅌ", + "ㅍ", + "ㅎ", + "0-9", + "a-z" + ) + ) // [...document.querySelectorAll("form.form td")[4].querySelectorAll("a")].map((el, i) => `"${el.innerText.trim()}"`).join(',\n') - private class SearchGenreTypeList : Filter.Select<String>("Genre", arrayOf( - "전체", - "17", - "BL", - "SF", - "TS", - "개그", - "게임", - "공포", - "도박", - "드라마", - "라노벨", - "러브코미디", - "로맨스", - "먹방", - "미스터리", - "백합", - "붕탁", - "성인", - "순정", - "스릴러", - "스포츠", - "시대", - "애니화", - "액션", - "역사", - "음악", - "이세계", - "일상", - "일상+치유", - "전생", - "추리", - "판타지", - "학원", - "호러" - )) + private class SearchGenreTypeList : Filter.Select<String>( + "Genre", + arrayOf( + "전체", + "17", + "BL", + "SF", + "TS", + "개그", + "게임", + "공포", + "도박", + "드라마", + "라노벨", + "러브코미디", + "로맨스", + "먹방", + "미스터리", + "백합", + "붕탁", + "성인", + "순정", + "스릴러", + "스포츠", + "시대", + "애니화", + "액션", + "역사", + "음악", + "이세계", + "일상", + "일상+치유", + "전생", + "추리", + "판타지", + "학원", + "호러" + ) + ) override fun getFilterList() = FilterList( SearchPublishTypeList(), @@ -188,7 +197,7 @@ class NewTokiWebtoon : NewToki("NewToki", "https://newtoki$domainNumber.com", "w private class SearchTypeList : Filter.Select<String>("Type", arrayOf("전체", "일반웹툰", "성인웹툰", "BL/GL", "완결웹툰")) override fun getFilterList() = FilterList( - SearchTypeList() + SearchTypeList() ) } diff --git a/src/ko/toonkor/src/eu/kanade/tachiyomi/extension/ko/toonkor/Toonkor.kt b/src/ko/toonkor/src/eu/kanade/tachiyomi/extension/ko/toonkor/Toonkor.kt index cafbb260d..c08ccb4e1 100644 --- a/src/ko/toonkor/src/eu/kanade/tachiyomi/extension/ko/toonkor/Toonkor.kt +++ b/src/ko/toonkor/src/eu/kanade/tachiyomi/extension/ko/toonkor/Toonkor.kt @@ -14,16 +14,16 @@ 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 java.lang.Exception -import java.nio.charset.Charset -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.lang.Exception +import java.nio.charset.Charset +import java.text.SimpleDateFormat +import java.util.Locale class Toonkor : ConfigurableSource, ParsedHttpSource() { diff --git a/src/pt/centraldemangas/src/eu/kanade/tachiyomi/extension/pt/centraldemangas/CentralDeMangas.kt b/src/pt/centraldemangas/src/eu/kanade/tachiyomi/extension/pt/centraldemangas/CentralDeMangas.kt index cf7637a1e..3d90213be 100644 --- a/src/pt/centraldemangas/src/eu/kanade/tachiyomi/extension/pt/centraldemangas/CentralDeMangas.kt +++ b/src/pt/centraldemangas/src/eu/kanade/tachiyomi/extension/pt/centraldemangas/CentralDeMangas.kt @@ -13,10 +13,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request @@ -24,6 +20,10 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class CentralDeMangas : ParsedHttpSource() { @@ -79,10 +79,10 @@ class CentralDeMangas : ParsedHttpSource() { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { return client.newCall(searchMangaRequest(page, query, filters)) - .asObservableSuccess() - .map { response -> - searchMangaParse(response, query) - } + .asObservableSuccess() + .map { response -> + searchMangaParse(response, query) + } } override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { @@ -117,10 +117,10 @@ class CentralDeMangas : ParsedHttpSource() { author = elementList.select("div.item:eq(3) div.content div.description").text() artist = elementList.select("div.item:eq(2) div.content div.description").text() genre = elementList.select("div.item:eq(4) div.content div.description a") - .joinToString { it.text() } + .joinToString { it.text() } status = elementList.select("div.item:eq(6) div.content div.description") - .text().orEmpty().let { parseStatus(it) } + .text().orEmpty().let { parseStatus(it) } description = elementList.select("div.item:eq(0) div.content div.description").text() thumbnail_url = elementList.select("div.item:eq(0) div.content div.description img") @@ -153,7 +153,7 @@ class CentralDeMangas : ParsedHttpSource() { private fun parseChapterDate(date: String): Long { return try { - SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH).parse(date).time + SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH).parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } diff --git a/src/pt/goldenmangas/src/eu/kanade/tachiyomi/extension/pt/goldenmangas/GoldenMangas.kt b/src/pt/goldenmangas/src/eu/kanade/tachiyomi/extension/pt/goldenmangas/GoldenMangas.kt index dbce48f9b..87b62b6a8 100644 --- a/src/pt/goldenmangas/src/eu/kanade/tachiyomi/extension/pt/goldenmangas/GoldenMangas.kt +++ b/src/pt/goldenmangas/src/eu/kanade/tachiyomi/extension/pt/goldenmangas/GoldenMangas.kt @@ -6,16 +6,16 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class GoldenMangas : ParsedHttpSource() { diff --git a/src/pt/hipercool/src/eu/kanade/tachiyomi/extension/pt/hipercool/Hipercool.kt b/src/pt/hipercool/src/eu/kanade/tachiyomi/extension/pt/hipercool/Hipercool.kt index f3fef75e6..a1a89fd38 100644 --- a/src/pt/hipercool/src/eu/kanade/tachiyomi/extension/pt/hipercool/Hipercool.kt +++ b/src/pt/hipercool/src/eu/kanade/tachiyomi/extension/pt/hipercool/Hipercool.kt @@ -19,9 +19,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.MediaType @@ -30,6 +27,9 @@ import okhttp3.Request import okhttp3.RequestBody import okhttp3.Response import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale @Nsfw class Hipercool : HttpSource() { @@ -225,7 +225,7 @@ class Hipercool : HttpSource() { private fun SimpleDateFormat.tryParseTime(date: String): Long { return try { - parse(date.substringBefore("T")).time + parse(date.substringBefore("T"))?.time ?: 0L } catch (e: ParseException) { 0L } diff --git a/src/pt/hqnow/src/eu/kanade/tachiyomi/extension/pt/hqnow/HQNow.kt b/src/pt/hqnow/src/eu/kanade/tachiyomi/extension/pt/hqnow/HQNow.kt index d05fe1308..edd848e42 100644 --- a/src/pt/hqnow/src/eu/kanade/tachiyomi/extension/pt/hqnow/HQNow.kt +++ b/src/pt/hqnow/src/eu/kanade/tachiyomi/extension/pt/hqnow/HQNow.kt @@ -155,35 +155,38 @@ class HQNow : HttpSource() { LetterFilter() ) - private class LetterFilter : UriPartFilter("Letra", arrayOf( - Pair("---", "<Selecione>"), - Pair("a", "A"), - Pair("b", "B"), - Pair("c", "C"), - Pair("d", "D"), - Pair("e", "E"), - Pair("f", "F"), - Pair("g", "G"), - Pair("h", "H"), - Pair("i", "I"), - Pair("j", "J"), - Pair("k", "K"), - Pair("l", "L"), - Pair("m", "M"), - Pair("n", "N"), - Pair("o", "O"), - Pair("p", "P"), - Pair("q", "Q"), - Pair("r", "R"), - Pair("s", "S"), - Pair("t", "T"), - Pair("u", "U"), - Pair("v", "V"), - Pair("w", "W"), - Pair("x", "X"), - Pair("y", "Y"), - Pair("z", "Z") - )) + private class LetterFilter : UriPartFilter( + "Letra", + arrayOf( + Pair("---", "<Selecione>"), + Pair("a", "A"), + Pair("b", "B"), + Pair("c", "C"), + Pair("d", "D"), + Pair("e", "E"), + Pair("f", "F"), + Pair("g", "G"), + Pair("h", "H"), + Pair("i", "I"), + Pair("j", "J"), + Pair("k", "K"), + Pair("l", "L"), + Pair("m", "M"), + Pair("n", "N"), + Pair("o", "O"), + Pair("p", "P"), + Pair("q", "Q"), + Pair("r", "R"), + Pair("s", "S"), + Pair("t", "T"), + Pair("u", "U"), + Pair("v", "V"), + Pair("w", "W"), + Pair("x", "X"), + Pair("y", "Y"), + Pair("z", "Z") + ) + ) open class UriPartFilter(displayName: String, private val vals: Array<Pair<String, String>>) : Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray()) { diff --git a/src/pt/mangahost/src/eu/kanade/tachiyomi/extension/pt/mangahost/MangaHost.kt b/src/pt/mangahost/src/eu/kanade/tachiyomi/extension/pt/mangahost/MangaHost.kt index 643f93557..394f51617 100644 --- a/src/pt/mangahost/src/eu/kanade/tachiyomi/extension/pt/mangahost/MangaHost.kt +++ b/src/pt/mangahost/src/eu/kanade/tachiyomi/extension/pt/mangahost/MangaHost.kt @@ -6,9 +6,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -16,6 +13,9 @@ import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.select.Elements +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class MangaHost : ParsedHttpSource() { diff --git a/src/pt/mangasproject/src/eu/kanade/tachiyomi/extension/pt/mangasproject/MangasProject.kt b/src/pt/mangasproject/src/eu/kanade/tachiyomi/extension/pt/mangasproject/MangasProject.kt index b7cdc5ec7..dbd073e08 100644 --- a/src/pt/mangasproject/src/eu/kanade/tachiyomi/extension/pt/mangasproject/MangasProject.kt +++ b/src/pt/mangasproject/src/eu/kanade/tachiyomi/extension/pt/mangasproject/MangasProject.kt @@ -14,10 +14,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.FormBody import okhttp3.Headers import okhttp3.HttpUrl @@ -27,6 +23,10 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit abstract class MangasProject( override val name: String, @@ -144,13 +144,16 @@ abstract class MangasProject( .substringAfter("Completo") .substringBefore("+") .split("&") - .groupBy({ it.contains("(Arte)") }, { - it.replace(" (Arte)", "") - .trim() - .split(", ") - .reversed() - .joinToString(" ") - }) + .groupBy( + { it.contains("(Arte)") }, + { + it.replace(" (Arte)", "") + .trim() + .split(", ") + .reversed() + .joinToString(" ") + } + ) return SManga.create().apply { thumbnail_url = seriesData.select("div.series-img > div.cover > img").attr("src") @@ -273,7 +276,7 @@ abstract class MangasProject( val token = document.select("script[src*=\"reader.\"]").firstOrNull() ?.attr("abs:src") ?.let { HttpUrl.parse(it)!!.queryParameter("token") } - ?: throw Exception(TOKEN_NOT_FOUND) + ?: throw Exception(TOKEN_NOT_FOUND) return chain.proceed(pageListApiRequest(request.url().toString(), token)) } diff --git a/src/pt/mangayabu/src/eu/kanade/tachiyomi/extension/pt/mangayabu/MangaYabu.kt b/src/pt/mangayabu/src/eu/kanade/tachiyomi/extension/pt/mangayabu/MangaYabu.kt index ccb52f76e..aa85e5c98 100644 --- a/src/pt/mangayabu/src/eu/kanade/tachiyomi/extension/pt/mangayabu/MangaYabu.kt +++ b/src/pt/mangayabu/src/eu/kanade/tachiyomi/extension/pt/mangayabu/MangaYabu.kt @@ -8,15 +8,15 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.FormBody import okhttp3.Headers import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class MangaYabu : ParsedHttpSource() { @@ -161,7 +161,7 @@ class MangaYabu : ParsedHttpSource() { private fun SimpleDateFormat.tryParseTime(date: String): Long { return try { - parse(date).time + parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } diff --git a/src/pt/supermangas/src/eu/kanade/tachiyomi/extension/pt/supermangas/SuperMangasGeneric.kt b/src/pt/supermangas/src/eu/kanade/tachiyomi/extension/pt/supermangas/SuperMangasGeneric.kt index a11071a4e..905d4a70c 100644 --- a/src/pt/supermangas/src/eu/kanade/tachiyomi/extension/pt/supermangas/SuperMangasGeneric.kt +++ b/src/pt/supermangas/src/eu/kanade/tachiyomi/extension/pt/supermangas/SuperMangasGeneric.kt @@ -315,18 +315,26 @@ abstract class SuperMangasGeneric( protected class ContentFilter(contents: List<Content>) : Filter.Select<String>( "Tipo de Conteúdo", - contents.map { it.third }.toTypedArray()) + contents.map { it.third }.toTypedArray() + ) protected class LetterFilter : Filter.Select<String>("Letra inicial", LETTER_LIST) - protected class StatusFilter : Filter.Select<String>("Status", - STATUS_LIST.map { it.second }.toTypedArray()) + protected class StatusFilter : Filter.Select<String>( + "Status", + STATUS_LIST.map { it.second }.toTypedArray() + ) - protected class CensureFilter : Filter.Select<String>("Censura", - CENSURE_LIST.map { it.second }.toTypedArray()) + protected class CensureFilter : Filter.Select<String>( + "Censura", + CENSURE_LIST.map { it.second }.toTypedArray() + ) - protected class SortFilter : Filter.Sort("Ordem", - SORT_LIST.map { it.third }.toTypedArray(), Selection(2, false)) + protected class SortFilter : Filter.Sort( + "Ordem", + SORT_LIST.map { it.third }.toTypedArray(), + Selection(2, false) + ) protected class GenreFilter(genres: List<Tag>) : Filter.Group<Tag>("Gêneros", genres) protected class ExclusiveModeFilter : Filter.CheckBox("Modo Exclusivo", true) diff --git a/src/pt/taosect/src/eu/kanade/tachiyomi/extension/pt/taosect/TaoSect.kt b/src/pt/taosect/src/eu/kanade/tachiyomi/extension/pt/taosect/TaoSect.kt index 9eb625755..ebbe8291a 100644 --- a/src/pt/taosect/src/eu/kanade/tachiyomi/extension/pt/taosect/TaoSect.kt +++ b/src/pt/taosect/src/eu/kanade/tachiyomi/extension/pt/taosect/TaoSect.kt @@ -7,16 +7,16 @@ 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 java.lang.UnsupportedOperationException -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.lang.UnsupportedOperationException +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class TaoSect : ParsedHttpSource() { @@ -180,8 +180,11 @@ class TaoSect : ParsedHttpSource() { private class GenreFilter(genres: List<Genre>) : Filter.Group<Genre>("Gêneros", genres) - private class SortFilter : Filter.Sort("Ordem", - SORT_LIST.map { it.third }.toTypedArray(), Selection(0, true)) + private class SortFilter : Filter.Sort( + "Ordem", + SORT_LIST.map { it.third }.toTypedArray(), + Selection(0, true) + ) override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException("Not used") diff --git a/src/pt/tsukimangas/src/eu/kanade/tachiyomi/extension/pt/tsukimangas/TsukiMangas.kt b/src/pt/tsukimangas/src/eu/kanade/tachiyomi/extension/pt/tsukimangas/TsukiMangas.kt index bd0e388f7..fb4699fe6 100644 --- a/src/pt/tsukimangas/src/eu/kanade/tachiyomi/extension/pt/tsukimangas/TsukiMangas.kt +++ b/src/pt/tsukimangas/src/eu/kanade/tachiyomi/extension/pt/tsukimangas/TsukiMangas.kt @@ -17,16 +17,16 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class TsukiMangas : HttpSource() { @@ -326,7 +326,7 @@ class TsukiMangas : HttpSource() { private fun SimpleDateFormat.tryParseDate(date: String): Long { return try { - parse(date).time + parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } diff --git a/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangas.kt b/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangas.kt index 866d441e0..58926c143 100644 --- a/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangas.kt +++ b/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangas.kt @@ -13,10 +13,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.FormBody import okhttp3.Headers import okhttp3.HttpUrl @@ -25,6 +21,10 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class UnionMangas : ParsedHttpSource() { diff --git a/src/pt/zinnes/src/eu/kanade/tachiyomi/extension/pt/zinnes/Zinnes.kt b/src/pt/zinnes/src/eu/kanade/tachiyomi/extension/pt/zinnes/Zinnes.kt index f19a0752c..36b411132 100644 --- a/src/pt/zinnes/src/eu/kanade/tachiyomi/extension/pt/zinnes/Zinnes.kt +++ b/src/pt/zinnes/src/eu/kanade/tachiyomi/extension/pt/zinnes/Zinnes.kt @@ -8,15 +8,15 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class Zinnes : ParsedHttpSource() { @@ -128,7 +128,7 @@ class Zinnes : ParsedHttpSource() { private fun parseChapterDate(date: String): Long { return try { - SimpleDateFormat("dd MMM, yyyy", Locale("pt", "BR")).parse(date).time + SimpleDateFormat("dd MMM, yyyy", Locale("pt", "BR")).parse(date)?.time ?: 0L } catch (e: ParseException) { 0L } diff --git a/src/ru/acomics/src/eu/kanade/tachiyomi/extension/ru/acomics/AComics.kt b/src/ru/acomics/src/eu/kanade/tachiyomi/extension/ru/acomics/AComics.kt index f993ca2bd..0bf950a76 100644 --- a/src/ru/acomics/src/eu/kanade/tachiyomi/extension/ru/acomics/AComics.kt +++ b/src/ru/acomics/src/eu/kanade/tachiyomi/extension/ru/acomics/AComics.kt @@ -8,11 +8,11 @@ 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 java.net.URLEncoder import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.net.URLEncoder class AComics : ParsedHttpSource() { @@ -34,23 +34,23 @@ class AComics : ParsedHttpSource() { } override val client = network.client.newBuilder() - .addNetworkInterceptor { chain -> - val newReq = chain - .request() - .newBuilder() - .addHeader("Cookie", cookiesHeader) - .build() + .addNetworkInterceptor { chain -> + val newReq = chain + .request() + .newBuilder() + .addHeader("Cookie", cookiesHeader) + .build() - chain.proceed(newReq) - }.build()!! + chain.proceed(newReq) + }.build()!! override val supportsLatest = true override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/comics?categories=&ratings[]=1&ratings[]=2&ratings[]=3&ratings[]=4&ratings[]=5ratings[]=6&&type=0&updatable=0&subscribe=0&issue_count=2&sort=subscr_count&skip=${10 * (page - 1)}", headers) + GET("$baseUrl/comics?categories=&ratings[]=1&ratings[]=2&ratings[]=3&ratings[]=4&ratings[]=5ratings[]=6&&type=0&updatable=0&subscribe=0&issue_count=2&sort=subscr_count&skip=${10 * (page - 1)}", headers) override fun latestUpdatesRequest(page: Int): Request = - GET("$baseUrl/comics?categories=&ratings[]=1&ratings[]=2&ratings[]=3&ratings[]=4&ratings[]=5ratings[]=6&&type=0&updatable=0&subscribe=0&issue_count=2&sort=last_update&skip=${10 * (page - 1)}", headers) + GET("$baseUrl/comics?categories=&ratings[]=1&ratings[]=2&ratings[]=3&ratings[]=4&ratings[]=5ratings[]=6&&type=0&updatable=0&subscribe=0&issue_count=2&sort=last_update&skip=${10 * (page - 1)}", headers) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val url: String = if (query.isNotEmpty()) { @@ -107,10 +107,10 @@ class AComics : ParsedHttpSource() { } override fun latestUpdatesFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun searchMangaFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun popularMangaNextPageSelector() = "span.button:not(:has(a)) + span.button > a" @@ -130,9 +130,9 @@ class AComics : ParsedHttpSource() { override fun chapterListParse(response: Response): List<SChapter> { val res = mutableListOf<SChapter>() val count = response.asJsoup() - .select(".about-summary > p:contains(Количество выпусков:)") - .text() - .split("Количество выпусков: ")[1].toInt() + .select(".about-summary > p:contains(Количество выпусков:)") + .text() + .split("Количество выпусков: ")[1].toInt() for (index in count downTo 1) { val chapter = SChapter.create() @@ -161,34 +161,37 @@ class AComics : ParsedHttpSource() { private class Rating(name: String, val id: Int) : Filter.CheckBox(name, state = true) private class Status : Filter.Select<String>("Статус", arrayOf("Все", "Завершенный", "Продолжающийся")) - private class RatingList : Filter.Group<Rating>("Возрастная категория", listOf( + private class RatingList : Filter.Group<Rating>( + "Возрастная категория", + listOf( Rating("???", 1), Rating("0+", 2), Rating("6+", 3), Rating("12+", 4), Rating("16+", 5), Rating("18+", 6) - )) + ) + ) override fun getFilterList() = FilterList( - Status(), - RatingList(), - GenreList(getGenreList()) + Status(), + RatingList(), + GenreList(getGenreList()) ) private fun getGenreList() = listOf( - Genre("Животные", 1), - Genre("Драма", 2), - Genre("Фэнтези", 3), - Genre("Игры", 4), - Genre("Юмор", 5), - Genre("Журнал", 6), - Genre("Паранормальное", 7), - Genre("Конец света", 8), - Genre("Романтика", 9), - Genre("Фантастика", 10), - Genre("Бытовое", 11), - Genre("Стимпанк", 12), - Genre("Супергерои", 13) + Genre("Животные", 1), + Genre("Драма", 2), + Genre("Фэнтези", 3), + Genre("Игры", 4), + Genre("Юмор", 5), + Genre("Журнал", 6), + Genre("Паранормальное", 7), + Genre("Конец света", 8), + Genre("Романтика", 9), + Genre("Фантастика", 10), + Genre("Бытовое", 11), + Genre("Стимпанк", 12), + Genre("Супергерои", 13) ) } diff --git a/src/ru/anibe/src/eu/kanade/tachiyomi/extension/ru/anibe/Anibe.kt b/src/ru/anibe/src/eu/kanade/tachiyomi/extension/ru/anibe/Anibe.kt index 291410904..9a3a9da8c 100644 --- a/src/ru/anibe/src/eu/kanade/tachiyomi/extension/ru/anibe/Anibe.kt +++ b/src/ru/anibe/src/eu/kanade/tachiyomi/extension/ru/anibe/Anibe.kt @@ -120,15 +120,17 @@ class Anibe : ParsedHttpSource() { override fun chapterListParse(response: Response): List<SChapter> { val allChapters = mutableListOf<SChapter>() val jsonManga = gson.fromJson<JsonObject>(response.body()!!.string()) - val jsonChapters = jsonManga["episodes"].asJsonObject.keys().sortedWith(Comparator<String> { a, b -> - when { - a.substringBefore("_").toInt() < b.substringBefore("_").toInt() -> 1 - a.substringBefore("_").toInt() > b.substringBefore("_").toInt() -> -1 - a.substringAfter("_") < b.substringAfter("_") -> 1 - a.substringAfter("_") > b.substringAfter("_") -> -1 - else -> 0 + val jsonChapters = jsonManga["episodes"].asJsonObject.keys().sortedWith( + Comparator<String> { a, b -> + when { + a.substringBefore("_").toInt() < b.substringBefore("_").toInt() -> 1 + a.substringBefore("_").toInt() > b.substringBefore("_").toInt() -> -1 + a.substringAfter("_") < b.substringAfter("_") -> 1 + a.substringAfter("_") > b.substringAfter("_") -> -1 + else -> 0 + } } - }) + ) for (i in jsonChapters.indices) { val chapter = SChapter.create() diff --git a/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt b/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt index f13d7f7c8..ddfa54894 100644 --- a/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt +++ b/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt @@ -86,13 +86,14 @@ class ComX : ParsedHttpSource() { override fun latestUpdatesNextPageSelector(): Nothing? = null override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - return POST("$baseUrl/comix/", - body = FormBody.Builder() - .add("do", "search") - .add("story", query) - .add("subaction", "search") - .build(), - headers = headers + return POST( + "$baseUrl/comix/", + body = FormBody.Builder() + .add("do", "search") + .add("story", query) + .add("subaction", "search") + .build(), + headers = headers ) } @@ -109,10 +110,12 @@ class ComX : ParsedHttpSource() { val manga = SManga.create() manga.author = infoElement.select("p:eq(2)").text().removePrefix("Издатель: ") manga.genre = infoElement.select("p:eq(3)").text() - .removePrefix("Жанр: ").split(",").plusElement("Комикс").joinToString { it.trim() } + .removePrefix("Жанр: ").split(",").plusElement("Комикс").joinToString { it.trim() } - manga.status = parseStatus(infoElement.select("p:eq(4)").text() - .removePrefix("Статус: ")) + manga.status = parseStatus( + infoElement.select("p:eq(4)").text() + .removePrefix("Статус: ") + ) val text = infoElement.select("*").text() if (!text.contains("Добавить описание на комикс")) { @@ -134,9 +137,9 @@ class ComX : ParsedHttpSource() { private fun parseStatus(element: String): Int = when { element.contains("Продолжается") -> SManga.ONGOING element.contains("Завершён") || - element.contains("Лимитка") || - element.contains("Ван шот") || - element.contains("Графический роман") -> SManga.COMPLETED + element.contains("Лимитка") || + element.contains("Ван шот") || + element.contains("Графический роман") -> SManga.COMPLETED else -> SManga.UNKNOWN } @@ -161,12 +164,14 @@ class ComX : ParsedHttpSource() { val pages = chapterPageListParse(document).distinct() for (page in pages) { - val post = POST("$baseUrl/engine/mods/comix/listPages.php", - body = FormBody.Builder() - .add("newsid", id) - .add("page", page) - .build(), - headers = headers) + val post = POST( + "$baseUrl/engine/mods/comix/listPages.php", + body = FormBody.Builder() + .add("newsid", id) + .add("page", page) + .build(), + headers = headers + ) list += chapterResponseParse(client.newCall(post).execute().asJsoup()) } @@ -194,7 +199,7 @@ class ComX : ParsedHttpSource() { val link = html.substring(endIndex + endTag.length, comixIndex) val urls: List<String> = html.substring(beginIndex + beginTag.length, endIndex) - .split(',') + .split(',') val pages = mutableListOf<Page>() for (i in urls.indices) { diff --git a/src/ru/desu/src/eu/kanade/tachiyomi/extension/ru/desu/Desu.kt b/src/ru/desu/src/eu/kanade/tachiyomi/extension/ru/desu/Desu.kt index f85a9ca7d..9d06f5e05 100644 --- a/src/ru/desu/src/eu/kanade/tachiyomi/extension/ru/desu/Desu.kt +++ b/src/ru/desu/src/eu/kanade/tachiyomi/extension/ru/desu/Desu.kt @@ -8,12 +8,12 @@ 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 java.util.ArrayList import okhttp3.Headers import okhttp3.Request import okhttp3.Response import org.json.JSONArray import org.json.JSONObject +import java.util.ArrayList class Desu : HttpSource() { override val name = "Desu" @@ -34,9 +34,11 @@ class Desu : HttpSource() { val ret = ArrayList<SManga>(arr.length()) for (i in 0 until arr.length()) { val obj = arr.getJSONObject(i) - ret.add(SManga.create().apply { - mangaFromJSON(obj, false) - }) + ret.add( + SManga.create().apply { + mangaFromJSON(obj, false) + } + ) } return MangasPage(ret, next) } @@ -120,19 +122,21 @@ class Desu : HttpSource() { val arr = obj.getJSONObject("chapters").getJSONArray("list") for (i in 0 until arr.length()) { val obj2 = arr.getJSONObject(i) - ret.add(SChapter.create().apply { - val ch = obj2.getString("ch") - val title = if (obj2.getString("title") == "null") "" else obj2.getString("title") - name = if (title.isEmpty()) { - "Глава $ch" - } else { - "$ch - $title" + ret.add( + SChapter.create().apply { + val ch = obj2.getString("ch") + val title = if (obj2.getString("title") == "null") "" else obj2.getString("title") + name = if (title.isEmpty()) { + "Глава $ch" + } else { + "$ch - $title" + } + val id = obj2.getString("id") + url = "/$cid/chapter/$id" + chapter_number = ch.toFloat() + date_upload = obj2.getLong("date") * 1000 } - val id = obj2.getString("id") - url = "/$cid/chapter/$id" - chapter_number = ch.toFloat() - date_upload = obj2.getLong("date") * 1000 - }) + ) } return ret } @@ -149,10 +153,12 @@ class Desu : HttpSource() { } override fun imageUrlParse(response: Response) = - throw UnsupportedOperationException("This method should not be called!") + throw UnsupportedOperationException("This method should not be called!") - private class OrderBy : Filter.Select<String>("Сортировка", - arrayOf("Популярность", "Дата", "Имя")) + private class OrderBy : Filter.Select<String>( + "Сортировка", + arrayOf("Популярность", "Дата", "Имя") + ) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Жанр", genres) private class TypeList(types: List<Type>) : Filter.Group<Type>("Тип", types) @@ -160,64 +166,64 @@ class Desu : HttpSource() { private class Type(name: String, val id: String) : Filter.CheckBox(name) private class Genre(name: String, val id: String) : Filter.CheckBox(name) override fun getFilterList() = FilterList( - OrderBy(), - TypeList(getTypeList()), - GenreList(getGenreList()) + OrderBy(), + TypeList(getTypeList()), + GenreList(getGenreList()) ) private fun getTypeList() = listOf( - Type("Манга", "manga"), - Type("Манхва", "manhwa"), - Type("Маньхуа", "manhua"), - Type("Ваншот", "one_shot"), - Type("Комикс", "comics") + Type("Манга", "manga"), + Type("Манхва", "manhwa"), + Type("Маньхуа", "manhua"), + Type("Ваншот", "one_shot"), + Type("Комикс", "comics") ) private fun getGenreList() = listOf( - Genre("Безумие", "Dementia"), - Genre("Боевые искусства", "Martial Arts"), - Genre("Вампиры", "Vampire"), - Genre("Военное", "Military"), - Genre("Гарем", "Harem"), - Genre("Демоны", "Demons"), - Genre("Детектив", "Mystery"), - Genre("Детское", "Kids"), - Genre("Дзёсей", "Josei"), - Genre("Додзинси", "Doujinshi"), - Genre("Драма", "Drama"), - Genre("Игры", "Game"), - Genre("Исторический", "Historical"), - Genre("Комедия", "Comedy"), - Genre("Космос", "Space"), - Genre("Магия", "Magic"), - Genre("Машины", "Cars"), - Genre("Меха", "Mecha"), - Genre("Музыка", "Music"), - Genre("Пародия", "Parody"), - Genre("Повседневность", "Slice of Life"), - Genre("Полиция", "Police"), - Genre("Приключения", "Adventure"), - Genre("Психологическое", "Psychological"), - Genre("Романтика", "Romance"), - Genre("Самураи", "Samurai"), - Genre("Сверхъестественное", "Supernatural"), - Genre("Сёдзе", "Shoujo"), - Genre("Сёдзе Ай", "Shoujo Ai"), - Genre("Сейнен", "Seinen"), - Genre("Сёнен", "Shounen"), - Genre("Сёнен Ай", "Shounen Ai"), - Genre("Смена пола", "Gender Bender"), - Genre("Спорт", "Sports"), - Genre("Супер сила", "Super Power"), - Genre("Триллер", "Thriller"), - Genre("Ужасы", "Horror"), - Genre("Фантастика", "Sci-Fi"), - Genre("Фэнтези", "Fantasy"), - Genre("Хентай", "Hentai"), - Genre("Школа", "School"), - Genre("Экшен", "Action"), - Genre("Этти", "Ecchi"), - Genre("Юри", "Yuri"), - Genre("Яой", "Yaoi") + Genre("Безумие", "Dementia"), + Genre("Боевые искусства", "Martial Arts"), + Genre("Вампиры", "Vampire"), + Genre("Военное", "Military"), + Genre("Гарем", "Harem"), + Genre("Демоны", "Demons"), + Genre("Детектив", "Mystery"), + Genre("Детское", "Kids"), + Genre("Дзёсей", "Josei"), + Genre("Додзинси", "Doujinshi"), + Genre("Драма", "Drama"), + Genre("Игры", "Game"), + Genre("Исторический", "Historical"), + Genre("Комедия", "Comedy"), + Genre("Космос", "Space"), + Genre("Магия", "Magic"), + Genre("Машины", "Cars"), + Genre("Меха", "Mecha"), + Genre("Музыка", "Music"), + Genre("Пародия", "Parody"), + Genre("Повседневность", "Slice of Life"), + Genre("Полиция", "Police"), + Genre("Приключения", "Adventure"), + Genre("Психологическое", "Psychological"), + Genre("Романтика", "Romance"), + Genre("Самураи", "Samurai"), + Genre("Сверхъестественное", "Supernatural"), + Genre("Сёдзе", "Shoujo"), + Genre("Сёдзе Ай", "Shoujo Ai"), + Genre("Сейнен", "Seinen"), + Genre("Сёнен", "Shounen"), + Genre("Сёнен Ай", "Shounen Ai"), + Genre("Смена пола", "Gender Bender"), + Genre("Спорт", "Sports"), + Genre("Супер сила", "Super Power"), + Genre("Триллер", "Thriller"), + Genre("Ужасы", "Horror"), + Genre("Фантастика", "Sci-Fi"), + Genre("Фэнтези", "Fantasy"), + Genre("Хентай", "Hentai"), + Genre("Школа", "School"), + Genre("Экшен", "Action"), + Genre("Этти", "Ecchi"), + Genre("Юри", "Yuri"), + Genre("Яой", "Yaoi") ) } diff --git a/src/ru/henchan/src/eu/kanade/tachiyomi/extension/ru/henchan/Henchan.kt b/src/ru/henchan/src/eu/kanade/tachiyomi/extension/ru/henchan/Henchan.kt index 6f9947dc8..47ad5bac2 100644 --- a/src/ru/henchan/src/eu/kanade/tachiyomi/extension/ru/henchan/Henchan.kt +++ b/src/ru/henchan/src/eu/kanade/tachiyomi/extension/ru/henchan/Henchan.kt @@ -18,10 +18,6 @@ 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 java.net.URL -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request @@ -29,6 +25,10 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.net.URL +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale @Nsfw class Henchan : ParsedHttpSource() { @@ -49,10 +49,10 @@ class Henchan : ParsedHttpSource() { .addNetworkInterceptor(rateLimitInterceptor).build() override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/mostfavorites&sort=manga?offset=${20 * (page - 1)}", headers) + GET("$baseUrl/mostfavorites&sort=manga?offset=${20 * (page - 1)}", headers) override fun latestUpdatesRequest(page: Int): Request = - GET("$baseUrl/manga/new?offset=${20 * (page - 1)}", headers) + GET("$baseUrl/manga/new?offset=${20 * (page - 1)}", headers) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { @@ -65,10 +65,10 @@ class Henchan : ParsedHttpSource() { when (filter) { is GenreList -> { filter.state - .filter { !it.isIgnored() } - .forEach { f -> - genres += (if (f.isExcluded()) "-" else "") + f.id + '+' - } + .filter { !it.isIgnored() } + .forEach { f -> + genres += (if (f.isExcluded()) "-" else "") + f.id + '+' + } } } } @@ -122,10 +122,10 @@ class Henchan : ParsedHttpSource() { } override fun latestUpdatesFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun searchMangaFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun popularMangaNextPageSelector() = "#pagination > a:contains(Вперед)" @@ -149,11 +149,15 @@ class Henchan : ParsedHttpSource() { response.close() // Error message for exceeding last page if (response.code() == 404) - Observable.just(listOf(SChapter.create().apply { - url = manga.url - name = "Chapter" - chapter_number = 1f - })) + Observable.just( + listOf( + SChapter.create().apply { + url = manga.url + name = "Chapter" + chapter_number = 1f + } + ) + ) else throw Exception("HTTP error ${response.code()}") } } @@ -206,20 +210,24 @@ class Henchan : ParsedHttpSource() { // has related chapters val result = mutableListOf<SChapter>() - result.addAll(document.select(chapterListSelector()).map { - chapterFromElement(it) - }) + result.addAll( + document.select(chapterListSelector()).map { + chapterFromElement(it) + } + ) var url = document.select("div#pagination_related a:contains(Вперед)").attr("href") while (url.isNotBlank()) { val get = GET( - "${response.request().url()}/$url", - headers = headers + "${response.request().url()}/$url", + headers = headers ) val nextPage = client.newCall(get).execute().asJsoup() - result.addAll(nextPage.select(chapterListSelector()).map { - chapterFromElement(it) - }) + result.addAll( + nextPage.select(chapterListSelector()).map { + chapterFromElement(it) + } + ) url = nextPage.select("div#pagination_related a:contains(Вперед)").attr("href") } @@ -264,183 +272,186 @@ class Henchan : ParsedHttpSource() { private class Genre(val id: String, @SuppressLint("DefaultLocale") name: String = id.replace('_', ' ').capitalize()) : Filter.TriState(name) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Тэги", genres) - private class OrderBy : UriPartFilter("Сортировка", arrayOf("Дата", "Популярность", "Алфавит"), - arrayOf("&n=dateasc" to "", "&n=favasc" to "&n=favdesc", "&n=abcdesc" to "&n=abcasc"), - arrayOf("manga/new&n=dateasc" to "manga/new", "manga/new&n=favasc" to "mostfavorites&sort=manga", "manga/new&n=abcdesc" to "manga/new&n=abcasc")) + private class OrderBy : UriPartFilter( + "Сортировка", + arrayOf("Дата", "Популярность", "Алфавит"), + arrayOf("&n=dateasc" to "", "&n=favasc" to "&n=favdesc", "&n=abcdesc" to "&n=abcasc"), + arrayOf("manga/new&n=dateasc" to "manga/new", "manga/new&n=favasc" to "mostfavorites&sort=manga", "manga/new&n=abcdesc" to "manga/new&n=abcasc") + ) private open class UriPartFilter(displayName: String, sortNames: Array<String>, val withGenres: Array<Pair<String, String>>, val withoutGenres: Array<Pair<String, String>>) : - Filter.Sort(displayName, sortNames, Selection(1, false)) { + Filter.Sort(displayName, sortNames, Selection(1, false)) { fun toUriPartWithGenres() = if (state!!.ascending) withGenres[state!!.index].first else withGenres[state!!.index].second fun toUriPartWithoutGenres() = if (state!!.ascending) withoutGenres[state!!.index].first else withoutGenres[state!!.index].second } override fun getFilterList() = FilterList( - OrderBy(), - GenreList(getGenreList()) + OrderBy(), + GenreList(getGenreList()) ) private fun getGenreList() = listOf( - Genre("3D"), - Genre("action"), - Genre("ahegao"), - Genre("bdsm"), - Genre("corruption"), - Genre("foot_fetish"), - Genre("footfuck"), - Genre("gender_bender"), - Genre("live"), - Genre("lolcon"), - Genre("megane"), - Genre("mind_break"), - Genre("monstergirl"), - Genre("netorare"), - Genre("netori"), - Genre("nipple_penetration"), - Genre("paizuri_(titsfuck)"), - Genre("rpg"), - Genre("scat"), - Genre("shemale"), - Genre("shooter"), - Genre("simulation"), - Genre("skinsuit"), - Genre("tomboy"), - Genre("x-ray"), - Genre("алкоголь"), - Genre("анал"), - Genre("андроид"), - Genre("анилингус"), - Genre("аркада"), - Genre("арт"), - Genre("бабушка"), - Genre("без_текста"), - Genre("без_трусиков"), - Genre("без_цензуры"), - Genre("беременность"), - Genre("бикини"), - Genre("близнецы"), - Genre("боди-арт"), - Genre("больница"), - Genre("большая_грудь"), - Genre("большие_попки"), - Genre("буккаке"), - Genre("в_ванной"), - Genre("в_общественном_месте"), - Genre("в_первый_раз"), - Genre("в_цвете"), - Genre("в_школе"), - Genre("вампиры"), - Genre("веб"), - Genre("вебкам"), - Genre("вибратор"), - Genre("визуальная_новелла"), - Genre("внучка"), - Genre("волосатые_женщины"), - Genre("гаремник"), - Genre("гипноз"), - Genre("глубокий_минет"), - Genre("горячий_источник"), - Genre("грудастая_лоли"), - Genre("групповой_секс"), - Genre("гяру_и_гангуро"), - Genre("двойное_проникновение"), - Genre("девочки_волшебницы"), - Genre("девушка_туалет"), - Genre("демоны"), - Genre("дилдо"), - Genre("дочь"), - Genre("драма"), - Genre("дыра_в_стене"), - Genre("жестокость"), - Genre("за_деньги"), - Genre("зомби"), - Genre("зрелые_женщины"), - Genre("измена"), - Genre("изнасилование"), - Genre("инопланетяне"), - Genre("инцест"), - Genre("исполнение_желаний"), - Genre("камера"), - Genre("квест"), - Genre("колготки"), - Genre("комиксы"), - Genre("косплей"), - Genre("кузина"), - Genre("куннилингус"), - Genre("купальники"), - Genre("латекс_и_кожа"), - Genre("магия"), - Genre("маленькая_грудь"), - Genre("мастурбация"), - Genre("мать"), - Genre("мейдочки"), - Genre("мерзкий_дядька"), - Genre("много_девушек"), - Genre("молоко"), - Genre("монстры"), - Genre("мочеиспускание"), - Genre("мужская_озвучка"), - Genre("мужчина_крепкого_телосложения"), - Genre("мускулистые_женщины"), - Genre("на_природе"), - Genre("наблюдение"), - Genre("непрямой_инцест"), - Genre("обмен_партнерами"), - Genre("обмен_телами"), - Genre("огромная_грудь"), - Genre("огромный_член"), - Genre("остановка_времени"), - Genre("парень_пассив"), - Genre("переодевание"), - Genre("песочница"), - Genre("племянница"), - Genre("пляж"), - Genre("подглядывание"), - Genre("подчинение"), - Genre("похищение"), - Genre("принуждение"), - Genre("прозрачная_одежда"), - Genre("проникновение_в_матку"), - Genre("психические_отклонения"), - Genre("публично"), - Genre("рабыни"), - Genre("романтика"), - Genre("сверхъестественное"), - Genre("секс_игрушки"), - Genre("сестра"), - Genre("сетакон"), - Genre("спортивная_форма"), - Genre("спящие"), - Genre("страпон"), - Genre("темнокожие"), - Genre("тентакли"), - Genre("толстушки"), - Genre("трап"), - Genre("тётя"), - Genre("учитель_и_ученик"), - Genre("ушастые"), - Genre("фантазии"), - Genre("фантастика"), - Genre("фемдом"), - Genre("фестиваль"), - Genre("фистинг"), - Genre("фурри"), - Genre("футанари"), - Genre("футанари_имеет_парня"), - Genre("фэнтези"), - Genre("хоррор"), - Genre("цундере"), - Genre("чикан"), - Genre("чирлидеры"), - Genre("чулки"), - Genre("школьники"), - Genre("школьницы"), - Genre("школьный_купальник"), - Genre("эксгибиционизм"), - Genre("эльфы"), - Genre("эччи"), - Genre("юмор"), - Genre("юри"), - Genre("яндере"), - Genre("яой") + Genre("3D"), + Genre("action"), + Genre("ahegao"), + Genre("bdsm"), + Genre("corruption"), + Genre("foot_fetish"), + Genre("footfuck"), + Genre("gender_bender"), + Genre("live"), + Genre("lolcon"), + Genre("megane"), + Genre("mind_break"), + Genre("monstergirl"), + Genre("netorare"), + Genre("netori"), + Genre("nipple_penetration"), + Genre("paizuri_(titsfuck)"), + Genre("rpg"), + Genre("scat"), + Genre("shemale"), + Genre("shooter"), + Genre("simulation"), + Genre("skinsuit"), + Genre("tomboy"), + Genre("x-ray"), + Genre("алкоголь"), + Genre("анал"), + Genre("андроид"), + Genre("анилингус"), + Genre("аркада"), + Genre("арт"), + Genre("бабушка"), + Genre("без_текста"), + Genre("без_трусиков"), + Genre("без_цензуры"), + Genre("беременность"), + Genre("бикини"), + Genre("близнецы"), + Genre("боди-арт"), + Genre("больница"), + Genre("большая_грудь"), + Genre("большие_попки"), + Genre("буккаке"), + Genre("в_ванной"), + Genre("в_общественном_месте"), + Genre("в_первый_раз"), + Genre("в_цвете"), + Genre("в_школе"), + Genre("вампиры"), + Genre("веб"), + Genre("вебкам"), + Genre("вибратор"), + Genre("визуальная_новелла"), + Genre("внучка"), + Genre("волосатые_женщины"), + Genre("гаремник"), + Genre("гипноз"), + Genre("глубокий_минет"), + Genre("горячий_источник"), + Genre("грудастая_лоли"), + Genre("групповой_секс"), + Genre("гяру_и_гангуро"), + Genre("двойное_проникновение"), + Genre("девочки_волшебницы"), + Genre("девушка_туалет"), + Genre("демоны"), + Genre("дилдо"), + Genre("дочь"), + Genre("драма"), + Genre("дыра_в_стене"), + Genre("жестокость"), + Genre("за_деньги"), + Genre("зомби"), + Genre("зрелые_женщины"), + Genre("измена"), + Genre("изнасилование"), + Genre("инопланетяне"), + Genre("инцест"), + Genre("исполнение_желаний"), + Genre("камера"), + Genre("квест"), + Genre("колготки"), + Genre("комиксы"), + Genre("косплей"), + Genre("кузина"), + Genre("куннилингус"), + Genre("купальники"), + Genre("латекс_и_кожа"), + Genre("магия"), + Genre("маленькая_грудь"), + Genre("мастурбация"), + Genre("мать"), + Genre("мейдочки"), + Genre("мерзкий_дядька"), + Genre("много_девушек"), + Genre("молоко"), + Genre("монстры"), + Genre("мочеиспускание"), + Genre("мужская_озвучка"), + Genre("мужчина_крепкого_телосложения"), + Genre("мускулистые_женщины"), + Genre("на_природе"), + Genre("наблюдение"), + Genre("непрямой_инцест"), + Genre("обмен_партнерами"), + Genre("обмен_телами"), + Genre("огромная_грудь"), + Genre("огромный_член"), + Genre("остановка_времени"), + Genre("парень_пассив"), + Genre("переодевание"), + Genre("песочница"), + Genre("племянница"), + Genre("пляж"), + Genre("подглядывание"), + Genre("подчинение"), + Genre("похищение"), + Genre("принуждение"), + Genre("прозрачная_одежда"), + Genre("проникновение_в_матку"), + Genre("психические_отклонения"), + Genre("публично"), + Genre("рабыни"), + Genre("романтика"), + Genre("сверхъестественное"), + Genre("секс_игрушки"), + Genre("сестра"), + Genre("сетакон"), + Genre("спортивная_форма"), + Genre("спящие"), + Genre("страпон"), + Genre("темнокожие"), + Genre("тентакли"), + Genre("толстушки"), + Genre("трап"), + Genre("тётя"), + Genre("учитель_и_ученик"), + Genre("ушастые"), + Genre("фантазии"), + Genre("фантастика"), + Genre("фемдом"), + Genre("фестиваль"), + Genre("фистинг"), + Genre("фурри"), + Genre("футанари"), + Genre("футанари_имеет_парня"), + Genre("фэнтези"), + Genre("хоррор"), + Genre("цундере"), + Genre("чикан"), + Genre("чирлидеры"), + Genre("чулки"), + Genre("школьники"), + Genre("школьницы"), + Genre("школьный_купальник"), + Genre("эксгибиционизм"), + Genre("эльфы"), + Genre("эччи"), + Genre("юмор"), + Genre("юри"), + Genre("яндере"), + Genre("яой") ) } diff --git a/src/ru/libmanga/src/eu/kanade/tachiyomi/extension/ru/libmanga/LibManga.kt b/src/ru/libmanga/src/eu/kanade/tachiyomi/extension/ru/libmanga/LibManga.kt index 06fc2569f..1b4f74054 100644 --- a/src/ru/libmanga/src/eu/kanade/tachiyomi/extension/ru/libmanga/LibManga.kt +++ b/src/ru/libmanga/src/eu/kanade/tachiyomi/extension/ru/libmanga/LibManga.kt @@ -25,8 +25,6 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -36,6 +34,8 @@ import org.jsoup.nodes.Element import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Locale class LibManga : ConfigurableSource, HttpSource() { @@ -211,7 +211,8 @@ class LibManga : ConfigurableSource, HttpSource() { body.select(".info-list__row:has(strong:contains(Перевод))") .first() .select("span.m-label") - .text()) { + .text() + ) { "продолжается" -> SManga.ONGOING "завершен" -> SManga.COMPLETED else -> SManga.UNKNOWN @@ -250,7 +251,7 @@ class LibManga : ConfigurableSource, HttpSource() { chapter.name = element.select("div.chapter-item__name").first().text() chapter.date_upload = SimpleDateFormat("dd.MM.yyyy", Locale.US) - .parse(element.select("div.chapter-item__date").text()).time + .parse(element.select("div.chapter-item__date").text())?.time ?: 0L return chapter } @@ -350,7 +351,8 @@ class LibManga : ConfigurableSource, HttpSource() { // +200ms val popup = client.newCall( - GET("$baseUrl/search?query=$searchRequest", popupSearchHeaders)) + GET("$baseUrl/search?query=$searchRequest", popupSearchHeaders) + ) .execute().body()!!.string() val jsonList = jsonParser.parse(popup).array @@ -361,9 +363,11 @@ class LibManga : ConfigurableSource, HttpSource() { val searchedMangas = popularMangaParse(response) // Filtered out what find in popup search - mangas.addAll(searchedMangas.mangas.filter { search -> - mangas.find { search.title == it.title } == null - }) + mangas.addAll( + searchedMangas.mangas.filter { search -> + mangas.find { search.title == it.title } == null + } + ) return MangasPage(mangas, searchedMangas.hasNextPage) } @@ -381,9 +385,11 @@ class LibManga : ConfigurableSource, HttpSource() { OrderBy() ) - private class OrderBy : Filter.Sort("Сортировка", + private class OrderBy : Filter.Sort( + "Сортировка", arrayOf("Рейтинг", "Имя", "Просмотры", "Дата", "Кол-во глав"), - Selection(0, false)) + Selection(0, false) + ) /* * Use console diff --git a/src/ru/mangachan/src/eu/kanade/tachiyomi/extension/ru/mangachan/Mangachan.kt b/src/ru/mangachan/src/eu/kanade/tachiyomi/extension/ru/mangachan/Mangachan.kt index f1360abfa..0e349bf7f 100644 --- a/src/ru/mangachan/src/eu/kanade/tachiyomi/extension/ru/mangachan/Mangachan.kt +++ b/src/ru/mangachan/src/eu/kanade/tachiyomi/extension/ru/mangachan/Mangachan.kt @@ -10,13 +10,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class Mangachan : ParsedHttpSource() { @@ -36,7 +36,7 @@ class Mangachan : ParsedHttpSource() { .addNetworkInterceptor(rateLimitInterceptor).build() override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/mostfavorites?offset=${20 * (page - 1)}", headers) + GET("$baseUrl/mostfavorites?offset=${20 * (page - 1)}", headers) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { var pageNum = 1 @@ -207,7 +207,7 @@ class Mangachan : ParsedHttpSource() { chapter.setUrlWithoutDomain(urlElement.attr("href")) chapter.name = urlElement.text() chapter.date_upload = element.select("div.date").first()?.text()?.let { - SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it).time + SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it)?.time ?: 0L } ?: 0 return chapter } @@ -231,14 +231,16 @@ class Mangachan : ParsedHttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Тэги", genres) private class Genre(name: String, val id: String = name.replace(' ', '_')) : Filter.TriState(name) private class Status : Filter.Select<String>("Статус", arrayOf("Все", "Перевод завершен", "Выпуск завершен", "Онгоинг", "Новые главы")) - private class OrderBy : Filter.Sort("Сортировка", - arrayOf("Дата", "Популярность", "Имя", "Главы"), - Selection(1, false)) + private class OrderBy : Filter.Sort( + "Сортировка", + arrayOf("Дата", "Популярность", "Имя", "Главы"), + Selection(1, false) + ) override fun getFilterList() = FilterList( - Status(), - OrderBy(), - GenreList(getGenreList()) + Status(), + OrderBy(), + GenreList(getGenreList()) ) /* [...document.querySelectorAll("li.sidetag > a:nth-child(1)")] @@ -246,60 +248,60 @@ class Mangachan : ParsedHttpSource() { * on https://mangachan.me/ */ private fun getGenreList() = listOf( - Genre("18_плюс"), - Genre("bdsm"), - Genre("арт"), - Genre("боевик"), - Genre("боевые_искусства"), - Genre("вампиры"), - Genre("веб"), - Genre("гарем"), - Genre("гендерная_интрига"), - Genre("героическое_фэнтези"), - Genre("детектив"), - Genre("дзёсэй"), - Genre("додзинси"), - Genre("драма"), - Genre("игра"), - Genre("инцест"), - Genre("искусство"), - Genre("история"), - Genre("киберпанк"), - Genre("кодомо"), - Genre("комедия"), - Genre("литРПГ"), - Genre("махо-сёдзё"), - Genre("меха"), - Genre("мистика"), - Genre("музыка"), - Genre("научная_фантастика"), - Genre("повседневность"), - Genre("постапокалиптика"), - Genre("приключения"), - Genre("психология"), - Genre("романтика"), - Genre("самурайский_боевик"), - Genre("сборник"), - Genre("сверхъестественное"), - Genre("сказка"), - Genre("спорт"), - Genre("супергерои"), - Genre("сэйнэн"), - Genre("сёдзё"), - Genre("сёдзё-ай"), - Genre("сёнэн"), - Genre("сёнэн-ай"), - Genre("тентакли"), - Genre("трагедия"), - Genre("триллер"), - Genre("ужасы"), - Genre("фантастика"), - Genre("фурри"), - Genre("фэнтези"), - Genre("школа"), - Genre("эротика"), - Genre("юри"), - Genre("яой"), - Genre("ёнкома") + Genre("18_плюс"), + Genre("bdsm"), + Genre("арт"), + Genre("боевик"), + Genre("боевые_искусства"), + Genre("вампиры"), + Genre("веб"), + Genre("гарем"), + Genre("гендерная_интрига"), + Genre("героическое_фэнтези"), + Genre("детектив"), + Genre("дзёсэй"), + Genre("додзинси"), + Genre("драма"), + Genre("игра"), + Genre("инцест"), + Genre("искусство"), + Genre("история"), + Genre("киберпанк"), + Genre("кодомо"), + Genre("комедия"), + Genre("литРПГ"), + Genre("махо-сёдзё"), + Genre("меха"), + Genre("мистика"), + Genre("музыка"), + Genre("научная_фантастика"), + Genre("повседневность"), + Genre("постапокалиптика"), + Genre("приключения"), + Genre("психология"), + Genre("романтика"), + Genre("самурайский_боевик"), + Genre("сборник"), + Genre("сверхъестественное"), + Genre("сказка"), + Genre("спорт"), + Genre("супергерои"), + Genre("сэйнэн"), + Genre("сёдзё"), + Genre("сёдзё-ай"), + Genre("сёнэн"), + Genre("сёнэн-ай"), + Genre("тентакли"), + Genre("трагедия"), + Genre("триллер"), + Genre("ужасы"), + Genre("фантастика"), + Genre("фурри"), + Genre("фэнтези"), + Genre("школа"), + Genre("эротика"), + Genre("юри"), + Genre("яой"), + Genre("ёнкома") ) } diff --git a/src/ru/mangaclub/src/eu/kanade/tachiyomi/extension/ru/mangaclub/Mangaclub.kt b/src/ru/mangaclub/src/eu/kanade/tachiyomi/extension/ru/mangaclub/Mangaclub.kt index fc5488d46..33f3e7d99 100644 --- a/src/ru/mangaclub/src/eu/kanade/tachiyomi/extension/ru/mangaclub/Mangaclub.kt +++ b/src/ru/mangaclub/src/eu/kanade/tachiyomi/extension/ru/mangaclub/Mangaclub.kt @@ -9,13 +9,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class Mangaclub : ParsedHttpSource() { @@ -142,7 +142,8 @@ class Mangaclub : ParsedHttpSource() { private class Tag(values: Array<String>) : Filter.Select<String>("Жанр", values) private class Sort(values: List<Pair<String, String>>) : Filter.Sort( - "Сортировать результат поиска", values.map { it.first }.toTypedArray(), + "Сортировать результат поиска", + values.map { it.first }.toTypedArray(), Selection(2, false) ) diff --git a/src/ru/mangahub/src/eu/kanade/tachiyomi/extension/ru/mangahub/Mangahub.kt b/src/ru/mangahub/src/eu/kanade/tachiyomi/extension/ru/mangahub/Mangahub.kt index 77ad09e44..8fa5a5b2b 100644 --- a/src/ru/mangahub/src/eu/kanade/tachiyomi/extension/ru/mangahub/Mangahub.kt +++ b/src/ru/mangahub/src/eu/kanade/tachiyomi/extension/ru/mangahub/Mangahub.kt @@ -8,13 +8,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale open class Mangahub : ParsedHttpSource() { @@ -96,7 +96,7 @@ open class Mangahub : ParsedHttpSource() { val chapter = SChapter.create() chapter.name = urlElement.text() chapter.date_upload = element.select("div.text-muted").text()?.let { - SimpleDateFormat("dd.MM.yyyy", Locale.US).parse(it).time + SimpleDateFormat("dd.MM.yyyy", Locale.US).parse(it)?.time ?: 0L } ?: 0 chapter.setUrlWithoutDomain(urlElement.attr("href")) return chapter diff --git a/src/ru/mangaonlinebiz/src/eu/kanade/tachiyomi/extension/ru/mangaonlinebiz/MangaOnlineBiz.kt b/src/ru/mangaonlinebiz/src/eu/kanade/tachiyomi/extension/ru/mangaonlinebiz/MangaOnlineBiz.kt index 5bacecd8d..cfee7d248 100644 --- a/src/ru/mangaonlinebiz/src/eu/kanade/tachiyomi/extension/ru/mangaonlinebiz/MangaOnlineBiz.kt +++ b/src/ru/mangaonlinebiz/src/eu/kanade/tachiyomi/extension/ru/mangaonlinebiz/MangaOnlineBiz.kt @@ -13,13 +13,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MangaOnlineBiz : ParsedHttpSource() { override val name = "MangaOnlineBiz" @@ -145,7 +145,7 @@ class MangaOnlineBiz : ParsedHttpSource() { chapter.setUrlWithoutDomain("/$mangaName/${element.get("volume").string}/${element.get("number").string})/1") chapter.name = "Том ${element.get("volume").string} - Глава ${element.get("number").string} ${element.get("title").string}" chapter.chapter_number = element.get("number").float - chapter.date_upload = SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(element.get("date").string).time + chapter.date_upload = SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(element.get("date").string)?.time ?: 0L return chapter } diff --git a/src/ru/mintmanga/src/eu/kanade/tachiyomi/extension/ru/mintmanga/Mintmanga.kt b/src/ru/mintmanga/src/eu/kanade/tachiyomi/extension/ru/mintmanga/Mintmanga.kt index 55300a1b7..4c8962e6e 100644 --- a/src/ru/mintmanga/src/eu/kanade/tachiyomi/extension/ru/mintmanga/Mintmanga.kt +++ b/src/ru/mintmanga/src/eu/kanade/tachiyomi/extension/ru/mintmanga/Mintmanga.kt @@ -10,10 +10,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.regex.Pattern import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -22,6 +18,10 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.regex.Pattern class Mintmanga : ParsedHttpSource() { @@ -38,13 +38,13 @@ class Mintmanga : ParsedHttpSource() { private val rateLimitInterceptor = RateLimitInterceptor(2) override val client: OkHttpClient = network.client.newBuilder() - .addNetworkInterceptor(rateLimitInterceptor).build() + .addNetworkInterceptor(rateLimitInterceptor).build() override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) + GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) override fun latestUpdatesRequest(page: Int): Request = - GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) + GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) override fun popularMangaSelector() = "div.tile" @@ -61,7 +61,7 @@ class Mintmanga : ParsedHttpSource() { } override fun latestUpdatesFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun popularMangaNextPageSelector() = "a.nextLink" @@ -163,9 +163,9 @@ class Mintmanga : ParsedHttpSource() { chapter.date_upload = element.select("td.hidden-xxs").last()?.text()?.let { try { - SimpleDateFormat("dd.MM.yy", Locale.US).parse(it).time + SimpleDateFormat("dd.MM.yy", Locale.US).parse(it)?.time ?: 0L } catch (e: ParseException) { - SimpleDateFormat("dd/MM/yy", Locale.US).parse(it).time + SimpleDateFormat("dd/MM/yy", Locale.US).parse(it)?.time ?: 0L } } ?: 0 return chapter @@ -245,67 +245,67 @@ class Mintmanga : ParsedHttpSource() { * on https://mintmanga.live/search/advanced */ override fun getFilterList() = FilterList( - Category(getCategoryList()), - GenreList(getGenreList()) + Category(getCategoryList()), + GenreList(getGenreList()) ) private fun getCategoryList() = listOf( - Genre("В цвете", "el_4614"), - Genre("Веб", "el_1355"), - Genre("Выпуск приостановлен", "el_5232"), - Genre("Ёнкома", "el_2741"), - Genre("Комикс западный", "el_1903"), - Genre("Комикс русский", "el_2173"), - Genre("Манхва", "el_1873"), - Genre("Маньхуа", "el_1875"), - Genre("Не Яой", "el_1874"), - Genre("Ранобэ", "el_5688"), - Genre("Сборник", "el_1348") + Genre("В цвете", "el_4614"), + Genre("Веб", "el_1355"), + Genre("Выпуск приостановлен", "el_5232"), + Genre("Ёнкома", "el_2741"), + Genre("Комикс западный", "el_1903"), + Genre("Комикс русский", "el_2173"), + Genre("Манхва", "el_1873"), + Genre("Маньхуа", "el_1875"), + Genre("Не Яой", "el_1874"), + Genre("Ранобэ", "el_5688"), + Genre("Сборник", "el_1348") ) private fun getGenreList() = listOf( - Genre("арт", "el_2220"), - Genre("бара", "el_1353"), - Genre("боевик", "el_1346"), - Genre("боевые искусства", "el_1334"), - Genre("вампиры", "el_1339"), - Genre("гарем", "el_1333"), - Genre("гендерная интрига", "el_1347"), - Genre("героическое фэнтези", "el_1337"), - Genre("детектив", "el_1343"), - Genre("дзёсэй", "el_1349"), - Genre("додзинси", "el_1332"), - Genre("драма", "el_1310"), - Genre("игра", "el_5229"), - Genre("история", "el_1311"), - Genre("киберпанк", "el_1351"), - Genre("комедия", "el_1328"), - Genre("меха", "el_1318"), - Genre("мистика", "el_1324"), - Genre("научная фантастика", "el_1325"), - Genre("омегаверс", "el_5676"), - Genre("повседневность", "el_1327"), - Genre("постапокалиптика", "el_1342"), - Genre("приключения", "el_1322"), - Genre("психология", "el_1335"), - Genre("романтика", "el_1313"), - Genre("самурайский боевик", "el_1316"), - Genre("сверхъестественное", "el_1350"), - Genre("сёдзё", "el_1314"), - Genre("сёдзё-ай", "el_1320"), - Genre("сёнэн", "el_1326"), - Genre("сёнэн-ай", "el_1330"), - Genre("спорт", "el_1321"), - Genre("сэйнэн", "el_1329"), - Genre("трагедия", "el_1344"), - Genre("триллер", "el_1341"), - Genre("ужасы", "el_1317"), - Genre("фантастика", "el_1331"), - Genre("фэнтези", "el_1323"), - Genre("школа", "el_1319"), - Genre("эротика", "el_1340"), - Genre("этти", "el_1354"), - Genre("юри", "el_1315"), - Genre("яой", "el_1336") + Genre("арт", "el_2220"), + Genre("бара", "el_1353"), + Genre("боевик", "el_1346"), + Genre("боевые искусства", "el_1334"), + Genre("вампиры", "el_1339"), + Genre("гарем", "el_1333"), + Genre("гендерная интрига", "el_1347"), + Genre("героическое фэнтези", "el_1337"), + Genre("детектив", "el_1343"), + Genre("дзёсэй", "el_1349"), + Genre("додзинси", "el_1332"), + Genre("драма", "el_1310"), + Genre("игра", "el_5229"), + Genre("история", "el_1311"), + Genre("киберпанк", "el_1351"), + Genre("комедия", "el_1328"), + Genre("меха", "el_1318"), + Genre("мистика", "el_1324"), + Genre("научная фантастика", "el_1325"), + Genre("омегаверс", "el_5676"), + Genre("повседневность", "el_1327"), + Genre("постапокалиптика", "el_1342"), + Genre("приключения", "el_1322"), + Genre("психология", "el_1335"), + Genre("романтика", "el_1313"), + Genre("самурайский боевик", "el_1316"), + Genre("сверхъестественное", "el_1350"), + Genre("сёдзё", "el_1314"), + Genre("сёдзё-ай", "el_1320"), + Genre("сёнэн", "el_1326"), + Genre("сёнэн-ай", "el_1330"), + Genre("спорт", "el_1321"), + Genre("сэйнэн", "el_1329"), + Genre("трагедия", "el_1344"), + Genre("триллер", "el_1341"), + Genre("ужасы", "el_1317"), + Genre("фантастика", "el_1331"), + Genre("фэнтези", "el_1323"), + Genre("школа", "el_1319"), + Genre("эротика", "el_1340"), + Genre("этти", "el_1354"), + Genre("юри", "el_1315"), + Genre("яой", "el_1336") ) } diff --git a/src/ru/nudemoon/src/eu/kanade/tachiyomi/extension/ru/nudemoon/Nudemoon.kt b/src/ru/nudemoon/src/eu/kanade/tachiyomi/extension/ru/nudemoon/Nudemoon.kt index 7c3366999..5d7eb9d3d 100644 --- a/src/ru/nudemoon/src/eu/kanade/tachiyomi/extension/ru/nudemoon/Nudemoon.kt +++ b/src/ru/nudemoon/src/eu/kanade/tachiyomi/extension/ru/nudemoon/Nudemoon.kt @@ -9,13 +9,13 @@ 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 java.net.URLEncoder -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.net.URLEncoder +import java.text.SimpleDateFormat +import java.util.Locale @Nsfw class Nudemoon : ParsedHttpSource() { @@ -29,10 +29,10 @@ class Nudemoon : ParsedHttpSource() { override val supportsLatest = true override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/all_manga?views&rowstart=${30 * (page - 1)}", headers) + GET("$baseUrl/all_manga?views&rowstart=${30 * (page - 1)}", headers) override fun latestUpdatesRequest(page: Int): Request = - GET("$baseUrl/all_manga?date&rowstart=${30 * (page - 1)}", headers) + GET("$baseUrl/all_manga?date&rowstart=${30 * (page - 1)}", headers) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { // Search by query on this site works really badly, i don't even sure of the need to implement it @@ -97,10 +97,10 @@ class Nudemoon : ParsedHttpSource() { } override fun latestUpdatesFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun searchMangaFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun popularMangaNextPageSelector() = "a.small:contains(Следующая)" @@ -162,7 +162,7 @@ class Nudemoon : ParsedHttpSource() { chapter.name = chapterName chapter.date_upload = infoElem.text().substringAfter("Дата:").substringBefore("Просмотров").trim().let { try { - SimpleDateFormat("dd MMMM yyyy", Locale("ru")).parse(it).time + SimpleDateFormat("dd MMMM yyyy", Locale("ru")).parse(it)?.time ?: 0L } catch (e: Exception) { 0 } @@ -185,97 +185,99 @@ class Nudemoon : ParsedHttpSource() { private class Genre(name: String, val id: String = name.replace(' ', '_')) : Filter.CheckBox(name.capitalize()) private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Тэги", genres) - private class OrderBy : Filter.Sort("Сортировка", - arrayOf("Дата", "Просмотры", "Лайки"), - Selection(1, false)) + private class OrderBy : Filter.Sort( + "Сортировка", + arrayOf("Дата", "Просмотры", "Лайки"), + Selection(1, false) + ) override fun getFilterList() = FilterList( - OrderBy(), - GenreList(getGenreList()) + OrderBy(), + GenreList(getGenreList()) ) private fun getGenreList() = listOf( - Genre("анал"), - Genre("без цензуры"), - Genre("беременные"), - Genre("близняшки"), - Genre("большие груди"), - Genre("в бассейне"), - Genre("в больнице"), - Genre("в ванной"), - Genre("в общественном месте"), - Genre("в первый раз"), - Genre("в транспорте"), - Genre("в туалете"), - Genre("гарем"), - Genre("гипноз"), - Genre("горничные"), - Genre("горячий источник"), - Genre("групповой секс"), - Genre("драма"), - Genre("запредельное"), - Genre("золотой дождь"), - Genre("зрелые женщины"), - Genre("идолы"), - Genre("извращение"), - Genre("измена"), - Genre("имеют парня"), - Genre("клизма"), - Genre("колготки"), - Genre("комиксы"), - Genre("комиксы 3D"), - Genre("косплей"), - Genre("мастурбация"), - Genre("мерзкий мужик"), - Genre("много спермы"), - Genre("молоко"), - Genre("монстры"), - Genre("на камеру"), - Genre("на природе"), - Genre("обычный секс"), - Genre("огромный член"), - Genre("пляж"), - Genre("подглядывание"), - Genre("принуждение"), - Genre("продажность"), - Genre("пьяные"), - Genre("рабыни"), - Genre("романтика"), - Genre("с ушками"), - Genre("секс игрушки"), - Genre("спящие"), - Genre("страпон"), - Genre("студенты"), - Genre("суккуб"), - Genre("тентакли"), - Genre("толстушки"), - Genre("трапы"), - Genre("ужасы"), - Genre("униформа"), - Genre("учитель и ученик"), - Genre("фемдом"), - Genre("фетиш"), - Genre("фурри"), - Genre("футанари"), - Genre("футфетиш"), - Genre("фэнтези"), - Genre("цветная"), - Genre("чикан"), - Genre("чулки"), - Genre("шимейл"), - Genre("эксгибиционизм"), - Genre("юмор"), - Genre("юри"), - Genre("ahegao"), - Genre("BDSM"), - Genre("ganguro"), - Genre("gender bender"), - Genre("megane"), - Genre("mind break"), - Genre("monstergirl"), - Genre("netorare"), - Genre("nipple penetration"), - Genre("titsfuck"), - Genre("x-ray") + Genre("анал"), + Genre("без цензуры"), + Genre("беременные"), + Genre("близняшки"), + Genre("большие груди"), + Genre("в бассейне"), + Genre("в больнице"), + Genre("в ванной"), + Genre("в общественном месте"), + Genre("в первый раз"), + Genre("в транспорте"), + Genre("в туалете"), + Genre("гарем"), + Genre("гипноз"), + Genre("горничные"), + Genre("горячий источник"), + Genre("групповой секс"), + Genre("драма"), + Genre("запредельное"), + Genre("золотой дождь"), + Genre("зрелые женщины"), + Genre("идолы"), + Genre("извращение"), + Genre("измена"), + Genre("имеют парня"), + Genre("клизма"), + Genre("колготки"), + Genre("комиксы"), + Genre("комиксы 3D"), + Genre("косплей"), + Genre("мастурбация"), + Genre("мерзкий мужик"), + Genre("много спермы"), + Genre("молоко"), + Genre("монстры"), + Genre("на камеру"), + Genre("на природе"), + Genre("обычный секс"), + Genre("огромный член"), + Genre("пляж"), + Genre("подглядывание"), + Genre("принуждение"), + Genre("продажность"), + Genre("пьяные"), + Genre("рабыни"), + Genre("романтика"), + Genre("с ушками"), + Genre("секс игрушки"), + Genre("спящие"), + Genre("страпон"), + Genre("студенты"), + Genre("суккуб"), + Genre("тентакли"), + Genre("толстушки"), + Genre("трапы"), + Genre("ужасы"), + Genre("униформа"), + Genre("учитель и ученик"), + Genre("фемдом"), + Genre("фетиш"), + Genre("фурри"), + Genre("футанари"), + Genre("футфетиш"), + Genre("фэнтези"), + Genre("цветная"), + Genre("чикан"), + Genre("чулки"), + Genre("шимейл"), + Genre("эксгибиционизм"), + Genre("юмор"), + Genre("юри"), + Genre("ahegao"), + Genre("BDSM"), + Genre("ganguro"), + Genre("gender bender"), + Genre("megane"), + Genre("mind break"), + Genre("monstergirl"), + Genre("netorare"), + Genre("nipple penetration"), + Genre("titsfuck"), + Genre("x-ray") ) } diff --git a/src/ru/onlinecomics/src/eu/kanade/tachiyomi/extension/ru/onlinecomics/Onlinecomics.kt b/src/ru/onlinecomics/src/eu/kanade/tachiyomi/extension/ru/onlinecomics/Onlinecomics.kt index 7c61d2818..3234a822b 100644 --- a/src/ru/onlinecomics/src/eu/kanade/tachiyomi/extension/ru/onlinecomics/Onlinecomics.kt +++ b/src/ru/onlinecomics/src/eu/kanade/tachiyomi/extension/ru/onlinecomics/Onlinecomics.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers 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 class Onlinecomics : ParsedHttpSource() { override fun searchMangaFromElement(element: Element): SManga { @@ -51,14 +51,14 @@ class Onlinecomics : ParsedHttpSource() { override val supportsLatest = false override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/online-reading/comicsonline/$page") + GET("$baseUrl/online-reading/comicsonline/$page") override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val url = "https://yandex.ru/search/site/?html=1&topdoc=http://jurnalu.ru/?searchid=2158851&" + - "text=$query&web=0&encoding=&tld=ru&htmlcss=1.x&updatehash=true&searchid=2158851&" + - "clid=&text=batman&web=0&p=&surl=&constraintid=&date=&within=&from_day=&" + - "from_month=&from_year=&to_day=&to_month=&to_year=&available=&priceLow=&priceHigh=&" + - "categoryId=&l10n=ru&callback=jQuery" + "text=$query&web=0&encoding=&tld=ru&htmlcss=1.x&updatehash=true&searchid=2158851&" + + "clid=&text=batman&web=0&p=&surl=&constraintid=&date=&within=&from_day=&" + + "from_month=&from_year=&to_day=&to_month=&to_year=&available=&priceLow=&priceHigh=&" + + "categoryId=&l10n=ru&callback=jQuery" return GET(url, headers) } @@ -94,22 +94,22 @@ class Onlinecomics : ParsedHttpSource() { override fun searchMangaParse(response: Response): MangasPage { val body = response.body()!!.string() - .replace("\\/", "/") - .replace("\\-", "-") - .removePrefix("jQuery(Ya.Site.Results.triggerResultsDelivered('") - .removeSuffix("'))") + .replace("\\/", "/") + .replace("\\-", "-") + .removePrefix("jQuery(Ya.Site.Results.triggerResultsDelivered('") + .removeSuffix("'))") val document = Jsoup.parse(body) val mangaList = mutableListOf<SManga>() document.select(".b-serp-item__title-link").forEach { element -> val manga = SManga.create() val url = element.select("a.b-serp-item__title-link").first() - .attr("href").removePrefix("http://www.jurnalu.ru") + .attr("href").removePrefix("http://www.jurnalu.ru") if (url.contains("/manga/")) return@forEach val splits = url.split('/') val newUrl = splits - .joinToString("/", limit = 4, truncated = "") - .removeSuffix("/") + .joinToString("/", limit = 4, truncated = "") + .removeSuffix("/") manga.setUrlWithoutDomain(newUrl) manga.title = element.select("yass-span").text().split('/')[0] mangaList.add(manga) @@ -124,10 +124,12 @@ class Onlinecomics : ParsedHttpSource() { val manga = SManga.create() if (infoElement.select("strong").size > 5) { - manga.author = (infoElement.select("strong")[6].text() + - infoElement.select("strong")[7].text()) - .removePrefix("Издательство: ") - .split(" /")[0] + manga.author = ( + infoElement.select("strong")[6].text() + + infoElement.select("strong")[7].text() + ) + .removePrefix("Издательство: ") + .split(" /")[0] val text = (document.select("p[align]")[0].parentNode() as Element).text() val begin = if (text.contains("Жанр:")) { @@ -141,7 +143,7 @@ class Onlinecomics : ParsedHttpSource() { manga.status = parseStatus(infoElement.text()) manga.description = infoElement.select("div").last().text() - .split("Только у нас на сайте вы можете ")[0] + .split("Только у нас на сайте вы можете ")[0] manga.thumbnail_url = baseUrl + infoElement.select("div img")[1].attr("src") } else { @@ -164,12 +166,14 @@ class Onlinecomics : ParsedHttpSource() { val lastPage: String? = document.select("div.navigationG .C").last()?.text() if (lastPage != null) { (2..lastPage.toInt()).forEach { i -> - val get = GET("${response.request().url()}/$i", - headers = headers) + val get = GET( + "${response.request().url()}/$i", + headers = headers + ) chapterList.addAll( - client.newCall(get).execute().asJsoup().select(chapterListSelector()).map { - chapterFromElement(it) - } + client.newCall(get).execute().asJsoup().select(chapterListSelector()).map { + chapterFromElement(it) + } ) } } @@ -185,7 +189,7 @@ class Onlinecomics : ParsedHttpSource() { chapter.setUrlWithoutDomain(urlElement.attr("href")) chapter.name = urlElement.text() chapter.date_upload = element.select("div.date").first()?.text()?.let { - SimpleDateFormat("dd.MM.yyyy", Locale.US).parse(it).time + SimpleDateFormat("dd.MM.yyyy", Locale.US).parse(it)?.time ?: 0L } ?: 0 return chapter } diff --git a/src/ru/readmanga/src/eu/kanade/tachiyomi/extension/ru/readmanga/Readmanga.kt b/src/ru/readmanga/src/eu/kanade/tachiyomi/extension/ru/readmanga/Readmanga.kt index d9c1fd24b..2c21f1bf5 100644 --- a/src/ru/readmanga/src/eu/kanade/tachiyomi/extension/ru/readmanga/Readmanga.kt +++ b/src/ru/readmanga/src/eu/kanade/tachiyomi/extension/ru/readmanga/Readmanga.kt @@ -10,10 +10,6 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.regex.Pattern import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -22,6 +18,10 @@ import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.regex.Pattern class Readmanga : ParsedHttpSource() { @@ -38,17 +38,17 @@ class Readmanga : ParsedHttpSource() { private val rateLimitInterceptor = RateLimitInterceptor(2) override val client: OkHttpClient = network.client.newBuilder() - .addNetworkInterceptor(rateLimitInterceptor).build() + .addNetworkInterceptor(rateLimitInterceptor).build() override fun popularMangaSelector() = "div.tile" override fun latestUpdatesSelector() = "div.tile" override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) + GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) override fun latestUpdatesRequest(page: Int): Request = - GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) + GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) override fun popularMangaFromElement(element: Element): SManga { val manga = SManga.create() @@ -61,7 +61,7 @@ class Readmanga : ParsedHttpSource() { } override fun latestUpdatesFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun popularMangaNextPageSelector() = "a.nextLink" @@ -163,9 +163,9 @@ class Readmanga : ParsedHttpSource() { chapter.date_upload = element.select("td.hidden-xxs").last()?.text()?.let { try { - SimpleDateFormat("dd.MM.yy", Locale.US).parse(it).time + SimpleDateFormat("dd.MM.yy", Locale.US).parse(it)?.time ?: 0L } catch (e: ParseException) { - SimpleDateFormat("dd/MM/yy", Locale.US).parse(it).time + SimpleDateFormat("dd/MM/yy", Locale.US).parse(it)?.time ?: 0L } } ?: 0 return chapter @@ -245,63 +245,63 @@ class Readmanga : ParsedHttpSource() { * on https://readmanga.me/search/advanced */ override fun getFilterList() = FilterList( - Category(getCategoryList()), - GenreList(getGenreList()) + Category(getCategoryList()), + GenreList(getGenreList()) ) private fun getCategoryList() = listOf( - Genre("В цвете", "el_7290"), - Genre("Веб", "el_2160"), - Genre("Выпуск приостановлен", "el_8033"), - Genre("Ёнкома", "el_2161"), - Genre("Комикс западный", "el_3515"), - Genre("Манхва", "el_3001"), - Genre("Маньхуа", "el_3002"), - Genre("Ранобэ", "el_8575"), - Genre("Сборник", "el_2157") + Genre("В цвете", "el_7290"), + Genre("Веб", "el_2160"), + Genre("Выпуск приостановлен", "el_8033"), + Genre("Ёнкома", "el_2161"), + Genre("Комикс западный", "el_3515"), + Genre("Манхва", "el_3001"), + Genre("Маньхуа", "el_3002"), + Genre("Ранобэ", "el_8575"), + Genre("Сборник", "el_2157") ) private fun getGenreList() = listOf( - Genre("арт", "el_5685"), - Genre("боевик", "el_2155"), - Genre("боевые искусства", "el_2143"), - Genre("вампиры", "el_2148"), - Genre("гарем", "el_2142"), - Genre("гендерная интрига", "el_2156"), - Genre("героическое фэнтези", "el_2146"), - Genre("детектив", "el_2152"), - Genre("дзёсэй", "el_2158"), - Genre("додзинси", "el_2141"), - Genre("драма", "el_2118"), - Genre("игра", "el_2154"), - Genre("история", "el_2119"), - Genre("киберпанк", "el_8032"), - Genre("кодомо", "el_2137"), - Genre("комедия", "el_2136"), - Genre("махо-сёдзё", "el_2147"), - Genre("меха", "el_2126"), - Genre("мистика", "el_2132"), - Genre("научная фантастика", "el_2133"), - Genre("повседневность", "el_2135"), - Genre("постапокалиптика", "el_2151"), - Genre("приключения", "el_2130"), - Genre("психология", "el_2144"), - Genre("романтика", "el_2121"), - Genre("самурайский боевик", "el_2124"), - Genre("сверхъестественное", "el_2159"), - Genre("сёдзё", "el_2122"), - Genre("сёдзё-ай", "el_2128"), - Genre("сёнэн", "el_2134"), - Genre("сёнэн-ай", "el_2139"), - Genre("спорт", "el_2129"), - Genre("сэйнэн", "el_2138"), - Genre("трагедия", "el_2153"), - Genre("триллер", "el_2150"), - Genre("ужасы", "el_2125"), - Genre("фантастика", "el_2140"), - Genre("фэнтези", "el_2131"), - Genre("школа", "el_2127"), - Genre("этти", "el_2149"), - Genre("юри", "el_2123") + Genre("арт", "el_5685"), + Genre("боевик", "el_2155"), + Genre("боевые искусства", "el_2143"), + Genre("вампиры", "el_2148"), + Genre("гарем", "el_2142"), + Genre("гендерная интрига", "el_2156"), + Genre("героическое фэнтези", "el_2146"), + Genre("детектив", "el_2152"), + Genre("дзёсэй", "el_2158"), + Genre("додзинси", "el_2141"), + Genre("драма", "el_2118"), + Genre("игра", "el_2154"), + Genre("история", "el_2119"), + Genre("киберпанк", "el_8032"), + Genre("кодомо", "el_2137"), + Genre("комедия", "el_2136"), + Genre("махо-сёдзё", "el_2147"), + Genre("меха", "el_2126"), + Genre("мистика", "el_2132"), + Genre("научная фантастика", "el_2133"), + Genre("повседневность", "el_2135"), + Genre("постапокалиптика", "el_2151"), + Genre("приключения", "el_2130"), + Genre("психология", "el_2144"), + Genre("романтика", "el_2121"), + Genre("самурайский боевик", "el_2124"), + Genre("сверхъестественное", "el_2159"), + Genre("сёдзё", "el_2122"), + Genre("сёдзё-ай", "el_2128"), + Genre("сёнэн", "el_2134"), + Genre("сёнэн-ай", "el_2139"), + Genre("спорт", "el_2129"), + Genre("сэйнэн", "el_2138"), + Genre("трагедия", "el_2153"), + Genre("триллер", "el_2150"), + Genre("ужасы", "el_2125"), + Genre("фантастика", "el_2140"), + Genre("фэнтези", "el_2131"), + Genre("школа", "el_2127"), + Genre("этти", "el_2149"), + Genre("юри", "el_2123") ) } diff --git a/src/ru/remanga/src/eu/kanade/tachiyomi/extension/ru/remanga/Remanga.kt b/src/ru/remanga/src/eu/kanade/tachiyomi/extension/ru/remanga/Remanga.kt index 8d8615c3e..670dc2390 100644 --- a/src/ru/remanga/src/eu/kanade/tachiyomi/extension/ru/remanga/Remanga.kt +++ b/src/ru/remanga/src/eu/kanade/tachiyomi/extension/ru/remanga/Remanga.kt @@ -40,11 +40,6 @@ 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 java.io.ByteArrayOutputStream -import java.io.IOException -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale import okhttp3.Call import okhttp3.Callback import okhttp3.Headers @@ -60,6 +55,11 @@ import org.jsoup.Jsoup import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.io.ByteArrayOutputStream +import java.io.IOException +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale class Remanga : ConfigurableSource, HttpSource() { override val name = "Remanga" @@ -233,8 +233,9 @@ class Remanga : ConfigurableSource, HttpSource() { } .map { response -> (if (warnLogin) manga.apply { description = "Авторизуйтесь для просмотра списка глав" } else mangaDetailsParse(response)) - .apply { initialized = true - } + .apply { + initialized = true + } } } @@ -267,7 +268,7 @@ class Remanga : ConfigurableSource, HttpSource() { Observable.error(Exception("Licensed - No chapters to show")) } else -> { - val branchId = branch.maxBy { selector(it) }!!.id + val branchId = branch.maxByOrNull { selector(it) }!!.id client.newCall(chapterListRequest(branchId)) .asObservableSuccess() .map { response -> @@ -397,9 +398,11 @@ class Remanga : ConfigurableSource, HttpSource() { AgeList(getAgeList()) ) - private class OrderBy : Filter.Sort("Сортировка", + private class OrderBy : Filter.Sort( + "Сортировка", arrayOf("Новизне", "Последним обновлениям", "Популярности", "Лайкам", "Просмотрам", "Мне повезет"), - Selection(2, false)) + Selection(2, false) + ) private fun getAgeList() = listOf( CheckFilter("Для всех", "0"), diff --git a/src/ru/risensteam/src/eu/kanade/tachiyomi/extension/ru/risensteam/RisensTeam.kt b/src/ru/risensteam/src/eu/kanade/tachiyomi/extension/ru/risensteam/RisensTeam.kt index 877dabdeb..b84832223 100644 --- a/src/ru/risensteam/src/eu/kanade/tachiyomi/extension/ru/risensteam/RisensTeam.kt +++ b/src/ru/risensteam/src/eu/kanade/tachiyomi/extension/ru/risensteam/RisensTeam.kt @@ -18,14 +18,14 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.MediaType import okhttp3.Request import okhttp3.RequestBody import okhttp3.Response import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale class RisensTeam : HttpSource() { diff --git a/src/ru/selfmanga/src/eu/kanade/tachiyomi/extension/ru/selfmanga/Selfmanga.kt b/src/ru/selfmanga/src/eu/kanade/tachiyomi/extension/ru/selfmanga/Selfmanga.kt index 4f4c0b45d..21e2c18ff 100644 --- a/src/ru/selfmanga/src/eu/kanade/tachiyomi/extension/ru/selfmanga/Selfmanga.kt +++ b/src/ru/selfmanga/src/eu/kanade/tachiyomi/extension/ru/selfmanga/Selfmanga.kt @@ -7,16 +7,16 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale -import java.util.regex.Pattern import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.regex.Pattern class Selfmanga : ParsedHttpSource() { @@ -33,10 +33,10 @@ class Selfmanga : ParsedHttpSource() { override fun latestUpdatesSelector() = "div.tile" override fun popularMangaRequest(page: Int): Request = - GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) + GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) override fun latestUpdatesRequest(page: Int): Request = - GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) + GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) override fun popularMangaFromElement(element: Element): SManga { val manga = SManga.create() @@ -49,7 +49,7 @@ class Selfmanga : ParsedHttpSource() { } override fun latestUpdatesFromElement(element: Element): SManga = - popularMangaFromElement(element) + popularMangaFromElement(element) override fun popularMangaNextPageSelector() = "a.nextLink" @@ -118,9 +118,9 @@ class Selfmanga : ParsedHttpSource() { } chapter.date_upload = element.select("td.hidden-xxs").last()?.text()?.let { try { - SimpleDateFormat("dd/MM/yy", Locale.US).parse(it).time + SimpleDateFormat("dd/MM/yy", Locale.US).parse(it)?.time ?: 0L } catch (e: ParseException) { - SimpleDateFormat("dd.MM.yy", Locale.US).parse(it).time + SimpleDateFormat("dd.MM.yy", Locale.US).parse(it)?.time ?: 0L } } ?: 0 return chapter @@ -196,53 +196,53 @@ class Selfmanga : ParsedHttpSource() { * on https://selfmanga.ru/search/advanced */ override fun getFilterList() = FilterList( - Category(getCategoryList()), - GenreList(getGenreList()) + Category(getCategoryList()), + GenreList(getGenreList()) ) private fun getCategoryList() = listOf( - Genre("Артбук", "el_5894"), - Genre("Веб", "el_2160"), - Genre("Журнал", "el_4983"), - Genre("Ранобэ", "el_5215"), - Genre("Сборник", "el_2157") + Genre("Артбук", "el_5894"), + Genre("Веб", "el_2160"), + Genre("Журнал", "el_4983"), + Genre("Ранобэ", "el_5215"), + Genre("Сборник", "el_2157") ) private fun getGenreList() = listOf( - Genre("боевик", "el_2155"), - Genre("боевые искусства", "el_2143"), - Genre("вампиры", "el_2148"), - Genre("гарем", "el_2142"), - Genre("гендерная интрига", "el_2156"), - Genre("героическое фэнтези", "el_2146"), - Genre("детектив", "el_2152"), - Genre("дзёсэй", "el_2158"), - Genre("додзинси", "el_2141"), - Genre("драма", "el_2118"), - Genre("ёнкома", "el_2161"), - Genre("история", "el_2119"), - Genre("комедия", "el_2136"), - Genre("махо-сёдзё", "el_2147"), - Genre("мистика", "el_2132"), - Genre("научная фантастика", "el_2133"), - Genre("повседневность", "el_2135"), - Genre("постапокалиптика", "el_2151"), - Genre("приключения", "el_2130"), - Genre("психология", "el_2144"), - Genre("романтика", "el_2121"), - Genre("сверхъестественное", "el_2159"), - Genre("сёдзё", "el_2122"), - Genre("сёдзё-ай", "el_2128"), - Genre("сёнэн", "el_2134"), - Genre("сёнэн-ай", "el_2139"), - Genre("спорт", "el_2129"), - Genre("сэйнэн", "el_5838"), - Genre("трагедия", "el_2153"), - Genre("триллер", "el_2150"), - Genre("ужасы", "el_2125"), - Genre("фантастика", "el_2140"), - Genre("фэнтези", "el_2131"), - Genre("школа", "el_2127"), - Genre("этти", "el_4982") + Genre("боевик", "el_2155"), + Genre("боевые искусства", "el_2143"), + Genre("вампиры", "el_2148"), + Genre("гарем", "el_2142"), + Genre("гендерная интрига", "el_2156"), + Genre("героическое фэнтези", "el_2146"), + Genre("детектив", "el_2152"), + Genre("дзёсэй", "el_2158"), + Genre("додзинси", "el_2141"), + Genre("драма", "el_2118"), + Genre("ёнкома", "el_2161"), + Genre("история", "el_2119"), + Genre("комедия", "el_2136"), + Genre("махо-сёдзё", "el_2147"), + Genre("мистика", "el_2132"), + Genre("научная фантастика", "el_2133"), + Genre("повседневность", "el_2135"), + Genre("постапокалиптика", "el_2151"), + Genre("приключения", "el_2130"), + Genre("психология", "el_2144"), + Genre("романтика", "el_2121"), + Genre("сверхъестественное", "el_2159"), + Genre("сёдзё", "el_2122"), + Genre("сёдзё-ай", "el_2128"), + Genre("сёнэн", "el_2134"), + Genre("сёнэн-ай", "el_2139"), + Genre("спорт", "el_2129"), + Genre("сэйнэн", "el_5838"), + Genre("трагедия", "el_2153"), + Genre("триллер", "el_2150"), + Genre("ужасы", "el_2125"), + Genre("фантастика", "el_2140"), + Genre("фэнтези", "el_2131"), + Genre("школа", "el_2127"), + Genre("этти", "el_4982") ) } diff --git a/src/ru/yaoichan/src/eu/kanade/tachiyomi/extension/ru/yaoichan/Yaoichan.kt b/src/ru/yaoichan/src/eu/kanade/tachiyomi/extension/ru/yaoichan/Yaoichan.kt index 36032efd8..cc71b7e70 100644 --- a/src/ru/yaoichan/src/eu/kanade/tachiyomi/extension/ru/yaoichan/Yaoichan.kt +++ b/src/ru/yaoichan/src/eu/kanade/tachiyomi/extension/ru/yaoichan/Yaoichan.kt @@ -9,13 +9,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale @Nsfw class Yaoichan : ParsedHttpSource() { @@ -165,7 +165,7 @@ class Yaoichan : ParsedHttpSource() { chapter.setUrlWithoutDomain(urlElement.attr("href")) chapter.name = urlElement.text() chapter.date_upload = element.select("div.date").first()?.text()?.let { - SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it).time + SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it)?.time ?: 0L } ?: 0 return chapter } @@ -189,9 +189,11 @@ class Yaoichan : ParsedHttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Тэги", genres) private class Genre(name: String, val id: String = name.replace(' ', '_')) : Filter.TriState(name) private class Status : Filter.Select<String>("Статус", arrayOf("Все", "Перевод завершен", "Выпуск завершен", "Онгоинг", "Новые главы")) - private class OrderBy : Filter.Sort("Сортировка", + private class OrderBy : Filter.Sort( + "Сортировка", arrayOf("Дата", "Популярность", "Имя", "Главы"), - Selection(1, false)) + Selection(1, false) + ) override fun getFilterList() = FilterList( Status(), diff --git a/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/NPUtils.kt b/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/NPUtils.kt index d368e0e4b..bab46114f 100644 --- a/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/NPUtils.kt +++ b/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/NPUtils.kt @@ -1,9 +1,9 @@ package eu.kanade.tachiyomi.extension.th.nekopost +import org.jsoup.nodes.Element import java.text.SimpleDateFormat import java.util.ArrayList import java.util.Locale -import org.jsoup.nodes.Element class NPArrayList<E>(c: Collection<E>, val mangaList: List<Element>) : ArrayList<E>(c) { override fun isEmpty(): Boolean = mangaList.isEmpty() @@ -23,7 +23,7 @@ object NPUtils { return urlWithoutDomain } - fun convertDateStringToEpoch(dateStr: String, format: String = "yyyy-MM-dd"): Long = SimpleDateFormat(format, Locale("th")).parse(dateStr).time + fun convertDateStringToEpoch(dateStr: String, format: String = "yyyy-MM-dd"): Long = SimpleDateFormat(format, Locale("th")).parse(dateStr)?.time ?: 0L fun getSearchQuery(keyword: String = "", genreList: Array<String>, statusList: Array<String>): String { val keywordQuery = "ip_keyword=$keyword" diff --git a/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/Nekopost.kt b/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/Nekopost.kt index 5ff10beba..c08cad09b 100644 --- a/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/Nekopost.kt +++ b/src/th/nekopost/src/eu/kanade/tachiyomi/extension/th/nekopost/Nekopost.kt @@ -10,10 +10,6 @@ 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 java.net.URL -import java.util.Calendar -import java.util.Locale -import kotlin.collections.set import okhttp3.Request import okhttp3.Response import org.json.JSONArray @@ -21,6 +17,10 @@ import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable +import java.net.URL +import java.util.Calendar +import java.util.Locale +import kotlin.collections.set class Nekopost : ParsedHttpSource() { override val baseUrl: String = "https://www.nekopost.net/manga/" @@ -198,29 +198,31 @@ class Nekopost : ParsedHttpSource() { for (chIndex in 0 until chListData.length()) { val chInfo = chListData.getJSONObject(chIndex) - chList.add(ChapterInfo().apply { - nc_chapter_id = chInfo.getString("nc_chapter_id").toInt() - nc_chapter_no = chInfo.getString("nc_chapter_no").toFloat() - nc_chapter_name = chInfo.getString("nc_chapter_name") - nc_provider = chInfo.getString("nc_provider") - nc_created_date = chInfo.getString("nc_created_date").let { - it.split("-").toTypedArray().apply { - this[1] = (NPUtils.monthList.indexOf(this[1].toUpperCase(Locale.ROOT)) + 1).toString().padStart(2, '0') - } - }.joinToString("-").let { NPUtils.convertDateStringToEpoch(it) } - nc_owner_id = chInfo.getString("nc_owner_id").toInt() - nc_data_file = chInfo.getString("nc_data_file").let { - if (it.isNullOrBlank()) { - legacy_data_file = true - if (nc_chapter_no - nc_chapter_no.toInt() == 0f) - nc_chapter_no.toInt().toString() - else - nc_chapter_no.toString() - } else { - it + chList.add( + ChapterInfo().apply { + nc_chapter_id = chInfo.getString("nc_chapter_id").toInt() + nc_chapter_no = chInfo.getString("nc_chapter_no").toFloat() + nc_chapter_name = chInfo.getString("nc_chapter_name") + nc_provider = chInfo.getString("nc_provider") + nc_created_date = chInfo.getString("nc_created_date").let { + it.split("-").toTypedArray().apply { + this[1] = (NPUtils.monthList.indexOf(this[1].toUpperCase(Locale.ROOT)) + 1).toString().padStart(2, '0') + } + }.joinToString("-").let { NPUtils.convertDateStringToEpoch(it) } + nc_owner_id = chInfo.getString("nc_owner_id").toInt() + nc_data_file = chInfo.getString("nc_data_file").let { + if (it.isNullOrBlank()) { + legacy_data_file = true + if (nc_chapter_no - nc_chapter_no.toInt() == 0f) + nc_chapter_no.toInt().toString() + else + nc_chapter_no.toString() + } else { + it + } } } - }) + ) } chList @@ -233,11 +235,13 @@ class Nekopost : ParsedHttpSource() { val cateInfo = cateListData.getJSONObject(cateIndex) if (cateInfo.getString("project_id") != "null") { - cateList.add(ProjectCate().apply { - npc_id = cateInfo.getString("npc_id").toInt() - npc_name = cateInfo.getString("npc_name") - npc_name_link = cateInfo.getString("npc_name_link") - }) + cateList.add( + ProjectCate().apply { + npc_id = cateInfo.getString("npc_id").toInt() + npc_name = cateInfo.getString("npc_name") + npc_name_link = cateInfo.getString("npc_name_link") + } + ) } } @@ -303,7 +307,8 @@ class Nekopost : ParsedHttpSource() { true } else false }, - mangaList) + mangaList + ) val hasNextPage = mangaList.isNotEmpty() @@ -334,21 +339,29 @@ class Nekopost : ParsedHttpSource() { if (ch.legacy_data_file) { JSONArray(URL("${legacyChapterDataUrl}${pj.info.np_project_id}/${ch.nc_data_file}").readText()).getJSONArray(3).let { pageItem -> for (pageIndex in 0 until pageItem.length()) { - pageList.add(pageItem.getJSONObject(pageIndex).let { pageData -> - Page(pageData.getString("page_no").toInt() - 1, - "", - "${ch.getChapterJsonFolder()}${pageData.getString("value_url")}") - }) + pageList.add( + pageItem.getJSONObject(pageIndex).let { pageData -> + Page( + pageData.getString("page_no").toInt() - 1, + "", + "${ch.getChapterJsonFolder()}${pageData.getString("value_url")}" + ) + } + ) } } } else { JSONObject(URL("${ch.getChapterJsonFolder()}${ch.nc_data_file}").readText()).getJSONArray("pageItem").let { pageItem -> for (pageIndex in 0 until pageItem.length()) { - pageList.add(pageItem.getJSONObject(pageIndex).let { pageData -> - Page(pageData.getInt("pageNo") - 1, - "", - "${ch.getChapterJsonFolder()}${pageData.getString("fileName")}") - }) + pageList.add( + pageItem.getJSONObject(pageIndex).let { pageData -> + Page( + pageData.getInt("pageNo") - 1, + "", + "${ch.getChapterJsonFolder()}${pageData.getString("fileName")}" + ) + } + ) } } } @@ -390,7 +403,8 @@ class Nekopost : ParsedHttpSource() { true } else false }, - mangaList) + mangaList + ) val hasNextPage = mangaList.isNotEmpty() diff --git a/src/tr/MangaDenizi/src/eu/kanade/tachiyomi/extension/tr/mangadenizi/MangaDenizi.kt b/src/tr/MangaDenizi/src/eu/kanade/tachiyomi/extension/tr/mangadenizi/MangaDenizi.kt index cea5b4531..30921d97b 100644 --- a/src/tr/MangaDenizi/src/eu/kanade/tachiyomi/extension/tr/mangadenizi/MangaDenizi.kt +++ b/src/tr/MangaDenizi/src/eu/kanade/tachiyomi/extension/tr/mangadenizi/MangaDenizi.kt @@ -8,12 +8,12 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Response import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MangaDenizi : ParsedHttpSource() { override val name = "MangaDenizi" diff --git a/src/tr/serimanga/src/eu/kanade/tachiyomi/extension/tr/serimanga/SeriManga.kt b/src/tr/serimanga/src/eu/kanade/tachiyomi/extension/tr/serimanga/SeriManga.kt index 09aa65cec..2178fcd1a 100644 --- a/src/tr/serimanga/src/eu/kanade/tachiyomi/extension/tr/serimanga/SeriManga.kt +++ b/src/tr/serimanga/src/eu/kanade/tachiyomi/extension/tr/serimanga/SeriManga.kt @@ -7,12 +7,12 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class SeriManga : ParsedHttpSource() { override val name = "SeriManga" @@ -105,7 +105,7 @@ class SeriManga : ParsedHttpSource() { override fun chapterFromElement(element: Element) = SChapter.create().apply { setUrlWithoutDomain(element.select("a").attr("href")) name = "${element.select("span").first().text()}: ${element.select("span")[1].text()}" - date_upload = dateFormat.parse(element.select("span")[2].ownText()).time ?: 0 + date_upload = dateFormat.parse(element.select("span")[2].ownText())?.time ?: 0 } companion object { diff --git a/src/vi/academyvn/src/eu/kanade/tachiyomi/extension/vi/academyvn/HocVienTruyenTranh.kt b/src/vi/academyvn/src/eu/kanade/tachiyomi/extension/vi/academyvn/HocVienTruyenTranh.kt index 1de89956f..9d2fc63bf 100644 --- a/src/vi/academyvn/src/eu/kanade/tachiyomi/extension/vi/academyvn/HocVienTruyenTranh.kt +++ b/src/vi/academyvn/src/eu/kanade/tachiyomi/extension/vi/academyvn/HocVienTruyenTranh.kt @@ -7,13 +7,13 @@ 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 java.util.Calendar import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.Calendar class HocVienTruyenTranh : ParsedHttpSource() { diff --git a/src/vi/blogtruyen/src/eu/kanade/tachiyomi/extension/vi/blogtruyen/BlogTruyen.kt b/src/vi/blogtruyen/src/eu/kanade/tachiyomi/extension/vi/blogtruyen/BlogTruyen.kt index d5654e3bf..eaab85117 100644 --- a/src/vi/blogtruyen/src/eu/kanade/tachiyomi/extension/vi/blogtruyen/BlogTruyen.kt +++ b/src/vi/blogtruyen/src/eu/kanade/tachiyomi/extension/vi/blogtruyen/BlogTruyen.kt @@ -9,8 +9,6 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient @@ -18,6 +16,8 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class BlogTruyen : ParsedHttpSource() { @@ -181,67 +181,67 @@ class BlogTruyen : ParsedHttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Thể loại", genres) override fun getFilterList() = FilterList( - Status(), - GenreList(getGenreList()), - Author() + Status(), + GenreList(getGenreList()), + Author() ) private fun getGenreList() = listOf( - Genre("16+", 54), - Genre("18+", 45), - Genre("Action", 1), - Genre("Adult", 2), - Genre("Adventure", 3), - Genre("Anime", 4), - Genre("Comedy", 5), - Genre("Comic", 6), - Genre("Doujinshi", 7), - Genre("Drama", 49), - Genre("Ecchi", 48), - Genre("Even BT", 60), - Genre("Fantasy", 50), - Genre("Game", 61), - Genre("Gender Bender", 51), - Genre("Harem", 12), - Genre("Historical", 13), - Genre("Horror", 14), - Genre("Isekai/Dị Giới", 63), - Genre("Josei", 15), - Genre("Live Action", 16), - Genre("Magic", 46), - Genre("Manga", 55), - Genre("Manhua", 17), - Genre("Manhwa", 18), - Genre("Martial Arts", 19), - Genre("Mature", 20), - Genre("Mecha", 21), - Genre("Mystery", 22), - Genre("Nấu ăn", 56), - Genre("NTR", 62), - Genre("One shot", 23), - Genre("Psychological", 24), - Genre("Romance", 25), - Genre("School Life", 26), - Genre("Sci-fi", 27), - Genre("Seinen", 28), - Genre("Shoujo", 29), - Genre("Shoujo Ai", 30), - Genre("Shounen", 31), - Genre("Shounen Ai", 32), - Genre("Slice of Life", 33), - Genre("Smut", 34), - Genre("Soft Yaoi", 35), - Genre("Soft Yuri", 36), - Genre("Sports", 37), - Genre("Supernatural", 38), - Genre("Tạp chí truyện tranh", 39), - Genre("Tragedy", 40), - Genre("Trap", 58), - Genre("Trinh thám", 57), - Genre("Truyện scan", 41), - Genre("Video clip", 53), - Genre("VnComic", 42), - Genre("Webtoon", 52), - Genre("Yuri", 59) + Genre("16+", 54), + Genre("18+", 45), + Genre("Action", 1), + Genre("Adult", 2), + Genre("Adventure", 3), + Genre("Anime", 4), + Genre("Comedy", 5), + Genre("Comic", 6), + Genre("Doujinshi", 7), + Genre("Drama", 49), + Genre("Ecchi", 48), + Genre("Even BT", 60), + Genre("Fantasy", 50), + Genre("Game", 61), + Genre("Gender Bender", 51), + Genre("Harem", 12), + Genre("Historical", 13), + Genre("Horror", 14), + Genre("Isekai/Dị Giới", 63), + Genre("Josei", 15), + Genre("Live Action", 16), + Genre("Magic", 46), + Genre("Manga", 55), + Genre("Manhua", 17), + Genre("Manhwa", 18), + Genre("Martial Arts", 19), + Genre("Mature", 20), + Genre("Mecha", 21), + Genre("Mystery", 22), + Genre("Nấu ăn", 56), + Genre("NTR", 62), + Genre("One shot", 23), + Genre("Psychological", 24), + Genre("Romance", 25), + Genre("School Life", 26), + Genre("Sci-fi", 27), + Genre("Seinen", 28), + Genre("Shoujo", 29), + Genre("Shoujo Ai", 30), + Genre("Shounen", 31), + Genre("Shounen Ai", 32), + Genre("Slice of Life", 33), + Genre("Smut", 34), + Genre("Soft Yaoi", 35), + Genre("Soft Yuri", 36), + Genre("Sports", 37), + Genre("Supernatural", 38), + Genre("Tạp chí truyện tranh", 39), + Genre("Tragedy", 40), + Genre("Trap", 58), + Genre("Trinh thám", 57), + Genre("Truyện scan", 41), + Genre("Video clip", 53), + Genre("VnComic", 42), + Genre("Webtoon", 52), + Genre("Yuri", 59) ) } diff --git a/src/vi/hentaivn/src/eu/kanade/tachiyomi/extension/vi/hentaivn/HentaiVN.kt b/src/vi/hentaivn/src/eu/kanade/tachiyomi/extension/vi/hentaivn/HentaiVN.kt index 3bfb1b7d4..005153f0e 100644 --- a/src/vi/hentaivn/src/eu/kanade/tachiyomi/extension/vi/hentaivn/HentaiVN.kt +++ b/src/vi/hentaivn/src/eu/kanade/tachiyomi/extension/vi/hentaivn/HentaiVN.kt @@ -8,15 +8,15 @@ 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 java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale @Nsfw class HentaiVN : ParsedHttpSource() { @@ -42,7 +42,7 @@ class HentaiVN : ParsedHttpSource() { private fun parseDate(dateString: String): Long { return try { - dateFormat.parse(dateString).time + dateFormat.parse(dateString)?.time ?: 0L } catch (e: ParseException) { return 0L } @@ -124,7 +124,8 @@ class HentaiVN : ParsedHttpSource() { (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> when (filter) { is TextField -> url.addQueryParameter(filter.key, filter.state) - is GenreList -> filter.state + is GenreList -> + filter.state .filter { it.state } .map { it.id } .forEach { url.addQueryParameter("tag[]", it) } @@ -151,216 +152,216 @@ class HentaiVN : ParsedHttpSource() { private class GroupList(groups: Array<TransGroup>) : Filter.Select<TransGroup>("Nhóm dịch", groups) override fun getFilterList() = FilterList( - TextField("Doujinshi", "dou"), - TextField("Nhân vật", "char"), - GenreList(getGenreList()), - GroupList(getGroupList()) + TextField("Doujinshi", "dou"), + TextField("Nhân vật", "char"), + GenreList(getGenreList()), + GroupList(getGroupList()) ) // jQuery.makeArray($('#container > div > div > div.box-box.textbox > form > ul:nth-child(7) > li').map((i, e) => `Genre("${e.textContent}", "${e.children[0].value}")`)).join(',\n') // https://hentaivn.net/forum/search-plus.php private fun getGenreList() = listOf( - Genre("3D Hentai", "3"), - Genre("Action", "5"), - Genre("Adult", "116"), - Genre("Adventure", "203"), - Genre("Ahegao", "20"), - Genre("Anal", "21"), - Genre("Angel", "249"), - Genre("Ảnh động", "131"), - Genre("Animal", "127"), - Genre("Animal girl", "22"), - Genre("Artist", "115"), - Genre("BBW", "251"), - Genre("BDSM", "24"), - Genre("Bestiality", "25"), - Genre("Big Ass", "133"), - Genre("Big Boobs", "23"), - Genre("Big Penis", "32"), - Genre("Bloomers", "27"), - Genre("BlowJobs", "28"), - Genre("Body Swap", "29"), - Genre("Bodysuit", "30"), - Genre("Bondage", "254"), - Genre("Breast Sucking", "33"), - Genre("BreastJobs", "248"), - Genre("Brocon", "31"), - Genre("Brother", "242"), - Genre("Business Suit", "241"), - Genre("Catgirls", "39"), - Genre("Che ít", "101"), - Genre("Che nhiều", "129"), - Genre("Cheating", "34"), - Genre("Chikan", "35"), - Genre("Có che", "100"), - Genre("Comedy", "36"), - Genre("Comic", "120"), - Genre("Condom", "210"), - Genre("Cosplay", "38"), - Genre("Cousin", "2"), - Genre("Dark Skin", "40"), - Genre("Demon", "132"), - Genre("DemonGirl", "212"), - Genre("Devil", "104"), - Genre("DevilGirl", "105"), - Genre("Dirty", "253"), - Genre("Dirty Old Man", "41"), - Genre("Double Penetration", "42"), - Genre("Doujinshi", "44"), - Genre("Drama", "4"), - Genre("Drug", "43"), - Genre("Ecchi", "45"), - Genre("Elder Sister", "245"), - Genre("Elf", "125"), - Genre("Exhibitionism", "46"), - Genre("Fantasy", "123"), - Genre("Father", "243"), - Genre("Femdom", "47"), - Genre("Fingering", "48"), - Genre("Footjob", "108"), - Genre("Full Color", "37"), - Genre("Furry", "202"), - Genre("Futanari", "50"), - Genre("Game", "130"), - Genre("GangBang", "51"), - Genre("Garter Belts", "206"), - Genre("Gender Bender", "52"), - Genre("Ghost", "106"), - Genre("Glasses", "56"), - Genre("Group", "53"), - Genre("Guro", "55"), - Genre("Hairy", "247"), - Genre("Handjob", "57"), - Genre("Harem", "58"), - Genre("HentaiVN", "102"), - Genre("Historical", "80"), - Genre("Horror", "122"), - Genre("Housewife", "59"), - Genre("Humiliation", "60"), - Genre("Idol", "61"), - Genre("Imouto", "244"), - Genre("Incest", "62"), - Genre("Insect (Côn Trùng)", "26"), - Genre("Không che", "99"), - Genre("Kimono", "110"), - Genre("Loli", "63"), - Genre("Maids", "64"), - Genre("Manhwa", "114"), - Genre("Mature", "119"), - Genre("Miko", "124"), - Genre("Milf", "126"), - Genre("Mind Break", "121"), - Genre("Mind Control", "113"), - Genre("Monster", "66"), - Genre("Monstergirl", "67"), - Genre("Mother", "103"), - Genre("Nakadashi", "205"), - Genre("Netori", "1"), - Genre("Non-hen", "201"), - Genre("NTR", "68"), - Genre("Nurse", "69"), - Genre("Old Man", "211"), - Genre("Oneshot", "71"), - Genre("Oral", "70"), - Genre("Osananajimi", "209"), - Genre("Paizuri", "72"), - Genre("Pantyhose", "204"), - Genre("Pregnant", "73"), - Genre("Rape", "98"), - Genre("Romance", "117"), - Genre("Ryona", "207"), - Genre("Scat", "134"), - Genre("School Uniform", "74"), - Genre("SchoolGirl", "75"), - Genre("Series", "87"), - Genre("Sex Toys", "88"), - Genre("Shimapan", "246"), - Genre("Short Hentai", "118"), - Genre("Shota", "77"), - Genre("Shoujo", "76"), - Genre("Siscon", "79"), - Genre("Sister", "78"), - Genre("Slave", "82"), - Genre("Sleeping", "213"), - Genre("Small Boobs", "84"), - Genre("Sports", "83"), - Genre("Stockings", "81"), - Genre("Supernatural", "85"), - Genre("Sweating", "250"), - Genre("Swimsuit", "86"), - Genre("Teacher", "91"), - Genre("Tentacles", "89"), - Genre("Time Stop", "109"), - Genre("Tomboy", "90"), - Genre("Tracksuit", "252"), - Genre("Transformation", "256"), - Genre("Trap", "92"), - Genre("Tsundere", "111"), - Genre("Tự sướng", "65"), - Genre("Twins", "93"), - Genre("Vampire", "107"), - Genre("Vanilla", "208"), - Genre("Virgin", "95"), - Genre("X-ray", "94"), - Genre("Yandere", "112"), - Genre("Yaoi", "96"), - Genre("Yuri", "97"), - Genre("Zombie", "128") + Genre("3D Hentai", "3"), + Genre("Action", "5"), + Genre("Adult", "116"), + Genre("Adventure", "203"), + Genre("Ahegao", "20"), + Genre("Anal", "21"), + Genre("Angel", "249"), + Genre("Ảnh động", "131"), + Genre("Animal", "127"), + Genre("Animal girl", "22"), + Genre("Artist", "115"), + Genre("BBW", "251"), + Genre("BDSM", "24"), + Genre("Bestiality", "25"), + Genre("Big Ass", "133"), + Genre("Big Boobs", "23"), + Genre("Big Penis", "32"), + Genre("Bloomers", "27"), + Genre("BlowJobs", "28"), + Genre("Body Swap", "29"), + Genre("Bodysuit", "30"), + Genre("Bondage", "254"), + Genre("Breast Sucking", "33"), + Genre("BreastJobs", "248"), + Genre("Brocon", "31"), + Genre("Brother", "242"), + Genre("Business Suit", "241"), + Genre("Catgirls", "39"), + Genre("Che ít", "101"), + Genre("Che nhiều", "129"), + Genre("Cheating", "34"), + Genre("Chikan", "35"), + Genre("Có che", "100"), + Genre("Comedy", "36"), + Genre("Comic", "120"), + Genre("Condom", "210"), + Genre("Cosplay", "38"), + Genre("Cousin", "2"), + Genre("Dark Skin", "40"), + Genre("Demon", "132"), + Genre("DemonGirl", "212"), + Genre("Devil", "104"), + Genre("DevilGirl", "105"), + Genre("Dirty", "253"), + Genre("Dirty Old Man", "41"), + Genre("Double Penetration", "42"), + Genre("Doujinshi", "44"), + Genre("Drama", "4"), + Genre("Drug", "43"), + Genre("Ecchi", "45"), + Genre("Elder Sister", "245"), + Genre("Elf", "125"), + Genre("Exhibitionism", "46"), + Genre("Fantasy", "123"), + Genre("Father", "243"), + Genre("Femdom", "47"), + Genre("Fingering", "48"), + Genre("Footjob", "108"), + Genre("Full Color", "37"), + Genre("Furry", "202"), + Genre("Futanari", "50"), + Genre("Game", "130"), + Genre("GangBang", "51"), + Genre("Garter Belts", "206"), + Genre("Gender Bender", "52"), + Genre("Ghost", "106"), + Genre("Glasses", "56"), + Genre("Group", "53"), + Genre("Guro", "55"), + Genre("Hairy", "247"), + Genre("Handjob", "57"), + Genre("Harem", "58"), + Genre("HentaiVN", "102"), + Genre("Historical", "80"), + Genre("Horror", "122"), + Genre("Housewife", "59"), + Genre("Humiliation", "60"), + Genre("Idol", "61"), + Genre("Imouto", "244"), + Genre("Incest", "62"), + Genre("Insect (Côn Trùng)", "26"), + Genre("Không che", "99"), + Genre("Kimono", "110"), + Genre("Loli", "63"), + Genre("Maids", "64"), + Genre("Manhwa", "114"), + Genre("Mature", "119"), + Genre("Miko", "124"), + Genre("Milf", "126"), + Genre("Mind Break", "121"), + Genre("Mind Control", "113"), + Genre("Monster", "66"), + Genre("Monstergirl", "67"), + Genre("Mother", "103"), + Genre("Nakadashi", "205"), + Genre("Netori", "1"), + Genre("Non-hen", "201"), + Genre("NTR", "68"), + Genre("Nurse", "69"), + Genre("Old Man", "211"), + Genre("Oneshot", "71"), + Genre("Oral", "70"), + Genre("Osananajimi", "209"), + Genre("Paizuri", "72"), + Genre("Pantyhose", "204"), + Genre("Pregnant", "73"), + Genre("Rape", "98"), + Genre("Romance", "117"), + Genre("Ryona", "207"), + Genre("Scat", "134"), + Genre("School Uniform", "74"), + Genre("SchoolGirl", "75"), + Genre("Series", "87"), + Genre("Sex Toys", "88"), + Genre("Shimapan", "246"), + Genre("Short Hentai", "118"), + Genre("Shota", "77"), + Genre("Shoujo", "76"), + Genre("Siscon", "79"), + Genre("Sister", "78"), + Genre("Slave", "82"), + Genre("Sleeping", "213"), + Genre("Small Boobs", "84"), + Genre("Sports", "83"), + Genre("Stockings", "81"), + Genre("Supernatural", "85"), + Genre("Sweating", "250"), + Genre("Swimsuit", "86"), + Genre("Teacher", "91"), + Genre("Tentacles", "89"), + Genre("Time Stop", "109"), + Genre("Tomboy", "90"), + Genre("Tracksuit", "252"), + Genre("Transformation", "256"), + Genre("Trap", "92"), + Genre("Tsundere", "111"), + Genre("Tự sướng", "65"), + Genre("Twins", "93"), + Genre("Vampire", "107"), + Genre("Vanilla", "208"), + Genre("Virgin", "95"), + Genre("X-ray", "94"), + Genre("Yandere", "112"), + Genre("Yaoi", "96"), + Genre("Yuri", "97"), + Genre("Zombie", "128") ) // jQuery.makeArray($('#container > div > div > div.box-box.textbox > form > ul:nth-child(8) > li').map((i, e) => `TransGroup("${e.textContent}", "${e.children[0].value}")`)).join(',\n') // https://hentaivn.net/forum/search-plus.php private fun getGroupList() = arrayOf( - TransGroup("Tất cả", "0"), - TransGroup("Đang cập nhật", "1"), - TransGroup("Góc Hentai", "3"), - TransGroup("Hakihome", "4"), - TransGroup("LXERS", "5"), - TransGroup("Hentai-Homies", "6"), - TransGroup("BUZPLANET", "7"), - TransGroup("Trang Sally", "8"), - TransGroup("Loli Rules The World", "9"), - TransGroup("XXX Inc", "10"), - TransGroup("Kobato9x", "11"), - TransGroup("Blazing Soul", "12"), - TransGroup("TAYXUONG", "13"), - TransGroup("[S]ky [G]arden [G]roup", "14"), - TransGroup("Bloomer-kun", "15"), - TransGroup("DHT", "16"), - TransGroup("TruyenHen18", "17"), - TransGroup("iHentaiManga", "18"), - TransGroup("Quân cảng Kancolle X", "19"), - TransGroup("LHMANGA", "20"), - TransGroup("Ship of The Dream", "21"), - TransGroup("Fallen Angels", "22"), - TransGroup("TruyenHentai2H", "23"), - TransGroup("Lạc Thiên", "24"), - TransGroup("69HENTAIXXX", "25"), - TransGroup("DHL", "26"), - TransGroup("Hentai-AdutsManga", "27"), - TransGroup("Hatsu Kaze Desu Translator Team", "28"), - TransGroup("IHentai69", "29"), - TransGroup("Zest", "30"), - TransGroup("Demon Victory Team", "31"), - TransGroup("NTR Victory Team", "32"), - TransGroup("Rori Saikou", "33"), - TransGroup("Bullet Burn Team", "34"), - TransGroup("RE Team", "35"), - TransGroup("Rebelliones", "36"), - TransGroup("Shinto", "37"), - TransGroup("Sexual Paradise", "38"), - TransGroup("FA Dislike Team", "39"), - TransGroup("Triggered Team", "41"), - TransGroup("T.K Translation Team", "42"), - TransGroup("Mabu MG", "43"), - TransGroup("Team Zentsu", "44"), - TransGroup("Sweeter Than Salt", "46"), - TransGroup("Cà rà cà rà Cặt", "47"), - TransGroup("Paradise Of The Happiness", "48"), - TransGroup("Furry Break the 4th Wall", "49"), - TransGroup("The Ignite Team", "50"), - TransGroup("Cuồng Loli", "51"), - TransGroup("Depressed Lolicons Squad - DLS", "52"), - TransGroup("Heaven Of The Fuck", "53") + TransGroup("Tất cả", "0"), + TransGroup("Đang cập nhật", "1"), + TransGroup("Góc Hentai", "3"), + TransGroup("Hakihome", "4"), + TransGroup("LXERS", "5"), + TransGroup("Hentai-Homies", "6"), + TransGroup("BUZPLANET", "7"), + TransGroup("Trang Sally", "8"), + TransGroup("Loli Rules The World", "9"), + TransGroup("XXX Inc", "10"), + TransGroup("Kobato9x", "11"), + TransGroup("Blazing Soul", "12"), + TransGroup("TAYXUONG", "13"), + TransGroup("[S]ky [G]arden [G]roup", "14"), + TransGroup("Bloomer-kun", "15"), + TransGroup("DHT", "16"), + TransGroup("TruyenHen18", "17"), + TransGroup("iHentaiManga", "18"), + TransGroup("Quân cảng Kancolle X", "19"), + TransGroup("LHMANGA", "20"), + TransGroup("Ship of The Dream", "21"), + TransGroup("Fallen Angels", "22"), + TransGroup("TruyenHentai2H", "23"), + TransGroup("Lạc Thiên", "24"), + TransGroup("69HENTAIXXX", "25"), + TransGroup("DHL", "26"), + TransGroup("Hentai-AdutsManga", "27"), + TransGroup("Hatsu Kaze Desu Translator Team", "28"), + TransGroup("IHentai69", "29"), + TransGroup("Zest", "30"), + TransGroup("Demon Victory Team", "31"), + TransGroup("NTR Victory Team", "32"), + TransGroup("Rori Saikou", "33"), + TransGroup("Bullet Burn Team", "34"), + TransGroup("RE Team", "35"), + TransGroup("Rebelliones", "36"), + TransGroup("Shinto", "37"), + TransGroup("Sexual Paradise", "38"), + TransGroup("FA Dislike Team", "39"), + TransGroup("Triggered Team", "41"), + TransGroup("T.K Translation Team", "42"), + TransGroup("Mabu MG", "43"), + TransGroup("Team Zentsu", "44"), + TransGroup("Sweeter Than Salt", "46"), + TransGroup("Cà rà cà rà Cặt", "47"), + TransGroup("Paradise Of The Happiness", "48"), + TransGroup("Furry Break the 4th Wall", "49"), + TransGroup("The Ignite Team", "50"), + TransGroup("Cuồng Loli", "51"), + TransGroup("Depressed Lolicons Squad - DLS", "52"), + TransGroup("Heaven Of The Fuck", "53") ) } diff --git a/src/vi/iutruyentranh/src/eu/kanade/tachiyomi/extension/vi/iutruyentranh/IuTruyenTranh.kt b/src/vi/iutruyentranh/src/eu/kanade/tachiyomi/extension/vi/iutruyentranh/IuTruyenTranh.kt index 0f831e701..19ac7c5eb 100644 --- a/src/vi/iutruyentranh/src/eu/kanade/tachiyomi/extension/vi/iutruyentranh/IuTruyenTranh.kt +++ b/src/vi/iutruyentranh/src/eu/kanade/tachiyomi/extension/vi/iutruyentranh/IuTruyenTranh.kt @@ -8,14 +8,14 @@ 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 java.lang.UnsupportedOperationException -import java.text.SimpleDateFormat -import java.util.Locale import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.lang.UnsupportedOperationException +import java.text.SimpleDateFormat +import java.util.Locale class IuTruyenTranh : ParsedHttpSource() { @@ -116,7 +116,7 @@ class IuTruyenTranh : ParsedHttpSource() { chapter.setUrlWithoutDomain(urlElement.attr("href") + "&load=all") chapter.name = urlElement.select("b").text() chapter.date_upload = element.select("td:eq(1)").first()?.text()?.let { - SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).parse(it).time + SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).parse(it)?.time ?: 0L } ?: 0 return chapter } @@ -134,64 +134,64 @@ class IuTruyenTranh : ParsedHttpSource() { private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Thể loại", genres) override fun getFilterList() = FilterList( - Author(), - GenreList(getGenreList()) + Author(), + GenreList(getGenreList()) ) private fun getGenreList() = listOf( - Genre("Action"), - Genre("Adult"), - Genre("Adventure"), - Genre("Anime"), - Genre("Bishounen"), - Genre("Comedy"), - Genre("Cookin"), - Genre("Demons"), - Genre("Doujinshi"), - Genre("Drama"), - Genre("Ecchi"), - Genre("Fantasy"), - Genre("Gender Bender"), - Genre("Harem"), - Genre("Hentai"), - Genre("Historical"), - Genre("Horror"), - Genre("Josei"), - Genre("Live action"), - Genre("Magic"), - Genre("Manhua"), - Genre("Manhwa"), - Genre("Martial Arts"), - Genre("Mature"), - Genre("Mecha"), - Genre("Medical"), - Genre("Military"), - Genre("Mystery"), - Genre("One shot"), - Genre("Oneshot"), - Genre("Other"), - Genre("Psychological"), - Genre("Romance"), - Genre("School Life"), - Genre("Sci fi"), - Genre("Seinen"), - Genre("Shotacon"), - Genre("Shoujo"), - Genre("Shoujo Ai"), - Genre("Shoujoai"), - Genre("Shounen"), - Genre("Shounen Ai"), - Genre("Shounenai"), - Genre("Slice of Life"), - Genre("Smut"), - Genre("Sports"), - Genre("Super power"), - Genre("Superma"), - Genre("Supernatural"), - Genre("Tragedy"), - Genre("Vampire"), - Genre("Webtoon"), - Genre("Yaoi"), - Genre("Yuri") + Genre("Action"), + Genre("Adult"), + Genre("Adventure"), + Genre("Anime"), + Genre("Bishounen"), + Genre("Comedy"), + Genre("Cookin"), + Genre("Demons"), + Genre("Doujinshi"), + Genre("Drama"), + Genre("Ecchi"), + Genre("Fantasy"), + Genre("Gender Bender"), + Genre("Harem"), + Genre("Hentai"), + Genre("Historical"), + Genre("Horror"), + Genre("Josei"), + Genre("Live action"), + Genre("Magic"), + Genre("Manhua"), + Genre("Manhwa"), + Genre("Martial Arts"), + Genre("Mature"), + Genre("Mecha"), + Genre("Medical"), + Genre("Military"), + Genre("Mystery"), + Genre("One shot"), + Genre("Oneshot"), + Genre("Other"), + Genre("Psychological"), + Genre("Romance"), + Genre("School Life"), + Genre("Sci fi"), + Genre("Seinen"), + Genre("Shotacon"), + Genre("Shoujo"), + Genre("Shoujo Ai"), + Genre("Shoujoai"), + Genre("Shounen"), + Genre("Shounen Ai"), + Genre("Shounenai"), + Genre("Slice of Life"), + Genre("Smut"), + Genre("Sports"), + Genre("Super power"), + Genre("Superma"), + Genre("Supernatural"), + Genre("Tragedy"), + Genre("Vampire"), + Genre("Webtoon"), + Genre("Yaoi"), + Genre("Yuri") ) } diff --git a/src/vi/medoctruyentranh/src/eu/kanade/tachiyomi/extension/vi/medoctruyentranh/MeDocTruyenTranh.kt b/src/vi/medoctruyentranh/src/eu/kanade/tachiyomi/extension/vi/medoctruyentranh/MeDocTruyenTranh.kt index fb88b8837..f99de28cf 100644 --- a/src/vi/medoctruyentranh/src/eu/kanade/tachiyomi/extension/vi/medoctruyentranh/MeDocTruyenTranh.kt +++ b/src/vi/medoctruyentranh/src/eu/kanade/tachiyomi/extension/vi/medoctruyentranh/MeDocTruyenTranh.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Request import okhttp3.Response import org.json.JSONArray import org.json.JSONObject import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class MeDocTruyenTranh : ParsedHttpSource() { @@ -101,11 +101,11 @@ class MeDocTruyenTranh : ParsedHttpSource() { val manga = SManga.create() val jsonData = JSONObject(document.select("#__NEXT_DATA__").first()!!.data()) val mangaDetail = jsonData - .getJSONObject("props") - .getJSONObject("pageProps") - .getJSONObject("initialState") - .getJSONObject("detail") - .getJSONObject("story_item") + .getJSONObject("props") + .getJSONObject("pageProps") + .getJSONObject("initialState") + .getJSONObject("detail") + .getJSONObject("story_item") manga.title = mangaDetail.getString("title") manga.author = mangaDetail.getJSONArray("author_list").getString(0) val genres = mutableListOf<String>() @@ -148,9 +148,10 @@ class MeDocTruyenTranh : ParsedHttpSource() { private fun parseChapterDate(date: String): Long { // 2019-05-09T07:09:58 val dateFormat = SimpleDateFormat( - "yyyy-MM-dd'T'HH:mm:ss", Locale.US) - val dateObject = dateFormat.parse(date) - return dateObject.time + "yyyy-MM-dd'T'HH:mm:ss", + Locale.US + ) + return dateFormat.parse(date)?.time ?: 0L } override fun pageListParse(document: Document): List<Page> { diff --git a/src/vi/ngonphong/src/eu/kanade/tachiyomi/extension/vi/ngonphong/NgonPhong.kt b/src/vi/ngonphong/src/eu/kanade/tachiyomi/extension/vi/ngonphong/NgonPhong.kt index f500ca960..c9777068d 100644 --- a/src/vi/ngonphong/src/eu/kanade/tachiyomi/extension/vi/ngonphong/NgonPhong.kt +++ b/src/vi/ngonphong/src/eu/kanade/tachiyomi/extension/vi/ngonphong/NgonPhong.kt @@ -6,13 +6,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class NgonPhong : ParsedHttpSource() { @@ -117,7 +117,7 @@ class NgonPhong : ParsedHttpSource() { private fun String.toChapterDate(): Long { return try { - SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).parse(this).time + SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).parse(this)?.time ?: 0L } catch (_: Exception) { 0L } diff --git a/src/vi/truyenqq/src/eu/kanade/tachiyomi/extension/vi/truyenqq/TruyenQQ.kt b/src/vi/truyenqq/src/eu/kanade/tachiyomi/extension/vi/truyenqq/TruyenQQ.kt index d115c7d66..33c1ba88b 100644 --- a/src/vi/truyenqq/src/eu/kanade/tachiyomi/extension/vi/truyenqq/TruyenQQ.kt +++ b/src/vi/truyenqq/src/eu/kanade/tachiyomi/extension/vi/truyenqq/TruyenQQ.kt @@ -7,14 +7,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class TruyenQQ : ParsedHttpSource() { override val name: String = "TruyenQQ" @@ -91,14 +91,15 @@ class TruyenQQ : ParsedHttpSource() { chapter_number = name.substringAfter("Chương").trim().toFloat() } private fun parseDate(date: String): Long { - return SimpleDateFormat("dd/MM/yyyy", Locale.US).parse(date).time + return SimpleDateFormat("dd/MM/yyyy", Locale.US).parse(date)?.time ?: 0L } // Pages override fun pageListParse(document: Document): List<Page> = mutableListOf<Page>().apply { document.select("img.lazy").forEachIndexed { index, element -> - add(Page(index, "", element.attr("abs:src"))) } + add(Page(index, "", element.attr("abs:src"))) + } } override fun imageUrlParse(document: Document): String { throw Exception("Not Used") diff --git a/src/vi/truyentranhlh/src/eu/kanade/tachiyomi/extension/vi/truyentranhlh/TruyenTranhLH.kt b/src/vi/truyentranhlh/src/eu/kanade/tachiyomi/extension/vi/truyentranhlh/TruyenTranhLH.kt index ecba9ca0a..0da71c8b3 100644 --- a/src/vi/truyentranhlh/src/eu/kanade/tachiyomi/extension/vi/truyentranhlh/TruyenTranhLH.kt +++ b/src/vi/truyentranhlh/src/eu/kanade/tachiyomi/extension/vi/truyentranhlh/TruyenTranhLH.kt @@ -6,14 +6,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class TruyenTranhLH : ParsedHttpSource() { @@ -108,7 +108,7 @@ class TruyenTranhLH : ParsedHttpSource() { setUrlWithoutDomain(element.attr("href")) name = element.select("div.chapter-name").text() date_upload = element.select("div.chapter-time").firstOrNull()?.text() - ?.let { SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).parse(it).time } ?: 0 + ?.let { SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).parse(it)?.time ?: 0L } ?: 0 } } diff --git a/src/zh/bainianmanga/src/eu/kanade/tachiyomi/extension/zh/bainianmanga/BainianManga.kt b/src/zh/bainianmanga/src/eu/kanade/tachiyomi/extension/zh/bainianmanga/BainianManga.kt index 769a962a1..b1b64b283 100755 --- a/src/zh/bainianmanga/src/eu/kanade/tachiyomi/extension/zh/bainianmanga/BainianManga.kt +++ b/src/zh/bainianmanga/src/eu/kanade/tachiyomi/extension/zh/bainianmanga/BainianManga.kt @@ -43,7 +43,7 @@ class BainianManga : ParsedHttpSource() { override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector() override fun headersBuilder() = super.headersBuilder() - .add("Referer", baseUrl) + .add("Referer", baseUrl) override fun popularMangaFromElement(element: Element) = mangaFromElement(element) override fun latestUpdatesFromElement(element: Element) = mangaFromElement(element) @@ -103,10 +103,10 @@ class BainianManga : ParsedHttpSource() { private class GenreFilter(genres: Array<String>) : Filter.Select<String>("Genre", genres) override fun getFilterList() = FilterList( - GenreFilter(getGenreList()) + GenreFilter(getGenreList()) ) private fun getGenreList() = arrayOf( - "All" + "All" ) } diff --git a/src/zh/bh3/src/eu/kanade/tachiyomi/extension/zh/bh3/BH3.kt b/src/zh/bh3/src/eu/kanade/tachiyomi/extension/zh/bh3/BH3.kt index 8afdc6d3c..a4a2dd688 100644 --- a/src/zh/bh3/src/eu/kanade/tachiyomi/extension/zh/bh3/BH3.kt +++ b/src/zh/bh3/src/eu/kanade/tachiyomi/extension/zh/bh3/BH3.kt @@ -13,13 +13,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit class BH3 : ParsedHttpSource() { @@ -83,7 +83,7 @@ class BH3 : ParsedHttpSource() { } private fun parseDate(date: String): Long { - return SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).parse(date).time + return SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).parse(date)?.time ?: 0L } override fun mangaDetailsParse(document: Document): SManga { diff --git a/src/zh/comico/src/eu/kanade/tachiyomi/extension/zh/comico/Comico.kt b/src/zh/comico/src/eu/kanade/tachiyomi/extension/zh/comico/Comico.kt index 14aed3a9f..a45aed9e2 100644 --- a/src/zh/comico/src/eu/kanade/tachiyomi/extension/zh/comico/Comico.kt +++ b/src/zh/comico/src/eu/kanade/tachiyomi/extension/zh/comico/Comico.kt @@ -12,14 +12,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale abstract class Comico( override val name: String, @@ -143,7 +143,7 @@ abstract class Comico( } private fun parseDate(date: String): Long { - return SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).parse(date).time + return SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).parse(date)?.time ?: 0L } override fun pageListParse(document: Document): List<Page> { @@ -156,7 +156,7 @@ abstract class Comico( document.select("script:containsData(imageData)").first().data().let { if (it.isNotEmpty()) { it.substringAfter("imageData:[").substringBefore("]").trim().split(",") - .forEach { img -> pages.add(Page(pages.size, "", img.replace("\'", ""))) } + .forEach { img -> pages.add(Page(pages.size, "", img.replace("\'", ""))) } } } diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt index 90ca7668b..1d5def8d3 100644 --- a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt @@ -9,12 +9,12 @@ 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 java.net.URLEncoder -import java.util.ArrayList import okhttp3.Request import okhttp3.Response import org.json.JSONArray import org.json.JSONObject +import java.net.URLEncoder +import java.util.ArrayList /** * Dmzj source @@ -31,14 +31,16 @@ class Dmzj : HttpSource() { else url private fun myGet(url: String) = GET(url) - .newBuilder() - .header("User-Agent", - "Mozilla/5.0 (X11; Linux x86_64) " + - "AppleWebKit/537.36 (KHTML, like Gecko) " + - "Chrome/56.0.2924.87 " + - "Safari/537.36 " + - "Tachiyomi/1.0") - .build()!! + .newBuilder() + .header( + "User-Agent", + "Mozilla/5.0 (X11; Linux x86_64) " + + "AppleWebKit/537.36 (KHTML, like Gecko) " + + "Chrome/56.0.2924.87 " + + "Safari/537.36 " + + "Tachiyomi/1.0" + ) + .build()!! // for simple searches (query only, no filters) private fun simpleSearchJsonParse(json: String): MangasPage { @@ -47,12 +49,14 @@ class Dmzj : HttpSource() { for (i in 0 until arr.length()) { val obj = arr.getJSONObject(i) val cid = obj.getString("id") - ret.add(SManga.create().apply { - title = obj.getString("comic_name") - thumbnail_url = cleanUrl(obj.getString("comic_cover")) - author = obj.optString("comic_author") - url = "/comic/comic_$cid.json?version=2.7.019" - }) + ret.add( + SManga.create().apply { + title = obj.getString("comic_name") + thumbnail_url = cleanUrl(obj.getString("comic_cover")) + author = obj.optString("comic_author") + url = "/comic/comic_$cid.json?version=2.7.019" + } + ) } return MangasPage(ret, false) } @@ -64,17 +68,19 @@ class Dmzj : HttpSource() { for (i in 0 until arr.length()) { val obj = arr.getJSONObject(i) val cid = obj.getString("id") - ret.add(SManga.create().apply { - title = obj.getString("title") - thumbnail_url = obj.getString("cover") - author = obj.optString("authors") - status = when (obj.getString("status")) { - "已完结" -> SManga.COMPLETED - "连载中" -> SManga.ONGOING - else -> SManga.UNKNOWN + ret.add( + SManga.create().apply { + title = obj.getString("title") + thumbnail_url = obj.getString("cover") + author = obj.optString("authors") + status = when (obj.getString("status")) { + "已完结" -> SManga.COMPLETED + "连载中" -> SManga.ONGOING + else -> SManga.UNKNOWN + } + url = "/comic/comic_$cid.json?version=2.7.019" } - url = "/comic/comic_$cid.json?version=2.7.019" - }) + ) } return MangasPage(ret, arr.length() != 0) } @@ -157,11 +163,13 @@ class Dmzj : HttpSource() { val prefix = obj2.getString("title") for (j in 0 until arr2.length()) { val chapter = arr2.getJSONObject(j) - ret.add(SChapter.create().apply { - name = "$prefix: ${chapter.getString("chapter_title")}" - date_upload = chapter.getString("updatetime").toLong() * 1000 // milliseconds - url = "https://api.m.dmzj.com/comic/chapter/$cid/${chapter.getString("chapter_id")}.html" - }) + ret.add( + SChapter.create().apply { + name = "$prefix: ${chapter.getString("chapter_title")}" + date_upload = chapter.getString("updatetime").toLong() * 1000 // milliseconds + url = "https://api.m.dmzj.com/comic/chapter/$cid/${chapter.getString("chapter_id")}.html" + } + ) } } return ret @@ -202,17 +210,19 @@ class Dmzj : HttpSource() { // Unused, we can get image urls directly from the chapter page override fun imageUrlParse(response: Response) = - throw UnsupportedOperationException("This method should not be called!") + throw UnsupportedOperationException("This method should not be called!") override fun getFilterList() = FilterList( - SortFilter(), - GenreGroup(), - StatusFilter(), - TypeFilter(), - ReaderFilter() + SortFilter(), + GenreGroup(), + StatusFilter(), + TypeFilter(), + ReaderFilter() ) - private class GenreGroup : UriPartFilter("分类", arrayOf( + private class GenreGroup : UriPartFilter( + "分类", + arrayOf( Pair("全部", ""), Pair("冒险", "4"), Pair("百合", "3243"), @@ -255,15 +265,21 @@ class Dmzj : HttpSource() { Pair("西方魔幻", "3365"), Pair("音乐舞蹈", "3326"), Pair("机战", "3325") - )) + ) + ) - private class StatusFilter : UriPartFilter("连载状态", arrayOf( + private class StatusFilter : UriPartFilter( + "连载状态", + arrayOf( Pair("全部", ""), Pair("连载", "2309"), Pair("完结", "2310") - )) + ) + ) - private class TypeFilter : UriPartFilter("地区", arrayOf( + private class TypeFilter : UriPartFilter( + "地区", + arrayOf( Pair("全部", ""), Pair("日本", "2304"), Pair("韩国", "2305"), @@ -271,30 +287,37 @@ class Dmzj : HttpSource() { Pair("港台", "2307"), Pair("内地", "2308"), Pair("其他", "8453") - )) + ) + ) - private class SortFilter : UriPartFilter("排序", arrayOf( + private class SortFilter : UriPartFilter( + "排序", + arrayOf( Pair("人气", "0"), Pair("更新", "1") - )) + ) + ) - private class ReaderFilter : UriPartFilter("读者", arrayOf( + private class ReaderFilter : UriPartFilter( + "读者", + arrayOf( Pair("全部", ""), Pair("少年", "3262"), Pair("少女", "3263"), Pair("青年", "3264") - )) + ) + ) // Headers override fun headersBuilder() = - super.headersBuilder().add("Referer", "http://www.dmzj.com/")!! + super.headersBuilder().add("Referer", "http://www.dmzj.com/")!! private open class UriPartFilter( displayName: String, val vals: Array<Pair<String, String>>, defaultValue: Int = 0 ) : - Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray(), defaultValue) { + Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray(), defaultValue) { open fun toUriPart() = vals[state].second } } diff --git a/src/zh/gufengmh/src/eu/kanade/tachiyomi/extension/zh/gufengmh/Gufengmh.kt b/src/zh/gufengmh/src/eu/kanade/tachiyomi/extension/zh/gufengmh/Gufengmh.kt index 45e694e3a..ca376be19 100644 --- a/src/zh/gufengmh/src/eu/kanade/tachiyomi/extension/zh/gufengmh/Gufengmh.kt +++ b/src/zh/gufengmh/src/eu/kanade/tachiyomi/extension/zh/gufengmh/Gufengmh.kt @@ -122,266 +122,286 @@ class Gufengmh : ParsedHttpSource() { ) } - private class typefilter : UriSelectFilterPath("按类型", "filtertype", arrayOf( - Pair("", "全部"), - Pair("shaonian", "少年漫画"), - Pair("shaonv", "少女漫画"), - Pair("qingnian", "青年漫画"), - Pair("zhenrenmanhua", "真人漫画") - )) + private class typefilter : UriSelectFilterPath( + "按类型", + "filtertype", + arrayOf( + Pair("", "全部"), + Pair("shaonian", "少年漫画"), + Pair("shaonv", "少女漫画"), + Pair("qingnian", "青年漫画"), + Pair("zhenrenmanhua", "真人漫画") + ) + ) - private class regionfilter : UriSelectFilterPath("按地区", "filterregion", arrayOf( - Pair("", "全部"), - Pair("ribenmanhua", "日本漫画"), - Pair("guochanmanhua", "国产漫画"), - Pair("gangtaimanhua", "港台漫画"), - Pair("oumeimanhua", "欧美漫画"), - Pair("hanguomanhua", "韩国漫画") - )) + private class regionfilter : UriSelectFilterPath( + "按地区", + "filterregion", + arrayOf( + Pair("", "全部"), + Pair("ribenmanhua", "日本漫画"), + Pair("guochanmanhua", "国产漫画"), + Pair("gangtaimanhua", "港台漫画"), + Pair("oumeimanhua", "欧美漫画"), + Pair("hanguomanhua", "韩国漫画") + ) + ) - private class genrefilter : UriSelectFilterPath("按剧情", "filtergenre", arrayOf( - Pair("", "全部"), - Pair("maoxian", "冒险"), - Pair("mofa", "魔法"), - Pair("kehuan", "科幻"), - Pair("kongbu", "恐怖"), - Pair("lishi", "历史"), - Pair("jingji", "竞技"), - Pair("huanlexiang", "欢乐向"), - Pair("xifangmohuan", "西方魔幻"), - Pair("aiqing", "爱情"), - Pair("xuanyi", "悬疑"), - Pair("qihuan", "奇幻"), - Pair("qingxiaoshuo", "轻小说"), - Pair("sige", "四格"), - Pair("shengui", "神鬼"), - Pair("zhiyu", "治愈"), - Pair("xiaoyuan", "校园"), - Pair("weiniang", "伪娘"), - Pair("danmei", "耽美"), - Pair("hougong", "后宫"), - Pair("mohuan", "魔幻"), - Pair("wuxia", "武侠"), - Pair("zhichang", "职场"), - Pair("zhentan", "侦探"), - Pair("meishi", "美食"), - Pair("gedou", "格斗"), - Pair("lizhi", "励志"), - Pair("yinyuewudao", "音乐舞蹈"), - Pair("rexue", "热血"), - Pair("zhanzheng", "战争"), - Pair("gaoxiao", "搞笑"), - Pair("shenghuo", "生活"), - Pair("baihe", "百合"), - Pair("mengji", "萌系"), - Pair("jiecao", "节操"), - Pair("xingzhuanhuan", "性转换"), - Pair("yanyi", "颜艺"), - Pair("gufeng", "古风"), - Pair("xianxia", "仙侠"), - Pair("zhaiji", "宅系"), - Pair("juqing", "剧情"), - Pair("shenmo", "神魔"), - Pair("xuanhuan", "玄幻"), - Pair("chuanyue", "穿越"), - Pair("qita", "其他"), - Pair("huanxiang", "幻想"), - Pair("motong", "墨瞳"), - Pair("maimeng", "麦萌"), - Pair("manman", "漫漫"), - Pair("manhuadao", "漫画岛"), - Pair("tuili", "推理"), - Pair("dongfang", "东方"), - Pair("kuaikan", "快看"), - Pair("jizhan", "机战"), - Pair("gaoqingdanxing", "高清单行"), - Pair("xinzuo", "新作"), - Pair("tougao", "投稿"), - Pair("richang", "日常"), - Pair("shougong", "手工"), - Pair("yundong", "运动"), - Pair("weimei", "唯美"), - Pair("dushi", "都市"), - Pair("jingxian", "惊险"), - Pair("jiangshi", "僵尸"), - Pair("lianai", "恋爱"), - Pair("nuexin", "虐心"), - Pair("chunai", "纯爱"), - Pair("fuchou", "复仇"), - Pair("dongzuo", "动作"), - Pair("qita2", "其它"), - Pair("egao", "恶搞"), - Pair("mingxing", "明星"), - Pair("zhenhan", "震撼"), - Pair("anhei", "暗黑"), - Pair("naodong", "脑洞"), - Pair("xuexing", "血腥"), - Pair("youyaoqi", "有妖气"), - Pair("jijia", "机甲"), - Pair("qingchun", "青春"), - Pair("lingyi", "灵异"), - Pair("tongren", "同人"), - Pair("langman", "浪漫"), - Pair("quanmou", "权谋"), - Pair("shehui", "社会"), - Pair("gongdou", "宫斗"), - Pair("baoxiao", "爆笑"), - Pair("tiyu", "体育"), - Pair("lanmu", "栏目"), - Pair("caihong", "彩虹"), - Pair("zhentantuili", "侦探推理"), - Pair("shaonuaiqing", "少女爱情"), - Pair("gaoxiaoxiju", "搞笑喜剧"), - Pair("kongbulingyi", "恐怖灵异"), - Pair("kehuanmohuan", "科幻魔幻"), - Pair("jingjitiyu", "竞技体育"), - Pair("wuxiagedou", "武侠格斗"), - Pair("jianniang", "舰娘"), - Pair("danmeiBL", "耽美BL"), - Pair("xiee", "邪恶"), - Pair("zongheqita", "综合其它"), - Pair("qingnian", "青年"), - Pair("zhainan", "宅男"), - Pair("zazhi", "杂志"), - Pair("yinyue", "音乐"), - Pair("quancai", "全彩"), - Pair("heidao", "黑道"), - Pair("lianaidanmei", "恋爱耽美"), - Pair("rexuemaoxian", "热血冒险"), - Pair("funv", "腐女"), - Pair("gushi", "故事"), - Pair("shaonv", "少女"), - Pair("zongcai", "总裁"), - Pair("baoxiaoxiju", "爆笑喜剧"), - Pair("qitamanhua", "其他漫画"), - Pair("lianaishenghuo", "恋爱生活"), - Pair("kongbuxuanyi", "恐怖悬疑"), - Pair("danmeirensheng", "耽美人生"), - Pair("chongwu", "宠物"), - Pair("zhandou", "战斗"), - Pair("zhaohuanshou", "召唤兽"), - Pair("yineng", "异能"), - Pair("zhuangbi", "装逼"), - Pair("yishijie", "异世界"), - Pair("zhengju", "正剧"), - Pair("wenxin", "温馨"), - Pair("jingqi", "惊奇"), - Pair("jiakong", "架空"), - Pair("qingsong", "轻松"), - Pair("weilai", "未来"), - Pair("keji", "科技"), - Pair("shaonao", "烧脑"), - Pair("gaoxiaoegao", "搞笑恶搞"), - Pair("mhuaquan", "mhuaquan"), - Pair("shaonian", "少年"), - Pair("sigeduoge", "四格多格"), - Pair("bazong", "霸总"), - Pair("xiuzhen", "修真"), - Pair("gushimanhua", "故事漫画"), - Pair("huiben", "绘本"), - Pair("youxi", "游戏"), - Pair("zhenren", "真人"), - Pair("jingsong", "惊悚"), - Pair("manhua", "漫画"), - Pair("weizhongquan", "微众圈"), - Pair("yujie", "御姐"), - Pair("xiaoshuogaibian", "小说改编"), - Pair("luoli", "萝莉"), - Pair("1024manhua", "1024manhua"), - Pair("jiating", "家庭"), - Pair("shenhua", "神话"), - Pair("shishi", "史诗"), - Pair("moshi", "末世"), - Pair("yulequan", "娱乐圈"), - Pair("gandong", "感动"), - Pair("lunli", "伦理"), - Pair("zazhiquanben", "杂志全本"), - Pair("zhiyu2", "致郁"), - Pair("shangzhan", "商战"), - Pair("zhupu", "主仆"), - Pair("manhuaquan", "漫画圈"), - Pair("lianaijuqingmanhua", "恋爱、剧情漫画"), - Pair("hunai", "婚爱"), - Pair("haomen", "豪门"), - Pair("neihan", "内涵"), - Pair("xingzhuan", "性转"), - Pair("xiangcun", "乡村"), - Pair("gongting", "宫廷"), - Pair("duanzi", "段子"), - Pair("chunaimanhua", "纯爱漫画"), - Pair("nixi", "逆袭"), - Pair("hunyin", "婚姻"), - Pair("baihenvxing", "百合女性"), - Pair("shenghuomanhua", "生活漫画"), - Pair("ertong", "儿童"), - Pair("wudao", "舞蹈"), - Pair("tianchong", "甜宠"), - Pair("wengai", "文改"), - Pair("dujia", "独家"), - Pair("biaoqian", "标签"), - Pair("zhaifumanhua", "宅腐漫画"), - Pair("qinggan", "情感"), - Pair("mingkatong", "茗卡通"), - Pair("jiujie", "纠结"), - Pair("lianaimaoxiangaoxiao", "恋爱冒险搞笑"), - Pair("xiuzhenlianaijiakong", "修真恋爱架空"), - Pair("lianaigaoxiaohougong", "恋爱搞笑后宫"), - Pair("xuanyikongbu", "悬疑恐怖"), - Pair("lianaixiaoyuanshenghuo", "恋爱校园生活"), - Pair("xiuzhenlianaigufeng", "修真恋爱古风"), - Pair("shenghuoxuanyilingyi", "生活悬疑灵异"), - Pair("qingnianmanhua", "青年漫画"), - Pair("lishimanhua", "历史漫画"), - Pair("meishaonv", "美少女"), - Pair("shuangliu", "爽流"), - Pair("qiangwei", "蔷薇"), - Pair("gaozhishang", "高智商"), - Pair("xuanyituili", "悬疑推理"), - Pair("jizhi", "机智"), - Pair("donghua", "动画"), - Pair("rexuedongzuo", "热血动作"), - Pair("xiuji", "秀吉"), - Pair("AA", "AA"), - Pair("gaibian", "改编"), - Pair("juwei", "橘味") - )) + private class genrefilter : UriSelectFilterPath( + "按剧情", + "filtergenre", + arrayOf( + Pair("", "全部"), + Pair("maoxian", "冒险"), + Pair("mofa", "魔法"), + Pair("kehuan", "科幻"), + Pair("kongbu", "恐怖"), + Pair("lishi", "历史"), + Pair("jingji", "竞技"), + Pair("huanlexiang", "欢乐向"), + Pair("xifangmohuan", "西方魔幻"), + Pair("aiqing", "爱情"), + Pair("xuanyi", "悬疑"), + Pair("qihuan", "奇幻"), + Pair("qingxiaoshuo", "轻小说"), + Pair("sige", "四格"), + Pair("shengui", "神鬼"), + Pair("zhiyu", "治愈"), + Pair("xiaoyuan", "校园"), + Pair("weiniang", "伪娘"), + Pair("danmei", "耽美"), + Pair("hougong", "后宫"), + Pair("mohuan", "魔幻"), + Pair("wuxia", "武侠"), + Pair("zhichang", "职场"), + Pair("zhentan", "侦探"), + Pair("meishi", "美食"), + Pair("gedou", "格斗"), + Pair("lizhi", "励志"), + Pair("yinyuewudao", "音乐舞蹈"), + Pair("rexue", "热血"), + Pair("zhanzheng", "战争"), + Pair("gaoxiao", "搞笑"), + Pair("shenghuo", "生活"), + Pair("baihe", "百合"), + Pair("mengji", "萌系"), + Pair("jiecao", "节操"), + Pair("xingzhuanhuan", "性转换"), + Pair("yanyi", "颜艺"), + Pair("gufeng", "古风"), + Pair("xianxia", "仙侠"), + Pair("zhaiji", "宅系"), + Pair("juqing", "剧情"), + Pair("shenmo", "神魔"), + Pair("xuanhuan", "玄幻"), + Pair("chuanyue", "穿越"), + Pair("qita", "其他"), + Pair("huanxiang", "幻想"), + Pair("motong", "墨瞳"), + Pair("maimeng", "麦萌"), + Pair("manman", "漫漫"), + Pair("manhuadao", "漫画岛"), + Pair("tuili", "推理"), + Pair("dongfang", "东方"), + Pair("kuaikan", "快看"), + Pair("jizhan", "机战"), + Pair("gaoqingdanxing", "高清单行"), + Pair("xinzuo", "新作"), + Pair("tougao", "投稿"), + Pair("richang", "日常"), + Pair("shougong", "手工"), + Pair("yundong", "运动"), + Pair("weimei", "唯美"), + Pair("dushi", "都市"), + Pair("jingxian", "惊险"), + Pair("jiangshi", "僵尸"), + Pair("lianai", "恋爱"), + Pair("nuexin", "虐心"), + Pair("chunai", "纯爱"), + Pair("fuchou", "复仇"), + Pair("dongzuo", "动作"), + Pair("qita2", "其它"), + Pair("egao", "恶搞"), + Pair("mingxing", "明星"), + Pair("zhenhan", "震撼"), + Pair("anhei", "暗黑"), + Pair("naodong", "脑洞"), + Pair("xuexing", "血腥"), + Pair("youyaoqi", "有妖气"), + Pair("jijia", "机甲"), + Pair("qingchun", "青春"), + Pair("lingyi", "灵异"), + Pair("tongren", "同人"), + Pair("langman", "浪漫"), + Pair("quanmou", "权谋"), + Pair("shehui", "社会"), + Pair("gongdou", "宫斗"), + Pair("baoxiao", "爆笑"), + Pair("tiyu", "体育"), + Pair("lanmu", "栏目"), + Pair("caihong", "彩虹"), + Pair("zhentantuili", "侦探推理"), + Pair("shaonuaiqing", "少女爱情"), + Pair("gaoxiaoxiju", "搞笑喜剧"), + Pair("kongbulingyi", "恐怖灵异"), + Pair("kehuanmohuan", "科幻魔幻"), + Pair("jingjitiyu", "竞技体育"), + Pair("wuxiagedou", "武侠格斗"), + Pair("jianniang", "舰娘"), + Pair("danmeiBL", "耽美BL"), + Pair("xiee", "邪恶"), + Pair("zongheqita", "综合其它"), + Pair("qingnian", "青年"), + Pair("zhainan", "宅男"), + Pair("zazhi", "杂志"), + Pair("yinyue", "音乐"), + Pair("quancai", "全彩"), + Pair("heidao", "黑道"), + Pair("lianaidanmei", "恋爱耽美"), + Pair("rexuemaoxian", "热血冒险"), + Pair("funv", "腐女"), + Pair("gushi", "故事"), + Pair("shaonv", "少女"), + Pair("zongcai", "总裁"), + Pair("baoxiaoxiju", "爆笑喜剧"), + Pair("qitamanhua", "其他漫画"), + Pair("lianaishenghuo", "恋爱生活"), + Pair("kongbuxuanyi", "恐怖悬疑"), + Pair("danmeirensheng", "耽美人生"), + Pair("chongwu", "宠物"), + Pair("zhandou", "战斗"), + Pair("zhaohuanshou", "召唤兽"), + Pair("yineng", "异能"), + Pair("zhuangbi", "装逼"), + Pair("yishijie", "异世界"), + Pair("zhengju", "正剧"), + Pair("wenxin", "温馨"), + Pair("jingqi", "惊奇"), + Pair("jiakong", "架空"), + Pair("qingsong", "轻松"), + Pair("weilai", "未来"), + Pair("keji", "科技"), + Pair("shaonao", "烧脑"), + Pair("gaoxiaoegao", "搞笑恶搞"), + Pair("mhuaquan", "mhuaquan"), + Pair("shaonian", "少年"), + Pair("sigeduoge", "四格多格"), + Pair("bazong", "霸总"), + Pair("xiuzhen", "修真"), + Pair("gushimanhua", "故事漫画"), + Pair("huiben", "绘本"), + Pair("youxi", "游戏"), + Pair("zhenren", "真人"), + Pair("jingsong", "惊悚"), + Pair("manhua", "漫画"), + Pair("weizhongquan", "微众圈"), + Pair("yujie", "御姐"), + Pair("xiaoshuogaibian", "小说改编"), + Pair("luoli", "萝莉"), + Pair("1024manhua", "1024manhua"), + Pair("jiating", "家庭"), + Pair("shenhua", "神话"), + Pair("shishi", "史诗"), + Pair("moshi", "末世"), + Pair("yulequan", "娱乐圈"), + Pair("gandong", "感动"), + Pair("lunli", "伦理"), + Pair("zazhiquanben", "杂志全本"), + Pair("zhiyu2", "致郁"), + Pair("shangzhan", "商战"), + Pair("zhupu", "主仆"), + Pair("manhuaquan", "漫画圈"), + Pair("lianaijuqingmanhua", "恋爱、剧情漫画"), + Pair("hunai", "婚爱"), + Pair("haomen", "豪门"), + Pair("neihan", "内涵"), + Pair("xingzhuan", "性转"), + Pair("xiangcun", "乡村"), + Pair("gongting", "宫廷"), + Pair("duanzi", "段子"), + Pair("chunaimanhua", "纯爱漫画"), + Pair("nixi", "逆袭"), + Pair("hunyin", "婚姻"), + Pair("baihenvxing", "百合女性"), + Pair("shenghuomanhua", "生活漫画"), + Pair("ertong", "儿童"), + Pair("wudao", "舞蹈"), + Pair("tianchong", "甜宠"), + Pair("wengai", "文改"), + Pair("dujia", "独家"), + Pair("biaoqian", "标签"), + Pair("zhaifumanhua", "宅腐漫画"), + Pair("qinggan", "情感"), + Pair("mingkatong", "茗卡通"), + Pair("jiujie", "纠结"), + Pair("lianaimaoxiangaoxiao", "恋爱冒险搞笑"), + Pair("xiuzhenlianaijiakong", "修真恋爱架空"), + Pair("lianaigaoxiaohougong", "恋爱搞笑后宫"), + Pair("xuanyikongbu", "悬疑恐怖"), + Pair("lianaixiaoyuanshenghuo", "恋爱校园生活"), + Pair("xiuzhenlianaigufeng", "修真恋爱古风"), + Pair("shenghuoxuanyilingyi", "生活悬疑灵异"), + Pair("qingnianmanhua", "青年漫画"), + Pair("lishimanhua", "历史漫画"), + Pair("meishaonv", "美少女"), + Pair("shuangliu", "爽流"), + Pair("qiangwei", "蔷薇"), + Pair("gaozhishang", "高智商"), + Pair("xuanyituili", "悬疑推理"), + Pair("jizhi", "机智"), + Pair("donghua", "动画"), + Pair("rexuedongzuo", "热血动作"), + Pair("xiuji", "秀吉"), + Pair("AA", "AA"), + Pair("gaibian", "改编"), + Pair("juwei", "橘味") + ) + ) - private class letterfilter : UriSelectFilterPath("按字母", "filterletter", arrayOf( - Pair("", "全部"), - Pair("a", "A"), - Pair("b", "B"), - Pair("c", "C"), - Pair("d", "D"), - Pair("e", "E"), - Pair("f", "F"), - Pair("g", "G"), - Pair("h", "H"), - Pair("i", "I"), - Pair("j", "J"), - Pair("k", "K"), - Pair("l", "L"), - Pair("m", "M"), - Pair("n", "N"), - Pair("o", "O"), - Pair("p", "P"), - Pair("q", "Q"), - Pair("r", "R"), - Pair("s", "S"), - Pair("t", "T"), - Pair("u", "U"), - Pair("v", "V"), - Pair("w", "W"), - Pair("x", "X"), - Pair("y", "Y"), - Pair("z", "Z"), - Pair("1", "其他") - )) + private class letterfilter : UriSelectFilterPath( + "按字母", + "filterletter", + arrayOf( + Pair("", "全部"), + Pair("a", "A"), + Pair("b", "B"), + Pair("c", "C"), + Pair("d", "D"), + Pair("e", "E"), + Pair("f", "F"), + Pair("g", "G"), + Pair("h", "H"), + Pair("i", "I"), + Pair("j", "J"), + Pair("k", "K"), + Pair("l", "L"), + Pair("m", "M"), + Pair("n", "N"), + Pair("o", "O"), + Pair("p", "P"), + Pair("q", "Q"), + Pair("r", "R"), + Pair("s", "S"), + Pair("t", "T"), + Pair("u", "U"), + Pair("v", "V"), + Pair("w", "W"), + Pair("x", "X"), + Pair("y", "Y"), + Pair("z", "Z"), + Pair("1", "其他") + ) + ) - private class statusfilter : UriSelectFilterPath("按进度", "filterstatus", arrayOf( - Pair("", "全部"), - Pair("wanjie", "已完结"), - Pair("lianzai", "连载中") - )) + private class statusfilter : UriSelectFilterPath( + "按进度", + "filterstatus", + arrayOf( + Pair("", "全部"), + Pair("wanjie", "已完结"), + Pair("lianzai", "连载中") + ) + ) /** * Class that creates a select filter. Each entry in the dropdown has a name and a display name. diff --git a/src/zh/jinmantiantang/src/eu/kanade/tachiyomi/extension/zh/jinmantiantang/Jinmantiantang.kt b/src/zh/jinmantiantang/src/eu/kanade/tachiyomi/extension/zh/jinmantiantang/Jinmantiantang.kt index 838110973..bf9b0bf45 100644 --- a/src/zh/jinmantiantang/src/eu/kanade/tachiyomi/extension/zh/jinmantiantang/Jinmantiantang.kt +++ b/src/zh/jinmantiantang/src/eu/kanade/tachiyomi/extension/zh/jinmantiantang/Jinmantiantang.kt @@ -9,14 +9,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.select.Elements +import java.text.SimpleDateFormat +import java.util.Locale @Nsfw class Jinmantiantang : ParsedHttpSource() { @@ -207,86 +207,95 @@ class Jinmantiantang : ParsedHttpSource() { TimeFilter() ) - private class CategoryGroup : UriPartFilter("按类型", arrayOf( - Pair("全部", "/albums?"), - Pair("其他", "/albums/another?"), - Pair("同人", "/albums/doujin?"), - Pair("韩漫", "/albums/hanman?"), - Pair("美漫", "/albums/meiman?"), - Pair("短篇", "/albums/short?"), - Pair("单本", "/albums/single?"), + private class CategoryGroup : UriPartFilter( + "按类型", + arrayOf( + Pair("全部", "/albums?"), + Pair("其他", "/albums/another?"), + Pair("同人", "/albums/doujin?"), + Pair("韩漫", "/albums/hanman?"), + Pair("美漫", "/albums/meiman?"), + Pair("短篇", "/albums/short?"), + Pair("单本", "/albums/single?"), - Pair("中文", "/search/photos?search_query=中文&"), - Pair("汉化", "/search/photos?search_query=漢化&"), - Pair("P站", "/search/photos?search_query=PIXIV&"), - Pair("图集", "/search/photos?search_query=CG&"), + Pair("中文", "/search/photos?search_query=中文&"), + Pair("汉化", "/search/photos?search_query=漢化&"), + Pair("P站", "/search/photos?search_query=PIXIV&"), + Pair("图集", "/search/photos?search_query=CG&"), - Pair("剧情", "/search/photos?search_query=劇情&"), - Pair("校园", "/search/photos?search_query=校園&"), - Pair("纯爱", "/search/photos?search_query=純愛&"), - Pair("人妻", "/search/photos?search_query=人妻&"), - Pair("师生", "/search/photos?search_query=師生&"), - Pair("近亲", "/search/photos?search_query=近親&"), - Pair("百合", "/search/photos?search_query=百合&"), - Pair("男同", "/search/photos?search_query=YAOI&"), - Pair("性转换", "/search/photos?search_query=性轉換&"), - Pair("NTR", "/search/photos?search_query=NTR&"), - Pair("伪娘", "/search/photos?search_query=偽娘&"), - Pair("痴女", "/search/photos?search_query=癡女&"), - Pair("全彩", "/search/photos?search_query=全彩&"), + Pair("剧情", "/search/photos?search_query=劇情&"), + Pair("校园", "/search/photos?search_query=校園&"), + Pair("纯爱", "/search/photos?search_query=純愛&"), + Pair("人妻", "/search/photos?search_query=人妻&"), + Pair("师生", "/search/photos?search_query=師生&"), + Pair("近亲", "/search/photos?search_query=近親&"), + Pair("百合", "/search/photos?search_query=百合&"), + Pair("男同", "/search/photos?search_query=YAOI&"), + Pair("性转换", "/search/photos?search_query=性轉換&"), + Pair("NTR", "/search/photos?search_query=NTR&"), + Pair("伪娘", "/search/photos?search_query=偽娘&"), + Pair("痴女", "/search/photos?search_query=癡女&"), + Pair("全彩", "/search/photos?search_query=全彩&"), - Pair("萝莉", "/search/photos?search_query=蘿莉&"), - Pair("御姐", "/search/photos?search_query=御姐&"), - Pair("熟女", "/search/photos?search_query=熟女&"), - Pair("正太", "/search/photos?search_query=正太&"), - Pair("巨乳", "/search/photos?search_query=巨乳&"), - Pair("贫乳", "/search/photos?search_query=貧乳&"), - Pair("女王", "/search/photos?search_query=女王&"), - Pair("教室", "/search/photos?search_query=教師&"), - Pair("女仆", "/search/photos?search_query=女僕&"), - Pair("护士", "/search/photos?search_query=護士&"), - Pair("泳裝", "/search/photos?search_query=泳裝&"), - Pair("眼镜", "/search/photos?search_query=眼鏡&"), - Pair("丝袜", "/search/photos?search_query=絲襪&"), - Pair("制服", "/search/photos?search_query=制服&"), + Pair("萝莉", "/search/photos?search_query=蘿莉&"), + Pair("御姐", "/search/photos?search_query=御姐&"), + Pair("熟女", "/search/photos?search_query=熟女&"), + Pair("正太", "/search/photos?search_query=正太&"), + Pair("巨乳", "/search/photos?search_query=巨乳&"), + Pair("贫乳", "/search/photos?search_query=貧乳&"), + Pair("女王", "/search/photos?search_query=女王&"), + Pair("教室", "/search/photos?search_query=教師&"), + Pair("女仆", "/search/photos?search_query=女僕&"), + Pair("护士", "/search/photos?search_query=護士&"), + Pair("泳裝", "/search/photos?search_query=泳裝&"), + Pair("眼镜", "/search/photos?search_query=眼鏡&"), + Pair("丝袜", "/search/photos?search_query=絲襪&"), + Pair("制服", "/search/photos?search_query=制服&"), - Pair("群交", "/search/photos?search_query=群交&"), - Pair("足交", "/search/photos?search_query=足交&"), - Pair("SM", "/search/photos?search_query=SM&"), - Pair("肛交", "/search/photos?search_query=肛交&"), - Pair("阿黑颜", "/search/photos?search_query=阿黑顏&"), - Pair("药物", "/search/photos?search_query=藥物&"), - Pair("扶他", "/search/photos?search_query=扶他&"), - Pair("调教", "/search/photos?search_query=調教&"), - Pair("野外", "/search/photos?search_query=野外&"), - Pair("露出", "/search/photos?search_query=露出&"), - Pair("催眠", "/search/photos?search_query=催眠&"), - Pair("自慰", "/search/photos?search_query=自慰&"), - Pair("触手", "/search/photos?search_query=觸手&"), - Pair("兽交", "/search/photos?search_query=獸交&"), - Pair("亚人", "/search/photos?search_query=亞人&"), - Pair("魔物", "/search/photos?search_query=魔物&"), + Pair("群交", "/search/photos?search_query=群交&"), + Pair("足交", "/search/photos?search_query=足交&"), + Pair("SM", "/search/photos?search_query=SM&"), + Pair("肛交", "/search/photos?search_query=肛交&"), + Pair("阿黑颜", "/search/photos?search_query=阿黑顏&"), + Pair("药物", "/search/photos?search_query=藥物&"), + Pair("扶他", "/search/photos?search_query=扶他&"), + Pair("调教", "/search/photos?search_query=調教&"), + Pair("野外", "/search/photos?search_query=野外&"), + Pair("露出", "/search/photos?search_query=露出&"), + Pair("催眠", "/search/photos?search_query=催眠&"), + Pair("自慰", "/search/photos?search_query=自慰&"), + Pair("触手", "/search/photos?search_query=觸手&"), + Pair("兽交", "/search/photos?search_query=獸交&"), + Pair("亚人", "/search/photos?search_query=亞人&"), + Pair("魔物", "/search/photos?search_query=魔物&"), - Pair("重口", "/search/photos?search_query=重口&"), - Pair("猎奇", "/search/photos?search_query=獵奇&"), - Pair("非H", "/search/photos?search_query=非H&"), - Pair("血腥", "/search/photos?search_query=血腥&"), - Pair("暴力", "/search/photos?search_query=暴力&") - )) + Pair("重口", "/search/photos?search_query=重口&"), + Pair("猎奇", "/search/photos?search_query=獵奇&"), + Pair("非H", "/search/photos?search_query=非H&"), + Pair("血腥", "/search/photos?search_query=血腥&"), + Pair("暴力", "/search/photos?search_query=暴力&") + ) + ) - private class SortFilter : UriPartFilter("排序", arrayOf( - Pair("最多订阅", "o=mv&"), - Pair("最新", "o=mr&"), - Pair("最多爱心", "o=tf&"), - Pair("最多图片", "o=mp&") - )) + private class SortFilter : UriPartFilter( + "排序", + arrayOf( + Pair("最多订阅", "o=mv&"), + Pair("最新", "o=mr&"), + Pair("最多爱心", "o=tf&"), + Pair("最多图片", "o=mp&") + ) + ) - private class TimeFilter : UriPartFilter("时间", arrayOf( - Pair("全部", "t=a"), - Pair("今天", "t=t"), - Pair("这周", "t=w"), - Pair("本月", "t=m") - )) + private class TimeFilter : UriPartFilter( + "时间", + arrayOf( + Pair("全部", "t=a"), + Pair("今天", "t=t"), + Pair("这周", "t=w"), + Pair("本月", "t=m") + ) + ) /** *创建选择过滤器的类。 下拉菜单中的每个条目都有一个名称和一个显示名称。 diff --git a/src/zh/kuaikanmanhua/src/eu/kanade/tachiyomi/extension/zh/kuaikanmanhua/Kuaikanmanhua.kt b/src/zh/kuaikanmanhua/src/eu/kanade/tachiyomi/extension/zh/kuaikanmanhua/Kuaikanmanhua.kt index 35d8c89a5..6b7bb4d1a 100644 --- a/src/zh/kuaikanmanhua/src/eu/kanade/tachiyomi/extension/zh/kuaikanmanhua/Kuaikanmanhua.kt +++ b/src/zh/kuaikanmanhua/src/eu/kanade/tachiyomi/extension/zh/kuaikanmanhua/Kuaikanmanhua.kt @@ -46,8 +46,10 @@ class Kuaikanmanhua : ParsedHttpSource() { private fun parseMangaDocument(document: Document): MangasPage { val mangas = mutableListOf<SManga>() - gson.fromJson<JsonArray>(document.select("script:containsData(datalist)").first().data() - .substringAfter("dataList:").substringBefore("}],error")) + gson.fromJson<JsonArray>( + document.select("script:containsData(datalist)").first().data() + .substringAfter("dataList:").substringBefore("}],error") + ) .forEach { mangas.add(mangaFromJson(it.asJsonObject)) } return MangasPage(mangas, document.select(popularMangaNextPageSelector()).isNotEmpty()) @@ -112,8 +114,10 @@ class Kuaikanmanhua : ParsedHttpSource() { document.select("script:containsData(resultList)").let { return if (it.isNotEmpty()) { // for search by query - gson.fromJson<JsonArray>(it.first().data() - .substringAfter("resultList:").substringBefore(",noResult")) + gson.fromJson<JsonArray>( + it.first().data() + .substringAfter("resultList:").substringBefore(",noResult") + ) .forEach { result -> mangas.add(searchMangaFromJson(result.asJsonObject)) } MangasPage(mangas, document.select(searchMangaNextPageSelector()).isNotEmpty()) } else { @@ -176,8 +180,10 @@ class Kuaikanmanhua : ParsedHttpSource() { override fun pageListParse(document: Document): List<Page> { val pages = mutableListOf<Page>() - gson.fromJson<JsonArray>(document.select("script:containsData(comicImages)").first().data() - .substringAfter("comicImages:").substringBefore("},nextComicInfo")) + gson.fromJson<JsonArray>( + document.select("script:containsData(comicImages)").first().data() + .substringAfter("comicImages:").substringBefore("},nextComicInfo") + ) .forEachIndexed { i, json -> pages.add(Page(i, "", json.asJsonObject["url"].asString)) } return pages @@ -193,35 +199,41 @@ class Kuaikanmanhua : ParsedHttpSource() { GenreFilter() ) - private class GenreFilter : UriPartFilter("题材", arrayOf( - Pair("全部", "0"), - Pair("恋爱", "20"), - Pair("古风", "46"), - Pair("校园", "47"), - Pair("奇幻", "22"), - Pair("大女主", "77"), - Pair("治愈", "27"), - Pair("总裁", "52"), - Pair("完结", "40"), - Pair("唯美", "58"), - Pair("日漫", "57"), - Pair("韩漫", "60"), - Pair("穿越", "80"), - Pair("正能量", "54"), - Pair("灵异", "32"), - Pair("爆笑", "24"), - Pair("都市", "48"), - Pair("萌系", "62"), - Pair("玄幻", "63"), - Pair("日常", "19"), - Pair("投稿", "76") - )) + private class GenreFilter : UriPartFilter( + "题材", + arrayOf( + Pair("全部", "0"), + Pair("恋爱", "20"), + Pair("古风", "46"), + Pair("校园", "47"), + Pair("奇幻", "22"), + Pair("大女主", "77"), + Pair("治愈", "27"), + Pair("总裁", "52"), + Pair("完结", "40"), + Pair("唯美", "58"), + Pair("日漫", "57"), + Pair("韩漫", "60"), + Pair("穿越", "80"), + Pair("正能量", "54"), + Pair("灵异", "32"), + Pair("爆笑", "24"), + Pair("都市", "48"), + Pair("萌系", "62"), + Pair("玄幻", "63"), + Pair("日常", "19"), + Pair("投稿", "76") + ) + ) - private class StatusFilter : UriPartFilter("类别", arrayOf( - Pair("全部", "1"), - Pair("连载中", "2"), - Pair("已完结", "3") - )) + private class StatusFilter : UriPartFilter( + "类别", + arrayOf( + Pair("全部", "1"), + Pair("连载中", "2"), + Pair("已完结", "3") + ) + ) private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) { diff --git a/src/zh/manhuadb/src/eu/kanade/tachiyomi/extension/zh/manhuadb/ManhuaDB.kt b/src/zh/manhuadb/src/eu/kanade/tachiyomi/extension/zh/manhuadb/ManhuaDB.kt index 93ef58d29..340f8cf7b 100644 --- a/src/zh/manhuadb/src/eu/kanade/tachiyomi/extension/zh/manhuadb/ManhuaDB.kt +++ b/src/zh/manhuadb/src/eu/kanade/tachiyomi/extension/zh/manhuadb/ManhuaDB.kt @@ -6,12 +6,12 @@ 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 java.util.regex.Pattern import okhttp3.Headers import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.util.regex.Pattern class ManhuaDB : ParsedHttpSource() { @@ -70,11 +70,11 @@ class ManhuaDB : ParsedHttpSource() { val pageStr = document.select("ol.breadcrumb > li:eq(2)").text() val pageNumMatcher = Pattern.compile("共\\s*(\\d+)").matcher(pageStr) if (pageNumMatcher.find()) { - val page = Integer.parseInt(pageNumMatcher.group(1)) + val page = Integer.parseInt(pageNumMatcher.group(1)!!) var path = document.select("ol.breadcrumb > li:eq(2) > a").attr("href") path = path.substring(1, path.length - 5) for (i in 0 until page) - pages.add(Page(i, "$baseUrl/${path}_p${i + 1}.html")) + pages.add(Page(i, "$baseUrl/${path}_p${i + 1}.html")) } return pages } diff --git a/src/zh/manhuadui/src/eu/kanade/tachiyomi/extension/zh/manhuadui/Manhuadui.kt b/src/zh/manhuadui/src/eu/kanade/tachiyomi/extension/zh/manhuadui/Manhuadui.kt index 9719bf5e9..9ffa6b4cf 100644 --- a/src/zh/manhuadui/src/eu/kanade/tachiyomi/extension/zh/manhuadui/Manhuadui.kt +++ b/src/zh/manhuadui/src/eu/kanade/tachiyomi/extension/zh/manhuadui/Manhuadui.kt @@ -8,15 +8,15 @@ 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 javax.crypto.Cipher -import javax.crypto.spec.IvParameterSpec -import javax.crypto.spec.SecretKeySpec import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import javax.crypto.Cipher +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec class Manhuadui : ParsedHttpSource() { @@ -163,41 +163,53 @@ class Manhuadui : ParsedHttpSource() { ProgressGroup() ) - private class CategoryGroup : UriPartFilter("按类型", arrayOf( - Pair("全部", ""), - Pair("儿童漫画", "ertong"), - Pair("少年漫画", "shaonian"), - Pair("少女漫画", "shaonv"), - Pair("青年漫画", "qingnian") - )) + private class CategoryGroup : UriPartFilter( + "按类型", + arrayOf( + Pair("全部", ""), + Pair("儿童漫画", "ertong"), + Pair("少年漫画", "shaonian"), + Pair("少女漫画", "shaonv"), + Pair("青年漫画", "qingnian") + ) + ) - private class ProgressGroup : UriPartFilter("按进度", arrayOf( - Pair("全部", ""), - Pair("已完结", "wanjie"), - Pair("连载中", "lianzai") - )) + private class ProgressGroup : UriPartFilter( + "按进度", + arrayOf( + Pair("全部", ""), + Pair("已完结", "wanjie"), + Pair("连载中", "lianzai") + ) + ) - private class RegionGroup : UriPartFilter("按地区", arrayOf( - Pair("全部", ""), - Pair("日本", "riben"), - Pair("大陆", "dalu"), - Pair("香港", "hongkong"), - Pair("台湾", "taiwan"), - Pair("欧美", "oumei"), - Pair("韩国", "hanguo"), - Pair("其他", "qita") - )) + private class RegionGroup : UriPartFilter( + "按地区", + arrayOf( + Pair("全部", ""), + Pair("日本", "riben"), + Pair("大陆", "dalu"), + Pair("香港", "hongkong"), + Pair("台湾", "taiwan"), + Pair("欧美", "oumei"), + Pair("韩国", "hanguo"), + Pair("其他", "qita") + ) + ) - private class GenreGroup : UriPartFilter("按剧情", arrayOf( - Pair("全部", ""), - Pair("热血", "rexue"), - Pair("冒险", "maoxian"), - Pair("玄幻", "xuanhuan"), - Pair("搞笑", "gaoxiao"), - Pair("恋爱", "lianai"), - Pair("宠物", "chongwu"), - Pair("新作", "xinzuo") - )) + private class GenreGroup : UriPartFilter( + "按剧情", + arrayOf( + Pair("全部", ""), + Pair("热血", "rexue"), + Pair("冒险", "maoxian"), + Pair("玄幻", "xuanhuan"), + Pair("搞笑", "gaoxiao"), + Pair("恋爱", "lianai"), + Pair("宠物", "chongwu"), + Pair("新作", "xinzuo") + ) + ) private open class UriPartFilter( displayName: String, diff --git a/src/zh/manhuagui/src/eu/kanade/tachiyomi/extension/zh/manhuagui/Manhuagui.kt b/src/zh/manhuagui/src/eu/kanade/tachiyomi/extension/zh/manhuagui/Manhuagui.kt index cc6b91001..632eb8c28 100644 --- a/src/zh/manhuagui/src/eu/kanade/tachiyomi/extension/zh/manhuagui/Manhuagui.kt +++ b/src/zh/manhuagui/src/eu/kanade/tachiyomi/extension/zh/manhuagui/Manhuagui.kt @@ -18,9 +18,6 @@ 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 java.io.IOException -import java.text.SimpleDateFormat -import java.util.Locale import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay @@ -40,6 +37,9 @@ import org.jsoup.nodes.Element import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.io.IOException +import java.text.SimpleDateFormat +import java.util.Locale class Manhuagui : ConfigurableSource, ParsedHttpSource() { @@ -49,10 +49,10 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { override val name = "漫画柜" override val baseUrl = - if (preferences.getBoolean(SHOW_ZH_HANT_WEBSITE_PREF, false)) - "https://tw.manhuagui.com" - else - "https://www.manhuagui.com" + if (preferences.getBoolean(SHOW_ZH_HANT_WEBSITE_PREF, false)) + "https://tw.manhuagui.com" + else + "https://www.manhuagui.com" override val lang = "zh" override val supportsLatest = true @@ -61,20 +61,22 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { private val baseHttpUrl: HttpUrl = HttpUrl.parse(baseUrl)!! // Add rate limit to fix manga thumbnail load failure - private val rateLimitInterceptor = ManhuaguiRateLimitInterceptor(baseHttpUrl.host()!!, - preferences.getString(MAINSITE_RATELIMIT_PREF, "2")!!.toInt(), - preferences.getString(IMAGE_CDN_RATELIMIT_PREF, "4")!!.toInt()) + private val rateLimitInterceptor = ManhuaguiRateLimitInterceptor( + baseHttpUrl.host()!!, + preferences.getString(MAINSITE_RATELIMIT_PREF, "2")!!.toInt(), + preferences.getString(IMAGE_CDN_RATELIMIT_PREF, "4")!!.toInt() + ) override val client: OkHttpClient = - if (getShowR18()) - network.client.newBuilder() - .addNetworkInterceptor(rateLimitInterceptor) - .addNetworkInterceptor(AddCookieHeaderInterceptor(baseHttpUrl.host()!!)) - .build() - else - network.client.newBuilder() - .addNetworkInterceptor(rateLimitInterceptor) - .build() + if (getShowR18()) + network.client.newBuilder() + .addNetworkInterceptor(rateLimitInterceptor) + .addNetworkInterceptor(AddCookieHeaderInterceptor(baseHttpUrl.host()!!)) + .build() + else + network.client.newBuilder() + .addNetworkInterceptor(rateLimitInterceptor) + .build() // Add R18 verification cookie class AddCookieHeaderInterceptor(private val baseHost: String) : Interceptor { @@ -82,7 +84,8 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { if (chain.request().url().host() == baseHost) { val originalCookies = chain.request().header("Cookie") ?: "" if (originalCookies != "" && !originalCookies.contains("isAdult=1")) { - return chain.proceed(chain.request().newBuilder() + return chain.proceed( + chain.request().newBuilder() .header("Cookie", "$originalCookies; isAdult=1") .build() ) @@ -95,7 +98,7 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/list/view_p$page.html", headers) override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/list/update_p$page.html", headers) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = - GET("$baseUrl/s/${query}_p$page.html", headers) + GET("$baseUrl/s/${query}_p$page.html", headers) override fun mangaDetailsRequest(manga: SManga): Request { var bid = Regex("""\d+/?$""").find(manga.url)?.value @@ -110,22 +113,34 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { withContext(Dispatchers.IO) { // Delay 1 second to wait main manga details request complete delay(1000L) - client.newCall(POST("$baseUrl/tools/submit_ajax.ashx?action=user_check_login", headersBuilder() - .set("Referer", manga.url) - .set("X-Requested-With", "XMLHttpRequest") - .build() - )).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) = e.printStackTrace() - override fun onResponse(call: Call, response: Response) = response.close() - }) + client.newCall( + POST( + "$baseUrl/tools/submit_ajax.ashx?action=user_check_login", + headersBuilder() + .set("Referer", manga.url) + .set("X-Requested-With", "XMLHttpRequest") + .build() + ) + ).enqueue( + object : Callback { + override fun onFailure(call: Call, e: IOException) = e.printStackTrace() + override fun onResponse(call: Call, response: Response) = response.close() + } + ) - client.newCall(GET("$baseUrl/tools/vote.ashx?act=get&bid=$bid", headersBuilder() - .set("Referer", manga.url) - .set("X-Requested-With", "XMLHttpRequest").build() - )).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) = e.printStackTrace() - override fun onResponse(call: Call, response: Response) = response.close() - }) + client.newCall( + GET( + "$baseUrl/tools/vote.ashx?act=get&bid=$bid", + headersBuilder() + .set("Referer", manga.url) + .set("X-Requested-With", "XMLHttpRequest").build() + ) + ).enqueue( + object : Callback { + override fun onFailure(call: Call, e: IOException) = e.printStackTrace() + override fun onResponse(call: Call, response: Response) = response.close() + } + ) } } } @@ -146,8 +161,8 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { return if (query.startsWith(PREFIX_ID_SEARCH)) { val id = query.removePrefix(PREFIX_ID_SEARCH) client.newCall(searchMangaByIdRequest(id)) - .asObservableSuccess() - .map { response -> searchMangaByIdParse(response, id) } + .asObservableSuccess() + .map { response -> searchMangaByIdParse(response, id) } } else { super.fetchSearchManga(page, query, filters) } @@ -163,8 +178,8 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector() override fun headersBuilder(): Headers.Builder = super.headersBuilder() - .set("Referer", baseUrl) - .set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36") + .set("Referer", baseUrl) + .set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36") override fun popularMangaFromElement(element: Element) = mangaFromElement(element) override fun latestUpdatesFromElement(element: Element) = mangaFromElement(element) @@ -207,8 +222,10 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { if (getShowR18()) { // Hidden chapter list is LZString encoded val decodedHiddenChapterList = Duktape.create().use { - it.evaluate(jsDecodeFunc + - """LZString.decompressFromBase64('${hiddenEncryptedChapterList.`val`()}');""") as String + it.evaluate( + jsDecodeFunc + + """LZString.decompressFromBase64('${hiddenEncryptedChapterList.`val`()}');""" + ) as String } val hiddenChapterList = Jsoup.parse(decodedHiddenChapterList, response.request().url().toString()) if (hiddenChapterList != null) { @@ -270,7 +287,8 @@ class Manhuagui : ConfigurableSource, ParsedHttpSource() { return manga } - private val jsDecodeFunc = """ + private val jsDecodeFunc = + """ var LZString=(function(){var f=String.fromCharCode;var keyStrBase64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var baseReverseDic={};function getBaseValue(alphabet,character){if(!baseReverseDic[alphabet]){baseReverseDic[alphabet]={};for(var i=0;i<alphabet.length;i++){baseReverseDic[alphabet][alphabet.charAt(i)]=i}}return baseReverseDic[alphabet][character]}var LZString={decompressFromBase64:function(input){if(input==null)return"";if(input=="")return null;return LZString._0(input.length,32,function(index){return getBaseValue(keyStrBase64,input.charAt(index))})},_0:function(length,resetValue,getNextValue){var dictionary=[],next,enlargeIn=4,dictSize=4,numBits=3,entry="",result=[],i,w,bits,resb,maxpower,power,c,data={val:getNextValue(0),position:resetValue,index:1};for(i=0;i<3;i+=1){dictionary[i]=i}bits=0;maxpower=Math.pow(2,2);power=1;while(power!=maxpower){resb=data.val&data.position;data.position>>=1;if(data.position==0){data.position=resetValue;data.val=getNextValue(data.index++)}bits|=(resb>0?1:0)*power;power<<=1}switch(next=bits){case 0:bits=0;maxpower=Math.pow(2,8);power=1;while(power!=maxpower){resb=data.val&data.position;data.position>>=1;if(data.position==0){data.position=resetValue;data.val=getNextValue(data.index++)}bits|=(resb>0?1:0)*power;power<<=1}c=f(bits);break;case 1:bits=0;maxpower=Math.pow(2,16);power=1;while(power!=maxpower){resb=data.val&data.position;data.position>>=1;if(data.position==0){data.position=resetValue;data.val=getNextValue(data.index++)}bits|=(resb>0?1:0)*power;power<<=1}c=f(bits);break;case 2:return""}dictionary[3]=c;w=c;result.push(c);while(true){if(data.index>length){return""}bits=0;maxpower=Math.pow(2,numBits);power=1;while(power!=maxpower){resb=data.val&data.position;data.position>>=1;if(data.position==0){data.position=resetValue;data.val=getNextValue(data.index++)}bits|=(resb>0?1:0)*power;power<<=1}switch(c=bits){case 0:bits=0;maxpower=Math.pow(2,8);power=1;while(power!=maxpower){resb=data.val&data.position;data.position>>=1;if(data.position==0){data.position=resetValue;data.val=getNextValue(data.index++)}bits|=(resb>0?1:0)*power;power<<=1}dictionary[dictSize++]=f(bits);c=dictSize-1;enlargeIn--;break;case 1:bits=0;maxpower=Math.pow(2,16);power=1;while(power!=maxpower){resb=data.val&data.position;data.position>>=1;if(data.position==0){data.position=resetValue;data.val=getNextValue(data.index++)}bits|=(resb>0?1:0)*power;power<<=1}dictionary[dictSize++]=f(bits);c=dictSize-1;enlargeIn--;break;case 2:return result.join('')}if(enlargeIn==0){enlargeIn=Math.pow(2,numBits);numBits++}if(dictionary[c]){entry=dictionary[c]}else{if(c===dictSize){entry=w+w.charAt(0)}else{return null}}result.push(entry);dictionary[dictSize++]=w+entry.charAt(0);enlargeIn--;w=entry;if(enlargeIn==0){enlargeIn=Math.pow(2,numBits);numBits++}}}};return LZString})();String.prototype.splic=function(f){return LZString.decompressFromBase64(this).split(f)}; """ diff --git a/src/zh/manhuagui/src/eu/kanade/tachiyomi/extension/zh/manhuagui/ManhuaguiRateLimitInterceptor.kt b/src/zh/manhuagui/src/eu/kanade/tachiyomi/extension/zh/manhuagui/ManhuaguiRateLimitInterceptor.kt index baa078962..36983c77a 100644 --- a/src/zh/manhuagui/src/eu/kanade/tachiyomi/extension/zh/manhuagui/ManhuaguiRateLimitInterceptor.kt +++ b/src/zh/manhuagui/src/eu/kanade/tachiyomi/extension/zh/manhuagui/ManhuaguiRateLimitInterceptor.kt @@ -1,9 +1,9 @@ package eu.kanade.tachiyomi.extension.zh.manhuagui import android.os.SystemClock -import java.util.concurrent.TimeUnit import okhttp3.Interceptor import okhttp3.Response +import java.util.concurrent.TimeUnit /** * An OkHttp interceptor modified for Manhuagui extension that handles rate limiting. diff --git a/src/zh/manhuaren/src/eu/kanade/tachiyomi/extension/zh/manhuaren/Manhuaren.kt b/src/zh/manhuaren/src/eu/kanade/tachiyomi/extension/zh/manhuaren/Manhuaren.kt index c4f478936..683e20712 100644 --- a/src/zh/manhuaren/src/eu/kanade/tachiyomi/extension/zh/manhuaren/Manhuaren.kt +++ b/src/zh/manhuaren/src/eu/kanade/tachiyomi/extension/zh/manhuaren/Manhuaren.kt @@ -8,13 +8,6 @@ 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 java.net.URLEncoder -import java.security.MessageDigest -import java.text.SimpleDateFormat -import java.util.ArrayList -import java.util.Date -import java.util.Locale -import java.util.concurrent.TimeUnit.MINUTES import okhttp3.CacheControl import okhttp3.Headers import okhttp3.HttpUrl @@ -22,6 +15,13 @@ import okhttp3.Request import okhttp3.Response import org.json.JSONArray import org.json.JSONObject +import java.net.URLEncoder +import java.security.MessageDigest +import java.text.SimpleDateFormat +import java.util.ArrayList +import java.util.Date +import java.util.Locale +import java.util.concurrent.TimeUnit.MINUTES class Manhuaren : HttpSource() { override val lang = "zh" @@ -75,8 +75,8 @@ class Manhuaren : HttpSource() { private fun hashString(type: String, input: String): String { val hexChars = "0123456789abcdef" val bytes = MessageDigest - .getInstance(type) - .digest(input.toByteArray()) + .getInstance(type) + .digest(input.toByteArray()) val result = StringBuilder(bytes.size * 2) bytes.forEach { @@ -90,9 +90,9 @@ class Manhuaren : HttpSource() { private fun urlEncode(str: String?): String { return URLEncoder.encode(str, "UTF-8") - .replace("+", "%20") - .replace("%7E", "~") - .replace("*", "%2A") + .replace("+", "%20") + .replace("%7E", "~") + .replace("*", "%2A") } private fun mangasFromJSONArray(arr: JSONArray): MangasPage { @@ -100,17 +100,19 @@ class Manhuaren : HttpSource() { for (i in 0 until arr.length()) { val obj = arr.getJSONObject(i) val id = obj.getInt("mangaId") - ret.add(SManga.create().apply { - title = obj.getString("mangaName") - thumbnail_url = obj.getString("mangaCoverimageUrl") - author = obj.optString("mangaAuthor") - status = when (obj.getInt("mangaIsOver")) { - 1 -> SManga.COMPLETED - 0 -> SManga.ONGOING - else -> SManga.UNKNOWN + ret.add( + SManga.create().apply { + title = obj.getString("mangaName") + thumbnail_url = obj.getString("mangaCoverimageUrl") + author = obj.optString("mangaAuthor") + status = when (obj.getInt("mangaIsOver")) { + 1 -> SManga.COMPLETED + 0 -> SManga.ONGOING + else -> SManga.UNKNOWN + } + url = "/v1/manga/getDetail?mangaId=$id" } - url = "/v1/manga/getDetail?mangaId=$id" - }) + ) } return MangasPage(ret, arr.length() != 0) } @@ -235,13 +237,15 @@ class Manhuaren : HttpSource() { val ret = ArrayList<SChapter>() for (i in 0 until arr.length()) { val obj = arr.getJSONObject(i) - ret.add(SChapter.create().apply { - val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) - name = if (obj.getInt("isMustPay") == 1) { "(锁) " } else { "" } + getChapterName(type, obj.getString("sectionName"), obj.getString("sectionTitle")) - date_upload = dateFormat.parse(obj.getString("releaseTime")).time - chapter_number = obj.getInt("sectionSort").toFloat() - url = "/v1/manga/getRead?mangaSectionId=${obj.getInt("sectionId")}" - }) + ret.add( + SChapter.create().apply { + val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) + name = if (obj.getInt("isMustPay") == 1) { "(锁) " } else { "" } + getChapterName(type, obj.getString("sectionName"), obj.getString("sectionTitle")) + date_upload = dateFormat.parse(obj.getString("releaseTime"))?.time ?: 0L + chapter_number = obj.getInt("sectionSort").toFloat() + url = "/v1/manga/getRead?mangaSectionId=${obj.getInt("sectionId")}" + } + ) } return ret } @@ -283,51 +287,57 @@ class Manhuaren : HttpSource() { override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("This method should not be called!") override fun getFilterList() = FilterList( - SortFilter("状态", arrayOf( - Pair("热门", "0"), - Pair("更新", "1"), - Pair("新作", "2"), - Pair("完结", "3") - )), - CategoryFilter("分类", arrayOf( - Category("全部", "0", "0"), - Category("热血", "0", "31"), - Category("恋爱", "0", "26"), - Category("校园", "0", "1"), - Category("百合", "0", "3"), - Category("耽美", "0", "27"), - Category("伪娘", "0", "5"), - Category("冒险", "0", "2"), - Category("职场", "0", "6"), - Category("后宫", "0", "8"), - Category("治愈", "0", "9"), - Category("科幻", "0", "25"), - Category("励志", "0", "10"), - Category("生活", "0", "11"), - Category("战争", "0", "12"), - Category("悬疑", "0", "17"), - Category("推理", "0", "33"), - Category("搞笑", "0", "37"), - Category("奇幻", "0", "14"), - Category("魔法", "0", "15"), - Category("恐怖", "0", "29"), - Category("神鬼", "0", "20"), - Category("萌系", "0", "21"), - Category("历史", "0", "4"), - Category("美食", "0", "7"), - Category("同人", "0", "30"), - Category("运动", "0", "34"), - Category("绅士", "0", "36"), - Category("机甲", "0", "40"), - Category("限制级", "0", "61"), - Category("少年向", "1", "1"), - Category("少女向", "1", "2"), - Category("青年向", "1", "3"), - Category("港台", "2", "35"), - Category("日韩", "2", "36"), - Category("大陆", "2", "37"), - Category("欧美", "2", "52") - )) + SortFilter( + "状态", + arrayOf( + Pair("热门", "0"), + Pair("更新", "1"), + Pair("新作", "2"), + Pair("完结", "3") + ) + ), + CategoryFilter( + "分类", + arrayOf( + Category("全部", "0", "0"), + Category("热血", "0", "31"), + Category("恋爱", "0", "26"), + Category("校园", "0", "1"), + Category("百合", "0", "3"), + Category("耽美", "0", "27"), + Category("伪娘", "0", "5"), + Category("冒险", "0", "2"), + Category("职场", "0", "6"), + Category("后宫", "0", "8"), + Category("治愈", "0", "9"), + Category("科幻", "0", "25"), + Category("励志", "0", "10"), + Category("生活", "0", "11"), + Category("战争", "0", "12"), + Category("悬疑", "0", "17"), + Category("推理", "0", "33"), + Category("搞笑", "0", "37"), + Category("奇幻", "0", "14"), + Category("魔法", "0", "15"), + Category("恐怖", "0", "29"), + Category("神鬼", "0", "20"), + Category("萌系", "0", "21"), + Category("历史", "0", "4"), + Category("美食", "0", "7"), + Category("同人", "0", "30"), + Category("运动", "0", "34"), + Category("绅士", "0", "36"), + Category("机甲", "0", "40"), + Category("限制级", "0", "61"), + Category("少年向", "1", "1"), + Category("少女向", "1", "2"), + Category("青年向", "1", "3"), + Category("港台", "2", "35"), + Category("日韩", "2", "36"), + Category("大陆", "2", "37"), + Category("欧美", "2", "52") + ) + ) ) private data class Category(val name: String, val type: String, val id: String) diff --git a/src/zh/onemanhua/src/eu/kanade/tachiyomi/extension/zh/onemanhua/Onemanhua.kt b/src/zh/onemanhua/src/eu/kanade/tachiyomi/extension/zh/onemanhua/Onemanhua.kt index eff08ee48..041c24ff5 100644 --- a/src/zh/onemanhua/src/eu/kanade/tachiyomi/extension/zh/onemanhua/Onemanhua.kt +++ b/src/zh/onemanhua/src/eu/kanade/tachiyomi/extension/zh/onemanhua/Onemanhua.kt @@ -9,14 +9,14 @@ 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 java.net.URLEncoder -import java.util.regex.Pattern -import javax.crypto.Cipher -import javax.crypto.spec.SecretKeySpec import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.net.URLEncoder +import java.util.regex.Pattern +import javax.crypto.Cipher +import javax.crypto.spec.SecretKeySpec class Onemanhua : ParsedHttpSource() { override val id = 8252565807829914103 // name used to be "One漫画" @@ -110,11 +110,14 @@ class Onemanhua : ParsedHttpSource() { title = document.select("h1.fed-part-eone").first().text().trim() thumbnail_url = picElement.attr("data-original") - status = when (detailElements.firstOrNull { - it.children().firstOrNull { - it2 -> it2.hasClass("fed-text-muted") && it2.ownText() == "状态" - } != null - }?.select("a")?.first()?.text()) { + status = when ( + detailElements.firstOrNull { + it.children().firstOrNull { + it2 -> + it2.hasClass("fed-text-muted") && it2.ownText() == "状态" + } != null + }?.select("a")?.first()?.text() + ) { "连载中" -> SManga.ONGOING "已完结" -> SManga.COMPLETED else -> SManga.UNKNOWN @@ -122,13 +125,15 @@ class Onemanhua : ParsedHttpSource() { author = detailElements.firstOrNull { it.children().firstOrNull { - it2 -> it2.hasClass("fed-text-muted") && it2.ownText() == "作者" + it2 -> + it2.hasClass("fed-text-muted") && it2.ownText() == "作者" } != null }?.select("a")?.first()?.text() genre = detailElements.firstOrNull { it.children().firstOrNull { - it2 -> it2.hasClass("fed-text-muted") && it2.ownText() == "类别" + it2 -> + it2.hasClass("fed-text-muted") && it2.ownText() == "类别" } != null }?.select("a")?.joinToString { it.text() } @@ -159,21 +164,31 @@ class Onemanhua : ParsedHttpSource() { // 4. Extract values from C_DATA to formulate page urls var imageServerDomain = regexExtractStringValue( - decryptedData, "domain:\"(.+?)\"", "Unable to match for imageServerDomain" + decryptedData, + "domain:\"(.+?)\"", + "Unable to match for imageServerDomain" ) var mhId = regexExtractStringValue( - decryptedData, "mhid:\"(.+?)\"", "Unable to match for mhId" + decryptedData, + "mhid:\"(.+?)\"", + "Unable to match for mhId" ) var pageName = regexExtractStringValue( - decryptedData, "pagename:\"(.+?)\"", "Unable to match for pagename" + decryptedData, + "pagename:\"(.+?)\"", + "Unable to match for pagename" ) val startImg = regexExtractIntValue( - decryptedData, "startimg:([0-9]+?),", "Unable to match for startimg" + decryptedData, + "startimg:([0-9]+?),", + "Unable to match for startimg" ) // 5. Decode and decrypt total pages var encodedTotalPages = regexExtractStringValue( - decryptedData, "enc_code1:\"(.+?)\"", "Unable to match for enc_code1" + decryptedData, + "enc_code1:\"(.+?)\"", + "Unable to match for enc_code1" ) var decodedTotalPages = String(Base64.decode(encodedTotalPages, Base64.NO_WRAP)) var decryptedTotalPages = Integer.parseInt(decryptAES(decodedTotalPages, decryptKey)) diff --git a/src/zh/pufei/src/eu/kanade/tachiyomi/extension/zh/pufei/Pufei.kt b/src/zh/pufei/src/eu/kanade/tachiyomi/extension/zh/pufei/Pufei.kt index 98aace73b..f98791f4c 100644 --- a/src/zh/pufei/src/eu/kanade/tachiyomi/extension/zh/pufei/Pufei.kt +++ b/src/zh/pufei/src/eu/kanade/tachiyomi/extension/zh/pufei/Pufei.kt @@ -13,7 +13,6 @@ 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 java.net.URL import okhttp3.HttpUrl import okhttp3.Interceptor import okhttp3.MediaType @@ -24,6 +23,7 @@ import okhttp3.ResponseBody import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.net.URL fun asJsoup(response: Response, html: String? = null): Document { return Jsoup.parse(html ?: bodyWithAutoCharset(response), response.request().url().toString()) @@ -76,7 +76,7 @@ class Pufei : ParsedHttpSource() { override fun latestUpdatesSelector() = popularMangaSelector() override fun headersBuilder() = super.headersBuilder() - .add("Referer", baseUrl) + .add("Referer", baseUrl) override fun popularMangaRequest(page: Int) = GET("$baseUrl/manhua/paihang.html", headers) @@ -167,11 +167,11 @@ class Pufei : ParsedHttpSource() { private class GenreFilter(genres: Array<String>) : Filter.Select<String>("Genre", genres) override fun getFilterList() = FilterList( - GenreFilter(getGenreList()) + GenreFilter(getGenreList()) ) private fun getGenreList() = arrayOf( - "All" + "All" ) // temp patch diff --git a/src/zh/qimiaomh/src/eu/kanade/tachiyomi/extension/zh/qimiaomh/Qimiaomh.kt b/src/zh/qimiaomh/src/eu/kanade/tachiyomi/extension/zh/qimiaomh/Qimiaomh.kt index c3f30f530..0f57a3808 100644 --- a/src/zh/qimiaomh/src/eu/kanade/tachiyomi/extension/zh/qimiaomh/Qimiaomh.kt +++ b/src/zh/qimiaomh/src/eu/kanade/tachiyomi/extension/zh/qimiaomh/Qimiaomh.kt @@ -8,14 +8,14 @@ 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 java.text.SimpleDateFormat -import java.util.Locale -import java.util.Random -import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.Random +import java.util.concurrent.TimeUnit class Qimiaomh : ParsedHttpSource() { override val name: String = "奇妙漫画" @@ -83,7 +83,7 @@ class Qimiaomh : ParsedHttpSource() { name = element.select("li.tit").text().trim() } private fun parseDate(date: String): Long { - return SimpleDateFormat("dd/MM/yyyy", Locale.US).parse(date).time + return SimpleDateFormat("dd/MM/yyyy", Locale.US).parse(date)?.time ?: 0L } // Pages diff --git a/src/zh/tohomh123/src/eu/kanade/tachiyomi/extension/zh/tohomh123/Tohomh.kt b/src/zh/tohomh123/src/eu/kanade/tachiyomi/extension/zh/tohomh123/Tohomh.kt index a8c625fbb..5b5f8f5d1 100644 --- a/src/zh/tohomh123/src/eu/kanade/tachiyomi/extension/zh/tohomh123/Tohomh.kt +++ b/src/zh/tohomh123/src/eu/kanade/tachiyomi/extension/zh/tohomh123/Tohomh.kt @@ -10,13 +10,13 @@ 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 java.text.SimpleDateFormat -import java.util.Locale import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale class Tohomh : ParsedHttpSource() { @@ -124,7 +124,7 @@ class Tohomh : ParsedHttpSource() { } private fun parseChapterDate(string: String): Long { - return dateFormat.parse(string).time + return dateFormat.parse(string)?.time ?: 0L } // Pages diff --git a/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/WuqiManga.kt b/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/WuqiManga.kt index 9ca273de2..1f988d401 100644 --- a/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/WuqiManga.kt +++ b/src/zh/wuqimanga/src/eu/kanade/tachiyomi/extension/zh/wuqimanga/WuqiManga.kt @@ -126,10 +126,12 @@ class WuqiManga : ParsedHttpSource() { val chapters = mutableListOf<SChapter>() response.asJsoup().select("div.chapter div.chapter-list>ul").asReversed().forEach { it.select("li a").forEach { - chapters.add(SChapter.create().apply { - url = it.attr("href") - name = it.attr("title") - }) + chapters.add( + SChapter.create().apply { + url = it.attr("href") + name = it.attr("title") + } + ) } } return chapters