diff --git a/StremioProvider/src/main/kotlin/com/lagradost/StremioProvider.kt b/StremioProvider/src/main/kotlin/com/lagradost/StremioProvider.kt index c47d8b3..d406fe4 100644 --- a/StremioProvider/src/main/kotlin/com/lagradost/StremioProvider.kt +++ b/StremioProvider/src/main/kotlin/com/lagradost/StremioProvider.kt @@ -1,19 +1,17 @@ package com.lagradost import android.util.Log -import com.lagradost.StremioProvider.Companion.encodeUri import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.utils.AppUtils.toJson - import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson -import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.loadExtractor import org.json.JSONObject import java.net.URLEncoder -private const val TRACKER_LIST_URL = "https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt" +private const val TRACKER_LIST_URL = + "https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt" class StremioProvider : MainAPI() { override var mainUrl = "https://stremio.github.io/stremio-static-addon-example" @@ -46,7 +44,8 @@ class StremioProvider : MainAPI() { override suspend fun load(url: String): LoadResponse? { val res = tryParseJson(url) ?: throw RuntimeException(url) - return res.toLoadResponse(this) + val json = app.get("${mainUrl}/meta/${res.type}/${res.id}.json").parsedSafe()?.meta ?: throw RuntimeException(url) + return json.toLoadResponse(this) } override suspend fun loadLinks( @@ -77,8 +76,11 @@ class StremioProvider : MainAPI() { suspend fun search(query: String, provider: StremioProvider): List { val entries = mutableListOf() types.forEach { type -> - val res = tryParseJson(app.get("${provider.mainUrl}/catalog/${type.encodeUri()}/${id.encodeUri()}/search=${query.encodeUri()}.json").text) ?: return@forEach - res.metas.forEach { entry -> + val json = app.get("${provider.mainUrl}/catalog/${type}/${id}/search=${query}.json").text + val res = + tryParseJson(json) + ?: return@forEach + res.metas?.forEach { entry -> entries.add(entry.toSearchResponse(provider)) } } @@ -88,8 +90,11 @@ class StremioProvider : MainAPI() { suspend fun toHomePageList(provider: StremioProvider): HomePageList? { val entries = mutableListOf() types.forEach { type -> - val res = tryParseJson(app.get("${provider.mainUrl}/catalog/${type.encodeUri()}/${id.encodeUri()}.json").text) ?: return@forEach - res.metas.forEach { entry -> + val json = app.get("${provider.mainUrl}/catalog/${type}/${id}.json").text + val res = + tryParseJson(json) + ?: return@forEach + res.metas?.forEach { entry -> entries.add(entry.toSearchResponse(provider)) } } @@ -100,7 +105,7 @@ class StremioProvider : MainAPI() { } } - private data class CatalogResponse(val metas: List) + private data class CatalogResponse(val metas: List?,val meta: CatalogEntry?) private data class CatalogEntry( val name: String, val id: String, @@ -118,13 +123,14 @@ class StremioProvider : MainAPI() { posterUrl = poster } } + suspend fun toLoadResponse(provider: StremioProvider): LoadResponse { if (videos == null || videos.isEmpty()) { return provider.newMovieLoadResponse( name, - "${provider.mainUrl}/meta/${type?.encodeUri()}/${id.encodeUri()}.json", + "${provider.mainUrl}/meta/${type}/${id}.json", TvType.Others, - "${provider.mainUrl}/stream/${type?.encodeUri()}/${id.encodeUri()}.json" + "${provider.mainUrl}/stream/${type}/${id}.json" ) { posterUrl = poster plot = description @@ -132,7 +138,7 @@ class StremioProvider : MainAPI() { } else { return provider.newTvSeriesLoadResponse( name, - "${provider.mainUrl}/meta/${type?.encodeUri()}/${id.encodeUri()}.json", + "${provider.mainUrl}/meta/${type}/${id}.json", TvType.Others, videos.map { it.toEpisode(provider, type) @@ -146,10 +152,15 @@ class StremioProvider : MainAPI() { } } - private data class Video(val id: String, val title: String?, val thumbnail: String?, val overview: String?) { + private data class Video( + val id: String, + val title: String?, + val thumbnail: String?, + val overview: String? + ) { fun toEpisode(provider: StremioProvider, type: String?): Episode { return provider.newEpisode( - "${provider.mainUrl}/stream/${type?.encodeUri()}/${id.encodeUri()}.json" + "${provider.mainUrl}/stream/${type}/${id}.json" ) { this.name = title this.posterUrl = thumbnail @@ -169,13 +180,17 @@ class StremioProvider : MainAPI() { val infoHash: String?, val sources: List = emptyList() ) { - suspend fun runCallback(subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit) { + suspend fun runCallback( + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ) { if (url != null) { var referer: String? = null try { val headers = ((behaviorHints?.get("proxyHeaders") as? JSONObject) ?.get("request") as? JSONObject) - referer = headers?.get("referer") as? String ?: headers?.get("origin") as? String + referer = + headers?.get("referer") as? String ?: headers?.get("origin") as? String } catch (ex: Throwable) { Log.e("Stremio", Log.getStackTraceString(ex)) } @@ -183,13 +198,14 @@ class StremioProvider : MainAPI() { if (url.endsWith(".m3u8")) { callback.invoke( ExtractorLink( - name ?: "", - title ?: name ?: "", - url, + name ?: "", + title ?: name ?: "", + url, referer ?: "", - Qualities.Unknown.value, - isM3u8 = true - )) + Qualities.Unknown.value, + isM3u8 = true + ) + ) } else { callback.invoke( ExtractorLink( @@ -199,7 +215,8 @@ class StremioProvider : MainAPI() { referer ?: "", Qualities.Unknown.value, isM3u8 = false - )) + ) + ) } } if (ytId != null) { @@ -212,17 +229,13 @@ class StremioProvider : MainAPI() { val resp = app.get(TRACKER_LIST_URL).text val otherTrackers = resp .split("\n") - .filterIndexed{i, s -> i%2==0} - .filter{s -> !s.isNullOrEmpty()} - .map{it -> "&tr=$it"} - .joinToString("") - + .filterIndexed { i, s -> i % 2 == 0 } + .filter { s -> s.isNotEmpty() }.joinToString("") { "&tr=$it" } + val sourceTrackers = sources - .filter{it->it.startsWith("tracker:")} - .map{it->it.removePrefix("tracker:")} - .filter{s -> !s.isNullOrEmpty()} - .map{it -> "&tr=$it"} - .joinToString("") + .filter { it -> it.startsWith("tracker:") } + .map { it -> it.removePrefix("tracker:") } + .filter { s -> s.isNotEmpty() }.joinToString("") { "&tr=$it" } val magnet = "magnet:?xt=urn:btih:${infoHash}${sourceTrackers}${otherTrackers}" callback.invoke( @@ -239,6 +252,6 @@ class StremioProvider : MainAPI() { } companion object { - fun String.encodeUri() = URLEncoder.encode(this, "utf8") + fun String.encodeUri(): String = URLEncoder.encode(this, "utf8") } }