forked from AlmightyHak/extensions-source
Fix(it/ANIMEWORLD): Update ANIMEWORLD.tv (#287)
This commit is contained in:
parent
f21d544722
commit
09270205a7
3 changed files with 17 additions and 77 deletions
|
@ -1,14 +1,15 @@
|
||||||
ext {
|
ext {
|
||||||
extName = 'ANIMEWORLD.tv'
|
extName = 'ANIMEWORLD.tv'
|
||||||
extClass = '.ANIMEWORLD'
|
extClass = '.ANIMEWORLD'
|
||||||
extVersionCode = 39
|
extVersionCode = 40
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(':lib:filemoon-extractor'))
|
|
||||||
implementation(project(':lib:streamtape-extractor'))
|
implementation(project(':lib:streamtape-extractor'))
|
||||||
implementation(project(':lib:dood-extractor'))
|
implementation(project(':lib:dood-extractor'))
|
||||||
|
implementation(project(':lib:streamhidevid-extractor'))
|
||||||
|
implementation(project(':lib:vidguard-extractor'))
|
||||||
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
|
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
|
||||||
}
|
}
|
|
@ -4,7 +4,6 @@ import android.app.Application
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.it.animeworld.extractors.StreamHideExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
|
@ -13,8 +12,9 @@ import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
||||||
import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor
|
import eu.kanade.tachiyomi.lib.streamhidevidextractor.StreamHideVidExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
||||||
|
import eu.kanade.tachiyomi.lib.vidguardextractor.VidGuardExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
@ -102,18 +102,13 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
if (copyrightError.hasText()) throw Exception(copyrightError.text())
|
if (copyrightError.hasText()) throw Exception(copyrightError.text())
|
||||||
|
|
||||||
val serverList = mutableListOf<Pair<String, String>>()
|
val serverList = mutableListOf<Pair<String, String>>()
|
||||||
|
|
||||||
val elements = document.select(videoListSelector())
|
|
||||||
val epId = document.selectFirst("div#player[data-episode-id]")?.attr("data-episode-id")
|
val epId = document.selectFirst("div#player[data-episode-id]")?.attr("data-episode-id")
|
||||||
|
|
||||||
val altServers = mutableListOf<Pair<String, String>>()
|
val altServers = mutableListOf<Pair<String, String>>()
|
||||||
val altList = listOf("StreamHide", "FileMoon")
|
|
||||||
document.select("div.servers > div.widget-title span.server-tab").forEach {
|
document.select("div.servers > div.widget-title span.server-tab").forEach {
|
||||||
val name = it.text()
|
val name = it.text()
|
||||||
if (altList.any { t -> t.contains(name, true) }) {
|
|
||||||
altServers.add(Pair(name, it.attr("data-name")))
|
altServers.add(Pair(name, it.attr("data-name")))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
altServers.forEach { serverPair ->
|
altServers.forEach { serverPair ->
|
||||||
val dataId = document.selectFirst("div.server[data-name=${serverPair.second}] li.episode a[data-episode-id=$epId]")?.attr("data-id")
|
val dataId = document.selectFirst("div.server[data-name=${serverPair.second}] li.episode a[data-episode-id=$epId]")?.attr("data-id")
|
||||||
|
@ -128,21 +123,16 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
.build()
|
.build()
|
||||||
val target = json.decodeFromString<ServerResponse>(
|
val target = json.decodeFromString<ServerResponse>(
|
||||||
client.newCall(GET(apiUrl, headers = apiHeaders)).execute().body.string(),
|
client.newCall(GET(apiUrl, headers = apiHeaders)).execute().body.string(),
|
||||||
).target
|
).grabber
|
||||||
serverList.add(Pair(serverPair.first, target))
|
serverList.add(Pair(serverPair.first, target))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (element in elements) {
|
|
||||||
val url = element.attr("href")
|
|
||||||
val name = element.text().substringAfter("ownload ").substringBefore(" ")
|
|
||||||
serverList.add(Pair(name, url))
|
|
||||||
}
|
|
||||||
|
|
||||||
val videoList = serverList.flatMap { server ->
|
val videoList = serverList.flatMap { server ->
|
||||||
val url = server.second
|
val url = server.second
|
||||||
|
val url2 = server.first
|
||||||
when {
|
when {
|
||||||
url.contains("streamingaw") -> {
|
url2.contains("AnimeWorld Server") -> {
|
||||||
listOf(Video(url, "AnimeWorld Server", url))
|
listOf(Video(url, "AnimeWorld Server", url))
|
||||||
}
|
}
|
||||||
url.contains("https://doo") -> {
|
url.contains("https://doo") -> {
|
||||||
|
@ -153,14 +143,14 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
StreamTapeExtractor(client).videoFromUrl(url.replace("/v/", "/e/"))
|
StreamTapeExtractor(client).videoFromUrl(url.replace("/v/", "/e/"))
|
||||||
?.let(::listOf)
|
?.let(::listOf)
|
||||||
}
|
}
|
||||||
url.contains("filemoon") -> {
|
url.contains("streamhide") -> {
|
||||||
FilemoonExtractor(client).videosFromUrl(url, prefix = "${server.first} - ", headers = headers)
|
StreamHideVidExtractor(client).videosFromUrl(url)
|
||||||
}
|
}
|
||||||
server.first.contains("streamhide", true) -> {
|
url.contains("vidguard") or url.contains("listeamed") -> {
|
||||||
StreamHideExtractor(client).videosFromUrl(url, headers)
|
VidGuardExtractor(client).videosFromUrl(url)
|
||||||
}
|
}
|
||||||
else -> null
|
else -> null
|
||||||
}.orEmpty()
|
} ?: emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
return videoList
|
return videoList
|
||||||
|
@ -518,8 +508,8 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
ListPreference(screen.context).apply {
|
ListPreference(screen.context).apply {
|
||||||
key = "preferred_server"
|
key = "preferred_server"
|
||||||
title = "Preferred server"
|
title = "Preferred server"
|
||||||
entries = arrayOf("Animeworld server", "FileMoon", "StreamHide", "Doodstream", "StreamTape")
|
entries = arrayOf("Animeworld server", "StreamHide", "Doodstream", "StreamTape", "VidGuard", "Listeamed")
|
||||||
entryValues = arrayOf("Animeworld server", "FileMoon", "StreamHide", "Doodstream", "StreamTape")
|
entryValues = arrayOf("Animeworld server", "StreamHide", "Doodstream", "StreamTape", "VidGuard", "Listeamed")
|
||||||
setDefaultValue("Animeworld server")
|
setDefaultValue("Animeworld server")
|
||||||
summary = "%s"
|
summary = "%s"
|
||||||
|
|
||||||
|
@ -537,5 +527,6 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
@Serializable
|
@Serializable
|
||||||
data class ServerResponse(
|
data class ServerResponse(
|
||||||
val target: String,
|
val target: String,
|
||||||
|
val grabber: String,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.animeextension.it.animeworld.extractors
|
|
||||||
|
|
||||||
import dev.datlag.jsunpacker.JsUnpacker
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class StreamHideExtractor(private val client: OkHttpClient) {
|
|
||||||
fun videosFromUrl(url: String, headers: Headers): List<Video> {
|
|
||||||
val videoList = mutableListOf<Video>()
|
|
||||||
|
|
||||||
val url = OkHttpClient().newBuilder().followRedirects(false).build()
|
|
||||||
.newCall(GET(url, headers)).execute().request.url.toString()
|
|
||||||
|
|
||||||
val packed = client.newCall(GET(url)).execute()
|
|
||||||
.asJsoup().selectFirst("script:containsData(eval)")?.data() ?: return emptyList()
|
|
||||||
val unpacked = JsUnpacker.unpackAndCombine(packed) ?: return emptyList()
|
|
||||||
val masterUrl = Regex("""file: ?"(.*?)"""").find(unpacked)?.groupValues?.get(1) ?: return emptyList()
|
|
||||||
|
|
||||||
val masterHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "*/*")
|
|
||||||
.add("Host", masterUrl.toHttpUrl().host)
|
|
||||||
.add("Origin", "https://${url.toHttpUrl().host}")
|
|
||||||
.add("Referer", "https://${url.toHttpUrl().host}/")
|
|
||||||
.build()
|
|
||||||
val masterPlaylist = client.newCall(
|
|
||||||
GET(masterUrl, headers = masterHeaders),
|
|
||||||
).execute().body.string()
|
|
||||||
|
|
||||||
val masterBase = "https://${masterUrl.toHttpUrl().host}${masterUrl.toHttpUrl().encodedPath}"
|
|
||||||
.substringBeforeLast("/") + "/"
|
|
||||||
|
|
||||||
masterPlaylist.substringAfter("#EXT-X-STREAM-INF:").split("#EXT-X-STREAM-INF:")
|
|
||||||
.forEach {
|
|
||||||
val quality = "StreamHide - " + it.substringAfter("RESOLUTION=").substringAfter("x").substringBefore(",") + "p "
|
|
||||||
val videoUrl = masterBase + it.substringAfter("\n").substringBefore("\n")
|
|
||||||
|
|
||||||
val videoHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "*/*")
|
|
||||||
.add("Host", videoUrl.toHttpUrl().host)
|
|
||||||
.add("Origin", "https://${url.toHttpUrl().host}")
|
|
||||||
.add("Referer", "https://${url.toHttpUrl().host}/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
videoList.add(Video(videoUrl, quality, videoUrl, headers = videoHeaders))
|
|
||||||
}
|
|
||||||
return videoList
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue