diff --git a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt index 5e7f060e..5c628582 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt @@ -22,6 +22,7 @@ import com.lagradost.cloudstream3.utils.UIHelper import com.lagradost.cloudstream3.utils.UIHelper.hasPIPPermission import com.lagradost.cloudstream3.utils.UIHelper.shouldShowPIPMode import com.lagradost.cloudstream3.utils.UIHelper.toPx +import org.schabi.newpipe.extractor.NewPipe import java.util.* object CommonActivity { @@ -115,6 +116,8 @@ object CommonActivity { act.hasPIPPermission() // CHECK IF FEATURE IS ENABLED IN SETTINGS act.updateLocale() + + NewPipe.init(DownloaderTestImpl.getInstance()) } private fun Activity.enterPIPMode() { diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index 1dd37b8f..daab7016 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -615,7 +615,6 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { loadCache() test() - NewPipe.init(DownloaderTestImpl.getInstance()) updateHasTrailers() /*nav_view.setOnNavigationItemSelectedListener { item -> when (item.itemId) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AllAnimeProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AllAnimeProvider.kt index e6888fa3..f3c91a33 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AllAnimeProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AllAnimeProvider.kt @@ -1,7 +1,6 @@ package com.lagradost.cloudstream3.animeproviders import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.LoadResponse.Companion.addActors import com.lagradost.cloudstream3.mvvm.safeApiCall @@ -165,7 +164,7 @@ class AllAnimeProvider : MainAPI() { res = app.get(link).text if (res.contains("PERSISTED_QUERY_NOT_FOUND")) return emptyList() } - val response = mapper.readValue(res) + val response = parseJson(res) val results = response.data.shows.edges.filter { // filtering in case there is an anime with 0 episodes available on the site. @@ -211,7 +210,7 @@ class AllAnimeProvider : MainAPI() { rhino.evaluateString(scope, js, "JavaScript", 1, null) val jsEval = scope.get("returnValue", scope) ?: return null - val showData = mapper.readValue(jsEval as String) + val showData = parseJson(jsEval as String) val title = showData.name val description = showData.description @@ -230,7 +229,7 @@ class AllAnimeProvider : MainAPI() { }) else null) } - val characters = soup.select("div.character > div.card-character-box")?.mapNotNull { + val characters = soup.select("div.character > div.card-character-box").mapNotNull { val img = it?.selectFirst("img")?.attr("src") ?: return@mapNotNull null val name = it.selectFirst("div > a")?.ownText() ?: return@mapNotNull null val role = when (it.selectFirst("div > .text-secondary")?.text()?.trim()) { @@ -333,7 +332,7 @@ class AllAnimeProvider : MainAPI() { callback: (ExtractorLink) -> Unit ): Boolean { var apiEndPoint = - mapper.readValue(app.get("$mainUrl/getVersion").text).episodeIframeHead + parseJson(app.get("$mainUrl/getVersion").text).episodeIframeHead if (apiEndPoint.endsWith("/")) apiEndPoint = apiEndPoint.slice(0 until apiEndPoint.length - 1) @@ -370,7 +369,7 @@ class AllAnimeProvider : MainAPI() { val response = app.get(link) if (response.code < 400) { - val links = mapper.readValue(response.text).links + val links = parseJson(response.text).links links.forEach { server -> if (server.hls != null && server.hls) { getM3u8Qualities( diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AnimePaheProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AnimePaheProvider.kt index 2cc790ca..58e744d9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AnimePaheProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AnimePaheProvider.kt @@ -7,6 +7,7 @@ import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.JsUnpacker import com.lagradost.cloudstream3.utils.getQualityFromName @@ -82,7 +83,7 @@ class AnimePaheProvider : MainAPI() { for (i in urls) { try { val response = app.get(i.first).text - val episodes = mapper.readValue(response).data.map { + val episodes = parseJson(response).data.map { newAnimeSearchResponse( it.animeTitle, "https://pahe.win/a/${it.animeId}?slug=${it.animeTitle}", @@ -127,7 +128,7 @@ class AnimePaheProvider : MainAPI() { val headers = mapOf("referer" to "$mainUrl/") val req = app.get(url, headers = headers).text - val data = req.let { mapper.readValue(it) } + val data = parseJson(req) for (anime in data.data) { if (anime.id == animeId) { return "https://animepahe.com/anime/${anime.session}" @@ -142,7 +143,7 @@ class AnimePaheProvider : MainAPI() { val headers = mapOf("referer" to "$mainUrl/") val req = app.get(url, headers = headers).text - val data = req.let { mapper.readValue(it) } + val data = parseJson(req) return data.data.map { newAnimeSearchResponse( @@ -188,7 +189,7 @@ class AnimePaheProvider : MainAPI() { val headers = mapOf("referer" to "$mainUrl/") val req = app.get(uri, headers = headers).text - val data = req.let { mapper.readValue(it) } + val data = parseJson(req) val lastPage = data.lastPage val perPage = data.perPage @@ -518,7 +519,7 @@ class AnimePaheProvider : MainAPI() { link = link.replace(regex, "") val req = app.get(link, headers = headers).text - val jsonResponse = req.let { mapper.readValue(it) } + val jsonResponse = parseJson(req) val ep = ((jsonResponse.data.map { if (it.episode == episodeNum) { it diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AnimekisaProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AnimekisaProvider.kt index dab8e406..91e1a133 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AnimekisaProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/AnimekisaProvider.kt @@ -72,7 +72,7 @@ class AnimekisaProvider : MainAPI() { val title = it.selectFirst("h3 a")?.text() ?: "" val url = it.selectFirst("a.film-poster-ahref")?.attr("href") ?.replace("watch/", "anime/")?.replace( - Regex("(-episode-(\\d+)\\/\$|-episode-(\\d+)\$|-episode-full|-episode-.*-.(\\/|))"), + Regex("(-episode-(\\d+)/\$|-episode-(\\d+)\$|-episode-full|-episode-.*-.(/|))"), "" ) ?: return@mapNotNull null val poster = it.selectFirst(".film-poster img")?.attr("data-src") diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/DubbedAnimeProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/DubbedAnimeProvider.kt index 1219e3f4..d6ac927f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/DubbedAnimeProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/DubbedAnimeProvider.kt @@ -1,10 +1,10 @@ package com.lagradost.cloudstream3.animeproviders import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.APIHolder.unixTime import com.lagradost.cloudstream3.APIHolder.unixTimeMS +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName import org.jsoup.Jsoup @@ -117,7 +117,7 @@ class DubbedAnimeProvider : MainAPI() { val url = mainUrl + (if (isMovie) "/movies/jsonMovie" else "/xz/v3/jsonEpi") + ".php?slug=$slug&_=$unixTime" val response = app.get(url).text - val mapped = mapper.readValue(response) + val mapped = parseJson(response) return mapped.result.anime.first() } diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/MundoDonghuaProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/MundoDonghuaProvider.kt index 372bfb1a..cbdf9834 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/MundoDonghuaProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/MundoDonghuaProvider.kt @@ -1,14 +1,14 @@ package com.lagradost.cloudstream3.animeproviders import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.AppUtils.parseJson -import com.lagradost.cloudstream3.utils.AppUtils.toJson +import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.M3u8Helper.Companion.generateM3u8 +import com.lagradost.cloudstream3.utils.getAndUnpack +import com.lagradost.cloudstream3.utils.getQualityFromName +import com.lagradost.cloudstream3.utils.loadExtractor import java.util.* -import kotlin.collections.ArrayList class MundoDonghuaProvider : MainAPI() { diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/NineAnimeProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/NineAnimeProvider.kt index ae9a763c..43648764 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/NineAnimeProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/NineAnimeProvider.kt @@ -206,7 +206,7 @@ class NineAnimeProvider : MainAPI() { } } - override suspend fun search(query: String): List? { + override suspend fun search(query: String): List { val vrf = encodeVrf(query) //?language%5B%5D=${if (selectDub) "dubbed" else "subbed"}& val url = diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/TenshiProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/TenshiProvider.kt index 02bb6e00..0e4489e7 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/TenshiProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/TenshiProvider.kt @@ -2,10 +2,10 @@ package com.lagradost.cloudstream3.animeproviders import android.annotation.SuppressLint import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.network.DdosGuardKiller import com.lagradost.cloudstream3.network.getHeaders +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName import org.jsoup.nodes.Document @@ -253,7 +253,7 @@ class TenshiProvider : MainAPI() { } }) - val similarAnime = document.select("ul.anime-loop > li > a")?.mapNotNull { element -> + val similarAnime = document.select("ul.anime-loop > li > a").mapNotNull { element -> val href = element.attr("href") ?: return@mapNotNull null val title = element.selectFirst("> .overlay > .thumb-title")?.text() ?: return@mapNotNull null @@ -321,7 +321,7 @@ class TenshiProvider : MainAPI() { sourceHTML ) if (match != null) { - val qualities = mapper.readValue>( + val qualities = parseJson>( match.destructured.component1() .replace("'", "\"") .replace(Regex("""(\w+): """), "\"\$1\": ") diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/WatchCartoonOnlineProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/WatchCartoonOnlineProvider.kt index 940ad97c..ef393089 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/WatchCartoonOnlineProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/WatchCartoonOnlineProvider.kt @@ -1,8 +1,8 @@ package com.lagradost.cloudstream3.animeproviders import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities import org.jsoup.Jsoup @@ -238,7 +238,7 @@ class WatchCartoonOnlineProvider : MainAPI() { ) ) - val link = mapper.readValue(linkResponse.text) + val link = parseJson(linkResponse.text) val hdLink = "${link.server}/getvid?evid=${link.hd}" val sdLink = "${link.server}/getvid?evid=${link.enc}" diff --git a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/ZoroProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/ZoroProvider.kt index e24f10db..b74b113a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/animeproviders/ZoroProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/animeproviders/ZoroProvider.kt @@ -2,12 +2,12 @@ package com.lagradost.cloudstream3.animeproviders import android.util.Log import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId import com.lagradost.cloudstream3.movieproviders.SflixProvider.Companion.extractRabbitStream import com.lagradost.cloudstream3.movieproviders.SflixProvider.Companion.runSflixExtractorVerifierJob +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.ExtractorLink @@ -210,7 +210,7 @@ class ZoroProvider : MainAPI() { val animeId = URI(url).path.split("-").last() val episodes = Jsoup.parse( - mapper.readValue( + parseJson( app.get( "$mainUrl/ajax/v2/episode/list/$animeId" ).text @@ -223,7 +223,7 @@ class ZoroProvider : MainAPI() { } val actors = document.select("div.block-actors-content > div.bac-list-wrap > div.bac-item") - ?.mapNotNull { head -> + .mapNotNull { head -> val subItems = head.select(".per-info") ?: return@mapNotNull null if (subItems.isEmpty()) return@mapNotNull null var role: ActorRole? = null diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/XStreamCdn.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/XStreamCdn.kt index 7338f570..89f4ca67 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/XStreamCdn.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/XStreamCdn.kt @@ -1,9 +1,8 @@ package com.lagradost.cloudstream3.extractors import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.app -import com.lagradost.cloudstream3.mapper +import com.lagradost.cloudstream3.utils.AppUtils import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName @@ -73,7 +72,7 @@ open class XStreamCdn : ExtractorApi() { val text = this.text if (text.isEmpty()) return listOf() if (text == """{"success":false,"data":"Video not found or has been removed"}""") return listOf() - mapper.readValue(text)?.let { + AppUtils.parseJson(text)?.let { if (it.success && it.data != null) { it.data.forEach { data -> extractedLinksList.add( diff --git a/app/src/main/java/com/lagradost/cloudstream3/liveproviders/EjaTv.kt b/app/src/main/java/com/lagradost/cloudstream3/liveproviders/EjaTv.kt index f55b2087..9ee0af6b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/liveproviders/EjaTv.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/liveproviders/EjaTv.kt @@ -8,7 +8,7 @@ import com.lagradost.cloudstream3.utils.Qualities import org.jsoup.nodes.Element class EjaTv : MainAPI() { - override var mainUrl = "https://eja.tv/" + override var mainUrl = "https://eja.tv" override var name = "Eja.tv" // Universal language? @@ -25,6 +25,7 @@ class EjaTv : MainAPI() { val href = fixUrl(link.attr("href")) val img = this.selectFirst("div.thumb img") val lang = this.selectFirst(".card-title > a")?.attr("href")?.removePrefix("?country=") + ?.replace("int", "eu") //international -> European Union 🇪🇺 return LiveSearchResponse( // Kinda hack way to get the title img?.attr("alt")?.replaceFirst("Watch ", "") ?: return null, @@ -45,7 +46,6 @@ class EjaTv : MainAPI() { "Entertainment" to mapOf("language" to language, "category" to "Entertainment") ) return HomePageResponse(dataMap.apmap { (title, data) -> - println("ADDED isHorizontalImages") val document = app.post(mainUrl, data = data).document val shows = document.select("div.card-body").mapNotNull { it.toSearchResponse() diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyHDXyzProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyHDXyzProvider.kt index dca312d5..e14c01d0 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyHDXyzProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyHDXyzProvider.kt @@ -1,7 +1,7 @@ package com.lagradost.cloudstream3.movieproviders -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.loadExtractor @@ -20,17 +20,19 @@ class PinoyHDXyzProvider : MainAPI() { val document = app.get(mainUrl, referer = mainUrl).document val mainbody = document.getElementsByTag("body") - mainbody?.select("div.section-cotent.col-md-12.bordert")?.forEach { row -> + mainbody.select("div.section-cotent.col-md-12.bordert").forEach { row -> val title = row?.select("div.title-section.tt")?.text() ?: "" val elements = row?.select("li.img_frame.preview-tumb7")?.mapNotNull { // Get inner div from article val innerBody = it?.selectFirst("a") ?: return@mapNotNull null // Fetch details - val name = it.text()?.trim() - if (name.isNullOrBlank()) { return@mapNotNull null } + val name = it.text().trim() + if (name.isBlank()) { + return@mapNotNull null + } val link = innerBody.attr("href") ?: return@mapNotNull null - val image = fixUrlNull(innerBody.select("img")?.attr("src")) + val image = fixUrlNull(innerBody.select("img").attr("src")) //Log.i(this.name, "Result => (innerBody, image) ${innerBody} / ${image}") // Get Year from Link val rex = Regex("_(\\d+)_") @@ -60,7 +62,7 @@ class PinoyHDXyzProvider : MainAPI() { override suspend fun search(query: String): List { val url = "$mainUrl/search/?q=${query.replace(" ", "+")}" val document = app.get(url).document.select("div.portfolio-thumb") - return document?.mapNotNull { + return document.mapNotNull { if (it == null) { return@mapNotNull null } @@ -77,13 +79,13 @@ class PinoyHDXyzProvider : MainAPI() { posterUrl = image, year = year ) - }?.distinctBy { c -> c.url } ?: listOf() + }.distinctBy { c -> c.url } } override suspend fun load(url: String): LoadResponse { val doc = app.get(url).document val body = doc.getElementsByTag("body") - val inner = body?.select("div.info") + val inner = body.select("div.info") // Video links val listOfLinks: MutableList = mutableListOf() @@ -92,11 +94,11 @@ class PinoyHDXyzProvider : MainAPI() { var title = "" var year: Int? = null var tags: List? = null - val poster = fixUrlNull(inner?.select("div.portfolio-tumb.ph-link > img")?.attr("src")) + val poster = fixUrlNull(inner.select("div.portfolio-tumb.ph-link > img").attr("src")) //Log.i(this.name, "Result => (imgLinkCode) ${imgLinkCode}") - inner?.select("table")?.select("tr")?.forEach { + inner.select("table").select("tr").forEach { val td = it?.select("td") ?: return@forEach - val caption = td[0].text()?.lowercase() + val caption = td[0].text().lowercase() //Log.i(this.name, "Result => (caption) $caption") when (caption) { "name" -> { @@ -106,41 +108,45 @@ class PinoyHDXyzProvider : MainAPI() { var yearRes = td[1].toString() year = if (yearRes.isNotBlank()) { if (yearRes.contains("var year =")) { - yearRes = yearRes.substring(yearRes.indexOf("var year =") + "var year =".length) + yearRes = + yearRes.substring(yearRes.indexOf("var year =") + "var year =".length) //Log.i(this.name, "Result => (yearRes) $yearRes") yearRes = yearRes.substring(0, yearRes.indexOf(';')) .trim().removeSurrounding("'") } yearRes.toIntOrNull() - } else { null } + } else { + null + } } "genre" -> { - tags = td[1].select("a")?.mapNotNull { tag -> + tags = td[1].select("a").mapNotNull { tag -> tag?.text()?.trim() ?: return@mapNotNull null - }?.filter { a -> a.isNotBlank() } + }.filter { a -> a.isNotBlank() } } } } - var descript = body?.select("div.eText")?.text() + var descript = body.select("div.eText").text() if (!descript.isNullOrEmpty()) { try { descript = "(undefined_x_Polus+[.\\d+])".toRegex().replace(descript, "") descript = "(_x_Polus+[.\\d+])".toRegex().replace(descript, "") descript = descript.trim().removeSuffix("undefined").trim() - } catch (e: java.lang.Exception) { } + } catch (e: java.lang.Exception) { + } } // Add links hidden in description listOfLinks.addAll(fetchUrls(descript)) listOfLinks.forEach { link -> //Log.i(this.name, "Result => (hidden link) $link") - descript = descript?.replace(link, "") + descript = descript.replace(link, "") } // Try looking for episodes, for series val episodeList = ArrayList() - val bodyText = body?.select("div.section-cotent1.col-md-12")?.select("section") - ?.select("script")?.toString() ?: "" + val bodyText = body.select("div.section-cotent1.col-md-12").select("section") + .select("script").toString() //Log.i(this.name, "Result => (bodyText) ${bodyText}") "(?<=ses=\\(')(.*)(?='\\).split)".toRegex().find(bodyText)?.groupValues?.get(0).let { @@ -178,14 +184,14 @@ class PinoyHDXyzProvider : MainAPI() { } // Video links for Movie - body?.select("div.tabcontent > iframe")?.forEach { + body.select("div.tabcontent > iframe").forEach { val linkMain = it?.attr("src") if (!linkMain.isNullOrEmpty()) { listOfLinks.add(linkMain) //Log.i(this.name, "Result => (linkMain) $linkMain") } } - body?.select("div.tabcontent.hide > iframe")?.forEach { + body.select("div.tabcontent.hide > iframe").forEach { val linkMain = it?.attr("src") if (!linkMain.isNullOrEmpty()) { listOfLinks.add(linkMain) @@ -193,7 +199,7 @@ class PinoyHDXyzProvider : MainAPI() { } } - val extraLinks = body?.select("div.tabcontent.hide")?.text() + val extraLinks = body.select("div.tabcontent.hide").text() listOfLinks.addAll(fetchUrls(extraLinks)) val streamLinks = listOfLinks.distinct().toJson() @@ -218,7 +224,7 @@ class PinoyHDXyzProvider : MainAPI() { callback: (ExtractorLink) -> Unit ): Boolean { var count = 0 - mapper.readValue>(data).forEach { item -> + parseJson>(data).forEach { item -> val url = item.trim() if (url.isNotBlank()) { if (loadExtractor(url, mainUrl, subtitleCallback, callback)) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/VMoveeProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/VMoveeProvider.kt index 9f847fad..39a1c436 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/VMoveeProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/VMoveeProvider.kt @@ -1,8 +1,8 @@ package com.lagradost.cloudstream3.movieproviders import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName import org.jsoup.Jsoup @@ -75,7 +75,7 @@ class VMoveeProvider : MainAPI() { data = mapOf("action" to "doo_player_ajax", "post" to data, "nume" to "2", "type" to "movie") ).text - val ajax = mapper.readValue(post) + val ajax = parseJson(post) var realUrl = ajax.embedUrl if (realUrl.startsWith("//")) { realUrl = "https:$realUrl" @@ -90,7 +90,7 @@ class VMoveeProvider : MainAPI() { headers = mapOf("Referer" to request.url), data = mapOf("r" to "https://www.vmovee.watch/", "d" to "reeoov.tube") ).text - val apiData = mapper.readValue(apiResponse) + val apiData = parseJson(apiResponse) for (d in apiData.data) { callback.invoke( ExtractorLink( diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/WatchAsianProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/WatchAsianProvider.kt index 0e7e52b5..fbf3d9cf 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/WatchAsianProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/WatchAsianProvider.kt @@ -1,10 +1,10 @@ package com.lagradost.cloudstream3.movieproviders -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.animeproviders.GogoanimeProvider.Companion.extractVidstream import com.lagradost.cloudstream3.extractors.XStreamCdn import com.lagradost.cloudstream3.extractors.helper.AsianEmbedHelper +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.loadExtractor @@ -208,7 +208,7 @@ class WatchAsianProvider : MainAPI() { data } var count = 0 - mapper.readValue>(links).apmap { item -> + parseJson>(links).apmap { item -> count++ val url = fixUrl(item.trim()) //Log.i(this.name, "Result => (url) $url") diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/AniListApi.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/AniListApi.kt index 0490d3b5..606fee97 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/AniListApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/AniListApi.kt @@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.json.JsonMapper import com.fasterxml.jackson.module.kotlin.KotlinModule -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.AcraApplication.Companion.getKey import com.lagradost.cloudstream3.AcraApplication.Companion.getKeys @@ -14,6 +13,7 @@ import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.syncproviders.AccountManager import com.lagradost.cloudstream3.syncproviders.AuthAPI import com.lagradost.cloudstream3.syncproviders.SyncAPI +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.splitQuery import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson @@ -174,9 +174,6 @@ class AniListApi(index: Int) : AccountManager(index), SyncAPI { } companion object { - private val mapper = JsonMapper.builder().addModule(KotlinModule()) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).build()!! - private val aniListStatusString = arrayOf("CURRENT", "COMPLETED", "PAUSED", "DROPPED", "PLANNING", "REPEATING") @@ -489,7 +486,7 @@ class AniListApi(index: Int) : AccountManager(index), SyncAPI { }""" val data = postApi(q, true) - val d = mapper.readValue(data ?: return null) + val d = parseJson(data ?: return null) val main = d.data?.Media if (main?.mediaListEntry != null) { @@ -750,7 +747,7 @@ class AniListApi(index: Int) : AccountManager(index), SyncAPI { }""" val data = postApi(q) if (data.isNullOrBlank()) return null - val userData = mapper.readValue(data) + val userData = parseJson(data) val u = userData.data?.Viewer val user = AniListUser( u?.id, diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/MALApi.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/MALApi.kt index 2654f3de..ea27720a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/MALApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/MALApi.kt @@ -2,10 +2,6 @@ package com.lagradost.cloudstream3.syncproviders.providers import android.util.Base64 import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.databind.DeserializationFeature -import com.fasterxml.jackson.databind.json.JsonMapper -import com.fasterxml.jackson.module.kotlin.KotlinModule -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.AcraApplication.Companion.getKey import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser import com.lagradost.cloudstream3.AcraApplication.Companion.setKey @@ -16,6 +12,7 @@ import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.syncproviders.AccountManager import com.lagradost.cloudstream3.syncproviders.AuthAPI import com.lagradost.cloudstream3.syncproviders.SyncAPI +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.splitQuery import com.lagradost.cloudstream3.utils.DataStore.toKotlinObject import java.net.URL @@ -70,7 +67,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { "Authorization" to "Bearer $auth", ), cacheTime = 0 ).text - return mapper.readValue(res).data.map { + return parseJson(res).data.map { val node = it.node SyncAPI.SyncSearchResult( node.title, @@ -196,7 +193,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { "Authorization" to "Bearer $auth" ) ).text - return mapper.readValue(res).let { malAnime -> + return parseJson(res).let { malAnime -> SyncAPI.SyncResult( id = internalId.toString(), totalEpisodes = malAnime.numEpisodes, @@ -300,16 +297,13 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { openBrowser(request) } - private val mapper = JsonMapper.builder().addModule(KotlinModule()) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).build()!! - private var requestId = 0 private var codeVerifier = "" private fun storeToken(response: String) { try { if (response != "") { - val token = mapper.readValue(response) + val token = parseJson(response) setKey(accountId, MAL_UNIXTIME_KEY, (token.expires_in + unixTime)) setKey(accountId, MAL_REFRESH_TOKEN_KEY, token.refresh_token) setKey(accountId, MAL_TOKEN_KEY, token.access_token) @@ -474,7 +468,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { ), cacheTime = 0 ).text - return mapper.readValue(res) + return parseJson(res) } suspend fun setAllMalData() { @@ -490,7 +484,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { "Authorization" to "Bearer " + (getAuth() ?: return) ), cacheTime = 0 ).text - val values = mapper.readValue(res) + val values = parseJson(res) val titles = values.data.map { MalTitleHolder(it.list_status, it.node.id, it.node.title) } for (t in titles) { @@ -554,7 +548,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { ), cacheTime = 0 ).text - val user = mapper.readValue(res) + val user = parseJson(res) if (setSettings) { setKey(accountId, MAL_USER_KEY, user) registerAccount() @@ -600,7 +594,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { return if (res.isNullOrBlank()) { false } else { - val malStatus = mapper.readValue(res) + val malStatus = parseJson(res) if (allTitles.containsKey(id)) { val currentTitle = allTitles[id]!! allTitles[id] = MalTitleHolder(malStatus, id, currentTitle.name) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/BackupUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/BackupUtils.kt index 022b2285..c174a20a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/BackupUtils.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/BackupUtils.kt @@ -10,10 +10,10 @@ import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.FragmentActivity import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.mvvm.logError +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.DataStore.getDefaultSharedPrefs import com.lagradost.cloudstream3.utils.DataStore.getSharedPrefs import com.lagradost.cloudstream3.utils.DataStore.mapper @@ -152,7 +152,7 @@ object BackupUtils { ?: return@registerForActivityResult val restoredValue = - mapper.readValue(input) + parseJson(input.readBytes().toString()) activity.restore( restoredValue, restoreSettings = true, @@ -191,8 +191,8 @@ object BackupUtils { "content/unknown", ) ) - } catch (e : Exception) { - showToast(this,e.message) + } catch (e: Exception) { + showToast(this, e.message) logError(e) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt index 78bd213b..ebc5a58d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt @@ -24,6 +24,7 @@ import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.normalSafeApiCall +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import kotlinx.coroutines.runBlocking import java.io.File import kotlin.concurrent.thread @@ -65,9 +66,6 @@ class InAppUpdater { @JsonProperty("updateNodeId") val updateNodeId: String? ) - private val mapper = JsonMapper.builder().addModule(KotlinModule()) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).build() - private fun Activity.getAppUpdate(): Update { return try { val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) @@ -86,7 +84,7 @@ class InAppUpdater { val url = "https://api.github.com/repos/LagradOst/CloudStream-3/releases" val headers = mapOf("Accept" to "application/vnd.github.v3+json") val response = - mapper.readValue>(runBlocking { + parseJson>(runBlocking { app.get( url, headers = headers @@ -154,7 +152,7 @@ class InAppUpdater { val releaseUrl = "https://api.github.com/repos/LagradOst/CloudStream-3/releases" val headers = mapOf("Accept" to "application/vnd.github.v3+json") val response = - mapper.readValue>(app.get(releaseUrl, headers = headers).text) + parseJson>(app.get(releaseUrl, headers = headers).text) val found = response.lastOrNull { rel -> @@ -163,7 +161,7 @@ class InAppUpdater { val foundAsset = found?.assets?.getOrNull(0) val tagResponse = - mapper.readValue(app.get(tagUrl, headers = headers).text) + parseJson(app.get(tagUrl, headers = headers).text) val shouldUpdate = (getString(R.string.prerelease_commit_hash) != tagResponse.github_object.sha) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt index 993180c7..730c4b4f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt @@ -2,11 +2,10 @@ package com.lagradost.cloudstream3.utils import android.util.Log import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.animeproviders.AniflixProvider import com.lagradost.cloudstream3.app -import com.lagradost.cloudstream3.mapper import com.lagradost.cloudstream3.mvvm.logError +import com.lagradost.cloudstream3.utils.AppUtils.parseJson import java.util.concurrent.TimeUnit object SyncUtil { @@ -62,7 +61,7 @@ object SyncUtil { val url = "https://raw.githubusercontent.com/MALSync/MAL-Sync-Backup/master/data/pages/$site/$slug.json" val response = app.get(url, cacheTime = 1, cacheUnit = TimeUnit.DAYS).text - val mapped = mapper.readValue(response) + val mapped = parseJson(response) val overrideMal = mapped?.malId ?: mapped?.Mal?.id ?: mapped?.Anilist?.malId val overrideAnilist = mapped?.aniId ?: mapped?.Anilist?.id