From fe4332fa74a24fa151c663a3b1b7fa1614f4709d Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Fri, 23 Jun 2023 13:07:58 +0000 Subject: [PATCH] refactor(multisrc/animestream): Make multisrc a bit more generic and customizable (#1775) --- .../animestream/animenosub/src/Animenosub.kt | 19 +--- .../multisrc/animestream/AnimeStream.kt | 91 +++++++++++++------ .../animestream/AnimeStreamFilters.kt | 17 +--- .../animestream/AnimeStreamGenerator.kt | 2 +- 4 files changed, 69 insertions(+), 60 deletions(-) diff --git a/multisrc/overrides/animestream/animenosub/src/Animenosub.kt b/multisrc/overrides/animestream/animenosub/src/Animenosub.kt index cb033d49e..46cffe6a2 100644 --- a/multisrc/overrides/animestream/animenosub/src/Animenosub.kt +++ b/multisrc/overrides/animestream/animenosub/src/Animenosub.kt @@ -7,7 +7,6 @@ import eu.kanade.tachiyomi.animeextension.en.animenosub.extractors.StreamWishExt import eu.kanade.tachiyomi.animeextension.en.animenosub.extractors.VidMolyExtractor import eu.kanade.tachiyomi.animeextension.en.animenosub.extractors.VtubeExtractor import eu.kanade.tachiyomi.animeextension.en.animenosub.extractors.WolfstreamExtractor -import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor import eu.kanade.tachiyomi.multisrc.animestream.AnimeStream @@ -18,23 +17,11 @@ class Animenosub : AnimeStream( "Animenosub", "https://animenosub.com", ) { - // ============================== Popular =============================== - - override fun popularAnimeSelector() = "div.serieslist.wpop-weekly li" - // ============================== Episodes ============================== - - override fun episodeFromElement(element: Element): SEpisode { + override fun getEpisodeName(element: Element, epNum: String): String { val episodeTitle = element.selectFirst("div.epl-title")?.text() ?: "" - return SEpisode.create().apply { - setUrlWithoutDomain(element.attr("href")) - element.selectFirst("div.epl-num")!!.text().let { - name = "Ep. $it ${if (episodeTitle.contains("Episode $it", true)) "" else episodeTitle}" - episode_number = it.substringBefore(" ").toFloatOrNull() ?: 0F - } - element.selectFirst("div.epl-sub")?.text()?.let { scanlator = it } - date_upload = element.selectFirst("div.epl-date")?.text().toDate() - } + val complement = if (episodeTitle.contains("Episode $epNum", true)) "" else episodeTitle + return "Ep. $epNum $complement" } // ============================ Video Links ============================= diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/animestream/AnimeStream.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/animestream/AnimeStream.kt index 872629244..a8ab24453 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/animestream/AnimeStream.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/animestream/AnimeStream.kt @@ -85,21 +85,13 @@ abstract class AnimeStream( return super.fetchPopularAnime(page) } - override fun popularAnimeFromElement(element: Element): SAnime { - return SAnime.create().apply { - val ahref = element.selectFirst("h4 > a.series")!! - setUrlWithoutDomain(ahref.attr("href")) - title = ahref.text() - thumbnail_url = element.selectFirst("img")!!.getImageUrl() - } - } + override fun popularAnimeRequest(page: Int) = GET("$animeListUrl/?page=$page&order=popular") - override fun popularAnimeNextPageSelector() = null + override fun popularAnimeSelector() = searchAnimeSelector() - override fun popularAnimeRequest(page: Int) = GET(baseUrl) + override fun popularAnimeNextPageSelector() = searchAnimeNextPageSelector() - /* Possible classes: wpop-weekly, wpop-monthly, wpop-alltime */ - override fun popularAnimeSelector() = "div.serieslist.wpop-alltime li" + override fun popularAnimeFromElement(element: Element) = searchAnimeFromElement(element) // ============================== Episodes ============================== override fun episodeListParse(response: Response): List { @@ -112,40 +104,67 @@ abstract class AnimeStream( else -> "Episode" } + @Suppress("unused_parameter") + protected open fun getEpisodeName(element: Element, epNum: String) = "$episodePrefix $epNum" + override fun episodeFromElement(element: Element): SEpisode { return SEpisode.create().apply { setUrlWithoutDomain(element.attr("href")) - element.selectFirst("div.epl-num")!!.text().let { - name = "$episodePrefix $it" + element.selectFirst(".epl-num")!!.text().let { + name = getEpisodeName(element, it) episode_number = it.substringBefore(" ").toFloatOrNull() ?: 0F } - element.selectFirst("div.epl-sub")?.text()?.let { scanlator = it } - date_upload = element.selectFirst("div.epl-date")?.text().toDate() + element.selectFirst(".epl-sub")?.text()?.let { scanlator = it } + date_upload = element.selectFirst(".epl-date")?.text().toDate() } } override fun episodeListSelector() = "div.eplister > ul > li > a" // =========================== Anime Details ============================ + protected open val animeDetailsSelector = "div.info-content, div.right ul.data" + protected open val animeAltNameSelector = ".alter" + protected open val animeTitleSelector = "h1.entry-title" + protected open val animeThumbnailSelector = "div.thumb > img, div.limage > img" + protected open val animeGenresSelector = "div.genxed > a, li:contains(Genre:) a" + protected open val animeDescriptionSelector = ".entry-content[itemprop=description], .desc" + protected open val animeAdditionalInfoSelector = "div.spe > span, li:has(b)" + + protected open val animeStatusText = "Status" + protected open val animeArtistText = "tudio" + protected open val animeAuthorText = "Fansub" + + protected open val animeAltNamePrefix = when (lang) { + "pt-BR" -> "Nome(s) alternativo(s): " + else -> "Alternative name(s): " + } + + protected open fun getAnimeDescription(document: Document) = + document.selectFirst(animeDescriptionSelector)?.text() + override fun animeDetailsParse(document: Document): SAnime { return SAnime.create().apply { setUrlWithoutDomain(document.location()) - title = document.selectFirst("h1.entry-title")!!.text() - thumbnail_url = document.selectFirst("div.thumb > img")!!.getImageUrl() + title = document.selectFirst(animeTitleSelector)!!.text() + thumbnail_url = document.selectFirst(animeThumbnailSelector)!!.getImageUrl() - val infos = document.selectFirst("div.info-content")!! - genre = infos.select("div.genxed > a").eachText().joinToString() + val infos = document.selectFirst(animeDetailsSelector)!! + genre = infos.select(animeGenresSelector).eachText().joinToString() - status = parseStatus(infos.getInfo("Status")) - artist = infos.getInfo("tudio") - author = infos.getInfo("Fansub") + status = parseStatus(infos.getInfo(animeStatusText)) + artist = infos.getInfo(animeArtistText) + author = infos.getInfo(animeAuthorText) description = buildString { - document.selectFirst("div.entry-content")?.text()?.let { + getAnimeDescription(document)?.let { append("$it\n\n") } - infos.select("div.spe > span").eachText().forEach { + document.selectFirst(animeAltNameSelector)?.text() + ?.takeIf(String::isNotBlank) + ?.let { append("$animeAltNamePrefix$it\n") } + + infos.select(animeAdditionalInfoSelector).eachText().forEach { append("$it\n") } } @@ -153,7 +172,7 @@ abstract class AnimeStream( } // ============================ Video Links ============================= - override fun videoListSelector() = "select.mirror > option[data-index]" + override fun videoListSelector() = "select.mirror > option[data-index], ul.mirror a[data-em]" override fun videoListParse(response: Response): List