parent
8a4093ab8d
commit
dc2cf3e4d5
2 changed files with 13 additions and 42 deletions
|
@ -1,7 +1,7 @@
|
||||||
ext {
|
ext {
|
||||||
extName = 'Oppai Stream'
|
extName = 'Oppai Stream'
|
||||||
extClass = '.OppaiStream'
|
extClass = '.OppaiStream'
|
||||||
extVersionCode = 5
|
extVersionCode = 6
|
||||||
isNsfw = true
|
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.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")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue