From dc2cf3e4d5b08b7b7b45f3ab5d4fe39a48e61a0c Mon Sep 17 00:00:00 2001 From: imper1aldev <23511335+imper1aldev@users.noreply.github.com> Date: Sat, 14 Sep 2024 02:18:38 -0600 Subject: [PATCH] oppstrem fixed Closes #220 --- src/en/oppaistream/build.gradle | 2 +- .../en/oppaistream/OppaiStream.kt | 53 +++++-------------- 2 files changed, 13 insertions(+), 42 deletions(-) diff --git a/src/en/oppaistream/build.gradle b/src/en/oppaistream/build.gradle index aa7ad9e8..91a8bfd9 100644 --- a/src/en/oppaistream/build.gradle +++ b/src/en/oppaistream/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Oppai Stream' extClass = '.OppaiStream' - extVersionCode = 5 + extVersionCode = 6 isNsfw = true } diff --git a/src/en/oppaistream/src/eu/kanade/tachiyomi/animeextension/en/oppaistream/OppaiStream.kt b/src/en/oppaistream/src/eu/kanade/tachiyomi/animeextension/en/oppaistream/OppaiStream.kt index 46d95a2b..9b14afdd 100644 --- a/src/en/oppaistream/src/eu/kanade/tachiyomi/animeextension/en/oppaistream/OppaiStream.kt +++ b/src/en/oppaistream/src/eu/kanade/tachiyomi/animeextension/en/oppaistream/OppaiStream.kt @@ -14,24 +14,21 @@ import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.model.Track import eu.kanade.tachiyomi.animesource.model.Video -import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource +import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.parseAs -import kotlinx.serialization.json.Json import okhttp3.FormBody import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Request import okhttp3.Response -import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -import uy.kohesive.injekt.injectLazy import java.net.URLEncoder.encode -class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource { +class OppaiStream : AnimeHttpSource(), ConfigurableAnimeSource { override val name = "Oppai Stream" @@ -47,30 +44,18 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource { Injekt.get().getSharedPreferences("source_$id", 0x0000) } - private val json: Json by injectLazy() + private val searchAnimeSelector = "div.episode-shown > div > a" // ============================== Popular =============================== override fun popularAnimeRequest(page: Int) = GET("$baseUrl/$SEARCH_PATH?order=views&page=$page&limit=$SEARCH_LIMIT") override fun popularAnimeParse(response: Response) = searchAnimeParse(response) - override fun popularAnimeSelector() = searchAnimeSelector() - - override fun popularAnimeFromElement(element: Element) = searchAnimeFromElement(element) - - override fun popularAnimeNextPageSelector() = null - // =============================== Latest =============================== override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/$SEARCH_PATH?order=uploaded&page=$page&limit=$SEARCH_LIMIT") override fun latestUpdatesParse(response: Response) = searchAnimeParse(response) - override fun latestUpdatesSelector() = searchAnimeSelector() - - override fun latestUpdatesFromElement(element: Element) = searchAnimeFromElement(element) - - override fun latestUpdatesNextPageSelector() = null - // =============================== Search =============================== override fun getFilterList() = FILTERS @@ -107,29 +92,23 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource { return GET(url, headers) } - override fun searchAnimeSelector() = "div.episode-shown > div > a" - - override fun searchAnimeNextPageSelector() = null - override fun searchAnimeParse(response: Response): AnimesPage { val document = response.asJsoup() - val elements = document.select(searchAnimeSelector()) - + val elements = document.select(searchAnimeSelector) val anime = elements.map(::searchAnimeFromElement).distinctBy { it.title } - val hasNextPage = elements.size >= SEARCH_LIMIT - return AnimesPage(anime, hasNextPage) } - override fun searchAnimeFromElement(element: Element) = SAnime.create().apply { + private fun searchAnimeFromElement(element: Element) = SAnime.create().apply { thumbnail_url = element.selectFirst("img.cover-img-in")?.attr("abs:src") title = element.selectFirst(".title-ep")!!.text().replace(TITLE_CLEANUP_REGEX, "") - setUrlWithoutDomain(element.attr("exur").fixLink()) + setUrlWithoutDomain(element.attr("exur").ifEmpty { element.attr("href") }.fixLink()) } // =========================== Anime Details ============================ - override fun animeDetailsParse(document: Document) = SAnime.create().apply { + override fun animeDetailsParse(response: Response) = SAnime.create().apply { + val document = response.asJsoup() // Fetch from from Anilist when "Anilist Cover" is selected in settings val name = document.selectFirst("div.episode-info > h1")!!.text().substringBefore(" Ep ") title = name @@ -159,10 +138,8 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource { return doc.select("div.more-same-eps .in-main-gr > a").map(::episodeFromElement).reversed() } - override fun episodeListSelector() = "div.more-same-eps > div > div > a" - - override fun episodeFromElement(element: Element) = SEpisode.create().apply { - setUrlWithoutDomain(element.attr("exur").fixLink()) + private fun episodeFromElement(element: Element) = SEpisode.create().apply { + setUrlWithoutDomain(element.attr("exur").ifEmpty { element.attr("href") }.fixLink()) val num = element.selectFirst("font.ep")?.text() ?: "1" name = "Episode $num" episode_number = num.toFloatOrNull() ?: 1F @@ -189,10 +166,6 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource { } } - override fun videoListSelector() = throw UnsupportedOperationException() - - override fun videoFromElement(element: Element) = throw UnsupportedOperationException() - override fun List