Fix(it/ANIMEWORLD): Update ANIMEWORLD.tv #287

Merged
Dark25 merged 1 commit from AnimeWorld into main 2024-10-04 19:03:28 -05:00
3 changed files with 17 additions and 77 deletions

View file

@ -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"
} }

View file

@ -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,
) )
} }

View file

@ -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
}
}