diff --git a/src/zh/hanime1/build.gradle b/src/zh/hanime1/build.gradle
index 52a349f0..85bc719b 100644
--- a/src/zh/hanime1/build.gradle
+++ b/src/zh/hanime1/build.gradle
@@ -1,7 +1,7 @@
 ext {
     extName = 'Hanime1'
     extClass = '.Hanime1'
-    extVersionCode = 3
+    extVersionCode = 4
     isNsfw = true
 }
 
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 49f297c0..ab8e354b 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
@@ -24,6 +24,7 @@ import kotlinx.serialization.json.Json
 import kotlinx.serialization.json.JsonElement
 import kotlinx.serialization.json.jsonObject
 import kotlinx.serialization.json.jsonPrimitive
+import okhttp3.Cookie
 import okhttp3.HttpUrl.Companion.toHttpUrl
 import okhttp3.Interceptor
 import okhttp3.Request
@@ -100,13 +101,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 {
+                // Try to find the source from the 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)
@@ -137,7 +148,7 @@ class Hanime1 : AnimeHttpSource(), ConfigurableAnimeSource {
                 }
             }
         } else {
-            jsoup.select(".search-videos").map {
+            jsoup.select("a:not([target]) > .search-videos").map {
                 SAnime.create().apply {
                     setUrlWithoutDomain(it.parent()!!.attr("href"))
                     thumbnail_url = it.select("img").attr("src")
@@ -277,25 +288,50 @@ class Hanime1 : AnimeHttpSource(), ConfigurableAnimeSource {
     }
 
     override fun setupPreferenceScreen(screen: PreferenceScreen) {
-        screen.addPreference(
-            ListPreference(screen.context).apply {
-                key = PREF_KEY_VIDEO_QUALITY
-                title = "設置首選畫質"
-                entries = arrayOf("1080P", "720P", "480P")
-                entryValues = entries
-                setDefaultValue(DEFAULT_QUALITY)
-                summary =
-                    "當前選擇:${preferences.getString(PREF_KEY_VIDEO_QUALITY, DEFAULT_QUALITY)}"
-                setOnPreferenceChangeListener { _, newValue ->
-                    summary = "當前選擇:${newValue as String}"
-                    true
-                }
-            },
-        )
+        screen.apply {
+            addPreference(
+                ListPreference(context).apply {
+                    key = PREF_KEY_VIDEO_QUALITY
+                    title = "設置首選畫質"
+                    entries = arrayOf("1080P", "720P", "480P")
+                    entryValues = entries
+                    setDefaultValue(DEFAULT_QUALITY)
+                    summary =
+                        "當前選擇:${preferences.getString(PREF_KEY_VIDEO_QUALITY, DEFAULT_QUALITY)}"
+                    setOnPreferenceChangeListener { _, newValue ->
+                        summary = "當前選擇:${newValue as String}"
+                        true
+                    }
+                },
+            )
+            addPreference(
+                ListPreference(context).apply {
+                    key = PREF_KEY_LANG
+                    title = "設置首選語言"
+                    summary = "該設置僅影響影片字幕"
+                    entries = arrayOf("繁體中文", "簡體中文")
+                    entryValues = arrayOf("zh-CHT", "zh-CHS")
+                    setOnPreferenceChangeListener { _, newValue ->
+                        val baseHttpUrl = baseUrl.toHttpUrl()
+                        client.cookieJar.saveFromResponse(
+                            baseHttpUrl,
+                            listOf(
+                                Cookie.parse(
+                                    baseHttpUrl,
+                                    "user_lang=${newValue as String}",
+                                )!!,
+                            ),
+                        )
+                        true
+                    }
+                },
+            )
+        }
     }
 
     companion object {
         const val PREF_KEY_VIDEO_QUALITY = "PREF_KEY_VIDEO_QUALITY"
+        const val PREF_KEY_LANG = "PREF_KEY_LANG"
 
         const val PREF_KEY_GENRE_LIST = "PREF_KEY_GENRE_LIST"
         const val PREF_KEY_SORT_LIST = "PREF_KEY_SORT_LIST"