fix(ar/Anime4Up): fix episodes not loading/adding more sources (#1824)
This commit is contained in:
@ -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"
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user