fix(ar/Anime4Up): fix episodes not loading/adding more sources (#1824)

This commit is contained in:
adly98
2023-07-02 20:35:46 +03:00
committed by GitHub
parent 26f748e66e
commit 4a18a376a3
3 changed files with 77 additions and 112 deletions

View File

@ -5,13 +5,16 @@ ext {
extName = 'Anime4up'
pkgNameSuffix = 'ar.anime4up'
extClass = '.Anime4Up'
extVersionCode = 44
extVersionCode = 45
libVersion = '13'
}
dependencies {
implementation(project(':lib-streamsb-extractor'))
implementation(project(':lib-dood-extractor'))
implementation(project(':lib-voe-extractor'))
implementation(project(':lib-vidbom-extractor'))
implementation(project(':lib-okru-extractor'))
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
}

View File

@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.animeextension.ar.anime4up
import android.app.Application
import android.content.SharedPreferences
import android.util.Log
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.ar.anime4up.extractors.GdrivePlayerExtractor
import eu.kanade.tachiyomi.animeextension.ar.anime4up.extractors.MoshahdaExtractor
import eu.kanade.tachiyomi.animeextension.ar.anime4up.extractors.SharedExtractor
import eu.kanade.tachiyomi.animeextension.ar.anime4up.extractors.VidYardExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
@ -17,11 +17,19 @@ import eu.kanade.tachiyomi.animesource.model.SEpisode
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
import eu.kanade.tachiyomi.lib.vidbomextractor.VidBomExtractor
import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.FormBody
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonObject
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
@ -32,6 +40,7 @@ import org.jsoup.nodes.Element
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.lang.Exception
import java.util.Base64
class Anime4Up : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
@ -45,6 +54,10 @@ class Anime4Up : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val client: OkHttpClient = network.cloudflareClient
private val json = Json {
ignoreUnknownKeys = true
}
private val preferences: SharedPreferences by lazy {
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
}
@ -98,113 +111,66 @@ class Anime4Up : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// Video links
@RequiresApi(Build.VERSION_CODES.O)
override fun videoListParse(response: Response): List<Video> {
val document = response.asJsoup()
val iframe = document.select("iframe").attr("src")
if (iframe.contains("http")) {
val referer = response.request.url.encodedPath
val newHeaders = Headers.headersOf("referer", baseUrl + referer)
val iframeResponse = client.newCall(GET(iframe, newHeaders))
.execute().asJsoup()
return videosFromElement(iframeResponse.selectFirst(videoListSelector())!!)
} else {
val postUrl = document.select("form[method=post]").attr("action")
val ur = document.select("input[name=ur]").attr("value")
val wl = document.select("input[name=wl]").attr("value")
val dl = document.select("input[name=dl]").attr("value")
val moshahda = document.select("input[name=moshahda]").attr("value")
val submit = document.select("input[name=submit]").attr("value")
// POST data
val body = FormBody.Builder()
.add("dl", "$dl")
.add("moshahda", "$moshahda")
.add("submit", "$submit")
.add("ur", "$ur")
.add("wl", "$wl")
.build()
// Call POST
val referer = response.request.url.encodedPath
val newHeaders = Headers.headersOf("referer", "$postUrl")
val iframeResponse = client.newCall(POST(postUrl, newHeaders, body)).execute().asJsoup()
/*val iframe2 = iframe.select("li[data-i=moshahda] a").attr("data-ep-url")
val iframeResponse = client.newCall(GET(iframe2, newHeaders))
.execute().asJsoup()*/
return videosFromElement(iframeResponse)
val base64 = response.asJsoup().select("input[name=wl]").attr("value")
val jHash = String(Base64.getDecoder().decode(base64))
val parsedJ = json.decodeFromString<JsonObject>(jHash)
val streamLinks = parsedJ["fhd"]!!.jsonObject.entries + parsedJ["hd"]!!.jsonObject.entries + parsedJ["sd"]!!.jsonObject.entries
return streamLinks.distinctBy { it.key }.parallelMap {
val url = it.value.toString().replace("\"", "")
runCatching { extractVideos(url) }.getOrElse { emptyList() }
}.flatten()
}
private inline fun <A, B> Iterable<A>.parallelMap(crossinline f: suspend (A) -> B): List<B> =
runBlocking {
map { async(Dispatchers.Default) { f(it) } }.awaitAll()
}
private fun extractVideos(url: String): List<Video> {
return when {
url.contains("shared") -> {
SharedExtractor(client).videosFromUrl(url)?.let(::listOf)
}
url.contains("drive.google") -> {
val embedUrlG = "https://gdriveplayer.to/embed2.php?link=$url"
GdrivePlayerExtractor(client).videosFromUrl(embedUrlG)
}
url.contains("vidyard") -> {
val headers = headers.newBuilder()
.set("Referer", "https://play.vidyard.com")
.set("Accept-Encoding", "gzip, deflate, br")
.set("Accept-Language", "en-US,en;q=0.5")
.set("TE", "trailers")
.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0")
.build()
val id = url.substringAfter("com/").substringBefore("?")
val vidUrl = "https://play.vidyard.com/player/$id.json"
VidYardExtractor(client).videosFromUrl(vidUrl, headers)
}
url.contains("ok.ru") -> {
OkruExtractor(client).videosFromUrl(url)
}
url.contains("voe") -> {
VoeExtractor(client).videoFromUrl(url)?.let(::listOf)
}
Regex("(do*d(?:stream)?\\.(?:com?|watch|to|s[ho]|cx|la|w[sf]|pm|re|yt|stream))").containsMatchIn(url) -> {
DoodExtractor(client).videoFromUrl(url, "Dood mirror")?.let(::listOf)
}
Regex("(?:v[aie]d[bp][aoe]?m|myvii?d|v[aei]{1,2}dshar[er]?)\\.(?:com|net|org|xyz)").containsMatchIn(url) -> {
VidBomExtractor(client).videosFromUrl(url)
}
Regex("(?:view|watch|embed(?:tv)?|tube|player|cloudemb|japopav|javplaya|p1ayerjavseen|gomovizplay|stream(?:ovies)?|vidmovie|javside|aintahalu|finaltayibin|yahlusubh|taeyabathuna|)?s{0,2}b?(?:embed\\d?|play\\d?|video|fast|full|streams{0,3}|the|speed|l?anh|tvmshow|longvu|arslanrocky|chill|rity|hight|brisk|face|lvturbo|net|one|asian|ani|rapid|sonic|lona)?\\.(?:com|net|org|one|tv|xyz|fun|pro|sbs)").containsMatchIn(url)
-> {
StreamSBExtractor(client).videosFromUrl(url, headers)
}
else -> null
} ?: emptyList()
}
// override fun videoListSelector() = "script:containsData(m3u8)"
override fun videoListSelector() = "li[data-i] a"
private fun videosFromElement(element: Element): List<Video> {
val videoList = mutableListOf<Video>()
val elements = element.select(videoListSelector())
for (element in elements) {
val location = element.ownerDocument()!!.location()
val embedUrl = element.attr("data-ep-url")
val qualityy = element.text()
Log.i("embedUrl", "$embedUrl")
when {
embedUrl.contains("moshahda")
-> {
val headers = headers.newBuilder()
.set("referer", "https://gamertak.com/Watch1.php")
.build()
val videos = MoshahdaExtractor(client).videosFromUrl(embedUrl, headers)
videoList.addAll(videos)
}
embedUrl.contains("dood")
-> {
val video = DoodExtractor(client).videoFromUrl(embedUrl, qualityy)
if (video != null) {
videoList.add(video)
}
}
embedUrl.contains("drive.google")
-> {
val embedUrlG = "https://gdriveplayer.to/embed2.php?link=" + embedUrl
val videos = GdrivePlayerExtractor(client).videosFromUrl(embedUrlG)
videoList.addAll(videos)
}
embedUrl.contains("vidyard")
-> {
val headers = headers.newBuilder()
.set("Referer", "https://play.vidyard.com")
.set("Accept-Encoding", "gzip, deflate, br")
.set("Accept-Language", "en-US,en;q=0.5")
.set("TE", "trailers")
.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0")
.build()
val id = embedUrl.substringAfter("com/").substringBefore("?")
val vidUrl = "https://play.vidyard.com/player/" + id + ".json"
val videos = VidYardExtractor(client).videosFromUrl(vidUrl, headers)
videoList.addAll(videos)
}
embedUrl.contains("sbembed.com") || embedUrl.contains("sbembed1.com") || embedUrl.contains("sbplay.org") ||
embedUrl.contains("sbvideo.net") || embedUrl.contains("streamsb.net") || embedUrl.contains("sbplay.one") ||
embedUrl.contains("cloudemb.com") || embedUrl.contains("playersb.com") || embedUrl.contains("tubesb.com") ||
embedUrl.contains("sbplay1.com") || embedUrl.contains("embedsb.com") || embedUrl.contains("watchsb.com") ||
embedUrl.contains("sbplay2.com") || embedUrl.contains("japopav.tv") || embedUrl.contains("viewsb.com") ||
embedUrl.contains("sbfast") || embedUrl.contains("sbfull.com") || embedUrl.contains("javplaya.com") ||
embedUrl.contains("ssbstream.net") || embedUrl.contains("p1ayerjavseen.com") || embedUrl.contains("sbthe.com") ||
embedUrl.contains("vidmovie.xyz") || embedUrl.contains("sbspeed.com") || embedUrl.contains("streamsss.net") ||
embedUrl.contains("sblanh.com") || embedUrl.contains("tvmshow.com") || embedUrl.contains("sbanh.com") ||
embedUrl.contains("streamovies.xyz")
-> {
val videos = StreamSBExtractor(client).videosFromUrl(embedUrl, headers)
videoList.addAll(videos)
}
embedUrl.contains("4shared") -> {
val video = SharedExtractor(client).videoFromUrl(embedUrl, qualityy)
if (video != null) {
videoList.add(video)
}
}
}
}
return videoList
}
override fun List<Video>.sort(): List<Video> {
val quality = preferences.getString("preferred_quality", null)
if (quality != null) {

View File

@ -6,14 +6,10 @@ import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.OkHttpClient
class SharedExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
fun videosFromUrl(url: String, quality: String = "mirror"): Video? {
val document = client.newCall(GET(url)).execute().asJsoup()
val check = document.select("div.error4shared").text()
val videoUrl = document.select("source").attr("src")
return if (check.contains("This file is not available any more")) {
Video(url, "no 1video", "https")
} else {
Video(url, quality, videoUrl)
return document.selectFirst("source")?.let {
Video(it.attr("src"), "4Shared: $quality", it.attr("src"))
}
}
}