fix(pt/pobreflix): Fixed pt/PobreFlix source (fix #258) (#310)

This commit is contained in:
WebDitto 2024-10-17 16:37:52 -03:00 committed by GitHub
parent 2eac326793
commit 88361e0e35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 63 additions and 81 deletions

View file

@ -36,6 +36,7 @@ class FireplayerExtractor(
val script = val script =
doc.selectFirst("script:containsData(eval):containsData(p,a,c,k,e,d)")?.data() doc.selectFirst("script:containsData(eval):containsData(p,a,c,k,e,d)")?.data()
?.replace(Regex("[\\u00E0-\\u00FC]"), "-") // Fix a bug in JsUnpacker with accents
?.let(JsUnpacker::unpackAndCombine) ?.let(JsUnpacker::unpackAndCombine)
?: doc.selectFirst("script:containsData(FirePlayer)")?.data() ?: doc.selectFirst("script:containsData(FirePlayer)")?.data()

View file

@ -2,8 +2,8 @@ ext {
extName = 'Pobreflix' extName = 'Pobreflix'
extClass = '.Pobreflix' extClass = '.Pobreflix'
themePkg = 'dooplay' themePkg = 'dooplay'
baseUrl = 'https://pobreflix1.art' baseUrl = 'https://pobreflix.global'
overrideVersionCode = 10 overrideVersionCode = 11
isNsfw = true isNsfw = true
} }
@ -11,6 +11,7 @@ apply from: "$rootDir/common.gradle"
dependencies { dependencies {
implementation(project(":lib:filemoon-extractor")) implementation(project(":lib:filemoon-extractor"))
implementation(project(":lib:fireplayer-extractor"))
implementation(project(":lib:streamwish-extractor")) implementation(project(":lib:streamwish-extractor"))
implementation(project(":lib:streamtape-extractor")) implementation(project(":lib:streamtape-extractor"))
implementation(project(":lib:playlist-utils")) implementation(project(":lib:playlist-utils"))

View file

@ -1,23 +1,25 @@
package eu.kanade.tachiyomi.animeextension.pt.pobreflix package eu.kanade.tachiyomi.animeextension.pt.pobreflix
import android.util.Base64 import android.util.Base64
import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.FireplayerExtractor
import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.MyStreamExtractor import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.MyStreamExtractor
import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.PlayerFlixExtractor
import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.SuperFlixExtractor import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.SuperFlixExtractor
import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor
import eu.kanade.tachiyomi.lib.fireplayerextractor.FireplayerExtractor
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
import eu.kanade.tachiyomi.lib.streamwishextractor.StreamWishExtractor import eu.kanade.tachiyomi.lib.streamwishextractor.StreamWishExtractor
import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Response import okhttp3.Response
class Pobreflix : DooPlay( class Pobreflix : DooPlay(
"pt-BR", "pt-BR",
"Pobreflix", "Pobreflix",
"https://pobreflix1.art", "https://pobreflix.global",
) { ) {
// ============================== Popular =============================== // ============================== Popular ===============================
override fun popularAnimeSelector() = "div.featured div.poster" override fun popularAnimeSelector() = "div.featured div.poster"
@ -26,53 +28,52 @@ class Pobreflix : DooPlay(
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/series/page/$page/", headers) override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/series/page/$page/", headers)
// ============================ Video Links ============================= // ============================ Video Links =============================
private val embedplayerExtractor by lazy { FireplayerExtractor(client) } private val fireplayerExtractor by lazy { FireplayerExtractor(client) }
private val brbeastExtractor by lazy { FireplayerExtractor(client, "https://brbeast.com") }
private val superembedsExtractor by lazy { FireplayerExtractor(client, "https://superembeds.com/") }
private val filemoonExtractor by lazy { FilemoonExtractor(client) } private val filemoonExtractor by lazy { FilemoonExtractor(client) }
private val mystreamExtractor by lazy { MyStreamExtractor(client, headers) } private val mystreamExtractor by lazy { MyStreamExtractor(client, headers) }
private val streamtapeExtractor by lazy { StreamTapeExtractor(client) } private val streamtapeExtractor by lazy { StreamTapeExtractor(client) }
private val streamwishExtractor by lazy { StreamWishExtractor(client, headers) } private val streamwishExtractor by lazy { StreamWishExtractor(client, headers) }
private val playerflixExtractor by lazy { PlayerFlixExtractor(client, headers, ::genericExtractor) }
private val superflixExtractor by lazy { SuperFlixExtractor(client, headers, ::genericExtractor) } private val superflixExtractor by lazy { SuperFlixExtractor(client, headers, ::genericExtractor) }
private val supercdnExtractor by lazy { SuperFlixExtractor(client, headers, ::genericExtractor, "https://supercdn.org") } private val supercdnExtractor by lazy { SuperFlixExtractor(client, headers, ::genericExtractor, "https://supercdn.org") }
override fun videoListParse(response: Response): List<Video> { override fun videoListParse(response: Response): List<Video> {
val doc = response.asJsoup() val doc = response.asJsoup()
return doc.select("div.source-box > a").flatMap { return doc.select("div.source-box > a").parallelCatchingFlatMapBlocking {
runCatching { val data = it.attr("href").trim().toHttpUrl().queryParameter("auth")
val data = it.attr("href").toHttpUrl().queryParameter("auth") ?.let { Base64.decode(it, Base64.DEFAULT) }
?.let { Base64.decode(it, Base64.DEFAULT) } ?.let(::String)
?.let(::String) ?: return@parallelCatchingFlatMapBlocking emptyList()
?: return@flatMap emptyList() val url = data.replace("\\", "").substringAfter("url\":\"").substringBefore('"')
val url = data.replace("\\", "").substringAfter("url\":\"").substringBefore('"') genericExtractor(url)
genericExtractor(url)
}.getOrElse { emptyList() }
} }
} }
private fun genericExtractor(url: String, language: String = ""): List<Video> { private fun genericExtractor(url: String, language: String = ""): List<Video> {
val langSubstr = "[$language]" val langSubstr = if (language.isBlank()) "" else "[$language] "
return when { return when {
url.contains("superflix") -> url.contains("superflix") ->
superflixExtractor.videosFromUrl(url) superflixExtractor.videosFromUrl(url)
url.contains("supercdn") -> url.contains("supercdn") ->
supercdnExtractor.videosFromUrl(url) supercdnExtractor.videosFromUrl(url)
url.contains("filemoon") -> url.contains("filemoon") ->
filemoonExtractor.videosFromUrl(url, "$langSubstr Filemoon - ", headers = headers) filemoonExtractor.videosFromUrl(url, "${langSubstr}Filemoon - ", headers = headers)
url.contains("watch.brplayer") || url.contains("/watch?v=") -> url.contains("watch.brplayer") || url.contains("/watch?v=") ->
mystreamExtractor.videosFromUrl(url, language) mystreamExtractor.videosFromUrl(url, language)
url.contains("brbeast") -> url.contains("brbeast") ->
brbeastExtractor.videosFromUrl(url, language) fireplayerExtractor.videosFromUrl(url = url, videoNameGen = { "${langSubstr}BrBeast - $it" })
url.contains("embedplayer") -> url.contains("embedplayer") ->
embedplayerExtractor.videosFromUrl(url, language) fireplayerExtractor.videosFromUrl(url = url, videoNameGen = { "${langSubstr}EmbedPlayer - $it" })
url.contains("superembeds") -> url.contains("superembeds") ->
superembedsExtractor.videosFromUrl(url, language) fireplayerExtractor.videosFromUrl(url = url, videoNameGen = { "${langSubstr}SuperEmbeds - $it" })
url.contains("streamtape") -> url.contains("streamtape") ->
streamtapeExtractor.videosFromUrl(url, "$langSubstr Streamtape") streamtapeExtractor.videosFromUrl(url, "${langSubstr}Streamtape")
url.contains("filelions") -> url.contains("filelions") ->
streamwishExtractor.videosFromUrl(url, videoNameGen = { "$langSubstr FileLions - $it" }) streamwishExtractor.videosFromUrl(url, videoNameGen = { "${langSubstr}FileLions - $it" })
url.contains("streamwish") -> url.contains("streamwish") ->
streamwishExtractor.videosFromUrl(url, videoNameGen = { "$langSubstr Streamwish - $it" }) streamwishExtractor.videosFromUrl(url, videoNameGen = { "${langSubstr}Streamwish - $it" })
url.contains("playerflix") ->
playerflixExtractor.videosFromUrl(url)
else -> emptyList() else -> emptyList()
} }
} }

View file

@ -1,56 +0,0 @@
package eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors
import dev.datlag.jsunpacker.JsUnpacker
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.OkHttpClient
class FireplayerExtractor(private val client: OkHttpClient, private val host: String = "https://embedplayer.online") {
private val headers by lazy {
Headers.headersOf(
"X-Requested-With",
"XMLHttpRequest",
"Referer",
host,
"Origin",
host,
)
}
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
fun videosFromUrl(url: String, lang: String): List<Video> {
var id = url.substringAfterLast("/")
if (id.length < 32) {
val doc = client.newCall(GET(url, headers)).execute().asJsoup()
val script = doc.selectFirst("script:containsData(eval):containsData(p,a,c,k,e,d)")?.data()
?.let(JsUnpacker::unpackAndCombine)
?: doc.selectFirst("script:containsData(FirePlayer)")?.data()
if (script?.contains("FirePlayer(") == true) {
id = script.substringAfter("FirePlayer(\"").substringBefore('"')
}
}
val postUrl = "$host/player/index.php?data=$id&do=getVideo"
val body = FormBody.Builder()
.add("hash", id)
.add("r", "")
.build()
val masterUrl = client.newCall(POST(postUrl, headers, body = body)).execute()
.body.string()
.substringAfter("securedLink\":\"")
.substringBefore('"')
.replace("\\", "")
return playlistUtils.extractFromHls(masterUrl, videoNameGen = { "[$lang] EmbedPlayer - $it" })
}
}

View file

@ -0,0 +1,35 @@
package eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking
import okhttp3.Headers
import okhttp3.OkHttpClient
class PlayerFlixExtractor(
private val client: OkHttpClient,
private val defaultHeaders: Headers,
private val genericExtractor: (String, String) -> List<Video>,
) {
fun videosFromUrl(url: String): List<Video> {
val doc = client.newCall(GET(url, defaultHeaders)).execute().asJsoup()
val items = doc.select("#hostList div.buttonLoadHost").mapNotNull {
val url = it.attr("onclick")
.substringAfter('"', "")
.substringBefore('"')
?: return@mapNotNull null
val language = if (it.hasClass("hostDub")) {
"Dublado"
} else {
"Legendado"
}
language to url // (Language, videoId)
}
return items.parallelCatchingFlatMapBlocking { genericExtractor(it.second, it.first) }
}
}

View file

@ -18,7 +18,7 @@ class SuperFlixExtractor(
private val client: OkHttpClient, private val client: OkHttpClient,
private val defaultHeaders: Headers, private val defaultHeaders: Headers,
private val genericExtractor: (String, String) -> List<Video>, private val genericExtractor: (String, String) -> List<Video>,
private val host: String = "https://superflixapi.top", private val host: String = "https://superflixapi.dev",
) { ) {
private val json: Json by injectLazy() private val json: Json by injectLazy()