diff --git a/KuramanimeProvider/build.gradle.kts b/KuramanimeProvider/build.gradle.kts index 76e0b065..c9630bb2 100644 --- a/KuramanimeProvider/build.gradle.kts +++ b/KuramanimeProvider/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 21 +version = 22 cloudstream { diff --git a/KuramanimeProvider/src/main/kotlin/com/hexated/KuramanimeProvider.kt b/KuramanimeProvider/src/main/kotlin/com/hexated/KuramanimeProvider.kt index 9c2904b0..b29677b2 100644 --- a/KuramanimeProvider/src/main/kotlin/com/hexated/KuramanimeProvider.kt +++ b/KuramanimeProvider/src/main/kotlin/com/hexated/KuramanimeProvider.kt @@ -199,7 +199,7 @@ class KuramanimeProvider : MainAPI() { val token = res.select("meta[name=csrf-token]").attr("content") headers = mapOf( "Accept" to "application/json, text/javascript, */*; q=0.01", - "Authorization" to "Bearer YTNWeVlXMWhibWx0WlRwaVMwNUNTWFk1U1d4NVFsbDBObE5KWW10a1JWVXpkWFIzTTA5c05rcFJPSFJ6T2pFM01EQTFOemN5TnpBd01EQT0%3D", + "Authorization" to "Bearer ${getAuth()}", "X-Requested-With" to "XMLHttpRequest", "X-CSRF-TOKEN" to token ) @@ -224,6 +224,11 @@ class KuramanimeProvider : MainAPI() { return true } + private fun getAuth() : String { + val key = "kuramanime2:LEcXGYdOGcMCV8jM5fhRdM2mneSj6kaNts:${APIHolder.unixTimeMS};" + return base64Encode(base64Encode(key.toByteArray()).toByteArray()) + } + private suspend fun getMisc(): String { val misc = app.get( "$mainUrl/misc/post/EVhcpMNbO77acNZcHr2XVjaG8WAdNC1u", diff --git a/SoraStream/build.gradle.kts b/SoraStream/build.gradle.kts index 94c856cd..6824105e 100644 --- a/SoraStream/build.gradle.kts +++ b/SoraStream/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.konan.properties.Properties // use an integer for version numbers -version = 196 +version = 197 android { defaultConfig { diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt index 640c5db3..b27f2a26 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraExtractor.kt @@ -686,13 +686,19 @@ object SoraExtractor : SoraStream() { "$vidsrctoAPI/embed/tv/$imdbId/$season/$episode" } - val id = app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id") ?: return + val mediaId = app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id") ?: return - val subtitles = app.get("$vidsrctoAPI/ajax/embed/episode/$id/subtitles").text - tryParseJson>(subtitles)?.map { + app.get("$vidsrctoAPI/ajax/embed/episode/$mediaId/sources").parsedSafe()?.result?.apmap { + val encUrl = app.get("$vidsrctoAPI/ajax/embed/source/${it.id}").parsedSafe()?.result?.url + loadExtractor(vidsrctoDecrypt(encUrl ?: return@apmap), "$vidsrctoAPI/", subtitleCallback, callback) + } + + val subtitles = app.get("$vidsrctoAPI/ajax/embed/episode/$mediaId/subtitles").text + tryParseJson>(subtitles)?.map { subtitleCallback.invoke( SubtitleFile( - it.label ?: "", it.file ?: return@map + it.label ?: "", + it.file ?: return@map ) ) } @@ -1497,18 +1503,19 @@ object SoraExtractor : SoraStream() { val mediaLink = app.get(matchMedia?.first ?: return).document.selectFirst("a#jake1")?.attr("href") val detailDoc = app.get(mediaLink ?: return).document - val media = detailDoc.selectFirst("div.entry-content pre span")?.text()?.split("|") + val media = detailDoc.selectFirst("div.entry-content pre span")?.text() + ?.split("|") ?.map { it.trim() } val iframe = (if (season == null) { media?.mapIndexed { index, name -> - detailDoc.select("div.entry-content > pre")[index.plus(1)].selectFirst("a") + detailDoc.select("div.entry-content > h2")[index].selectFirst("a") ?.attr("href") to name } } else { media?.mapIndexed { index, name -> val linkMedia = - detailDoc.select("div.entry-content > pre")[index.plus(1)].selectFirst("a") + detailDoc.select("div.entry-content > h2")[index].selectFirst("a") ?.attr("href") app.get( linkMedia ?: return@mapIndexed null @@ -1518,25 +1525,19 @@ object SoraExtractor : SoraStream() { })?.filter { it?.first?.startsWith("http") == true } iframe?.apmap { - val token = app.get( - it?.first ?: return@apmap null - ).document.select("input[name=_csrf_token_645a83a41868941e4692aa31e7235f2]") - .attr("value") - val shortLink = app.post( - it.first ?: return@apmap null, - data = mapOf("_csrf_token_645a83a41868941e4692aa31e7235f2" to token) - ).document.selectFirst("a[rel=nofollow]")?.attr("href") + val iframeDoc = app.get(it?.first ?: return@apmap).document + val formUrl = iframeDoc.select("form").attr("action") + val formData = iframeDoc.select("form button").associate { v -> v.attr("name") to v.attr("value") } -// val videoUrl = extractRebrandly(shortLink ?: return@apmapIndexed null ) - val quality = - Regex("(\\d{3,4})p").find(it.second)?.groupValues?.getOrNull(1)?.toIntOrNull() + val videoUrl = app.post(formUrl, data = formData, referer = it.first).document.selectFirst("div.d-flex.justify-content-center.flex-wrap a")?.attr("href") + val quality = Regex("(\\d{3,4})p").find(it.second)?.groupValues?.getOrNull(1)?.toIntOrNull() val qualityName = it.second.replace("${quality}p", "").trim() callback.invoke( ExtractorLink( "$api", "$api $qualityName", - shortLink ?: return@apmap null, + videoUrl ?: return@apmap, "", quality ?: Qualities.Unknown.value ) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt index fee8e3b9..980ceb46 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraParser.kt @@ -162,7 +162,21 @@ data class WatchOnlineResponse( @JsonProperty("subtitles") val subtitles: ArrayList? = arrayListOf(), ) -data class FmoviesSubtitles( +data class VidsrctoResult( + @JsonProperty("id") val id: String? = null, + @JsonProperty("title") val title: String? = null, + @JsonProperty("url") val url: String? = null, +) + +data class VidsrctoResponse( + @JsonProperty("result") val result: VidsrctoResult? = null, +) + +data class VidsrctoSources( + @JsonProperty("result") val result: ArrayList? = arrayListOf(), +) + +data class VidsrctoSubtitles( @JsonProperty("label") val label: String? = null, @JsonProperty("file") val file: String? = null, ) diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt index fb532eb0..24337992 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStream.kt @@ -33,7 +33,6 @@ import com.hexated.SoraExtractor.invokeRidomovies import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies -import com.hexated.SoraExtractor.invokeGomovies import com.hexated.SoraExtractor.invokeHdmovies4u import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMultimovies @@ -682,9 +681,6 @@ open class SoraStream : TmdbProvider() { callback ) }, - { - if (!res.isAnime) invokeGomovies(res.title, res.year, res.season, res.episode, callback) - }, { if (!res.isAnime) invokeShowflix( res.title, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt index 9d832aa0..ecc42e58 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraStreamLite.kt @@ -22,7 +22,6 @@ import com.hexated.SoraExtractor.invokeRidomovies import com.hexated.SoraExtractor.invokeSmashyStream import com.hexated.SoraExtractor.invokeDumpStream import com.hexated.SoraExtractor.invokeEmovies -import com.hexated.SoraExtractor.invokeGomovies import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeNetmovies @@ -245,15 +244,6 @@ class SoraStreamLite : SoraStream() { callback ) }, - { - if (!res.isAnime) invokeGomovies( - res.title, - res.year, - res.season, - res.episode, - callback - ) - }, { invokeMoment(res.imdbId, res.season, res.episode, callback) }, diff --git a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt index 9a95bd77..e62f5006 100644 --- a/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt +++ b/SoraStream/src/main/kotlin/com/hexated/SoraUtils.kt @@ -1145,6 +1145,13 @@ fun String.decodePrimewireXor(key: String): String { return sb.toString() } +fun vidsrctoDecrypt(text: String): String { + val parse = Base64.decode(text.toByteArray(), Base64.URL_SAFE) + val cipher = Cipher.getInstance("RC4") + cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec("8z5Ag5wgagfsOuhz".toByteArray(), "RC4"), cipher.parameters) + return decode(cipher.doFinal(parse).toString(Charsets.UTF_8)) +} + fun String?.createSlug(): String? { return this?.replace(Regex("[^\\w\\s-]"), "") ?.replace(" ", "-")