feat: Added new lib extractor: fireplayer-extractor

This commit is contained in:
WebDitto 2024-10-16 14:17:48 -03:00
parent ec8981576a
commit aa2b5807d5
4 changed files with 41 additions and 22 deletions

View file

@ -0,0 +1,10 @@
plugins {
id("lib-android")
}
dependencies {
implementation("dev.datlag.jsunpacker:jsunpacker:1.0.1") {
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8")
}
implementation(project(":lib:playlist-utils"))
}

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.animeextension.pt.vizer.extractors
package eu.kanade.tachiyomi.lib.fireplayerextractor
import dev.datlag.jsunpacker.JsUnpacker
import eu.kanade.tachiyomi.animesource.model.Video
@ -8,29 +8,34 @@ import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
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,
)
}
class FireplayerExtractor(
private val client: OkHttpClient,
private val defaultHost: String? = null,
) {
fun videosFromUrl(
url: String,
videoNameGen: (String) -> String = { quality -> quality },
videoHost: String? = null,
): List<Video> {
val host = videoHost ?: defaultHost ?: "https://${url.toHttpUrl().host}"
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
val headers = Headers.Builder()
.set("X-Requested-With", "XMLHttpRequest")
.set("Referer", host)
.set("Origin", "https://${host.toHttpUrl().host}")
.set("X-Requested-With", "XMLHttpRequest")
.build()
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()
val script =
doc.selectFirst("script:containsData(eval):containsData(p,a,c,k,e,d)")?.data()
?.let(JsUnpacker::unpackAndCombine)
?: doc.selectFirst("script:containsData(FirePlayer)")?.data()
@ -51,6 +56,8 @@ class FireplayerExtractor(private val client: OkHttpClient, private val host: St
.substringBefore('"')
.replace("\\", "")
return playlistUtils.extractFromHls(masterUrl, videoNameGen = { "WarezCDN($lang) - $it" })
val playlistUtils = PlaylistUtils(client, headers)
return playlistUtils.extractFromHls(masterUrl, videoNameGen = videoNameGen)
}
}

View file

@ -8,6 +8,7 @@ ext {
apply from: "$rootDir/common.gradle"
dependencies {
implementation(project(':lib:fireplayer-extractor'))
implementation(project(':lib:mixdrop-extractor'))
implementation(project(':lib:playlist-utils'))
implementation(project(':lib:streamtape-extractor'))

View file

@ -10,7 +10,6 @@ import eu.kanade.tachiyomi.animeextension.pt.vizer.dto.SearchItemDto
import eu.kanade.tachiyomi.animeextension.pt.vizer.dto.SearchResultDto
import eu.kanade.tachiyomi.animeextension.pt.vizer.dto.VideoDto
import eu.kanade.tachiyomi.animeextension.pt.vizer.dto.VideoListDto
import eu.kanade.tachiyomi.animeextension.pt.vizer.extractors.FireplayerExtractor
import eu.kanade.tachiyomi.animeextension.pt.vizer.interceptor.WebViewResolver
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.animesource.model.SAnime
import eu.kanade.tachiyomi.animesource.model.SEpisode
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
import eu.kanade.tachiyomi.lib.fireplayerextractor.FireplayerExtractor
import eu.kanade.tachiyomi.lib.mixdropextractor.MixDropExtractor
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
import eu.kanade.tachiyomi.network.GET
@ -246,7 +246,7 @@ class Vizer : ConfigurableAnimeSource, AnimeHttpSource() {
private val mixdropExtractor by lazy { MixDropExtractor(client) }
private val streamtapeExtractor by lazy { StreamTapeExtractor(client) }
private val fireplayerExtractor by lazy { FireplayerExtractor(client, "https://basseqwevewcewcewecwcw.xyz") }
private val fireplayerExtractor by lazy { FireplayerExtractor(client) }
private fun getVideosFromObject(videoObj: VideoDto): List<Video> {
val hosters = videoObj.hosters ?: return emptyList()
@ -254,7 +254,8 @@ class Vizer : ConfigurableAnimeSource, AnimeHttpSource() {
val langPrefix = if (videoObj.lang == "1") "LEG" else "DUB"
return hosters.iterator().flatMap { (name, status) ->
if (status != 3) return@flatMap emptyList()
// Always try the warezcdn
if (status != 3 && name != "warezcdn") return@flatMap emptyList()
val url = getPlayerUrl(videoObj.id, name)
if (url.isNullOrBlank()) {
return emptyList()
@ -262,7 +263,7 @@ class Vizer : ConfigurableAnimeSource, AnimeHttpSource() {
when (name) {
"mixdrop" -> mixdropExtractor.videosFromUrl(url, langPrefix)
"streamtape" -> streamtapeExtractor.videosFromUrl(url, "StreamTape($langPrefix)")
"warezcdn" -> fireplayerExtractor.videosFromUrl(url, langPrefix)
"warezcdn" -> fireplayerExtractor.videosFromUrl(url, videoNameGen = { "WarezCDN($langPrefix) - $it" })
else -> emptyList()
}
}