fix(pt/pifansubs): Fix latest updates & video extractors (#2733)
This commit is contained in:
parent
daa397256c
commit
afb33b7e01
@ -1,4 +1,4 @@
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(':lib-gdriveplayer-extractor'))
|
implementation(project(':lib-streamhidevid-extractor'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.pifansubs
|
package eu.kanade.tachiyomi.animeextension.pt.pifansubs
|
||||||
|
|
||||||
import android.net.Uri
|
import eu.kanade.tachiyomi.animeextension.pt.pifansubs.extractors.BlembedExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.pifansubs.extractors.AdoroDoramasExtractor
|
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.pifansubs.extractors.JMVStreamExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.lib.gdriveplayerextractor.GdrivePlayerExtractor
|
import eu.kanade.tachiyomi.lib.streamhidevidextractor.StreamHideVidExtractor
|
||||||
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
|
||||||
@ -43,18 +41,13 @@ class PiFansubs : DooPlay(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val streamHideVidExtractor by lazy { StreamHideVidExtractor(client) }
|
||||||
|
private val blembedExtractor by lazy { BlembedExtractor(client, headers) }
|
||||||
|
|
||||||
private fun getPlayerVideos(url: String): List<Video> {
|
private fun getPlayerVideos(url: String): List<Video> {
|
||||||
return when {
|
return when {
|
||||||
"player.jmvstream" in url ->
|
"https://vidhide" in url -> streamHideVidExtractor.videosFromUrl(url)
|
||||||
JMVStreamExtractor(client).videosFromUrl(url)
|
"https://blembed" in url -> blembedExtractor.videosFromUrl(url)
|
||||||
"gdriveplayer." in url ->
|
|
||||||
GdrivePlayerExtractor(client).videosFromUrl(url, "GdrivePlayer", headers)
|
|
||||||
"https://adorodoramas.com" in url ->
|
|
||||||
AdoroDoramasExtractor(client).videosFromUrl(url)
|
|
||||||
"/jwplayer/?source" in url -> {
|
|
||||||
val videoUrl = Uri.parse(url).getQueryParameter("source")!!
|
|
||||||
listOf(Video(videoUrl, "JWPlayer", videoUrl, headers))
|
|
||||||
}
|
|
||||||
else -> emptyList<Video>()
|
else -> emptyList<Video>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,5 +60,5 @@ class PiFansubs : DooPlay(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// =============================== Latest ===============================
|
// =============================== Latest ===============================
|
||||||
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/episodes/page/$page", headers)
|
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/episodios/page/$page", headers)
|
||||||
}
|
}
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.pifansubs.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class AdoroDoramasExtractor(private val client: OkHttpClient) {
|
|
||||||
|
|
||||||
private val playerName = "AdoroDoramas"
|
|
||||||
|
|
||||||
fun videosFromUrl(url: String): List<Video> {
|
|
||||||
val body = client.newCall(GET(url)).execute()
|
|
||||||
.use { it.body.string() }
|
|
||||||
.substringAfter("sources: [")
|
|
||||||
.substringBefore("],")
|
|
||||||
return body.split("}").filter { it.isNotBlank() }.map {
|
|
||||||
val quality = it.substringAfter("size: ").substringBefore(" ") + "p"
|
|
||||||
val videoUrl = it.substringAfter("src: '").substringBefore("'")
|
|
||||||
Video(url, "$playerName - $quality", videoUrl)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,45 @@
|
|||||||
|
package eu.kanade.tachiyomi.animeextension.pt.pifansubs.extractors
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
import kotlinx.serialization.json.decodeFromStream
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Response
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
|
class BlembedExtractor(private val client: OkHttpClient, private val headers: Headers) {
|
||||||
|
private val json: Json by injectLazy()
|
||||||
|
|
||||||
|
fun videosFromUrl(url: String): List<Video> {
|
||||||
|
val doc = client.newCall(GET(url, headers)).execute()
|
||||||
|
.use { it.asJsoup() }
|
||||||
|
|
||||||
|
val script = doc.selectFirst("script:containsData(player =)")
|
||||||
|
?.data()
|
||||||
|
?: return emptyList()
|
||||||
|
|
||||||
|
val token = script.substringAfter("kaken = \"").substringBefore('"')
|
||||||
|
val timestamp = System.currentTimeMillis().toString()
|
||||||
|
|
||||||
|
val reqUrl = "https://blembed.com/api/?$token&_=$timestamp"
|
||||||
|
val reqHeaders = headers.newBuilder().add("X-Requested-With", "XMLHttpRequest").build()
|
||||||
|
val res = client.newCall(GET(reqUrl, reqHeaders)).execute()
|
||||||
|
.parseAs<ResponseData>()
|
||||||
|
|
||||||
|
return res.sources.map { Video(it.file, "Blembed - ${it.label}", it.file, headers) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline fun <reified T> Response.parseAs(): T = use {
|
||||||
|
json.decodeFromStream(it.body.byteStream())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class ResponseData(val sources: List<VideoDto>) {
|
||||||
|
@Serializable
|
||||||
|
data class VideoDto(val file: String, val label: String)
|
||||||
|
}
|
@ -1,31 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.pifansubs.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class JMVStreamExtractor(private val client: OkHttpClient) {
|
|
||||||
|
|
||||||
private val regexPlaylist = Regex("src\":\"(\\S+?)\"")
|
|
||||||
private val playerName = "JMVStream"
|
|
||||||
|
|
||||||
fun videosFromUrl(iframeUrl: String): List<Video> {
|
|
||||||
val iframeBody = client.newCall(GET(iframeUrl)).execute()
|
|
||||||
.use { it.body.string() }
|
|
||||||
|
|
||||||
val playlistUrl = regexPlaylist.find(iframeBody)!!.groupValues.get(1)
|
|
||||||
val playlistData = client.newCall(GET(playlistUrl)).execute()
|
|
||||||
.use { it.body.string() }
|
|
||||||
|
|
||||||
val separator = "#EXT-X-STREAM-INF:"
|
|
||||||
return playlistData.substringAfter(separator).split(separator).map {
|
|
||||||
val quality = it.substringAfter("RESOLUTION=")
|
|
||||||
.substringAfter("x")
|
|
||||||
.substringBefore("\n")
|
|
||||||
.substringBefore(",") + "p"
|
|
||||||
val path = it.substringAfter("\n").substringBefore("\n")
|
|
||||||
val url = playlistUrl.replace("playlist.m3u8", path)
|
|
||||||
Video(url, "$playerName - $quality", url)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -23,7 +23,7 @@ class DooPlayGenerator : ThemeSourceGenerator {
|
|||||||
SingleLang("JetAnime", "https://ssl.jetanimes.com", "fr", isNsfw = false, overrideVersionCode = 2),
|
SingleLang("JetAnime", "https://ssl.jetanimes.com", "fr", isNsfw = false, overrideVersionCode = 2),
|
||||||
SingleLang("Kinoking", "https://kinoking.cc", "de", isNsfw = false, overrideVersionCode = 19),
|
SingleLang("Kinoking", "https://kinoking.cc", "de", isNsfw = false, overrideVersionCode = 19),
|
||||||
SingleLang("Multimovies", "https://multimovies.live", "en", isNsfw = false, overrideVersionCode = 13),
|
SingleLang("Multimovies", "https://multimovies.live", "en", isNsfw = false, overrideVersionCode = 13),
|
||||||
SingleLang("Pi Fansubs", "https://pifansubs.org", "pt-BR", isNsfw = true, overrideVersionCode = 17),
|
SingleLang("Pi Fansubs", "https://pifansubs.club", "pt-BR", isNsfw = true, overrideVersionCode = 18),
|
||||||
SingleLang("Pobreflix", "https://pobreflix.biz", "pt-BR", isNsfw = true, overrideVersionCode = 3),
|
SingleLang("Pobreflix", "https://pobreflix.biz", "pt-BR", isNsfw = true, overrideVersionCode = 3),
|
||||||
SingleLang("UniqueStream", "https://uniquestream.net", "en", isNsfw = false, overrideVersionCode = 2),
|
SingleLang("UniqueStream", "https://uniquestream.net", "en", isNsfw = false, overrideVersionCode = 2),
|
||||||
SingleLang("VoirCartoon", "https://voircartoon.com", "fr", isNsfw = true),
|
SingleLang("VoirCartoon", "https://voircartoon.com", "fr", isNsfw = true),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user