From 8b11adcfadbbcb91c9d644468d31520db8c76c53 Mon Sep 17 00:00:00 2001
From: Dark25 <nadiecaca2000@gmail.com>
Date: Wed, 18 Sep 2024 20:56:29 +0200
Subject: [PATCH] Feat(lib/ChillxExtractor): Update extractor and add extractor
 to Hikari

---
 .../lib/chillxextractor/ChillxExtractor.kt    | 33 +++++++++++--------
 src/all/hikari/build.gradle                   |  3 +-
 .../animeextension/all/hikari/Hikari.kt       |  8 ++---
 3 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/lib/chillx-extractor/src/main/java/eu/kanade/tachiyomi/lib/chillxextractor/ChillxExtractor.kt b/lib/chillx-extractor/src/main/java/eu/kanade/tachiyomi/lib/chillxextractor/ChillxExtractor.kt
index daa73bff..2e4d7f82 100644
--- a/lib/chillx-extractor/src/main/java/eu/kanade/tachiyomi/lib/chillxextractor/ChillxExtractor.kt
+++ b/lib/chillx-extractor/src/main/java/eu/kanade/tachiyomi/lib/chillxextractor/ChillxExtractor.kt
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.lib.chillxextractor
 
 import eu.kanade.tachiyomi.animesource.model.Track
 import eu.kanade.tachiyomi.animesource.model.Video
-import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES.decryptWithSalt
+import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
 import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.util.parseAs
@@ -13,17 +13,18 @@ import kotlinx.serialization.json.Json
 import okhttp3.Headers
 import okhttp3.OkHttpClient
 import uy.kohesive.injekt.injectLazy
+import java.net.URI
 
 class ChillxExtractor(private val client: OkHttpClient, private val headers: Headers) {
     private val json: Json by injectLazy()
     private val playlistUtils by lazy { PlaylistUtils(client, headers) }
 
     companion object {
-        private val REGEX_MASTER_JS by lazy { Regex("""\s*=\s*'([^']+)""") }
-        private val REGEX_SOURCES by lazy { Regex("""sources:\s*\[\{"file":"([^"]+)""") }
-        private val REGEX_FILE by lazy { Regex("""file: ?"([^"]+)"""") }
-        private val REGEX_SOURCE by lazy { Regex("""source = ?"([^"]+)"""") }
-        private val REGEX_SUBS by lazy { Regex("""\[(.*?)\](https?://[^\s,]+)""") }
+        private val REGEX_MASTER_JS = Regex("""\s*=\s*'([^']+)""")
+        private val REGEX_SOURCES = Regex("""sources:\s*\[\{"file":"([^"]+)""")
+        private val REGEX_FILE = Regex("""file: ?"([^"]+)"""")
+        private val REGEX_SOURCE = Regex("""source = ?"([^"]+)"""")
+        private val REGEX_SUBS = Regex("""\[(.*?)\](https?://[^\s,]+)""")
         private const val KEY_SOURCE = "https://raw.githubusercontent.com/Rowdy-Avocado/multi-keys/keys/index.html"
     }
 
@@ -38,7 +39,7 @@ class ChillxExtractor(private val client: OkHttpClient, private val headers: Hea
         val master = REGEX_MASTER_JS.find(body)?.groupValues?.get(1) ?: return emptyList()
         val aesJson = json.decodeFromString<CryptoInfo>(master)
         val key = fetchKey() ?: throw ErrorLoadingException("Unable to get key")
-        val decryptedScript = decryptWithSalt(aesJson.ciphertext, aesJson.salt, key)
+        val decryptedScript = CryptoAES.decryptWithSalt(aesJson.ciphertext, aesJson.salt, key)
             .replace("\\n", "\n")
             .replace("\\", "")
 
@@ -74,18 +75,24 @@ class ChillxExtractor(private val client: OkHttpClient, private val headers: Hea
         }
     }
 
+    private fun String.getHost(): String {
+        return fixTitle(URI(this).host.substringBeforeLast(".").substringAfterLast("."))
+    }
+
+    private fun fixTitle(title: String): String {
+        return title.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
+    }
+
     @Serializable
     data class CryptoInfo(
-        @SerialName("ct")
-        val ciphertext: String,
-        @SerialName("s")
-        val salt: String,
+        @SerialName("ct") val ciphertext: String,
+        @SerialName("s") val salt: String,
     )
 
     @Serializable
     data class KeysData(
-        @SerialName("chillx")
-        val keys: List<String>
+        @SerialName("chillx") val keys: List<String>
     )
 }
+
 class ErrorLoadingException(message: String) : Exception(message)
diff --git a/src/all/hikari/build.gradle b/src/all/hikari/build.gradle
index 490edc08..23c6a56c 100644
--- a/src/all/hikari/build.gradle
+++ b/src/all/hikari/build.gradle
@@ -1,7 +1,7 @@
 ext {
     extName = 'Hikari'
     extClass = '.Hikari'
-    extVersionCode = 7
+    extVersionCode = 8
 }
 
 apply from: "$rootDir/common.gradle"
@@ -9,4 +9,5 @@ apply from: "$rootDir/common.gradle"
 dependencies {
     implementation(project(':lib:filemoon-extractor'))
     implementation(project(':lib:vidhide-extractor'))
+    implementation(project(':lib:chillx-extractor'))
 }
\ No newline at end of file
diff --git a/src/all/hikari/src/eu/kanade/tachiyomi/animeextension/all/hikari/Hikari.kt b/src/all/hikari/src/eu/kanade/tachiyomi/animeextension/all/hikari/Hikari.kt
index cc35e0cb..784ca2ec 100644
--- a/src/all/hikari/src/eu/kanade/tachiyomi/animeextension/all/hikari/Hikari.kt
+++ b/src/all/hikari/src/eu/kanade/tachiyomi/animeextension/all/hikari/Hikari.kt
@@ -14,6 +14,7 @@ import eu.kanade.tachiyomi.animesource.model.Video
 import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
 import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor
 import eu.kanade.tachiyomi.lib.vidhideextractor.VidHideExtractor
+import eu.kanade.tachiyomi.lib.chillxextractor.ChillxExtractor
 import eu.kanade.tachiyomi.network.GET
 import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking
 import eu.kanade.tachiyomi.util.parseAs
@@ -218,6 +219,7 @@ class Hikari : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
 
     private val filemoonExtractor by lazy { FilemoonExtractor(client) }
     private val vidHideExtractor by lazy { VidHideExtractor(client, headers) }
+    private val chillxExtractor by lazy { ChillxExtractor(client, headers) }
     private val embedRegex = Regex("""getEmbed\(\s*(\d+)\s*,\s*(\d+)\s*,\s*'(\d+)'""")
 
     override fun videoListRequest(episode: SEpisode): Request {
@@ -336,10 +338,8 @@ class Hikari : ParsedAnimeHttpSource(), ConfigurableAnimeSource {
 
     private fun getVideosFromEmbed(embedUrl: String, name: String): List<Video> = when {
         name.contains("vidhide", true) -> vidHideExtractor.videosFromUrl(embedUrl, videoNameGen = { s -> "$name - $s" })
-        embedUrl.contains("filemoon", true) -> {
-            filemoonExtractor.videosFromUrl(embedUrl, prefix = "$name - ", headers = headers)
-        }
-        else -> emptyList()
+        embedUrl.contains("filemoon", true) -> filemoonExtractor.videosFromUrl(embedUrl, prefix = "$name - ", headers = headers)
+        else -> chillxExtractor.videoFromUrl(embedUrl, referer = baseUrl, prefix = "$name - ")
     }
 
     override fun videoListSelector() = ".server-item:has(a[onclick~=getEmbed])"