diff --git a/lib/fireplayer-extractor/src/main/java/eu/kanade/tachiyomi/lib/fireplayerextractor/FireplayerExtractor.kt b/lib/fireplayer-extractor/src/main/java/eu/kanade/tachiyomi/lib/fireplayerextractor/FireplayerExtractor.kt index f9735def..4afa8d95 100644 --- a/lib/fireplayer-extractor/src/main/java/eu/kanade/tachiyomi/lib/fireplayerextractor/FireplayerExtractor.kt +++ b/lib/fireplayer-extractor/src/main/java/eu/kanade/tachiyomi/lib/fireplayerextractor/FireplayerExtractor.kt @@ -36,6 +36,7 @@ class FireplayerExtractor( val script = 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) ?: doc.selectFirst("script:containsData(FirePlayer)")?.data() diff --git a/src/pt/pobreflix/build.gradle b/src/pt/pobreflix/build.gradle index ec1d8eb7..5b4d764a 100644 --- a/src/pt/pobreflix/build.gradle +++ b/src/pt/pobreflix/build.gradle @@ -2,8 +2,8 @@ ext { extName = 'Pobreflix' extClass = '.Pobreflix' themePkg = 'dooplay' - baseUrl = 'https://pobreflix1.art' - overrideVersionCode = 10 + baseUrl = 'https://pobreflix.global' + overrideVersionCode = 11 isNsfw = true } @@ -11,6 +11,7 @@ apply from: "$rootDir/common.gradle" dependencies { implementation(project(":lib:filemoon-extractor")) + implementation(project(":lib:fireplayer-extractor")) implementation(project(":lib:streamwish-extractor")) implementation(project(":lib:streamtape-extractor")) implementation(project(":lib:playlist-utils")) diff --git a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/Pobreflix.kt b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/Pobreflix.kt index 30783608..c1159018 100644 --- a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/Pobreflix.kt +++ b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/Pobreflix.kt @@ -1,23 +1,25 @@ package eu.kanade.tachiyomi.animeextension.pt.pobreflix 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.PlayerFlixExtractor import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.SuperFlixExtractor import eu.kanade.tachiyomi.animesource.model.Video 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.streamwishextractor.StreamWishExtractor import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup +import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Response class Pobreflix : DooPlay( "pt-BR", "Pobreflix", - "https://pobreflix1.art", + "https://pobreflix.global", ) { // ============================== Popular =============================== 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) // ============================ Video Links ============================= - private val embedplayerExtractor 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 fireplayerExtractor by lazy { FireplayerExtractor(client) } private val filemoonExtractor by lazy { FilemoonExtractor(client) } private val mystreamExtractor by lazy { MyStreamExtractor(client, headers) } private val streamtapeExtractor by lazy { StreamTapeExtractor(client) } 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 supercdnExtractor by lazy { SuperFlixExtractor(client, headers, ::genericExtractor, "https://supercdn.org") } override fun videoListParse(response: Response): List<Video> { val doc = response.asJsoup() - return doc.select("div.source-box > a").flatMap { - runCatching { - val data = it.attr("href").toHttpUrl().queryParameter("auth") - ?.let { Base64.decode(it, Base64.DEFAULT) } - ?.let(::String) - ?: return@flatMap emptyList() - val url = data.replace("\\", "").substringAfter("url\":\"").substringBefore('"') - genericExtractor(url) - }.getOrElse { emptyList() } + return doc.select("div.source-box > a").parallelCatchingFlatMapBlocking { + val data = it.attr("href").trim().toHttpUrl().queryParameter("auth") + ?.let { Base64.decode(it, Base64.DEFAULT) } + ?.let(::String) + ?: return@parallelCatchingFlatMapBlocking emptyList() + val url = data.replace("\\", "").substringAfter("url\":\"").substringBefore('"') + genericExtractor(url) } } private fun genericExtractor(url: String, language: String = ""): List<Video> { - val langSubstr = "[$language]" + val langSubstr = if (language.isBlank()) "" else "[$language] " return when { url.contains("superflix") -> superflixExtractor.videosFromUrl(url) url.contains("supercdn") -> supercdnExtractor.videosFromUrl(url) 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=") -> mystreamExtractor.videosFromUrl(url, language) url.contains("brbeast") -> - brbeastExtractor.videosFromUrl(url, language) + fireplayerExtractor.videosFromUrl(url = url, videoNameGen = { "${langSubstr}BrBeast - $it" }) url.contains("embedplayer") -> - embedplayerExtractor.videosFromUrl(url, language) + fireplayerExtractor.videosFromUrl(url = url, videoNameGen = { "${langSubstr}EmbedPlayer - $it" }) url.contains("superembeds") -> - superembedsExtractor.videosFromUrl(url, language) + fireplayerExtractor.videosFromUrl(url = url, videoNameGen = { "${langSubstr}SuperEmbeds - $it" }) url.contains("streamtape") -> - streamtapeExtractor.videosFromUrl(url, "$langSubstr Streamtape") + streamtapeExtractor.videosFromUrl(url, "${langSubstr}Streamtape") url.contains("filelions") -> - streamwishExtractor.videosFromUrl(url, videoNameGen = { "$langSubstr FileLions - $it" }) + streamwishExtractor.videosFromUrl(url, videoNameGen = { "${langSubstr}FileLions - $it" }) 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() } } diff --git a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/FireplayerExtractor.kt b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/FireplayerExtractor.kt deleted file mode 100644 index 98cf0104..00000000 --- a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/FireplayerExtractor.kt +++ /dev/null @@ -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" }) - } -} diff --git a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/PlayerFlixExtractor.kt b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/PlayerFlixExtractor.kt new file mode 100644 index 00000000..0dab9340 --- /dev/null +++ b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/PlayerFlixExtractor.kt @@ -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) } + } +} diff --git a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/SuperFlixExtractor.kt b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/SuperFlixExtractor.kt index 70d588bb..92a2dcbe 100644 --- a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/SuperFlixExtractor.kt +++ b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/extractors/SuperFlixExtractor.kt @@ -18,7 +18,7 @@ class SuperFlixExtractor( private val client: OkHttpClient, private val defaultHeaders: Headers, 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()