parent
8a4093ab8d
commit
dc2cf3e4d5
2 changed files with 13 additions and 42 deletions
|
@ -1,7 +1,7 @@
|
|||
ext {
|
||||
extName = 'Oppai Stream'
|
||||
extClass = '.OppaiStream'
|
||||
extVersionCode = 5
|
||||
extVersionCode = 6
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
|
|
|
@ -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<Application>().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<Video>.sort(): List<Video> {
|
||||
val quality = preferences.getString(PREF_QUALITY_KEY, PREF_QUALITY_DEFAULT)!!
|
||||
|
||||
|
@ -201,8 +174,6 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
|||
).reversed()
|
||||
}
|
||||
|
||||
override fun videoUrlParse(document: Document) = throw UnsupportedOperationException()
|
||||
|
||||
// ============================== Settings ==============================
|
||||
override fun setupPreferenceScreen(screen: PreferenceScreen) {
|
||||
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_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_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_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_VALUES = arrayOf("extraLarge", "large")
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue