From 430ec3f5ada1ea10773a8667ef7a034cb7c25edb Mon Sep 17 00:00:00 2001
From: ZhendongWu <rsshinide38@gmail.com>
Date: Sat, 22 Mar 2025 07:33:26 +0800
Subject: [PATCH] Hanime1:Fix the missing source for some videos.

---
 .../tachiyomi/animeextension/zh/hanime1/Hanime1.kt | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt b/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt
index ea346d16..1d64d8ae 100644
--- a/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt
+++ b/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt
@@ -100,13 +100,23 @@ class Hanime1 : AnimeHttpSource(), ConfigurableAnimeSource {
     }
 
     override fun videoListParse(response: Response): List<Video> {
-        val sourceList = response.asJsoup().select("video source")
+        val doc = response.asJsoup()
+        val sourceList = doc.select("video source")
         val preferQuality = preferences.getString(PREF_KEY_VIDEO_QUALITY, DEFAULT_QUALITY)
         return sourceList.map {
             val quality = it.attr("size")
             val url = it.attr("src")
             Video(url, "${quality}P", videoUrl = url)
-        }.sortedByDescending { preferQuality == it.quality }
+        }.filterNot { it.videoUrl?.startsWith("blob") == true }
+            .sortedByDescending { preferQuality == it.quality }
+            .ifEmpty {
+                // found source from script content
+                val videoUrl = doc.select("script[type=application/ld+json]").first()!!.data().let {
+                    val info = json.decodeFromString<JsonElement>(it).jsonObject
+                    info["contentUrl"]!!.jsonPrimitive.content
+                }
+                listOf(Video(videoUrl, "Raw", videoUrl = videoUrl))
+            }
     }
 
     override fun latestUpdatesParse(response: Response): AnimesPage = searchAnimeParse(response)