From 09270205a754fdad4b2b31a1fabf201e7f4d8988 Mon Sep 17 00:00:00 2001
From: Dark25 <nadiecaca2000@gmail.com>
Date: Sat, 5 Oct 2024 02:03:28 +0200
Subject: [PATCH] Fix(it/ANIMEWORLD): Update ANIMEWORLD.tv (#287)

---
 src/it/animeworld/build.gradle                |  5 +-
 .../it/animeworld/ANIMEWORLD.kt               | 37 +++++--------
 .../extractors/StreamHideExtractor.kt         | 52 -------------------
 3 files changed, 17 insertions(+), 77 deletions(-)
 delete mode 100644 src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/extractors/StreamHideExtractor.kt

diff --git a/src/it/animeworld/build.gradle b/src/it/animeworld/build.gradle
index 29043c33..b3f00d73 100644
--- a/src/it/animeworld/build.gradle
+++ b/src/it/animeworld/build.gradle
@@ -1,14 +1,15 @@
 ext {
     extName = 'ANIMEWORLD.tv'
     extClass = '.ANIMEWORLD'
-    extVersionCode = 39
+    extVersionCode = 40
 }
 
 apply from: "$rootDir/common.gradle"
 
 dependencies {
-    implementation(project(':lib:filemoon-extractor'))
     implementation(project(':lib:streamtape-extractor'))
     implementation(project(':lib:dood-extractor'))
+    implementation(project(':lib:streamhidevid-extractor'))
+    implementation(project(':lib:vidguard-extractor'))
     implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
 }
\ No newline at end of file
diff --git a/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/ANIMEWORLD.kt b/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/ANIMEWORLD.kt
index 6725ce77..f1f6fd92 100644
--- a/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/ANIMEWORLD.kt
+++ b/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/ANIMEWORLD.kt
@@ -4,7 +4,6 @@ import android.app.Application
 import android.content.SharedPreferences
 import androidx.preference.ListPreference
 import androidx.preference.PreferenceScreen
-import eu.kanade.tachiyomi.animeextension.it.animeworld.extractors.StreamHideExtractor
 import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
 import eu.kanade.tachiyomi.animesource.model.AnimeFilter
 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.online.ParsedAnimeHttpSource
 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.vidguardextractor.VidGuardExtractor
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.util.asJsoup
 import kotlinx.serialization.Serializable
@@ -102,17 +102,12 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
         if (copyrightError.hasText()) throw Exception(copyrightError.text())
 
         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 altServers = mutableListOf<Pair<String, String>>()
-        val altList = listOf("StreamHide", "FileMoon")
         document.select("div.servers > div.widget-title span.server-tab").forEach {
             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 ->
@@ -128,21 +123,16 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
                     .build()
                 val target = json.decodeFromString<ServerResponse>(
                     client.newCall(GET(apiUrl, headers = apiHeaders)).execute().body.string(),
-                ).target
+                ).grabber
                 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 url = server.second
+            val url2 = server.first
             when {
-                url.contains("streamingaw") -> {
+                url2.contains("AnimeWorld Server") -> {
                     listOf(Video(url, "AnimeWorld Server", url))
                 }
                 url.contains("https://doo") -> {
@@ -153,14 +143,14 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
                     StreamTapeExtractor(client).videoFromUrl(url.replace("/v/", "/e/"))
                         ?.let(::listOf)
                 }
-                url.contains("filemoon") -> {
-                    FilemoonExtractor(client).videosFromUrl(url, prefix = "${server.first} - ", headers = headers)
+                url.contains("streamhide") -> {
+                    StreamHideVidExtractor(client).videosFromUrl(url)
                 }
-                server.first.contains("streamhide", true) -> {
-                    StreamHideExtractor(client).videosFromUrl(url, headers)
+                url.contains("vidguard") or url.contains("listeamed") -> {
+                    VidGuardExtractor(client).videosFromUrl(url)
                 }
                 else -> null
-            }.orEmpty()
+            } ?: emptyList()
         }
 
         return videoList
@@ -518,8 +508,8 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
         ListPreference(screen.context).apply {
             key = "preferred_server"
             title = "Preferred server"
-            entries = arrayOf("Animeworld server", "FileMoon", "StreamHide", "Doodstream", "StreamTape")
-            entryValues = arrayOf("Animeworld server", "FileMoon", "StreamHide", "Doodstream", "StreamTape")
+            entries = arrayOf("Animeworld server", "StreamHide", "Doodstream", "StreamTape", "VidGuard", "Listeamed")
+            entryValues = arrayOf("Animeworld server", "StreamHide", "Doodstream", "StreamTape", "VidGuard", "Listeamed")
             setDefaultValue("Animeworld server")
             summary = "%s"
 
@@ -537,5 +527,6 @@ class ANIMEWORLD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
     @Serializable
     data class ServerResponse(
         val target: String,
+        val grabber: String,
     )
 }
diff --git a/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/extractors/StreamHideExtractor.kt b/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/extractors/StreamHideExtractor.kt
deleted file mode 100644
index bc04d2ae..00000000
--- a/src/it/animeworld/src/eu/kanade/tachiyomi/animeextension/it/animeworld/extractors/StreamHideExtractor.kt
+++ /dev/null
@@ -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
-    }
-}