diff --git a/src/all/genkan/build.gradle b/src/all/genkan/build.gradle index 3ec1425cc..406dcbdef 100644 --- a/src/all/genkan/build.gradle +++ b/src/all/genkan/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Genkan (multiple sources)' pkgNameSuffix = 'all.genkan' extClass = '.GenkanFactory' - extVersionCode = 3 + extVersionCode = 4 libVersion = '1.2' } 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 6d267fc74..45966b970 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 @@ -15,7 +15,7 @@ import java.util.* abstract class Genkan( override val name: String, - final override val baseUrl: String, + override val baseUrl: String, override val lang: String ) : ParsedHttpSource() { @@ -25,14 +25,13 @@ abstract class Genkan( override fun popularMangaSelector() = "div.list-item" - private val popularMangaUrl = "$baseUrl/comics?page=" // Search is also based off this val override fun popularMangaRequest(page: Int): Request { - return GET("$popularMangaUrl$page") + return GET("$baseUrl/comics?page=$page") } override fun latestUpdatesSelector() = popularMangaSelector() - // Track manga in latest updates page + // Track which manga titles have been added to latestUpdates's MangasPage private val latestUpdatesTitles = mutableSetOf<String>() override fun latestUpdatesRequest(page: Int): Request { @@ -40,7 +39,7 @@ abstract class Genkan( return GET("$baseUrl/latest?page=$page") } - // To prevent dupes + // To prevent dupes, only add manga to MangasPage if its title is not one we've added already override fun latestUpdatesParse(response: Response): MangasPage { val latestManga = mutableListOf<SManga>() val document = response.asJsoup() @@ -73,54 +72,10 @@ abstract class Genkan( override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - // Sources' websites don't appear to have a search function; so searching locally - private var searchQuery = "" - private var searchPage = 1 - private var nextPageSelectorElement = Elements() + // Search override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - if (page == 1) searchPage = 1 - searchQuery = query.toLowerCase() - return GET("$popularMangaUrl$page") - } - - override fun searchMangaParse(response: Response): MangasPage { - val searchMatches = mutableListOf<SManga>() - val document = response.asJsoup() - searchMatches.addAll(getMatchesFrom(document)) - - /* call another function if there's more pages to search - not doing it this way can lead to a false "no results found" - if no matches are found on the first page but there are matches - on subsequent pages */ - nextPageSelectorElement = document.select(searchMangaNextPageSelector()) - while (nextPageSelectorElement.hasText()) { - searchMatches.addAll(searchMorePages()) - } - - return MangasPage(searchMatches, false) - } - - // search the given document for matches - private fun getMatchesFrom(document: Document): MutableList<SManga> { - val searchMatches = mutableListOf<SManga>() - document.select(searchMangaSelector()).forEach { - if (it.text().toLowerCase().contains(searchQuery)) { - searchMatches.add(searchMangaFromElement(it)) - } - } - return searchMatches - } - - // search additional pages if called - private fun searchMorePages(): MutableList<SManga> { - searchPage++ - val nextPage = client.newCall(GET("$popularMangaUrl$searchPage", headers)).execute().asJsoup() - val searchMatches = mutableListOf<SManga>() - searchMatches.addAll(getMatchesFrom(nextPage)) - nextPageSelectorElement = nextPage.select(searchMangaNextPageSelector()) - - return searchMatches + return GET("$baseUrl/comics?query=$query") } override fun searchMangaSelector() = popularMangaSelector() @@ -208,3 +163,68 @@ abstract class Genkan( override fun getFilterList() = FilterList() } + +// For sites using the older Genkan CMS that didn't have a search function + +abstract class GenkanOriginal( + override val name: String, + override val baseUrl: String, + override val lang: String +) : Genkan(name, baseUrl, lang) { + + private var searchQuery = "" + private var searchPage = 1 + private var nextPageSelectorElement = Elements() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + if (page == 1) searchPage = 1 + searchQuery = query.toLowerCase() + return popularMangaRequest(page) + } + + override fun searchMangaParse(response: Response): MangasPage { + val searchMatches = mutableListOf<SManga>() + val document = response.asJsoup() + searchMatches.addAll(getMatchesFrom(document)) + + /* call another function if there's more pages to search + not doing it this way can lead to a false "no results found" + if no matches are found on the first page but there are matcheszz + on subsequent pages */ + nextPageSelectorElement = document.select(searchMangaNextPageSelector()) + while (nextPageSelectorElement.hasText()) { + searchMatches.addAll(searchMorePages()) + } + + return MangasPage(searchMatches, false) + } + + // search the given document for matches + private fun getMatchesFrom(document: Document): MutableList<SManga> { + val searchMatches = mutableListOf<SManga>() + document.select(searchMangaSelector()) + .filter { it.text().toLowerCase().contains(searchQuery) } + .map { searchMatches.add(searchMangaFromElement(it)) } + + return searchMatches + } + + // search additional pages if called + private fun searchMorePages(): MutableList<SManga> { + searchPage++ + val nextPage = client.newCall(popularMangaRequest(searchPage)).execute().asJsoup() + val searchMatches = mutableListOf<SManga>() + searchMatches.addAll(getMatchesFrom(nextPage)) + nextPageSelectorElement = nextPage.select(searchMangaNextPageSelector()) + + return searchMatches + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) + + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + +} + diff --git a/src/all/genkan/src/eu/kanade/tachiyomi/extension/all/genkan/GenkanFactory.kt b/src/all/genkan/src/eu/kanade/tachiyomi/extension/all/genkan/GenkanFactory.kt index f13cca240..b13ddf945 100644 --- a/src/all/genkan/src/eu/kanade/tachiyomi/extension/all/genkan/GenkanFactory.kt +++ b/src/all/genkan/src/eu/kanade/tachiyomi/extension/all/genkan/GenkanFactory.kt @@ -6,6 +6,7 @@ import eu.kanade.tachiyomi.source.SourceFactory class GenkanFactory : SourceFactory { override fun createSources(): List<Source> = listOf( LeviatanScans(), + LeviatanScansES(), PsychoPlay(), OneShotScans(), KaguyaDex(), @@ -13,9 +14,13 @@ class GenkanFactory : SourceFactory { HunlightScans()) } +/* Genkan class is for the latest version of Genkan CMS + GenkanOriginal is for the initial version of the CMS that didn't have its own search function */ + class LeviatanScans : Genkan("Leviatan Scans", "https://leviatanscans.com", "en") +class LeviatanScansES : GenkanOriginal("Leviatan Scans", "https://es.leviatanscans.com", "es") class PsychoPlay : Genkan("Psycho Play", "https://psychoplay.co", "en") class OneShotScans : Genkan("One Shot Scans", "https://oneshotscans.com", "en") -class KaguyaDex : Genkan("KaguyaDex", " https://kaguyadex.com", "en") -class KomiScans : Genkan("Komi Scans", " https://komiscans.com", "en") +class KaguyaDex : GenkanOriginal("KaguyaDex", " https://kaguyadex.com", "en") +class KomiScans : GenkanOriginal("Komi Scans", " https://komiscans.com", "en") class HunlightScans : Genkan("Hunlight Scans", "https://hunlight-scans.info", "en")