|
@ -1,7 +1,7 @@
|
||||||
ext {
|
ext {
|
||||||
extName = 'Oppai Stream'
|
extName = 'Oppai Stream'
|
||||||
extClass = '.OppaiStream'
|
extClass = '.OppaiStream'
|
||||||
extVersionCode = 4
|
extVersionCode = 5
|
||||||
isNsfw = true
|
isNsfw = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 9.3 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 94 KiB |
|
@ -29,6 +29,7 @@ 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 uy.kohesive.injekt.injectLazy
|
||||||
|
import java.net.URLEncoder.encode
|
||||||
|
|
||||||
class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
|
|
||||||
|
@ -124,11 +125,7 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
override fun searchAnimeFromElement(element: Element) = SAnime.create().apply {
|
override 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(
|
setUrlWithoutDomain(element.attr("exur").fixLink())
|
||||||
element.attr("href").replace(Regex("(?<=\\?e=)(.*?)(?=&f=)")) {
|
|
||||||
java.net.URLEncoder.encode(it.groupValues[1], "UTF-8")
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// =========================== Anime Details ============================
|
// =========================== Anime Details ============================
|
||||||
|
@ -159,35 +156,13 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
// ============================== Episodes ==============================
|
// ============================== Episodes ==============================
|
||||||
override fun episodeListParse(response: Response): List<SEpisode> {
|
override fun episodeListParse(response: Response): List<SEpisode> {
|
||||||
val doc = response.asJsoup()
|
val doc = response.asJsoup()
|
||||||
return buildList {
|
return doc.select("div.more-same-eps .in-main-gr > a").map(::episodeFromElement).reversed()
|
||||||
doc.select(episodeListSelector())
|
|
||||||
.map(::episodeFromElement)
|
|
||||||
.let(::addAll)
|
|
||||||
|
|
||||||
add(
|
|
||||||
SEpisode.create().apply {
|
|
||||||
setUrlWithoutDomain(
|
|
||||||
doc.location().replace(Regex("(?<=\\?e=)(.*?)(?=&f=)")) {
|
|
||||||
java.net.URLEncoder.encode(it.groupValues[1], "UTF-8")
|
|
||||||
},
|
|
||||||
)
|
|
||||||
val num = doc.selectFirst("div.episode-info > h1")!!.text().substringAfter(" Ep ")
|
|
||||||
name = "Episode $num"
|
|
||||||
episode_number = num.toFloatOrNull() ?: 1F
|
|
||||||
scanlator = doc.selectFirst("div.episode-info a.red")?.text()
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}.sortedByDescending { it.episode_number }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun episodeListSelector() = "div.more-same-eps > div > div > a"
|
override fun episodeListSelector() = "div.more-same-eps > div > div > a"
|
||||||
|
|
||||||
override fun episodeFromElement(element: Element) = SEpisode.create().apply {
|
override fun episodeFromElement(element: Element) = SEpisode.create().apply {
|
||||||
setUrlWithoutDomain(
|
setUrlWithoutDomain(element.attr("exur").fixLink())
|
||||||
element.attr("href").replace(Regex("(?<=\\?e=)(.*?)(?=&f=)")) {
|
|
||||||
java.net.URLEncoder.encode(it.groupValues[1], "UTF-8")
|
|
||||||
},
|
|
||||||
)
|
|
||||||
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
|
||||||
|
@ -198,7 +173,7 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
override fun videoListParse(response: Response): List<Video> {
|
override fun videoListParse(response: Response): List<Video> {
|
||||||
val doc = response.asJsoup()
|
val doc = response.asJsoup()
|
||||||
val script = doc.selectFirst("script:containsData(var availableres)")!!.data()
|
val script = doc.selectFirst("script:containsData(var availableres)")!!.data()
|
||||||
val subtitles = doc.select("track[kind=captions]").map {
|
val subtitles = doc.select("track[kind=captions], track[kind=subtitles]").map {
|
||||||
Track(it.attr("src"), it.attr("label"))
|
Track(it.attr("src"), it.attr("label"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,9 +201,7 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
).reversed()
|
).reversed()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun videoUrlParse(document: Document): String {
|
override fun videoUrlParse(document: Document) = throw UnsupportedOperationException()
|
||||||
throw UnsupportedOperationException()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ============================== Settings ==============================
|
// ============================== Settings ==============================
|
||||||
override fun setupPreferenceScreen(screen: PreferenceScreen) {
|
override fun setupPreferenceScreen(screen: PreferenceScreen) {
|
||||||
|
@ -322,6 +295,9 @@ class OppaiStream : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
|
||||||
return Pair(coverURL, studiosList)
|
return Pair(coverURL, studiosList)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun String.fixLink(): String =
|
||||||
|
this.replace(Regex("(?<=\\?e=)(.*?)(?=&f=)")) { encode(it.groupValues[1], "UTF-8") }
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val SEARCH_PATH = "actions/search.php"
|
private const val SEARCH_PATH = "actions/search.php"
|
||||||
private const val SEARCH_LIMIT = 36
|
private const val SEARCH_LIMIT = 36
|
||||||
|
|