oppstrem fixed

Closes #220
This commit is contained in:
imper1aldev 2024-09-14 02:18:38 -06:00
parent 8a4093ab8d
commit dc2cf3e4d5
2 changed files with 13 additions and 42 deletions

View file

@ -1,7 +1,7 @@
ext { ext {
extName = 'Oppai Stream' extName = 'Oppai Stream'
extClass = '.OppaiStream' extClass = '.OppaiStream'
extVersionCode = 5 extVersionCode = 6
isNsfw = true isNsfw = true
} }

View file

@ -14,24 +14,21 @@ import eu.kanade.tachiyomi.animesource.model.SAnime
import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.model.SEpisode
import eu.kanade.tachiyomi.animesource.model.Track import eu.kanade.tachiyomi.animesource.model.Track
import eu.kanade.tachiyomi.animesource.model.Video 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.GET
import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import eu.kanade.tachiyomi.util.parseAs import eu.kanade.tachiyomi.util.parseAs
import kotlinx.serialization.json.Json
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
import java.net.URLEncoder.encode import java.net.URLEncoder.encode
class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource { class OppaiStream : AnimeHttpSource(), ConfigurableAnimeSource {
override val name = "Oppai Stream" override val name = "Oppai Stream"
@ -47,30 +44,18 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
} }
private val json: Json by injectLazy() private val searchAnimeSelector = "div.episode-shown > div > a"
// ============================== Popular =============================== // ============================== Popular ===============================
override fun popularAnimeRequest(page: Int) = GET("$baseUrl/$SEARCH_PATH?order=views&page=$page&limit=$SEARCH_LIMIT") 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 popularAnimeParse(response: Response) = searchAnimeParse(response)
override fun popularAnimeSelector() = searchAnimeSelector()
override fun popularAnimeFromElement(element: Element) = searchAnimeFromElement(element)
override fun popularAnimeNextPageSelector() = null
// =============================== Latest =============================== // =============================== Latest ===============================
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/$SEARCH_PATH?order=uploaded&page=$page&limit=$SEARCH_LIMIT") 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 latestUpdatesParse(response: Response) = searchAnimeParse(response)
override fun latestUpdatesSelector() = searchAnimeSelector()
override fun latestUpdatesFromElement(element: Element) = searchAnimeFromElement(element)
override fun latestUpdatesNextPageSelector() = null
// =============================== Search =============================== // =============================== Search ===============================
override fun getFilterList() = FILTERS override fun getFilterList() = FILTERS
@ -107,29 +92,23 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
return GET(url, headers) return GET(url, headers)
} }
override fun searchAnimeSelector() = "div.episode-shown > div > a"
override fun searchAnimeNextPageSelector() = null
override fun searchAnimeParse(response: Response): AnimesPage { override fun searchAnimeParse(response: Response): AnimesPage {
val document = response.asJsoup() val document = response.asJsoup()
val elements = document.select(searchAnimeSelector()) val elements = document.select(searchAnimeSelector)
val anime = elements.map(::searchAnimeFromElement).distinctBy { it.title } val anime = elements.map(::searchAnimeFromElement).distinctBy { it.title }
val hasNextPage = elements.size >= SEARCH_LIMIT val hasNextPage = elements.size >= SEARCH_LIMIT
return AnimesPage(anime, hasNextPage) 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") thumbnail_url = element.selectFirst("img.cover-img-in")?.attr("abs:src")
title = element.selectFirst(".title-ep")!!.text().replace(TITLE_CLEANUP_REGEX, "") 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 ============================ // =========================== 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 // Fetch from from Anilist when "Anilist Cover" is selected in settings
val name = document.selectFirst("div.episode-info > h1")!!.text().substringBefore(" Ep ") val name = document.selectFirst("div.episode-info > h1")!!.text().substringBefore(" Ep ")
title = name title = name
@ -159,10 +138,8 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
return doc.select("div.more-same-eps .in-main-gr > a").map(::episodeFromElement).reversed() return doc.select("div.more-same-eps .in-main-gr > a").map(::episodeFromElement).reversed()
} }
override fun episodeListSelector() = "div.more-same-eps > div > div > a" private fun episodeFromElement(element: Element) = SEpisode.create().apply {
setUrlWithoutDomain(element.attr("exur").ifEmpty { element.attr("href") }.fixLink())
override fun episodeFromElement(element: Element) = SEpisode.create().apply {
setUrlWithoutDomain(element.attr("exur").fixLink())
val num = element.selectFirst("font.ep")?.text() ?: "1" val num = element.selectFirst("font.ep")?.text() ?: "1"
name = "Episode $num" name = "Episode $num"
episode_number = num.toFloatOrNull() ?: 1F 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<Video>.sort(): List<Video> { override fun List<Video>.sort(): List<Video> {
val quality = preferences.getString(PREF_QUALITY_KEY, PREF_QUALITY_DEFAULT)!! val quality = preferences.getString(PREF_QUALITY_KEY, PREF_QUALITY_DEFAULT)!!
@ -201,8 +174,6 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
).reversed() ).reversed()
} }
override fun videoUrlParse(document: Document) = throw UnsupportedOperationException()
// ============================== Settings ============================== // ============================== Settings ==============================
override fun setupPreferenceScreen(screen: PreferenceScreen) { override fun setupPreferenceScreen(screen: PreferenceScreen) {
ListPreference(screen.context).apply { ListPreference(screen.context).apply {
@ -305,7 +276,7 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
private const val PREF_QUALITY_KEY = "preferred_quality" private const val PREF_QUALITY_KEY = "preferred_quality"
private const val PREF_QUALITY_TITLE = "Preferred quality" private const val PREF_QUALITY_TITLE = "Preferred quality"
private const val PREF_QUALITY_DEFAULT = "720p" private const val PREF_QUALITY_DEFAULT = "1080p"
private val PREF_QUALITY_ENTRIES = arrayOf("2160p", "1080p", "720p") private val PREF_QUALITY_ENTRIES = arrayOf("2160p", "1080p", "720p")
private val PREF_QUALITY_VALUES = PREF_QUALITY_ENTRIES private val PREF_QUALITY_VALUES = PREF_QUALITY_ENTRIES
@ -319,7 +290,7 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
private const val PREF_COVER_QUALITY_KEY = "preferred_cover_quality" private const val PREF_COVER_QUALITY_KEY = "preferred_cover_quality"
private const val PREF_COVER_QUALITY_TITLE = "Preferred Anilist cover quality - Beta" private const val PREF_COVER_QUALITY_TITLE = "Preferred Anilist cover quality - Beta"
private const val PREF_COVER_QUALITY_DEFAULT = "large" private const val PREF_COVER_QUALITY_DEFAULT = "extraLarge"
private val PREF_COVER_QUALITY_ENTRIES = arrayOf("Extra Large", "Large") private val PREF_COVER_QUALITY_ENTRIES = arrayOf("Extra Large", "Large")
private val PREF_COVER_QUALITY_VALUES = arrayOf("extraLarge", "large") private val PREF_COVER_QUALITY_VALUES = arrayOf("extraLarge", "large")
} }