Made the requests nicer and added sessions

This commit is contained in:
Blatzar 2021-12-05 17:22:30 +01:00
parent 1d1485a4ed
commit a50cb9a08d
49 changed files with 434 additions and 423 deletions

View file

@ -5,7 +5,6 @@ import android.content.Context
import android.widget.Toast import android.widget.Toast
import com.google.auto.service.AutoService import com.google.auto.service.AutoService
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
import org.acra.ReportField import org.acra.ReportField
import org.acra.config.CoreConfiguration import org.acra.config.CoreConfiguration
@ -29,7 +28,7 @@ class CustomReportSender : ReportSender {
thread { // to not run it on main thread thread { // to not run it on main thread
normalSafeApiCall { normalSafeApiCall {
val post = post(url, data = data) val post = app.post(url, data = data)
println("Report response: $post") println("Report response: $post")
} }
} }

View file

@ -29,7 +29,7 @@ import com.lagradost.cloudstream3.APIHolder.apis
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
import com.lagradost.cloudstream3.APIHolder.restrictedApis import com.lagradost.cloudstream3.APIHolder.restrictedApis
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.network.initRequestClient import com.lagradost.cloudstream3.network.Requests
import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver
import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.OAuth2Apis import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.OAuth2Apis
import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.OAuth2accountApis import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.OAuth2accountApis
@ -71,6 +71,9 @@ const val VLC_FROM_PROGRESS = -2
const val VLC_EXTRA_POSITION_OUT = "extra_position" const val VLC_EXTRA_POSITION_OUT = "extra_position"
const val VLC_EXTRA_DURATION_OUT = "extra_duration" const val VLC_EXTRA_DURATION_OUT = "extra_duration"
const val VLC_LAST_ID_KEY = "vlc_last_open_id" const val VLC_LAST_ID_KEY = "vlc_last_open_id"
// Short name for requests client to make it nicer to use
var app = Requests()
class MainActivity : AppCompatActivity(), ColorPickerDialogListener { class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
override fun onColorSelected(dialogId: Int, color: Int) { override fun onColorSelected(dialogId: Int, color: Int) {
@ -509,7 +512,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
) // THEME IS SET BEFORE VIEW IS CREATED TO APPLY THE THEME TO THE MAIN VIEW ) // THEME IS SET BEFORE VIEW IS CREATED TO APPLY THE THEME TO THE MAIN VIEW
updateLocale() updateLocale()
initRequestClient() app.initClient(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
try { try {
if (isCastApiAvailable()) { if (isCastApiAvailable()) {

View file

@ -3,7 +3,6 @@ package com.lagradost.cloudstream3.animeproviders
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper import com.lagradost.cloudstream3.utils.M3u8Helper
@ -95,9 +94,9 @@ class AllAnimeProvider : MainAPI() {
override fun search(query: String): ArrayList<SearchResponse> { override fun search(query: String): ArrayList<SearchResponse> {
val link = val link =
"""$mainUrl/graphql?variables=%7B%22search%22%3A%7B%22allowAdult%22%3Afalse%2C%22query%22%3A%22$query%22%7D%2C%22limit%22%3A26%2C%22page%22%3A1%2C%22translationType%22%3A%22sub%22%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%229343797cc3d9e3f444e2d3b7db9a84d759b816a4d84512ea72d079f85bb96e98%22%7D%7D""" """$mainUrl/graphql?variables=%7B%22search%22%3A%7B%22allowAdult%22%3Afalse%2C%22query%22%3A%22$query%22%7D%2C%22limit%22%3A26%2C%22page%22%3A1%2C%22translationType%22%3A%22sub%22%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%229343797cc3d9e3f444e2d3b7db9a84d759b816a4d84512ea72d079f85bb96e98%22%7D%7D"""
var res = get(link).text var res = app.get(link).text
if (res.contains("PERSISTED_QUERY_NOT_FOUND")) { if (res.contains("PERSISTED_QUERY_NOT_FOUND")) {
res = get(link).text res = app.get(link).text
if (res.contains("PERSISTED_QUERY_NOT_FOUND")) return ArrayList() if (res.contains("PERSISTED_QUERY_NOT_FOUND")) return ArrayList()
} }
val response = mapper.readValue<AllAnimeQuery>(res) val response = mapper.readValue<AllAnimeQuery>(res)
@ -136,7 +135,7 @@ class AllAnimeProvider : MainAPI() {
rhino.optimizationLevel = -1 rhino.optimizationLevel = -1
val scope: Scriptable = rhino.initStandardObjects() val scope: Scriptable = rhino.initStandardObjects()
val html = get(url).text val html = app.get(url).text
val soup = Jsoup.parse(html) val soup = Jsoup.parse(html)
val script = soup.select("script").firstOrNull { val script = soup.select("script").firstOrNull {
@ -251,10 +250,10 @@ class AllAnimeProvider : MainAPI() {
subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
var apiEndPoint = mapper.readValue<ApiEndPoint>(get("$mainUrl/getVersion").text).episodeIframeHead var apiEndPoint = mapper.readValue<ApiEndPoint>(app.get("$mainUrl/getVersion").text).episodeIframeHead
if (apiEndPoint.endsWith("/")) apiEndPoint = apiEndPoint.slice(0 until apiEndPoint.length - 1) if (apiEndPoint.endsWith("/")) apiEndPoint = apiEndPoint.slice(0 until apiEndPoint.length - 1)
val html = get(data).text val html = app.get(data).text
val sources = Regex("""sourceUrl[:=]"(.+?)"""").findAll(html).toList() val sources = Regex("""sourceUrl[:=]"(.+?)"""").findAll(html).toList()
.map { URLDecoder.decode(it.destructured.component1().sanitize(), "UTF-8") } .map { URLDecoder.decode(it.destructured.component1().sanitize(), "UTF-8") }
@ -283,7 +282,7 @@ class AllAnimeProvider : MainAPI() {
} }
} else { } else {
link = apiEndPoint + URI(link).path + ".json?" + URI(link).query link = apiEndPoint + URI(link).path + ".json?" + URI(link).query
val response = get(link) val response = app.get(link)
if (response.code < 400) { if (response.code < 400) {
val links = mapper.readValue<AllAnimeVideoApiResponse>(response.text).links val links = mapper.readValue<AllAnimeVideoApiResponse>(response.text).links

View file

@ -1,7 +1,6 @@
package com.lagradost.cloudstream3.animeproviders package com.lagradost.cloudstream3.animeproviders
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
@ -37,7 +36,7 @@ class AnimeFlickProvider : MainAPI() {
override fun search(query: String): ArrayList<SearchResponse> { override fun search(query: String): ArrayList<SearchResponse> {
val link = "https://animeflick.net/search.php?search=$query" val link = "https://animeflick.net/search.php?search=$query"
val html = get(link).text val html = app.get(link).text
val doc = Jsoup.parse(html) val doc = Jsoup.parse(html)
return ArrayList(doc.select(".row.mt-2").map { return ArrayList(doc.select(".row.mt-2").map {
@ -57,7 +56,7 @@ class AnimeFlickProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val html = get(url).text val html = app.get(url).text
val doc = Jsoup.parse(html) val doc = Jsoup.parse(html)
val poster = mainUrl + doc.selectFirst("img.rounded").attr("src") val poster = mainUrl + doc.selectFirst("img.rounded").attr("src")
@ -93,7 +92,7 @@ class AnimeFlickProvider : MainAPI() {
subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
val html = get(data).text val html = app.get(data).text
val episodeRegex = Regex("""(https://.*?\.mp4)""") val episodeRegex = Regex("""(https://.*?\.mp4)""")
val links = episodeRegex.findAll(html).map { val links = episodeRegex.findAll(html).map {

View file

@ -27,7 +27,7 @@ class AnimePaheProvider : MainAPI() {
fun generateSession(): Boolean { fun generateSession(): Boolean {
if (cookies.isNotEmpty()) return true if (cookies.isNotEmpty()) return true
return try { return try {
val response = get("$MAIN_URL/") val response = app.get("$MAIN_URL/")
cookies = response.cookies cookies = response.cookies
true true
} catch (e: Exception) { } catch (e: Exception) {
@ -84,7 +84,7 @@ class AnimePaheProvider : MainAPI() {
val items = ArrayList<HomePageList>() val items = ArrayList<HomePageList>()
for (i in urls) { for (i in urls) {
try { try {
val response = get(i.first).text val response = app.get(i.first).text
val episodes = mapper.readValue<AnimePaheLatestReleases>(response).data.map { val episodes = mapper.readValue<AnimePaheLatestReleases>(response).data.map {
AnimeSearchResponse( AnimeSearchResponse(
@ -134,7 +134,7 @@ class AnimePaheProvider : MainAPI() {
val url = "$mainUrl/api?m=search&l=8&q=$title" val url = "$mainUrl/api?m=search&l=8&q=$title"
val headers = mapOf("referer" to "$mainUrl/") val headers = mapOf("referer" to "$mainUrl/")
val req = get(url, headers = headers).text val req = app.get(url, headers = headers).text
val data = req.let { mapper.readValue<AnimePaheSearch>(it) } val data = req.let { mapper.readValue<AnimePaheSearch>(it) }
for (anime in data.data) { for (anime in data.data) {
if (anime.id == animeId) { if (anime.id == animeId) {
@ -149,7 +149,7 @@ class AnimePaheProvider : MainAPI() {
val url = "$mainUrl/api?m=search&l=8&q=$query" val url = "$mainUrl/api?m=search&l=8&q=$query"
val headers = mapOf("referer" to "$mainUrl/") val headers = mapOf("referer" to "$mainUrl/")
val req = get(url, headers = headers).text val req = app.get(url, headers = headers).text
val data = req.let { mapper.readValue<AnimePaheSearch>(it) } val data = req.let { mapper.readValue<AnimePaheSearch>(it) }
return ArrayList(data.data.map { return ArrayList(data.data.map {
@ -200,7 +200,7 @@ class AnimePaheProvider : MainAPI() {
val uri = "$mainUrl/api?m=release&id=$id&sort=episode_asc&page=1" val uri = "$mainUrl/api?m=release&id=$id&sort=episode_asc&page=1"
val headers = mapOf("referer" to "$mainUrl/") val headers = mapOf("referer" to "$mainUrl/")
val req = get(uri, headers = headers).text val req = app.get(uri, headers = headers).text
val data = req.let { mapper.readValue<AnimePaheAnimeData>(it) } val data = req.let { mapper.readValue<AnimePaheAnimeData>(it) }
val lastPage = data.lastPage val lastPage = data.lastPage
@ -255,7 +255,7 @@ class AnimePaheProvider : MainAPI() {
val (animeId, animeTitle) = regex.find(url)!!.destructured val (animeId, animeTitle) = regex.find(url)!!.destructured
val link = getAnimeByIdAndTitle(animeTitle, animeId.toInt())!! val link = getAnimeByIdAndTitle(animeTitle, animeId.toInt())!!
val html = get(link).text val html = app.get(link).text
val doc = Jsoup.parse(html) val doc = Jsoup.parse(html)
val japTitle = doc.selectFirst("h2.japanese")?.text() val japTitle = doc.selectFirst("h2.japanese")?.text()
@ -270,14 +270,16 @@ class AnimePaheProvider : MainAPI() {
} }
val episodes = generateListOfEpisodes(url) val episodes = generateListOfEpisodes(url)
val year = """<strong>Aired:</strong>[^,]*, (\d+)""".toRegex().find(html)!!.destructured.component1() val year = """<strong>Aired:</strong>[^,]*, (\d+)""".toRegex()
.find(html)!!.destructured.component1()
.toIntOrNull() .toIntOrNull()
val status = when ("""<strong>Status:</strong>[^a]*a href=["']/anime/(.*?)["']""".toRegex() val status =
.find(html)!!.destructured.component1()) { when ("""<strong>Status:</strong>[^a]*a href=["']/anime/(.*?)["']""".toRegex()
"airing" -> ShowStatus.Ongoing .find(html)!!.destructured.component1()) {
"completed" -> ShowStatus.Completed "airing" -> ShowStatus.Ongoing
else -> null "completed" -> ShowStatus.Completed
} else -> null
}
val synopsis = doc.selectFirst(".anime-synopsis").text() val synopsis = doc.selectFirst(".anime-synopsis").text()
var anilistId: Int? = null var anilistId: Int? = null
@ -446,12 +448,12 @@ class AnimePaheProvider : MainAPI() {
} }
var responseCode = 302 var responseCode = 302
var adflyContent: Response? = null var adflyContent: AppResponse? = null
var tries = 0 var tries = 0
while (responseCode != 200 && tries < 20) { while (responseCode != 200 && tries < 20) {
adflyContent = get( adflyContent = app.get(
get(adflyUri, cookies = cookies, allowRedirects = false).url, app.get(adflyUri, cookies = cookies, allowRedirects = false).url,
cookies = cookies, cookies = cookies,
allowRedirects = false allowRedirects = false
) )
@ -467,20 +469,24 @@ class AnimePaheProvider : MainAPI() {
private fun getStreamUrlFromKwik(adflyUri: String): String { private fun getStreamUrlFromKwik(adflyUri: String): String {
val fContent = val fContent =
get(bypassAdfly(adflyUri), headers = mapOf("referer" to "https://kwik.cx/"), cookies = cookies) app.get(
bypassAdfly(adflyUri),
headers = mapOf("referer" to "https://kwik.cx/"),
cookies = cookies
)
cookies = cookies + fContent.cookies cookies = cookies + fContent.cookies
val (fullString, key, v1, v2) = KWIK_PARAMS_RE.find(fContent.text)!!.destructured val (fullString, key, v1, v2) = KWIK_PARAMS_RE.find(fContent.text)!!.destructured
val decrypted = decrypt(fullString, key, v1.toInt(), v2.toInt()) val decrypted = decrypt(fullString, key, v1.toInt(), v2.toInt())
val uri = KWIK_D_URL.find(decrypted)!!.destructured.component1() val uri = KWIK_D_URL.find(decrypted)!!.destructured.component1()
val tok = KWIK_D_TOKEN.find(decrypted)!!.destructured.component1() val tok = KWIK_D_TOKEN.find(decrypted)!!.destructured.component1()
var content: Response? = null var content: AppResponse? = null
var code = 419 var code = 419
var tries = 0 var tries = 0
while (code != 302 && tries < 20) { while (code != 302 && tries < 20) {
content = post( content = app.post(
uri, uri,
allowRedirects = false, allowRedirects = false,
data = mapOf("_token" to tok), data = mapOf("_token" to tok),
@ -508,7 +514,7 @@ class AnimePaheProvider : MainAPI() {
link = link.replace(regex, "") link = link.replace(regex, "")
val req = get(link, headers = headers).text val req = app.get(link, headers = headers).text
val jsonResponse = req.let { mapper.readValue<AnimePaheAnimeData>(it) } val jsonResponse = req.let { mapper.readValue<AnimePaheAnimeData>(it) }
val ep = ((jsonResponse.data.map { val ep = ((jsonResponse.data.map {
if (it.episode == episodeNum) { if (it.episode == episodeNum) {
@ -519,7 +525,7 @@ class AnimePaheProvider : MainAPI() {
}).filterNotNull())[0] }).filterNotNull())[0]
link = "$mainUrl/api?m=links&id=${ep.animeId}&session=${ep.session}&p=kwik" link = "$mainUrl/api?m=links&id=${ep.animeId}&session=${ep.session}&p=kwik"
} }
val req = get(link, headers = headers).text val req = app.get(link, headers = headers).text
val data = mapper.readValue<AnimePaheEpisodeLoadLinks>(req) val data = mapper.readValue<AnimePaheEpisodeLoadLinks>(req)
val qualities = ArrayList<ExtractorLink>() val qualities = ArrayList<ExtractorLink>()

View file

@ -5,7 +5,6 @@ import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.APIHolder.unixTime import com.lagradost.cloudstream3.APIHolder.unixTime
import com.lagradost.cloudstream3.APIHolder.unixTimeMS import com.lagradost.cloudstream3.APIHolder.unixTimeMS
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getQualityFromName import com.lagradost.cloudstream3.utils.getQualityFromName
@ -62,7 +61,7 @@ class DubbedAnimeProvider : MainAPI() {
) )
private fun parseDocumentTrending(url: String): List<SearchResponse> { private fun parseDocumentTrending(url: String): List<SearchResponse> {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
return document.select("li > a").map { return document.select("li > a").map {
val href = fixUrl(it.attr("href")) val href = fixUrl(it.attr("href"))
@ -81,7 +80,7 @@ class DubbedAnimeProvider : MainAPI() {
} }
private fun parseDocument(url: String, trimEpisode: Boolean = false): List<SearchResponse> { private fun parseDocument(url: String, trimEpisode: Boolean = false): List<SearchResponse> {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
return document.select("a.grid__link").map { return document.select("a.grid__link").map {
val href = fixUrl(it.attr("href")) val href = fixUrl(it.attr("href"))
@ -119,7 +118,7 @@ class DubbedAnimeProvider : MainAPI() {
private fun getAnimeEpisode(slug: String, isMovie: Boolean): EpisodeInfo { private fun getAnimeEpisode(slug: String, isMovie: Boolean): EpisodeInfo {
val url = val url =
mainUrl + (if (isMovie) "/movies/jsonMovie" else "/xz/v3/jsonEpi") + ".php?slug=$slug&_=$unixTime" mainUrl + (if (isMovie) "/movies/jsonMovie" else "/xz/v3/jsonEpi") + ".php?slug=$slug&_=$unixTime"
val response = get(url).text val response = app.get(url).text
val mapped = mapper.readValue<QueryEpisodeResultRoot>(response) val mapped = mapper.readValue<QueryEpisodeResultRoot>(response)
return mapped.result.anime.first() return mapped.result.anime.first()
} }
@ -135,7 +134,7 @@ class DubbedAnimeProvider : MainAPI() {
override fun quickSearch(query: String): List<SearchResponse> { override fun quickSearch(query: String): List<SearchResponse> {
val url = "$mainUrl/xz/searchgrid.php?p=1&limit=12&s=$query&_=$unixTime" val url = "$mainUrl/xz/searchgrid.php?p=1&limit=12&s=$query&_=$unixTime"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("div.grid__item > a") val items = document.select("div.grid__item > a")
if (items.isEmpty()) return ArrayList() if (items.isEmpty()) return ArrayList()
@ -167,7 +166,7 @@ class DubbedAnimeProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/search/$query" val url = "$mainUrl/search/$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("div.resultinner > a.resulta") val items = document.select("div.resultinner > a.resulta")
if (items.isEmpty()) return ArrayList() if (items.isEmpty()) return ArrayList()
@ -216,7 +215,7 @@ class DubbedAnimeProvider : MainAPI() {
}.toList()) }.toList())
for (hl in hls) { for (hl in hls) {
try { try {
val sources = get("$mainUrl/xz/api/playeri.php?url=$hl&_=$unixTime").text val sources = app.get("$mainUrl/xz/api/playeri.php?url=$hl&_=$unixTime").text
val find = "src=\"(.*?)\".*?label=\"(.*?)\"".toRegex().find(sources) val find = "src=\"(.*?)\".*?label=\"(.*?)\"".toRegex().find(sources)
if (find != null) { if (find != null) {
val quality = find.groupValues[2] val quality = find.groupValues[2]
@ -254,12 +253,13 @@ class DubbedAnimeProvider : MainAPI() {
null null
) )
} else { } else {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val title = document.selectFirst("h4").text() val title = document.selectFirst("h4").text()
val descriptHeader = document.selectFirst("div.animeDescript") val descriptHeader = document.selectFirst("div.animeDescript")
val descript = descriptHeader.selectFirst("> p").text() val descript = descriptHeader.selectFirst("> p").text()
val year = descriptHeader.selectFirst("> div.distatsx > div.sroverd").text().replace("Released: ", "") val year = descriptHeader.selectFirst("> div.distatsx > div.sroverd").text()
.replace("Released: ", "")
.toIntOrNull() .toIntOrNull()
val episodes = document.select("a.epibloks").map { val episodes = document.select("a.epibloks").map {

View file

@ -1,7 +1,6 @@
package com.lagradost.cloudstream3.animeproviders package com.lagradost.cloudstream3.animeproviders
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.network.url import com.lagradost.cloudstream3.network.url
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -72,12 +71,12 @@ class GogoanimeProvider : MainAPI() {
for (i in urls) { for (i in urls) {
try { try {
val params = mapOf("page" to "1", "type" to i.first) val params = mapOf("page" to "1", "type" to i.first)
val html = get( val html = app.get(
"https://ajax.gogo-load.com/ajax/page-recent-release.html", "https://ajax.gogo-load.com/ajax/page-recent-release.html",
headers = headers, headers = headers,
params = params params = params
).text )
items.add(HomePageList(i.second, (parseRegex.findAll(html).map { items.add(HomePageList(i.second, (parseRegex.findAll(html.text).map {
val (link, epNum, title, poster) = it.destructured val (link, epNum, title, poster) = it.destructured
val isSub = listOf(1, 3).contains(i.first.toInt()) val isSub = listOf(1, 3).contains(i.first.toInt())
AnimeSearchResponse( AnimeSearchResponse(
@ -105,7 +104,7 @@ class GogoanimeProvider : MainAPI() {
override fun search(query: String): ArrayList<SearchResponse> { override fun search(query: String): ArrayList<SearchResponse> {
val link = "$mainUrl/search.html?keyword=$query" val link = "$mainUrl/search.html?keyword=$query"
val html = get(link).text val html = app.get(link).text
val doc = Jsoup.parse(html) val doc = Jsoup.parse(html)
val episodes = doc.select(""".last_episodes li""").map { val episodes = doc.select(""".last_episodes li""").map {
@ -137,7 +136,7 @@ class GogoanimeProvider : MainAPI() {
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val link = getProperAnimeLink(url) val link = getProperAnimeLink(url)
val episodeloadApi = "https://ajax.gogo-load.com/ajax/load-list-episode" val episodeloadApi = "https://ajax.gogo-load.com/ajax/load-list-episode"
val html = get(link).text val html = app.get(link).text
val doc = Jsoup.parse(html) val doc = Jsoup.parse(html)
val animeBody = doc.selectFirst(".anime_info_body_bg") val animeBody = doc.selectFirst(".anime_info_body_bg")
@ -177,7 +176,7 @@ class GogoanimeProvider : MainAPI() {
val animeId = doc.selectFirst("#movie_id").attr("value") val animeId = doc.selectFirst("#movie_id").attr("value")
val params = mapOf("ep_start" to "0", "ep_end" to "2000", "id" to animeId) val params = mapOf("ep_start" to "0", "ep_end" to "2000", "id" to animeId)
val responseHTML = get(episodeloadApi, params = params).text val responseHTML = app.get(episodeloadApi, params = params).text
val epiDoc = Jsoup.parse(responseHTML) val epiDoc = Jsoup.parse(responseHTML)
val episodes = epiDoc.select("a").map { val episodes = epiDoc.select("a").map {
AnimeEpisode( AnimeEpisode(
@ -200,13 +199,13 @@ class GogoanimeProvider : MainAPI() {
} }
private fun extractVideos(uri: String): List<ExtractorLink> { private fun extractVideos(uri: String): List<ExtractorLink> {
val html = get(uri).text val html = app.get(uri).text
val doc = Jsoup.parse(html) val doc = Jsoup.parse(html)
val iframe = "https:" + doc.selectFirst("div.play-video > iframe").attr("src") val iframe = "https:" + doc.selectFirst("div.play-video > iframe").attr("src")
val link = iframe.replace("streaming.php", "download") val link = iframe.replace("streaming.php", "download")
val page = get(link, headers = mapOf("Referer" to iframe)) val page = app.get(link, headers = mapOf("Referer" to iframe))
val pageDoc = Jsoup.parse(page.text) val pageDoc = Jsoup.parse(page.text)
return pageDoc.select(".dowload > a").pmap { return pageDoc.select(".dowload > a").pmap {

View file

@ -1,7 +1,6 @@
package com.lagradost.cloudstream3.animeproviders package com.lagradost.cloudstream3.animeproviders
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getQualityFromName import com.lagradost.cloudstream3.utils.getQualityFromName
@ -24,7 +23,7 @@ class KawaiifuProvider : MainAPI() {
override fun getMainPage(): HomePageResponse { override fun getMainPage(): HomePageResponse {
val items = ArrayList<HomePageList>() val items = ArrayList<HomePageList>()
val resp = get(mainUrl).text val resp = app.get(mainUrl).text
val soup = Jsoup.parse(resp) val soup = Jsoup.parse(resp)
@ -68,7 +67,7 @@ class KawaiifuProvider : MainAPI() {
override fun search(query: String): ArrayList<SearchResponse> { override fun search(query: String): ArrayList<SearchResponse> {
val link = "$mainUrl/search-movie?keyword=${query}" val link = "$mainUrl/search-movie?keyword=${query}"
val html = get(link).text val html = app.get(link).text
val soup = Jsoup.parse(html) val soup = Jsoup.parse(html)
return ArrayList(soup.select(".item").map { return ArrayList(soup.select(".item").map {
@ -89,7 +88,7 @@ class KawaiifuProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val html = get(url).text val html = app.get(url).text
val soup = Jsoup.parse(html) val soup = Jsoup.parse(html)
val title = soup.selectFirst(".title").text() val title = soup.selectFirst(".title").text()
@ -98,7 +97,7 @@ class KawaiifuProvider : MainAPI() {
.filter { it.select("strong").isEmpty() && it.select("iframe").isEmpty() }.joinToString("\n") { it.text() } .filter { it.select("strong").isEmpty() && it.select("iframe").isEmpty() }.joinToString("\n") { it.text() }
val year = url.split("/").filter { it.contains("-") }[0].split("-")[1].toIntOrNull() val year = url.split("/").filter { it.contains("-") }[0].split("-")[1].toIntOrNull()
val episodes = Jsoup.parse( val episodes = Jsoup.parse(
get( app.get(
soup.selectFirst("a[href*=\".html-episode\"]").attr("href") soup.selectFirst("a[href*=\".html-episode\"]").attr("href")
).text ).text
).selectFirst(".list-ep").select("li").map { ).selectFirst(".list-ep").select("li").map {
@ -124,7 +123,7 @@ class KawaiifuProvider : MainAPI() {
subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
val htmlSource = get(data).text val htmlSource = app.get(data).text
val soupa = Jsoup.parse(htmlSource) val soupa = Jsoup.parse(htmlSource)
val episodeNum = if (data.contains("ep=")) data.split("ep=")[1].split("&")[0].toIntOrNull() else null val episodeNum = if (data.contains("ep=")) data.split("ep=")[1].split("&")[0].toIntOrNull() else null
@ -144,7 +143,7 @@ class KawaiifuProvider : MainAPI() {
.map { source -> Pair(source.attr("src"), source.attr("data-quality")) } .map { source -> Pair(source.attr("src"), source.attr("data-quality")) }
Triple(it.first, sources, it.second.second) Triple(it.first, sources, it.second.second)
} else { } else {
val html = get(it.second.first).text val html = app.get(it.second.first).text
val soup = Jsoup.parse(html) val soup = Jsoup.parse(html)
val sources = soup.select("video > source") val sources = soup.select("video > source")

View file

@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getQualityFromName import com.lagradost.cloudstream3.utils.getQualityFromName
@ -52,7 +51,7 @@ class TenshiProvider : MainAPI() {
override fun getMainPage(): HomePageResponse { override fun getMainPage(): HomePageResponse {
val items = ArrayList<HomePageList>() val items = ArrayList<HomePageList>()
val soup = Jsoup.parse(get(mainUrl).text) val soup = Jsoup.parse(app.get(mainUrl).text)
for (section in soup.select("#content > section")) { for (section in soup.select("#content > section")) {
try { try {
if (section.attr("id") == "toplist-tabs") { if (section.attr("id") == "toplist-tabs") {
@ -200,7 +199,7 @@ class TenshiProvider : MainAPI() {
override fun search(query: String): ArrayList<SearchResponse> { override fun search(query: String): ArrayList<SearchResponse> {
val url = "$mainUrl/anime" val url = "$mainUrl/anime"
var response = get(url, params = mapOf("q" to query), cookies = mapOf("loop-view" to "thumb")).text var response = app.get(url, params = mapOf("q" to query), cookies = mapOf("loop-view" to "thumb")).text
var document = Jsoup.parse(response) var document = Jsoup.parse(response)
val returnValue = parseSearchPage(document) val returnValue = parseSearchPage(document)
@ -208,7 +207,7 @@ class TenshiProvider : MainAPI() {
while (!document.select("""a.page-link[rel="next"]""").isEmpty()) { while (!document.select("""a.page-link[rel="next"]""").isEmpty()) {
val link = document.select("""a.page-link[rel="next"]""") val link = document.select("""a.page-link[rel="next"]""")
if (link != null && !link.isEmpty()) { if (link != null && !link.isEmpty()) {
response = get(link[0].attr("href"), cookies = mapOf("loop-view" to "thumb")).text response = app.get(link[0].attr("href"), cookies = mapOf("loop-view" to "thumb")).text
document = Jsoup.parse(response) document = Jsoup.parse(response)
returnValue.addAll(parseSearchPage(document)) returnValue.addAll(parseSearchPage(document))
} else { } else {
@ -220,7 +219,7 @@ class TenshiProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
var response = get(url, cookies = mapOf("loop-view" to "thumb")).text var response = app.get(url, cookies = mapOf("loop-view" to "thumb")).text
var document = Jsoup.parse(response) var document = Jsoup.parse(response)
val englishTitle = document.selectFirst("span.value > span[title=\"English\"]")?.parent()?.text()?.trim() val englishTitle = document.selectFirst("span.value > span[title=\"English\"]")?.parent()?.text()?.trim()
@ -234,7 +233,7 @@ class TenshiProvider : MainAPI() {
if (totalEpisodePages != null && totalEpisodePages > 1) { if (totalEpisodePages != null && totalEpisodePages > 1) {
for (pageNum in 2..totalEpisodePages) { for (pageNum in 2..totalEpisodePages) {
response = get("$url?page=$pageNum", cookies = mapOf("loop-view" to "thumb")).text response = app.get("$url?page=$pageNum", cookies = mapOf("loop-view" to "thumb")).text
document = Jsoup.parse(response) document = Jsoup.parse(response)
episodeNodes.addAll(document.select("li[class*=\"episode\"] > a")) episodeNodes.addAll(document.select("li[class*=\"episode\"] > a"))
} }
@ -290,7 +289,7 @@ class TenshiProvider : MainAPI() {
subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
val response = get(data).text val response = app.get(data).text
val soup = Jsoup.parse(response) val soup = Jsoup.parse(response)
data class Quality( data class Quality(
@ -301,7 +300,7 @@ class TenshiProvider : MainAPI() {
val sources = ArrayList<ExtractorLink>() val sources = ArrayList<ExtractorLink>()
for (source in soup.select("""[aria-labelledby="mirror-dropdown"] > li > a.dropdown-item""")) { for (source in soup.select("""[aria-labelledby="mirror-dropdown"] > li > a.dropdown-item""")) {
val release = source.text().replace("/", "").trim() val release = source.text().replace("/", "").trim()
val sourceHTML = get( val sourceHTML = app.get(
"https://tenshi.moe/embed?v=${source.attr("href").split("v=")[1].split("&")[0]}", "https://tenshi.moe/embed?v=${source.attr("href").split("v=")[1].split("&")[0]}",
headers = mapOf("Referer" to data) headers = mapOf("Referer" to data)
).text ).text

View file

@ -3,8 +3,6 @@ package com.lagradost.cloudstream3.animeproviders
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
@ -32,7 +30,7 @@ class WatchCartoonOnlineProvider : MainAPI() {
val url = "https://www.wcostream.com/search" val url = "https://www.wcostream.com/search"
var response = var response =
post( app.post(
url, url,
headers = mapOf("Referer" to url), headers = mapOf("Referer" to url),
data = mapOf("catara" to query, "konuara" to "series") data = mapOf("catara" to query, "konuara" to "series")
@ -71,7 +69,7 @@ class WatchCartoonOnlineProvider : MainAPI() {
// "episodes-search", is used for finding movies, anime episodes should be filtered out // "episodes-search", is used for finding movies, anime episodes should be filtered out
response = response =
post( app.post(
url, url,
headers = mapOf("Referer" to url), headers = mapOf("Referer" to url),
data = mapOf("catara" to query, "konuara" to "episodes") data = mapOf("catara" to query, "konuara" to "episodes")
@ -105,7 +103,7 @@ class WatchCartoonOnlineProvider : MainAPI() {
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val isMovie = !url.contains("/anime/") val isMovie = !url.contains("/anime/")
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
return if (!isMovie) { return if (!isMovie) {
@ -195,7 +193,7 @@ class WatchCartoonOnlineProvider : MainAPI() {
subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
val response = get(data).text val response = app.get(data).text
/*val embedUrl = fixUrl( /*val embedUrl = fixUrl(
Regex("itemprop=\"embedURL\" content=\"(.*?)\"").find(response.text)?.groupValues?.get(1) ?: return false Regex("itemprop=\"embedURL\" content=\"(.*?)\"").find(response.text)?.groupValues?.get(1) ?: return false
)*/ )*/
@ -223,7 +221,7 @@ class WatchCartoonOnlineProvider : MainAPI() {
val jsEval = scope.get("returnValue", scope) ?: return false val jsEval = scope.get("returnValue", scope) ?: return false
val src = fixUrl(Regex("src=\"(.*?)\"").find(jsEval as String)?.groupValues?.get(1) ?: return false) val src = fixUrl(Regex("src=\"(.*?)\"").find(jsEval as String)?.groupValues?.get(1) ?: return false)
val embedResponse = get( val embedResponse = app.get(
(src), (src),
headers = mapOf("Referer" to data) headers = mapOf("Referer" to data)
) )
@ -231,7 +229,7 @@ class WatchCartoonOnlineProvider : MainAPI() {
val getVidLink = fixUrl( val getVidLink = fixUrl(
Regex("get\\(\"(.*?)\"").find(embedResponse.text)?.groupValues?.get(1) ?: return false Regex("get\\(\"(.*?)\"").find(embedResponse.text)?.groupValues?.get(1) ?: return false
) )
val linkResponse = get( val linkResponse = app.get(
getVidLink, headers = mapOf( getVidLink, headers = mapOf(
"sec-ch-ua" to "\"Chromium\";v=\"91\", \" Not;A Brand\";v=\"99\"", "sec-ch-ua" to "\"Chromium\";v=\"91\", \" Not;A Brand\";v=\"99\"",
"sec-ch-ua-mobile" to "?0", "sec-ch-ua-mobile" to "?0",

View file

@ -2,8 +2,6 @@ package com.lagradost.cloudstream3.animeproviders
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.extractors.WcoStream import com.lagradost.cloudstream3.extractors.WcoStream
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import org.json.JSONObject import org.json.JSONObject
@ -48,7 +46,7 @@ class WcoProvider : MainAPI() {
val items = ArrayList<HomePageList>() val items = ArrayList<HomePageList>()
for (i in urls) { for (i in urls) {
try { try {
val response = JSONObject(get( val response = JSONObject(app.get(
i.first, i.first,
).text).getString("html") // I won't make a dataclass for this shit ).text).getString("html") // I won't make a dataclass for this shit
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
@ -117,14 +115,14 @@ class WcoProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/search" val url = "$mainUrl/search"
val response = val response =
get(url, params = mapOf("keyword" to query)) app.get(url, params = mapOf("keyword" to query))
var document = Jsoup.parse(response.text) var document = Jsoup.parse(response.text)
val returnValue = parseSearchPage(document) val returnValue = parseSearchPage(document)
while (!document.select(".pagination").isEmpty()) { while (!document.select(".pagination").isEmpty()) {
val link = document.select("a.page-link[rel=\"next\"]") val link = document.select("a.page-link[rel=\"next\"]")
if (!link.isEmpty()) { if (!link.isEmpty()) {
val extraResponse = get(fixUrl(link[0].attr("href"))).text val extraResponse = app.get(fixUrl(link[0].attr("href"))).text
document = Jsoup.parse(extraResponse) document = Jsoup.parse(extraResponse)
returnValue.addAll(parseSearchPage(document)) returnValue.addAll(parseSearchPage(document))
} else { } else {
@ -137,7 +135,7 @@ class WcoProvider : MainAPI() {
override fun quickSearch(query: String): List<SearchResponse> { override fun quickSearch(query: String): List<SearchResponse> {
val returnValue: ArrayList<SearchResponse> = ArrayList() val returnValue: ArrayList<SearchResponse> = ArrayList()
val response = JSONObject(post( val response = JSONObject(app.post(
"https://wcostream.cc/ajax/search", "https://wcostream.cc/ajax/search",
data = mapOf("keyword" to query) data = mapOf("keyword" to query)
).text).getString("html") // I won't make a dataclass for this shit ).text).getString("html") // I won't make a dataclass for this shit
@ -175,7 +173,7 @@ class WcoProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val response = get(url, timeout = 120).text val response = app.get(url, timeout = 120).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val japaneseTitle = document.selectFirst("div.elements div.row > div:nth-child(1) > div.row-line:nth-child(1)") val japaneseTitle = document.selectFirst("div.elements div.row > div:nth-child(1) > div.row-line:nth-child(1)")
@ -226,7 +224,7 @@ class WcoProvider : MainAPI() {
subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
val response = get(data).text val response = app.get(data).text
val servers = Jsoup.parse(response).select("#servers-list > ul > li").map { val servers = Jsoup.parse(response).select("#servers-list > ul > li").map {
mapOf( mapOf(
"link" to it?.selectFirst("a")?.attr("data-embed"), "link" to it?.selectFirst("a")?.attr("data-embed"),

View file

@ -7,7 +7,6 @@ import com.lagradost.cloudstream3.movieproviders.SflixProvider
import com.lagradost.cloudstream3.movieproviders.SflixProvider.Companion.toExtractorLink import com.lagradost.cloudstream3.movieproviders.SflixProvider.Companion.toExtractorLink
import com.lagradost.cloudstream3.movieproviders.SflixProvider.Companion.toSubtitleFile import com.lagradost.cloudstream3.movieproviders.SflixProvider.Companion.toSubtitleFile
import com.lagradost.cloudstream3.network.WebViewResolver import com.lagradost.cloudstream3.network.WebViewResolver
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import org.jsoup.Jsoup import org.jsoup.Jsoup
@ -84,7 +83,7 @@ class ZoroProvider : MainAPI() {
override fun getMainPage(): HomePageResponse { override fun getMainPage(): HomePageResponse {
val html = get("$mainUrl/home").text val html = app.get("$mainUrl/home").text
val document = Jsoup.parse(html) val document = Jsoup.parse(html)
val homePageList = ArrayList<HomePageList>() val homePageList = ArrayList<HomePageList>()
@ -142,7 +141,7 @@ class ZoroProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val link = "$mainUrl/search?keyword=$query" val link = "$mainUrl/search?keyword=$query"
val html = get(link).text val html = app.get(link).text
val document = Jsoup.parse(html) val document = Jsoup.parse(html)
return document.select(".flw-item").map { return document.select(".flw-item").map {
@ -186,7 +185,7 @@ class ZoroProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val html = get(url).text val html = app.get(url).text
val document = Jsoup.parse(html) val document = Jsoup.parse(html)
val title = document.selectFirst(".anisc-detail > .film-name")?.text().toString() val title = document.selectFirst(".anisc-detail > .film-name")?.text().toString()
@ -217,7 +216,7 @@ class ZoroProvider : MainAPI() {
val episodes = Jsoup.parse( val episodes = Jsoup.parse(
mapper.readValue<Response>( mapper.readValue<Response>(
get( app.get(
"$mainUrl/ajax/v2/episode/list/$animeId" "$mainUrl/ajax/v2/episode/list/$animeId"
).text ).text
).html ).html
@ -247,7 +246,7 @@ class ZoroProvider : MainAPI() {
} }
private fun getM3u8FromRapidCloud(url: String): String { private fun getM3u8FromRapidCloud(url: String): String {
return get( return app.get(
"$url&autoPlay=1&oa=0", "$url&autoPlay=1&oa=0",
headers = mapOf( headers = mapOf(
"Referer" to "https://zoro.to/", "Referer" to "https://zoro.to/",
@ -274,13 +273,13 @@ class ZoroProvider : MainAPI() {
val servers: List<Pair<DubStatus, String>> = Jsoup.parse( val servers: List<Pair<DubStatus, String>> = Jsoup.parse(
mapper.readValue<Response>( mapper.readValue<Response>(
get("$mainUrl/ajax/v2/episode/servers?episodeId=" + data.split("=")[1]).text app.get("$mainUrl/ajax/v2/episode/servers?episodeId=" + data.split("=")[1]).text
).html ).html
).select(".server-item[data-type][data-id]").map { ).select(".server-item[data-type][data-id]").map {
Pair(if (it.attr("data-type") == "sub") DubStatus.Subbed else DubStatus.Dubbed, it.attr("data-id")!!) Pair(if (it.attr("data-type") == "sub") DubStatus.Subbed else DubStatus.Dubbed, it.attr("data-id")!!)
} }
val res = get( val res = app.get(
data, data,
interceptor = WebViewResolver( interceptor = WebViewResolver(
Regex("""/getSources""") Regex("""/getSources""")
@ -288,7 +287,7 @@ class ZoroProvider : MainAPI() {
) )
// println("RES TEXT ${res.text}") // println("RES TEXT ${res.text}")
val recaptchaToken = res.request.url.queryParameter("_token") val recaptchaToken = res.response.request.url.queryParameter("_token")
val responses = servers.map { val responses = servers.map {
val link = "$mainUrl/ajax/v2/episode/sources?id=${it.second}&_token=$recaptchaToken" val link = "$mainUrl/ajax/v2/episode/sources?id=${it.second}&_token=$recaptchaToken"
@ -296,9 +295,9 @@ class ZoroProvider : MainAPI() {
it.first, it.first,
getM3u8FromRapidCloud( getM3u8FromRapidCloud(
mapper.readValue<RapidCloudResponse>( mapper.readValue<RapidCloudResponse>(
get( app.get(
link, link,
res.request.headers.toMap() res.headers.toMap()
).text ).text
).link ).link
) )

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.network.url import com.lagradost.cloudstream3.network.url
import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.*
@ -17,7 +17,7 @@ class AsianLoad : ExtractorApi() {
private val sourceRegex = Regex("""sources:[\W\w]*?file:\s*?["'](.*?)["']""") private val sourceRegex = Regex("""sources:[\W\w]*?file:\s*?["'](.*?)["']""")
override fun getUrl(url: String, referer: String?): List<ExtractorLink> { override fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val extractedLinksList: MutableList<ExtractorLink> = mutableListOf() val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
with(get(url, referer = referer)) { with(app.get(url, referer = referer)) {
sourceRegex.findAll(this.text).forEach { sourceMatch -> sourceRegex.findAll(this.text).forEach { sourceMatch ->
val extractedUrl = sourceMatch.groupValues[1] val extractedUrl = sourceMatch.groupValues[1]
// Trusting this isn't mp4, may fuck up stuff // Trusting this isn't mp4, may fuck up stuff

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -32,12 +32,12 @@ open class DoodLaExtractor : ExtractorApi() {
override fun getUrl(url: String, referer: String?): List<ExtractorLink>? { override fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val id = url.removePrefix("$mainUrl/e/").removePrefix("$mainUrl/d/") val id = url.removePrefix("$mainUrl/e/").removePrefix("$mainUrl/d/")
val trueUrl = getExtractorUrl(id) val trueUrl = getExtractorUrl(id)
val response = get(trueUrl).text val response = app.get(trueUrl).text
Regex("href=\".*/download/(.*?)\"").find(response)?.groupValues?.get(1)?.let { link -> Regex("href=\".*/download/(.*?)\"").find(response)?.groupValues?.get(1)?.let { link ->
if (link.isEmpty()) return null if (link.isEmpty()) return null
sleep(5000) // might need this to not trigger anti bot sleep(5000) // might need this to not trigger anti bot
val downloadLink = "$mainUrl/download/$link" val downloadLink = "$mainUrl/download/$link"
val downloadResponse = get(downloadLink).text val downloadResponse = app.get(downloadLink).text
Regex("onclick=\"window\\.open\\((['\"])(.*?)(['\"])").find(downloadResponse)?.groupValues?.get(2) Regex("onclick=\"window\\.open\\((['\"])(.*?)(['\"])").find(downloadResponse)?.groupValues?.get(2)
?.let { trueLink -> ?.let { trueLink ->
return listOf( return listOf(

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.*
@ -15,7 +15,7 @@ class MixDrop : ExtractorApi() {
} }
override fun getUrl(url: String, referer: String?): List<ExtractorLink>? { override fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
with(get(url)) { with(app.get(url)) {
getAndUnpack(this.text).let { unpackedText -> getAndUnpack(this.text).let { unpackedText ->
srcRegex.find(unpackedText)?.groupValues?.get(1)?.let { link -> srcRegex.find(unpackedText)?.groupValues?.get(1)?.let { link ->
return listOf( return listOf(

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.*
@ -11,7 +11,7 @@ class Mp4Upload : ExtractorApi() {
override val requiresReferer = true override val requiresReferer = true
override fun getUrl(url: String, referer: String?): List<ExtractorLink>? { override fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
with(get(url)) { with(app.get(url)) {
getAndUnpack(this.text).let { unpackedText -> getAndUnpack(this.text).let { unpackedText ->
srcRegex.find(unpackedText)?.groupValues?.get(1)?.let { link -> srcRegex.find(unpackedText)?.groupValues?.get(1)?.let { link ->
return listOf( return listOf(

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.network.url import com.lagradost.cloudstream3.network.url
import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorApi
@ -23,12 +23,12 @@ class MultiQuality : ExtractorApi() {
override fun getUrl(url: String, referer: String?): List<ExtractorLink> { override fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val extractedLinksList: MutableList<ExtractorLink> = mutableListOf() val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
with(get(url)) { with(app.get(url)) {
sourceRegex.findAll(this.text).forEach { sourceMatch -> sourceRegex.findAll(this.text).forEach { sourceMatch ->
val extractedUrl = sourceMatch.groupValues[1] val extractedUrl = sourceMatch.groupValues[1]
// Trusting this isn't mp4, may fuck up stuff // Trusting this isn't mp4, may fuck up stuff
if (URI(extractedUrl).path.endsWith(".m3u8")) { if (URI(extractedUrl).path.endsWith(".m3u8")) {
with(get(extractedUrl)) { with(app.get(extractedUrl)) {
m3u8Regex.findAll(this.text).forEach { match -> m3u8Regex.findAll(this.text).forEach { match ->
extractedLinksList.add( extractedLinksList.add(
ExtractorLink( ExtractorLink(

View file

@ -1,9 +1,8 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.APIHolder.unixTimeMS import com.lagradost.cloudstream3.APIHolder.unixTimeMS
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -20,7 +19,7 @@ class SBPlay : ExtractorApi() {
get() = false get() = false
override fun getUrl(url: String, referer: String?): List<ExtractorLink> { override fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val response = get(url, referer = referer).text val response = app.get(url, referer = referer).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val links = ArrayList<ExtractorLink>() val links = ArrayList<ExtractorLink>()
@ -35,8 +34,8 @@ class SBPlay : ExtractorApi() {
val mode = it.groupValues[2] val mode = it.groupValues[2]
val hash = it.groupValues[3] val hash = it.groupValues[3]
val href = "https://sbplay.one/dl?op=download_orig&id=$id&mode=$mode&hash=$hash" val href = "https://sbplay.one/dl?op=download_orig&id=$id&mode=$mode&hash=$hash"
val hrefResponse = get(href).text val hrefResponse = app.get(href).text
post("https://sbplay.one/?op=notifications&open=&_=$unixTimeMS", referer = href) app.post("https://sbplay.one/?op=notifications&open=&_=$unixTimeMS", referer = href)
val hrefDocument = Jsoup.parse(hrefResponse) val hrefDocument = Jsoup.parse(hrefResponse)
val hrefSpan = hrefDocument.selectFirst("span > a") val hrefSpan = hrefDocument.selectFirst("span > a")
if (hrefSpan == null) { if (hrefSpan == null) {

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -23,12 +23,12 @@ class StreamSB : ExtractorApi() {
override fun getUrl(url: String, referer: String?): List<ExtractorLink> { override fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val extractedLinksList: MutableList<ExtractorLink> = mutableListOf() val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
val newUrl = url.replace("sbplay.org/embed-", "sbplay.org/play/").removeSuffix(".html") val newUrl = url.replace("sbplay.org/embed-", "sbplay.org/play/").removeSuffix(".html")
with(get(newUrl, timeout = 10)) { with(app.get(newUrl, timeout = 10)) {
getAndUnpack(this.text).let { getAndUnpack(this.text).let {
sourceRegex.findAll(it).forEach { sourceMatch -> sourceRegex.findAll(it).forEach { sourceMatch ->
val extractedUrl = sourceMatch.groupValues[1] val extractedUrl = sourceMatch.groupValues[1]
if (extractedUrl.contains(".m3u8")) { if (extractedUrl.contains(".m3u8")) {
with(get(extractedUrl)) { with(app.get(extractedUrl)) {
m3u8UrlRegex.findAll(this.text).forEach { match -> m3u8UrlRegex.findAll(this.text).forEach { match ->
val extractedUrlM3u8 = match.groupValues[2] val extractedUrlM3u8 = match.groupValues[2]
val extractedRes = match.groupValues[1] val extractedRes = match.groupValues[1]

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -15,7 +15,7 @@ class StreamTape : ExtractorApi() {
Regex("""'robotlink'\)\.innerHTML = '(.+?)'\+ \('(.+?)'\)""") Regex("""'robotlink'\)\.innerHTML = '(.+?)'\+ \('(.+?)'\)""")
override fun getUrl(url: String, referer: String?): List<ExtractorLink>? { override fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
with(get(url)) { with(app.get(url)) {
linkRegex.find(this.text)?.let { linkRegex.find(this.text)?.let {
val extractedUrl = "https:${it.groups[1]!!.value + it.groups[2]!!.value.substring(3,)}" val extractedUrl = "https:${it.groups[1]!!.value + it.groups[2]!!.value.substring(3,)}"
return listOf( return listOf(

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -21,7 +21,7 @@ class Streamhub : ExtractorApi() {
} }
override fun getUrl(url: String, referer: String?): List<ExtractorLink>? { override fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val response = get(url).text val response = app.get(url).text
Regex("eval((.|\\n)*?)</script>").find(response)?.groupValues?.get(1)?.let { jsEval -> Regex("eval((.|\\n)*?)</script>").find(response)?.groupValues?.get(1)?.let { jsEval ->
JsUnpacker("eval$jsEval" ).unpack()?.let { unPacked -> JsUnpacker("eval$jsEval" ).unpack()?.let { unPacked ->
Regex("sources:\\[\\{src:\"(.*?)\"").find(unPacked)?.groupValues?.get(1)?.let { link -> Regex("sources:\\[\\{src:\"(.*?)\"").find(unPacked)?.groupValues?.get(1)?.let { link ->

View file

@ -1,7 +1,7 @@
package com.lagradost.cloudstream3.extractors package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.network.url import com.lagradost.cloudstream3.network.url
import com.lagradost.cloudstream3.pmap import com.lagradost.cloudstream3.pmap
@ -41,7 +41,7 @@ class Vidstream(val mainUrl: String) {
normalSafeApiCall { normalSafeApiCall {
val link = getDownloadUrl(id) val link = getDownloadUrl(id)
println("Generated vidstream download link: $link") println("Generated vidstream download link: $link")
val page = get(link, referer = extractorUrl) val page = app.get(link, referer = extractorUrl)
val pageDoc = Jsoup.parse(page.text) val pageDoc = Jsoup.parse(page.text)
val qualityRegex = Regex("(\\d+)P") val qualityRegex = Regex("(\\d+)P")
@ -64,7 +64,7 @@ class Vidstream(val mainUrl: String) {
} }
} }
with(get(extractorUrl)) { with(app.get(extractorUrl)) {
val document = Jsoup.parse(this.text) val document = Jsoup.parse(this.text)
val primaryLinks = document.select("ul.list-server-items > li.linkserver") val primaryLinks = document.select("ul.list-server-items > li.linkserver")
//val extractedLinksList: MutableList<ExtractorLink> = mutableListOf() //val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()

View file

@ -2,9 +2,9 @@ package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.mapper import com.lagradost.cloudstream3.mapper
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
class WcoStream : ExtractorApi() { class WcoStream : ExtractorApi() {
@ -16,14 +16,14 @@ class WcoStream : ExtractorApi() {
override fun getUrl(url: String, referer: String?): List<ExtractorLink> { override fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val baseUrl = url.split("/e/")[0] val baseUrl = url.split("/e/")[0]
val html = get(url, headers = mapOf("Referer" to "https://wcostream.cc/")).text val html = app.get(url, headers = mapOf("Referer" to "https://wcostream.cc/")).text
val (Id) = "/e/(.*?)?domain".toRegex().find(url)!!.destructured val (Id) = "/e/(.*?)?domain".toRegex().find(url)!!.destructured
val (skey) = """skey\s=\s['"](.*?)['"];""".toRegex().find(html)!!.destructured val (skey) = """skey\s=\s['"](.*?)['"];""".toRegex().find(html)!!.destructured
val apiLink = "$baseUrl/info/$Id?domain=wcostream.cc&skey=$skey" val apiLink = "$baseUrl/info/$Id?domain=wcostream.cc&skey=$skey"
val referrer = "$baseUrl/e/$Id?domain=wcostream.cc" val referrer = "$baseUrl/e/$Id?domain=wcostream.cc"
val response = get(apiLink, headers = mapOf("Referer" to referrer)).text val response = app.get(apiLink, headers = mapOf("Referer" to referrer)).text
data class Sources( data class Sources(
@JsonProperty("file") val file: String, @JsonProperty("file") val file: String,

View file

@ -2,9 +2,8 @@ package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mapper import com.lagradost.cloudstream3.mapper
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
@ -46,7 +45,7 @@ class XStreamCdn : ExtractorApi() {
) )
val newUrl = url.replace("$mainUrl/v/", "$mainUrl/api/source/") val newUrl = url.replace("$mainUrl/v/", "$mainUrl/api/source/")
val extractedLinksList: MutableList<ExtractorLink> = mutableListOf() val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
with(post(newUrl, headers = headers)) { with(app.post(newUrl, headers = headers)) {
val text = this.text val text = this.text
if (text == """{"success":false,"data":"Video not found or has been removed"}""") return listOf() if (text == """{"success":false,"data":"Video not found or has been removed"}""") return listOf()
mapper.readValue<ResponseJson?>(text)?.let { mapper.readValue<ResponseJson?>(text)?.let {

View file

@ -2,9 +2,6 @@ package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.network.url
import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.*
import okio.Buffer import okio.Buffer
import org.jsoup.Jsoup import org.jsoup.Jsoup
@ -35,7 +32,7 @@ class AllMoviesForYouProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/?s=$query" val url = "$mainUrl/?s=$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("ul.MovieList > li > article > a") val items = document.select("ul.MovieList > li > article > a")
@ -75,7 +72,7 @@ class AllMoviesForYouProvider : MainAPI() {
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val type = getType(url) val type = getType(url)
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val title = document.selectFirst("h1.Title").text() val title = document.selectFirst("h1.Title").text()
@ -101,7 +98,7 @@ class AllMoviesForYouProvider : MainAPI() {
val episodeList = ArrayList<TvSeriesEpisode>() val episodeList = ArrayList<TvSeriesEpisode>()
for (season in list) { for (season in list) {
val seasonResponse = get(season.second).text val seasonResponse = app.get(season.second).text
val seasonDocument = Jsoup.parse(seasonResponse) val seasonDocument = Jsoup.parse(seasonResponse)
val episodes = seasonDocument.select("table > tbody > tr") val episodes = seasonDocument.select("table > tbody > tr")
if (episodes.isNotEmpty()) { if (episodes.isNotEmpty()) {
@ -166,7 +163,7 @@ class AllMoviesForYouProvider : MainAPI() {
): Boolean { ): Boolean {
if (data == "about:blank") return false if (data == "about:blank") return false
if (data.startsWith("$mainUrl/episode/")) { if (data.startsWith("$mainUrl/episode/")) {
val response = get(data).text val response = app.get(data).text
getLink(Jsoup.parse(response))?.let { links -> getLink(Jsoup.parse(response))?.let { links ->
for (link in links) { for (link in links) {
if (link == data) continue if (link == data) continue
@ -178,7 +175,7 @@ class AllMoviesForYouProvider : MainAPI() {
} else if (data.startsWith(mainUrl) && data != mainUrl) { } else if (data.startsWith(mainUrl) && data != mainUrl) {
val realDataUrl = URLDecoder.decode(data, "UTF-8") val realDataUrl = URLDecoder.decode(data, "UTF-8")
if (data.contains("trdownload")) { if (data.contains("trdownload")) {
val request = get(data) val request = app.get(data)
val requestUrl = request.url val requestUrl = request.url
if (requestUrl.startsWith("https://streamhub.to/d/")) { if (requestUrl.startsWith("https://streamhub.to/d/")) {
val buffer = Buffer() val buffer = Buffer()
@ -213,7 +210,7 @@ class AllMoviesForYouProvider : MainAPI() {
} }
return true return true
} }
val response = get(realDataUrl).text val response = app.get(realDataUrl).text
Regex("<iframe.*?src=\"(.*?)\"").find(response)?.groupValues?.get(1)?.let { url -> Regex("<iframe.*?src=\"(.*?)\"").find(response)?.groupValues?.get(1)?.let { url ->
loadExtractor(url.trimStart(), realDataUrl, callback) loadExtractor(url.trimStart(), realDataUrl, callback)
} }

View file

@ -5,7 +5,6 @@ import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.animeproviders.GogoanimeProvider.Companion.getStatus import com.lagradost.cloudstream3.animeproviders.GogoanimeProvider.Companion.getStatus
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.DataStore.toKotlinObject import com.lagradost.cloudstream3.utils.DataStore.toKotlinObject
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -122,7 +121,7 @@ class AsiaFlixProvider : MainAPI() {
override fun getMainPage(): HomePageResponse { override fun getMainPage(): HomePageResponse {
val headers = mapOf("X-Requested-By" to "asiaflix-web") val headers = mapOf("X-Requested-By" to "asiaflix-web")
val response = get("$apiUrl/dashboard", headers = headers).text val response = app.get("$apiUrl/dashboard", headers = headers).text
val customMapper = mapper.copy().configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true) val customMapper = mapper.copy().configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
// Hack, because it can either be object or a list // Hack, because it can either be object or a list
@ -154,7 +153,7 @@ class AsiaFlixProvider : MainAPI() {
): Boolean { ): Boolean {
if (isCasting) return false if (isCasting) return false
val headers = mapOf("X-Requested-By" to "asiaflix-web") val headers = mapOf("X-Requested-By" to "asiaflix-web")
get("$apiUrl/utility/get-stream-links?url=$data", headers = headers).text.toKotlinObject<Link>().url?.let { app.get("$apiUrl/utility/get-stream-links?url=$data", headers = headers).text.toKotlinObject<Link>().url?.let {
// val fixedUrl = "https://api.asiaflix.app/api/v2/utility/cors-proxy/playlist/${URLEncoder.encode(it, StandardCharsets.UTF_8.toString())}" // val fixedUrl = "https://api.asiaflix.app/api/v2/utility/cors-proxy/playlist/${URLEncoder.encode(it, StandardCharsets.UTF_8.toString())}"
callback.invoke( callback.invoke(
ExtractorLink( ExtractorLink(
@ -173,14 +172,14 @@ class AsiaFlixProvider : MainAPI() {
override fun search(query: String): List<SearchResponse>? { override fun search(query: String): List<SearchResponse>? {
val headers = mapOf("X-Requested-By" to "asiaflix-web") val headers = mapOf("X-Requested-By" to "asiaflix-web")
val url = "$apiUrl/drama/search?q=$query" val url = "$apiUrl/drama/search?q=$query"
val response = get(url, headers = headers).text val response = app.get(url, headers = headers).text
return mapper.readValue<List<Data>?>(response)?.map { it.toSearchResponse() } return mapper.readValue<List<Data>?>(response)?.map { it.toSearchResponse() }
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val headers = mapOf("X-Requested-By" to "asiaflix-web") val headers = mapOf("X-Requested-By" to "asiaflix-web")
val requestUrl = "$apiUrl/drama?id=${url.split("/").lastOrNull()}" val requestUrl = "$apiUrl/drama?id=${url.split("/").lastOrNull()}"
val response = get(requestUrl, headers = headers).text val response = app.get(requestUrl, headers = headers).text
val dramaPage = response.toKotlinObject<DramaPage>() val dramaPage = response.toKotlinObject<DramaPage>()
return dramaPage.toLoadResponse() return dramaPage.toLoadResponse()
} }

View file

@ -1,7 +1,6 @@
package com.lagradost.cloudstream3.movieproviders package com.lagradost.cloudstream3.movieproviders
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
@ -22,7 +21,7 @@ class HDMProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/search/$query" val url = "$mainUrl/search/$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("div.col-md-2 > article > a") val items = document.select("div.col-md-2 > article > a")
if (items.isEmpty()) return ArrayList() if (items.isEmpty()) return ArrayList()
@ -46,7 +45,7 @@ class HDMProvider : MainAPI() {
): Boolean { ): Boolean {
if (data == "") return false if (data == "") return false
val slug = ".*/(.*?)\\.mp4".toRegex().find(data)?.groupValues?.get(1) ?: return false val slug = ".*/(.*?)\\.mp4".toRegex().find(data)?.groupValues?.get(1) ?: return false
val response = get(data).text val response = app.get(data).text
val key = "playlist\\.m3u8(.*?)\"".toRegex().find(response)?.groupValues?.get(1) ?: return false val key = "playlist\\.m3u8(.*?)\"".toRegex().find(response)?.groupValues?.get(1) ?: return false
callback.invoke( callback.invoke(
ExtractorLink( ExtractorLink(
@ -62,7 +61,7 @@ class HDMProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse? { override fun load(url: String): LoadResponse? {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val title = document.selectFirst("h2.movieTitle")?.text() ?: throw ErrorLoadingException("No Data Found") val title = document.selectFirst("h2.movieTitle")?.text() ?: throw ErrorLoadingException("No Data Found")
val poster = document.selectFirst("div.post-thumbnail > img").attr("src") val poster = document.selectFirst("div.post-thumbnail > img").attr("src")
@ -78,7 +77,7 @@ class HDMProvider : MainAPI() {
} }
override fun getMainPage(): HomePageResponse { override fun getMainPage(): HomePageResponse {
val html = get("$mainUrl", timeout = 25).text val html = app.get("$mainUrl", timeout = 25).text
val document = Jsoup.parse(html) val document = Jsoup.parse(html)
val all = ArrayList<HomePageList>() val all = ArrayList<HomePageList>()

View file

@ -6,7 +6,6 @@ import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.APIHolder.unixTime import com.lagradost.cloudstream3.APIHolder.unixTime
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.extractors.M3u8Manifest import com.lagradost.cloudstream3.extractors.M3u8Manifest
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.getQualityFromName import com.lagradost.cloudstream3.utils.getQualityFromName
import org.jsoup.Jsoup import org.jsoup.Jsoup
@ -73,11 +72,11 @@ class LookMovieProvider : MainAPI() {
override fun quickSearch(query: String): List<SearchResponse> { override fun quickSearch(query: String): List<SearchResponse> {
val movieUrl = "$mainUrl/api/v1/movies/search/?q=$query" val movieUrl = "$mainUrl/api/v1/movies/search/?q=$query"
val movieResponse = get(movieUrl).text val movieResponse = app.get(movieUrl).text
val movies = mapper.readValue<LookMovieSearchResultRoot>(movieResponse).result val movies = mapper.readValue<LookMovieSearchResultRoot>(movieResponse).result
val showsUrl = "$mainUrl/api/v1/shows/search/?q=$query" val showsUrl = "$mainUrl/api/v1/shows/search/?q=$query"
val showsResponse = get(showsUrl).text val showsResponse = app.get(showsUrl).text
val shows = mapper.readValue<LookMovieSearchResultRoot>(showsResponse).result val shows = mapper.readValue<LookMovieSearchResultRoot>(showsResponse).result
val returnValue = ArrayList<SearchResponse>() val returnValue = ArrayList<SearchResponse>()
@ -119,7 +118,7 @@ class LookMovieProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
fun search(query: String, isMovie: Boolean): ArrayList<SearchResponse> { fun search(query: String, isMovie: Boolean): ArrayList<SearchResponse> {
val url = "$mainUrl/${if (isMovie) "movies" else "shows"}/search/?q=$query" val url = "$mainUrl/${if (isMovie) "movies" else "shows"}/search/?q=$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("div.flex-wrap-movielist > div.movie-item-style-1") val items = document.select("div.flex-wrap-movielist > div.movie-item-style-1")
@ -163,7 +162,7 @@ class LookMovieProvider : MainAPI() {
} }
private fun loadCurrentLinks(url: String, callback: (ExtractorLink) -> Unit) { private fun loadCurrentLinks(url: String, callback: (ExtractorLink) -> Unit) {
val response = get(url.replace("\$unixtime", unixTime.toString())).text val response = app.get(url.replace("\$unixtime", unixTime.toString())).text
M3u8Manifest.extractLinks(response).forEach { M3u8Manifest.extractLinks(response).forEach {
callback.invoke( callback.invoke(
ExtractorLink( ExtractorLink(
@ -187,7 +186,7 @@ class LookMovieProvider : MainAPI() {
val localData: LookMovieLinkLoad = mapper.readValue(data) val localData: LookMovieLinkLoad = mapper.readValue(data)
if (localData.isMovie) { if (localData.isMovie) {
val tokenResponse = get(localData.url).text val tokenResponse = app.get(localData.url).text
val root = mapper.readValue<LookMovieTokenRoot>(tokenResponse) val root = mapper.readValue<LookMovieTokenRoot>(tokenResponse)
val accessToken = root.data?.accessToken ?: return false val accessToken = root.data?.accessToken ?: return false
addSubtitles(root.data.subtitles, subtitleCallback) addSubtitles(root.data.subtitles, subtitleCallback)
@ -195,7 +194,7 @@ class LookMovieProvider : MainAPI() {
return true return true
} else { } else {
loadCurrentLinks(localData.url, callback) loadCurrentLinks(localData.url, callback)
val subResponse = get(localData.extraUrl).text val subResponse = app.get(localData.extraUrl).text
val subs = mapper.readValue<List<LookMovieTokenSubtitle>>(subResponse) val subs = mapper.readValue<List<LookMovieTokenSubtitle>>(subResponse)
addSubtitles(subs, subtitleCallback) addSubtitles(subs, subtitleCallback)
} }
@ -203,7 +202,7 @@ class LookMovieProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse? { override fun load(url: String): LoadResponse? {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val isMovie = url.contains("/movies/") val isMovie = url.contains("/movies/")
@ -245,7 +244,7 @@ class LookMovieProvider : MainAPI() {
rating rating
) )
} else { } else {
val tokenResponse = get(realUrl).text val tokenResponse = app.get(realUrl).text
val root = mapper.readValue<LookMovieTokenRoot>(tokenResponse) val root = mapper.readValue<LookMovieTokenRoot>(tokenResponse)
val accessToken = root.data?.accessToken ?: return null val accessToken = root.data?.accessToken ?: return null

View file

@ -3,7 +3,7 @@ package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.network.Session
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getQualityFromName import com.lagradost.cloudstream3.utils.getQualityFromName
@ -40,7 +40,7 @@ class MeloMovieProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/movie/search/?name=$query" val url = "$mainUrl/movie/search/?name=$query"
val returnValue: ArrayList<SearchResponse> = ArrayList() val returnValue: ArrayList<SearchResponse> = ArrayList()
val response = get(url).text val response = app.get(url).text
val mapped = response.let { mapper.readValue<List<MeloMovieSearchResult>>(it) } val mapped = response.let { mapper.readValue<List<MeloMovieSearchResult>>(it) }
if (mapped.isEmpty()) return returnValue if (mapped.isEmpty()) return returnValue
@ -117,7 +117,7 @@ class MeloMovieProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse? { override fun load(url: String): LoadResponse? {
val response = get(url).text val response = app.get(url).text
//backdrop = imgurl //backdrop = imgurl
fun findUsingRegex(src: String): String? { fun findUsingRegex(src: String): String? {

View file

@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.WebViewResolver import com.lagradost.cloudstream3.network.WebViewResolver
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper import com.lagradost.cloudstream3.utils.M3u8Helper
@ -69,7 +68,7 @@ class SflixProvider(private val providerUrl: String, private val providerName: S
} }
override fun getMainPage(): HomePageResponse { override fun getMainPage(): HomePageResponse {
val html = get("$mainUrl/home").text val html = app.get("$mainUrl/home").text
val document = Jsoup.parse(html) val document = Jsoup.parse(html)
val all = ArrayList<HomePageList>() val all = ArrayList<HomePageList>()
@ -103,7 +102,7 @@ class SflixProvider(private val providerUrl: String, private val providerName: S
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/search/${query.replace(" ", "-")}" val url = "$mainUrl/search/${query.replace(" ", "-")}"
val html = get(url).text val html = app.get(url).text
val document = Jsoup.parse(html) val document = Jsoup.parse(html)
return document.select("div.flw-item").map { return document.select("div.flw-item").map {
@ -137,7 +136,7 @@ class SflixProvider(private val providerUrl: String, private val providerName: S
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val html = get(url).text val html = app.get(url).text
val document = Jsoup.parse(html) val document = Jsoup.parse(html)
val details = document.select("div.detail_page-watch") val details = document.select("div.detail_page-watch")
@ -167,7 +166,7 @@ class SflixProvider(private val providerUrl: String, private val providerName: S
if (isMovie) { if (isMovie) {
// Movies // Movies
val episodesUrl = "$mainUrl/ajax/movie/episodes/$id" val episodesUrl = "$mainUrl/ajax/movie/episodes/$id"
val episodes = get(episodesUrl).text val episodes = app.get(episodesUrl).text
// Supported streams, they're identical // Supported streams, they're identical
val sourceId = Jsoup.parse(episodes).select("a").firstOrNull { val sourceId = Jsoup.parse(episodes).select("a").firstOrNull {
@ -194,7 +193,7 @@ class SflixProvider(private val providerUrl: String, private val providerName: S
null null
) )
} else { } else {
val seasonsHtml = get("$mainUrl/ajax/v2/tv/seasons/$id").text val seasonsHtml = app.get("$mainUrl/ajax/v2/tv/seasons/$id").text
val seasonsDocument = Jsoup.parse(seasonsHtml) val seasonsDocument = Jsoup.parse(seasonsHtml)
val episodes = arrayListOf<TvSeriesEpisode>() val episodes = arrayListOf<TvSeriesEpisode>()
@ -202,7 +201,7 @@ class SflixProvider(private val providerUrl: String, private val providerName: S
val seasonId = element.attr("data-id") val seasonId = element.attr("data-id")
if (seasonId.isNullOrBlank()) return@forEachIndexed if (seasonId.isNullOrBlank()) return@forEachIndexed
val seasonHtml = get("$mainUrl/ajax/v2/season/episodes/$seasonId").text val seasonHtml = app.get("$mainUrl/ajax/v2/season/episodes/$seasonId").text
val seasonDocument = Jsoup.parse(seasonHtml) val seasonDocument = Jsoup.parse(seasonHtml)
seasonDocument.select("div.flw-item.film_single-item.episode-item.eps-item") seasonDocument.select("div.flw-item.film_single-item.episode-item.eps-item")
.forEachIndexed { _, it -> .forEachIndexed { _, it ->
@ -279,7 +278,7 @@ class SflixProvider(private val providerUrl: String, private val providerName: S
// Only used for tv series // Only used for tv series
val url = if (split.size == 2) { val url = if (split.size == 2) {
val episodesUrl = "$mainUrl/ajax/v2/episode/servers/${split[1]}" val episodesUrl = "$mainUrl/ajax/v2/episode/servers/${split[1]}"
val episodes = get(episodesUrl).text val episodes = app.get(episodesUrl).text
// Supported streams, they're identical // Supported streams, they're identical
val sourceId = Jsoup.parse(episodes).select("a").firstOrNull { val sourceId = Jsoup.parse(episodes).select("a").firstOrNull {
@ -292,7 +291,7 @@ class SflixProvider(private val providerUrl: String, private val providerName: S
data data
} }
val sources = get( val sources = app.get(
url, url,
interceptor = WebViewResolver( interceptor = WebViewResolver(
Regex("""/getSources""") Regex("""/getSources""")

View file

@ -3,7 +3,6 @@ package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getQualityFromName import com.lagradost.cloudstream3.utils.getQualityFromName
@ -43,7 +42,7 @@ class ThenosProvider : MainAPI() {
val list = ArrayList<HomePageList>() val list = ArrayList<HomePageList>()
map.entries.forEach { map.entries.forEach {
val url = "$apiUrl/library/${it.value}" val url = "$apiUrl/library/${it.value}"
val response = get(url).text val response = app.get(url).text
val mapped = mapper.readValue<ThenosLoadResponse>(response) val mapped = mapper.readValue<ThenosLoadResponse>(response)
mapped.Metadata?.mapNotNull { meta -> mapped.Metadata?.mapNotNull { meta ->
@ -211,7 +210,7 @@ class ThenosProvider : MainAPI() {
} }
private fun searchFromUrl(url: String): List<SearchResponse> { private fun searchFromUrl(url: String): List<SearchResponse> {
val response = get(url).text val response = app.get(url).text
val test = mapper.readValue<ThenosSearchResponse>(response) val test = mapper.readValue<ThenosSearchResponse>(response)
val returnValue = ArrayList<SearchResponse>() val returnValue = ArrayList<SearchResponse>()
@ -257,12 +256,12 @@ class ThenosProvider : MainAPI() {
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
val url = "$apiUrl/library/watch/$data" val url = "$apiUrl/library/watch/$data"
val response = get(url).text val response = app.get(url).text
val mapped = mapper.readValue<ThenosSource>(response) val mapped = mapper.readValue<ThenosSource>(response)
mapped.sources?.forEach { source -> mapped.sources?.forEach { source ->
val isM3u8 = source.type != "video/mp4" val isM3u8 = source.type != "video/mp4"
val token = get("https://token.noss.workers.dev/").text val token = app.get("https://token.noss.workers.dev/").text
val authorization = val authorization =
base64Decode(token) base64Decode(token)
@ -425,11 +424,11 @@ class ThenosProvider : MainAPI() {
private fun getAllEpisodes(id: String): List<TvSeriesEpisode> { private fun getAllEpisodes(id: String): List<TvSeriesEpisode> {
val episodes = ArrayList<TvSeriesEpisode>() val episodes = ArrayList<TvSeriesEpisode>()
val url = "$apiUrl/library/metadata/$id/children" val url = "$apiUrl/library/metadata/$id/children"
val response = get(url).text val response = app.get(url).text
val mapped = mapper.readValue<ThenosSeriesResponse>(response) val mapped = mapper.readValue<ThenosSeriesResponse>(response)
mapped.Metadata?.forEach { series_meta -> mapped.Metadata?.forEach { series_meta ->
val fixedUrl = apiUrl + series_meta.key val fixedUrl = apiUrl + series_meta.key
val child = get(fixedUrl).text val child = app.get(fixedUrl).text
val mappedSeason = mapper.readValue<SeasonResponse>(child) val mappedSeason = mapper.readValue<SeasonResponse>(child)
mappedSeason.Metadata?.forEach mappedSeason@{ meta -> mappedSeason.Metadata?.forEach mappedSeason@{ meta ->
episodes.add( episodes.add(
@ -452,7 +451,7 @@ class ThenosProvider : MainAPI() {
override fun load(url: String): LoadResponse? { override fun load(url: String): LoadResponse? {
val fixedUrl = "$apiUrl/library/metadata/${url.split("/").last()}" val fixedUrl = "$apiUrl/library/metadata/${url.split("/").last()}"
val response = get(fixedUrl).text val response = app.get(fixedUrl).text
val mapped = mapper.readValue<ThenosLoadResponse>(response) val mapped = mapper.readValue<ThenosLoadResponse>(response)
val isShow = mapped.Metadata?.any { it?.type == "show" } == true val isShow = mapped.Metadata?.any { it?.type == "show" } == true

View file

@ -2,7 +2,6 @@ package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
@ -35,7 +34,7 @@ class TrailersToProvider : MainAPI() {
get() = VPNStatus.MightBeNeeded get() = VPNStatus.MightBeNeeded
override fun getMainPage(): HomePageResponse? { override fun getMainPage(): HomePageResponse? {
val response = get(mainUrl).text val response = app.get(mainUrl).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val returnList = ArrayList<HomePageList>() val returnList = ArrayList<HomePageList>()
val docs = document.select("section.section > div.container") val docs = document.select("section.section > div.container")
@ -78,7 +77,7 @@ class TrailersToProvider : MainAPI() {
override fun quickSearch(query: String): List<SearchResponse> { override fun quickSearch(query: String): List<SearchResponse> {
val url = "$mainUrl/en/quick-search?q=$query" val url = "$mainUrl/en/quick-search?q=$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("div.group-post-minimal > a.post-minimal") val items = document.select("div.group-post-minimal > a.post-minimal")
if (items.isNullOrEmpty()) return ArrayList() if (items.isNullOrEmpty()) return ArrayList()
@ -106,7 +105,7 @@ class TrailersToProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/en/popular/movies-tvshows-collections?q=$query" val url = "$mainUrl/en/popular/movies-tvshows-collections?q=$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("div.col-lg-8 > article.list-item") val items = document.select("div.col-lg-8 > article.list-item")
if (items.isNullOrEmpty()) return ArrayList() if (items.isNullOrEmpty()) return ArrayList()
@ -135,7 +134,7 @@ class TrailersToProvider : MainAPI() {
data: String, data: String,
callback: (ExtractorLink) -> Unit, callback: (ExtractorLink) -> Unit,
): Boolean { ): Boolean {
val response = get(data).text val response = app.get(data).text
val url = "<source src='(.*?)'".toRegex().find(response)?.groupValues?.get(1) val url = "<source src='(.*?)'".toRegex().find(response)?.groupValues?.get(1)
if (url != null) { if (url != null) {
callback.invoke(ExtractorLink(this.name, this.name, url, mainUrl, Qualities.Unknown.value, false)) callback.invoke(ExtractorLink(this.name, this.name, url, mainUrl, Qualities.Unknown.value, false))
@ -146,7 +145,7 @@ class TrailersToProvider : MainAPI() {
private fun loadSubs(url: String, subtitleCallback: (SubtitleFile) -> Unit) { private fun loadSubs(url: String, subtitleCallback: (SubtitleFile) -> Unit) {
if (url.isEmpty()) return if (url.isEmpty()) return
val response = get(fixUrl(url)).text val response = app.get(fixUrl(url)).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("div.list-group > a.list-group-item") val items = document.select("div.list-group > a.list-group-item")
@ -183,7 +182,7 @@ class TrailersToProvider : MainAPI() {
return isSucc return isSucc
} else if (url.contains("/episode/")) { } else if (url.contains("/episode/")) {
val response = get(url, params = mapOf("preview" to "1")).text val response = app.get(url, params = mapOf("preview" to "1")).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
// val qSub = document.select("subtitle-content") // val qSub = document.select("subtitle-content")
val subUrl = document.select("subtitle-content")?.attr("data-url") ?: "" val subUrl = document.select("subtitle-content")?.attr("data-url") ?: ""
@ -200,7 +199,7 @@ class TrailersToProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val response = get(if (url.endsWith("?preview=1")) url else "$url?preview=1").text val response = app.get(if (url.endsWith("?preview=1")) url else "$url?preview=1").text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
var title = document?.selectFirst("h2.breadcrumbs-custom-title > a")?.text() var title = document?.selectFirst("h2.breadcrumbs-custom-title > a")?.text()
?: throw ErrorLoadingException("Service might be unavailable") ?: throw ErrorLoadingException("Service might be unavailable")

View file

@ -2,13 +2,9 @@ package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.ProviderType import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.TvType
import com.lagradost.cloudstream3.mapper
import com.lagradost.cloudstream3.metaproviders.TmdbLink import com.lagradost.cloudstream3.metaproviders.TmdbLink
import com.lagradost.cloudstream3.metaproviders.TmdbProvider import com.lagradost.cloudstream3.metaproviders.TmdbProvider
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
@ -82,7 +78,7 @@ class TrailersTwoProvider : TmdbProvider() {
} }
val subtitles = val subtitles =
get(subtitleUrl).text app.get(subtitleUrl).text
val subtitlesMapped = mapper.readValue<List<TrailersSubtitleFile>>(subtitles) val subtitlesMapped = mapper.readValue<List<TrailersSubtitleFile>>(subtitles)
subtitlesMapped.forEach { subtitlesMapped.forEach {
subtitleCallback.invoke( subtitleCallback.invoke(

View file

@ -3,8 +3,6 @@ package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.network.url import com.lagradost.cloudstream3.network.url
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
@ -25,7 +23,7 @@ class VMoveeProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/?s=$query" val url = "$mainUrl/?s=$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val searchItems = document.select("div.search-page > div.result-item > article") val searchItems = document.select("div.search-page > div.result-item > article")
if (searchItems.size == 0) return ArrayList() if (searchItems.size == 0) return ArrayList()
@ -79,7 +77,7 @@ class VMoveeProvider : MainAPI() {
val url = "$mainUrl/dashboard/admin-ajax.php" val url = "$mainUrl/dashboard/admin-ajax.php"
val post = val post =
post( app.post(
url, url,
headers = mapOf("referer" to url), headers = mapOf("referer" to url),
data = mapOf("action" to "doo_player_ajax", "post" to data, "nume" to "2", "type" to "movie") data = mapOf("action" to "doo_player_ajax", "post" to data, "nume" to "2", "type" to "movie")
@ -91,11 +89,11 @@ class VMoveeProvider : MainAPI() {
realUrl = "https:$realUrl" realUrl = "https:$realUrl"
} }
val request = get(realUrl) val request = app.get(realUrl)
val prefix = "https://reeoov.tube/v/" val prefix = "https://reeoov.tube/v/"
if (request.url.startsWith(prefix)) { if (request.url.startsWith(prefix)) {
val apiUrl = "https://reeoov.tube/api/source/${request.url.removePrefix(prefix)}" val apiUrl = "https://reeoov.tube/api/source/${request.url.removePrefix(prefix)}"
val apiResponse = post(apiUrl,headers = mapOf("Referer" to request.url),data = mapOf("r" to "https://www.vmovee.watch/", "d" to "reeoov.tube")).text val apiResponse = app.post(apiUrl,headers = mapOf("Referer" to request.url),data = mapOf("r" to "https://www.vmovee.watch/", "d" to "reeoov.tube")).text
val apiData = mapper.readValue<ReeoovAPI>(apiResponse) val apiData = mapper.readValue<ReeoovAPI>(apiResponse)
for (d in apiData.data) { for (d in apiData.data) {
callback.invoke( callback.invoke(
@ -115,7 +113,7 @@ class VMoveeProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val sheader = document.selectFirst("div.sheader") val sheader = document.selectFirst("div.sheader")

View file

@ -1,7 +1,6 @@
package com.lagradost.cloudstream3.movieproviders package com.lagradost.cloudstream3.movieproviders
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
@ -33,7 +32,7 @@ class VfFilmProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/?s=$query" val url = "$mainUrl/?s=$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("ul.MovieList > li > article > a") val items = document.select("ul.MovieList > li > article > a")
if (items.isNullOrEmpty()) return ArrayList() if (items.isNullOrEmpty()) return ArrayList()
@ -42,7 +41,8 @@ class VfFilmProvider : MainAPI() {
for (item in items) { for (item in items) {
val href = item.attr("href") val href = item.attr("href")
val poster = item.selectFirst("> div.Image > figure > img").attr("src").replace("//image", "https://image") val poster = item.selectFirst("> div.Image > figure > img").attr("src")
.replace("//image", "https://image")
val name = item.selectFirst("> h3.Title").text() val name = item.selectFirst("> h3.Title").text()
@ -76,22 +76,23 @@ class VfFilmProvider : MainAPI() {
private fun getDirect(original: String): String { // original data, https://vf-film.org/?trembed=1&trid=55313&trtype=1 for example private fun getDirect(original: String): String { // original data, https://vf-film.org/?trembed=1&trid=55313&trtype=1 for example
val response = get(original).text val response = app.get(original).text
val url = "iframe .*src=\"(.*?)\"".toRegex().find(response)?.groupValues?.get(1).toString() // https://vudeo.net/embed-uweno86lzx8f.html for example val url = "iframe .*src=\"(.*?)\"".toRegex().find(response)?.groupValues?.get(1)
val vudoResponse = get(url).text .toString() // https://vudeo.net/embed-uweno86lzx8f.html for example
val vudoResponse = app.get(url).text
val document = Jsoup.parse(vudoResponse) val document = Jsoup.parse(vudoResponse)
val vudoUrl = Regex("sources: \\[\"(.*?)\"]").find(document.html())?.groupValues?.get(1).toString() // direct mp4 link, https://m11.vudeo.net/2vp3ukyw2avjdohilpebtzuct42q5jwvpmpsez3xjs6d7fbs65dpuey2rbra/v.mp4 for exemple val vudoUrl = Regex("sources: \\[\"(.*?)\"]").find(document.html())?.groupValues?.get(1)
.toString() // direct mp4 link, https://m11.vudeo.net/2vp3ukyw2avjdohilpebtzuct42q5jwvpmpsez3xjs6d7fbs65dpuey2rbra/v.mp4 for exemple
return vudoUrl return vudoUrl
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val title = document?.selectFirst("div.SubTitle")?.text() val title = document?.selectFirst("div.SubTitle")?.text()
?: throw ErrorLoadingException("Service might be unavailable") ?: throw ErrorLoadingException("Service might be unavailable")
val year = document.select("span.Date").text()?.toIntOrNull() val year = document.select("span.Date").text()?.toIntOrNull()
@ -99,7 +100,8 @@ class VfFilmProvider : MainAPI() {
val duration = document.select("span.Time").text()?.toIntOrNull() val duration = document.select("span.Time").text()?.toIntOrNull()
val poster = document.selectFirst("div.Image > figure > img").attr("src").replace("//image", "https://image") val poster = document.selectFirst("div.Image > figure > img").attr("src")
.replace("//image", "https://image")
val descript = document.selectFirst("div.Description > p").text() val descript = document.selectFirst("div.Description > p").text()

View file

@ -2,10 +2,7 @@ package com.lagradost.cloudstream3.movieproviders
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.network.url
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
import okio.Buffer import okio.Buffer
@ -37,7 +34,7 @@ class VfSerieProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/?s=$query" val url = "$mainUrl/?s=$query"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val items = document.select("ul.MovieList > li > article > a") val items = document.select("ul.MovieList > li > article > a")
if (items.isNullOrEmpty()) return ArrayList() if (items.isNullOrEmpty()) return ArrayList()
@ -65,9 +62,9 @@ class VfSerieProvider : MainAPI() {
private fun getDirect(original: String): String { // original data, https://vf-serie.org/?trembed=1&trid=80467&trtype=2 for example private fun getDirect(original: String): String { // original data, https://vf-serie.org/?trembed=1&trid=80467&trtype=2 for example
val response = get(original).text val response = app.get(original).text
val url = "iframe .*src=\\\"(.*?)\\\"".toRegex().find(response)?.groupValues?.get(1).toString() // https://vudeo.net/embed-7jdb1t5b2mvo.html for example val url = "iframe .*src=\\\"(.*?)\\\"".toRegex().find(response)?.groupValues?.get(1).toString() // https://vudeo.net/embed-7jdb1t5b2mvo.html for example
val vudoResponse = get(url).text val vudoResponse = app.get(url).text
val document = Jsoup.parse(vudoResponse) val document = Jsoup.parse(vudoResponse)
val vudoUrl = Regex("sources: \\[\"(.*?)\"\\]").find(document.html())?.groupValues?.get(1).toString() // direct mp4 link, https://m5.vudeo.net/2vp3xgpw2avjdohilpfbtyuxzzrqzuh4z5yxvztral5k3rjnba6f4byj3saa/v.mp4 for exemple val vudoUrl = Regex("sources: \\[\"(.*?)\"\\]").find(document.html())?.groupValues?.get(1).toString() // direct mp4 link, https://m5.vudeo.net/2vp3xgpw2avjdohilpfbtyuxzzrqzuh4z5yxvztral5k3rjnba6f4byj3saa/v.mp4 for exemple
return vudoUrl return vudoUrl
@ -81,7 +78,7 @@ class VfSerieProvider : MainAPI() {
): Boolean { ): Boolean {
if (data == "") return false if (data == "") return false
val response = get(data).text val response = app.get(data).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val players = document.select("ul.TPlayerNv > li") val players = document.select("ul.TPlayerNv > li")
val trembed_url = document.selectFirst("div.TPlayerTb > iframe").attr("src") val trembed_url = document.selectFirst("div.TPlayerTb > iframe").attr("src")
@ -117,7 +114,7 @@ class VfSerieProvider : MainAPI() {
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val title = document?.selectFirst(".Title")?.text()?.replace("Regarder Serie ","")?.replace(" En Streaming", "") val title = document?.selectFirst(".Title")?.text()?.replace("Regarder Serie ","")?.replace(" En Streaming", "")
?: throw ErrorLoadingException("Service might be unavailable") ?: throw ErrorLoadingException("Service might be unavailable")

View file

@ -2,7 +2,6 @@ package com.lagradost.cloudstream3.movieproviders
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.extractors.Vidstream import com.lagradost.cloudstream3.extractors.Vidstream
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getQualityFromName import com.lagradost.cloudstream3.utils.getQualityFromName
@ -52,7 +51,7 @@ open class VidstreamProviderTemplate : MainAPI() {
// Simply looking at devtools network is enough to spot a request like: // Simply looking at devtools network is enough to spot a request like:
// https://vidembed.cc/search.html?keyword=neverland where neverland is the query, can be written as below. // https://vidembed.cc/search.html?keyword=neverland where neverland is the query, can be written as below.
val link = "$mainUrl/search.html?keyword=$query" val link = "$mainUrl/search.html?keyword=$query"
val html = get(link).text val html = app.get(link).text
val soup = Jsoup.parse(html) val soup = Jsoup.parse(html)
return ArrayList(soup.select(".listing.items > .video-block").map { li -> return ArrayList(soup.select(".listing.items > .video-block").map { li ->
@ -83,7 +82,7 @@ open class VidstreamProviderTemplate : MainAPI() {
// Like search you should return either of: AnimeLoadResponse, MovieLoadResponse, TorrentLoadResponse, TvSeriesLoadResponse. // Like search you should return either of: AnimeLoadResponse, MovieLoadResponse, TorrentLoadResponse, TvSeriesLoadResponse.
override fun load(url: String): LoadResponse? { override fun load(url: String): LoadResponse? {
// Gets the url returned from searching. // Gets the url returned from searching.
val html = get(url).text val html = app.get(url).text
val soup = Jsoup.parse(html) val soup = Jsoup.parse(html)
var title = soup.selectFirst("h1,h2,h3").text() var title = soup.selectFirst("h1,h2,h3").text()
@ -164,7 +163,7 @@ open class VidstreamProviderTemplate : MainAPI() {
val homePageList = ArrayList<HomePageList>() val homePageList = ArrayList<HomePageList>()
// .pmap {} is used to fetch the different pages in parallel // .pmap {} is used to fetch the different pages in parallel
urls.pmap { url -> urls.pmap { url ->
val response = get(url, timeout = 20).text val response = app.get(url, timeout = 20).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
document.select("div.main-inner")?.forEach { inner -> document.select("div.main-inner")?.forEach { inner ->
// Always trim your text unless you want the risk of spaces at the start or end. // Always trim your text unless you want the risk of spaces at the start or end.
@ -221,7 +220,7 @@ open class VidstreamProviderTemplate : MainAPI() {
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
): Boolean { ): Boolean {
// "?: return" is a very useful statement which returns if the iframe link isn't found. // "?: return" is a very useful statement which returns if the iframe link isn't found.
val iframeLink = Jsoup.parse(get(data).text).selectFirst("iframe")?.attr("src") ?: return false val iframeLink = Jsoup.parse(app.get(data).text).selectFirst("iframe")?.attr("src") ?: return false
// In this case the video player is a vidstream clone and can be handled by the vidstream extractor. // In this case the video player is a vidstream clone and can be handled by the vidstream extractor.
// This case is a both unorthodox and you normally do not call extractors as they detect the url returned and does the rest. // This case is a both unorthodox and you normally do not call extractors as they detect the url returned and does the rest.
@ -233,7 +232,7 @@ open class VidstreamProviderTemplate : MainAPI() {
vidstreamObject.getUrl(id, isCasting, callback) vidstreamObject.getUrl(id, isCasting, callback)
} }
val html = get(fixUrl(iframeLink)).text val html = app.get(fixUrl(iframeLink)).text
val soup = Jsoup.parse(html) val soup = Jsoup.parse(html)
val servers = soup.select(".list-server-items > .linkserver").mapNotNull { li -> val servers = soup.select(".list-server-items > .linkserver").mapNotNull { li ->
@ -253,7 +252,7 @@ open class VidstreamProviderTemplate : MainAPI() {
// Having a referer is often required. It's a basic security check most providers have. // Having a referer is often required. It's a basic security check most providers have.
// Try to replicate what your browser does. // Try to replicate what your browser does.
val serverHtml = get(it.second, headers = mapOf("referer" to iframeLink)).text val serverHtml = app.get(it.second, headers = mapOf("referer" to iframeLink)).text
sourceRegex.findAll(serverHtml).forEach { match -> sourceRegex.findAll(serverHtml).forEach { match ->
callback.invoke( callback.invoke(
ExtractorLink( ExtractorLink(

View file

@ -2,8 +2,11 @@ package com.lagradost.cloudstream3.network
import android.content.Context import android.content.Context
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.USER_AGENT import com.lagradost.cloudstream3.USER_AGENT
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mapper
import okhttp3.* import okhttp3.*
import okhttp3.Headers.Companion.toHeaders import okhttp3.Headers.Companion.toHeaders
import java.io.File import java.io.File
@ -11,7 +14,30 @@ import java.net.URI
import java.util.* import java.util.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
var baseClient = OkHttpClient()
class Session(
client: OkHttpClient = app.baseClient
) : Requests() {
init {
this.baseClient = client
.newBuilder()
.cookieJar(CustomCookieJar())
.build()
}
inner class CustomCookieJar : CookieJar {
private var cookies = mapOf<String, Cookie>()
override fun loadForRequest(url: HttpUrl): List<Cookie> {
return this.cookies.values.toList()
}
override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
this.cookies += cookies.map { it.name to it }
}
}
}
private const val DEFAULT_TIME = 10 private const val DEFAULT_TIME = 10
private val DEFAULT_TIME_UNIT = TimeUnit.MINUTES private val DEFAULT_TIME_UNIT = TimeUnit.MINUTES
private const val DEFAULT_USER_AGENT = USER_AGENT private const val DEFAULT_USER_AGENT = USER_AGENT
@ -20,30 +46,6 @@ private val DEFAULT_DATA: Map<String, String> = mapOf()
private val DEFAULT_COOKIES: Map<String, String> = mapOf() private val DEFAULT_COOKIES: Map<String, String> = mapOf()
private val DEFAULT_REFERER: String? = null private val DEFAULT_REFERER: String? = null
fun Context.initRequestClient(): OkHttpClient {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
val dns = settingsManager.getInt(this.getString(R.string.dns_pref), 0)
baseClient = OkHttpClient.Builder()
.cache(
// Note that you need to add a ResponseInterceptor to make this 100% active.
// The server response dictates if and when stuff should be cached.
Cache(
directory = File(cacheDir, "http_cache"),
maxSize = 50L * 1024L * 1024L // 50 MiB
)
).apply {
when (dns) {
1 -> addGoogleDns()
2 -> addCloudFlareDns()
// 3 -> addOpenDns()
4 -> addAdGuardDns()
}
}
// Needs to be build as otherwise the other builders will change this object
.build()
return baseClient
}
/** WARNING! CAN ONLY BE READ ONCE */ /** WARNING! CAN ONLY BE READ ONCE */
val Response.text: String val Response.text: String
get() { get() {
@ -58,14 +60,32 @@ val Response.url: String
val Response.cookies: Map<String, String> val Response.cookies: Map<String, String>
get() { get() {
val cookieList = val cookieList =
this.headers.filter { it.first.toLowerCase(Locale.ROOT) == "set-cookie" }.getOrNull(0)?.second?.split(";") this.headers.filter { it.first.toLowerCase(Locale.ROOT) == "set-cookie" }
.getOrNull(0)?.second?.split(";")
return cookieList?.associate { return cookieList?.associate {
val split = it.split("=") val split = it.split("=")
(split.getOrNull(0)?.trim() ?: "") to (split.getOrNull(1)?.trim() ?: "") (split.getOrNull(0)?.trim() ?: "") to (split.getOrNull(1)?.trim() ?: "")
}?.filter { it.key.isNotBlank() && it.value.isNotBlank() } ?: mapOf() }?.filter { it.key.isNotBlank() && it.value.isNotBlank() } ?: mapOf()
} }
fun getData(data: Map<String, String?>): RequestBody { class AppResponse(
val response: Response
) {
/** Lazy, initialized on use. */
val text by lazy { response.text }
val url by lazy { response.url }
val cookies by lazy { response.cookies }
val body by lazy { response.body }
val code = response.code
val headers = response.headers
/** Same as using mapper.readValue<T>() */
inline fun <reified T : Any> mapped(): T {
return mapper.readValue(this.text)
}
}
private fun getData(data: Map<String, String?>): RequestBody {
val builder = FormBody.Builder() val builder = FormBody.Builder()
data.forEach { data.forEach {
it.value?.let { value -> it.value?.let { value ->
@ -76,16 +96,19 @@ fun getData(data: Map<String, String?>): RequestBody {
} }
// https://github.com, id=test -> https://github.com?id=test // https://github.com, id=test -> https://github.com?id=test
fun appendUri(uri: String, appendQuery: String): String { private fun appendUri(uri: String, appendQuery: String): String {
val oldUri = URI(uri) val oldUri = URI(uri)
return URI( return URI(
oldUri.scheme, oldUri.authority, oldUri.path, oldUri.scheme,
if (oldUri.query == null) appendQuery else oldUri.query + "&" + appendQuery, oldUri.fragment oldUri.authority,
oldUri.path,
if (oldUri.query == null) appendQuery else oldUri.query + "&" + appendQuery,
oldUri.fragment
).toString() ).toString()
} }
// Can probably be done recursively // Can probably be done recursively
fun addParamsToUrl(url: String, params: Map<String, String?>): String { private fun addParamsToUrl(url: String, params: Map<String, String?>): String {
var appendedUrl = url var appendedUrl = url
params.forEach { params.forEach {
it.value?.let { value -> it.value?.let { value ->
@ -95,87 +118,31 @@ fun addParamsToUrl(url: String, params: Map<String, String?>): String {
return appendedUrl return appendedUrl
} }
fun getCache(cacheTime: Int, cacheUnit: TimeUnit): CacheControl { private fun getCache(cacheTime: Int, cacheUnit: TimeUnit): CacheControl {
return CacheControl.Builder().maxAge(cacheTime, cacheUnit).build() return CacheControl.Builder().maxStale(cacheTime, cacheUnit).build()
} }
/** /**
* Referer > Set headers > Set cookies > Default headers > Default Cookies * Referer > Set headers > Set cookies > Default headers > Default Cookies
*/ */
fun getHeaders(headers: Map<String, String>, referer: String?, cookie: Map<String, String>): Headers { private fun getHeaders(
headers: Map<String, String>,
referer: String?,
cookie: Map<String, String>
): Headers {
val refererMap = (referer ?: DEFAULT_REFERER)?.let { mapOf("referer" to it) } ?: mapOf() val refererMap = (referer ?: DEFAULT_REFERER)?.let { mapOf("referer" to it) } ?: mapOf()
val cookieHeaders = (DEFAULT_COOKIES + cookie) val cookieHeaders = (DEFAULT_COOKIES + cookie)
val cookieMap = val cookieMap =
if (cookieHeaders.isNotEmpty()) mapOf("Cookie" to cookieHeaders.entries.joinToString(separator = "; ") { if (cookieHeaders.isNotEmpty()) mapOf(
"${it.key}=${it.value};" "Cookie" to cookieHeaders.entries.joinToString(
}) else mapOf() separator = "; "
) {
"${it.key}=${it.value};"
}) else mapOf()
val tempHeaders = (DEFAULT_HEADERS + cookieMap + headers + refererMap) val tempHeaders = (DEFAULT_HEADERS + cookieMap + headers + refererMap)
return tempHeaders.toHeaders() return tempHeaders.toHeaders()
} }
fun get(
url: String,
headers: Map<String, String> = mapOf(),
referer: String? = null,
params: Map<String, String> = mapOf(),
cookies: Map<String, String> = mapOf(),
allowRedirects: Boolean = true,
cacheTime: Int = DEFAULT_TIME,
cacheUnit: TimeUnit = DEFAULT_TIME_UNIT,
timeout: Long = 0L,
interceptor: Interceptor? = null
): Response {
val client = baseClient
.newBuilder()
.followRedirects(allowRedirects)
.followSslRedirects(allowRedirects)
.callTimeout(timeout, TimeUnit.SECONDS)
if (interceptor != null) client.addInterceptor(interceptor)
val request = getRequestCreator(url, headers, referer, params, cookies, cacheTime, cacheUnit)
return client.build().newCall(request).execute()
}
fun post(
url: String,
headers: Map<String, String> = mapOf(),
referer: String? = null,
params: Map<String, String> = mapOf(),
cookies: Map<String, String> = mapOf(),
data: Map<String, String> = DEFAULT_DATA,
allowRedirects: Boolean = true,
cacheTime: Int = DEFAULT_TIME,
cacheUnit: TimeUnit = DEFAULT_TIME_UNIT,
timeout: Long = 0L
): Response {
val client = baseClient
.newBuilder()
.followRedirects(allowRedirects)
.followSslRedirects(allowRedirects)
.callTimeout(timeout, TimeUnit.SECONDS)
.build()
val request = postRequestCreator(url, headers, referer, params, cookies, data, cacheTime, cacheUnit)
return client.newCall(request).execute()
}
fun getRequestCreator(
url: String,
headers: Map<String, String>,
referer: String?,
params: Map<String, String>,
cookies: Map<String, String>,
cacheTime: Int,
cacheUnit: TimeUnit
): Request {
return Request.Builder()
.url(addParamsToUrl(url, params))
.cacheControl(getCache(cacheTime, cacheUnit))
.headers(getHeaders(headers, referer, cookies))
.build()
}
fun postRequestCreator( fun postRequestCreator(
url: String, url: String,
headers: Map<String, String>, headers: Map<String, String>,
@ -194,6 +161,22 @@ fun postRequestCreator(
.build() .build()
} }
fun getRequestCreator(
url: String,
headers: Map<String, String>,
referer: String?,
params: Map<String, String>,
cookies: Map<String, String>,
cacheTime: Int,
cacheUnit: TimeUnit
): Request {
return Request.Builder()
.url(addParamsToUrl(url, params))
.cacheControl(getCache(cacheTime, cacheUnit))
.headers(getHeaders(headers, referer, cookies))
.build()
}
fun putRequestCreator( fun putRequestCreator(
url: String, url: String,
headers: Map<String, String>, headers: Map<String, String>,
@ -212,25 +195,103 @@ fun putRequestCreator(
.build() .build()
} }
open class Requests {
var baseClient = OkHttpClient()
fun put( fun initClient(context: Context): OkHttpClient {
url: String, val settingsManager = PreferenceManager.getDefaultSharedPreferences(context)
headers: Map<String, String> = mapOf(), val dns = settingsManager.getInt(context.getString(R.string.dns_pref), 0)
referer: String? = null, baseClient = OkHttpClient.Builder()
params: Map<String, String> = mapOf(), .cache(
cookies: Map<String, String> = mapOf(), // Note that you need to add a ResponseInterceptor to make this 100% active.
data: Map<String, String?> = DEFAULT_DATA, // The server response dictates if and when stuff should be cached.
allowRedirects: Boolean = true, Cache(
cacheTime: Int = DEFAULT_TIME, directory = File(context.cacheDir, "http_cache"),
cacheUnit: TimeUnit = DEFAULT_TIME_UNIT, maxSize = 50L * 1024L * 1024L // 50 MiB
timeout: Long = 0L )
): Response { ).apply {
val client = baseClient when (dns) {
.newBuilder() 1 -> addGoogleDns()
.followRedirects(allowRedirects) 2 -> addCloudFlareDns()
.followSslRedirects(allowRedirects) // 3 -> addOpenDns()
.callTimeout(timeout, TimeUnit.SECONDS) 4 -> addAdGuardDns()
.build() }
val request = putRequestCreator(url, headers, referer, params, cookies, data, cacheTime, cacheUnit) }
return client.newCall(request).execute() // Needs to be build as otherwise the other builders will change this object
.build()
return baseClient
}
fun get(
url: String,
headers: Map<String, String> = mapOf(),
referer: String? = null,
params: Map<String, String> = mapOf(),
cookies: Map<String, String> = mapOf(),
allowRedirects: Boolean = true,
cacheTime: Int = DEFAULT_TIME,
cacheUnit: TimeUnit = DEFAULT_TIME_UNIT,
timeout: Long = 0L,
interceptor: Interceptor? = null,
): AppResponse {
val client = baseClient
.newBuilder()
.followRedirects(allowRedirects)
.followSslRedirects(allowRedirects)
.callTimeout(timeout, TimeUnit.SECONDS)
if (interceptor != null) client.addInterceptor(interceptor)
val request =
getRequestCreator(url, headers, referer, params, cookies, cacheTime, cacheUnit)
val response = client.build().newCall(request).execute()
return AppResponse(response)
}
fun post(
url: String,
headers: Map<String, String> = mapOf(),
referer: String? = null,
params: Map<String, String> = mapOf(),
cookies: Map<String, String> = mapOf(),
data: Map<String, String> = DEFAULT_DATA,
allowRedirects: Boolean = true,
cacheTime: Int = DEFAULT_TIME,
cacheUnit: TimeUnit = DEFAULT_TIME_UNIT,
timeout: Long = 0L,
): AppResponse {
val client = baseClient
.newBuilder()
.followRedirects(allowRedirects)
.followSslRedirects(allowRedirects)
.callTimeout(timeout, TimeUnit.SECONDS)
.build()
val request =
postRequestCreator(url, headers, referer, params, cookies, data, cacheTime, cacheUnit)
val response = client.newCall(request).execute()
return AppResponse(response)
}
fun put(
url: String,
headers: Map<String, String> = mapOf(),
referer: String? = null,
params: Map<String, String> = mapOf(),
cookies: Map<String, String> = mapOf(),
data: Map<String, String?> = DEFAULT_DATA,
allowRedirects: Boolean = true,
cacheTime: Int = DEFAULT_TIME,
cacheUnit: TimeUnit = DEFAULT_TIME_UNIT,
timeout: Long = 0L
): AppResponse {
val client = baseClient
.newBuilder()
.followRedirects(allowRedirects)
.followSslRedirects(allowRedirects)
.callTimeout(timeout, TimeUnit.SECONDS)
.build()
val request =
putRequestCreator(url, headers, referer, params, cookies, data, cacheTime, cacheUnit)
val response = client.newCall(request).execute()
return AppResponse(response)
}
} }

View file

@ -5,6 +5,7 @@ import android.net.http.SslError
import android.webkit.* import android.webkit.*
import com.lagradost.cloudstream3.AcraApplication import com.lagradost.cloudstream3.AcraApplication
import com.lagradost.cloudstream3.USER_AGENT import com.lagradost.cloudstream3.USER_AGENT
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.Coroutines.main import com.lagradost.cloudstream3.utils.Coroutines.main
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -98,15 +99,15 @@ class WebViewResolver(val interceptUrl: Regex) : Interceptor {
webViewUrl.contains("recaptcha") -> super.shouldInterceptRequest(view, request) webViewUrl.contains("recaptcha") -> super.shouldInterceptRequest(view, request)
request.method == "GET" -> get( request.method == "GET" -> app.get(
webViewUrl, webViewUrl,
headers = request.requestHeaders headers = request.requestHeaders
).toWebResourceResponse() ).response.toWebResourceResponse()
request.method == "POST" -> post( request.method == "POST" -> app.post(
webViewUrl, webViewUrl,
headers = request.requestHeaders headers = request.requestHeaders
).toWebResourceResponse() ).response.toWebResourceResponse()
else -> return super.shouldInterceptRequest(view, request) else -> return super.shouldInterceptRequest(view, request)
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -144,7 +145,7 @@ class WebViewResolver(val interceptUrl: Regex) : Interceptor {
// 1. contentType. 2. charset // 1. contentType. 2. charset
val typeRegex = Regex("""(.*);(?:.*charset=(.*)(?:|;)|)""") val typeRegex = Regex("""(.*);(?:.*charset=(.*)(?:|;)|)""")
return if (contentTypeValue != null) { return if (contentTypeValue != null) {
val found = typeRegex.find(contentTypeValue ?: "") val found = typeRegex.find(contentTypeValue)
val contentType = found?.groupValues?.getOrNull(1)?.ifBlank { null } ?: contentTypeValue val contentType = found?.groupValues?.getOrNull(1)?.ifBlank { null } ?: contentTypeValue
val charset = found?.groupValues?.getOrNull(2)?.ifBlank { null } val charset = found?.groupValues?.getOrNull(2)?.ifBlank { null }
WebResourceResponse(contentType, charset, this.body?.byteStream()) WebResourceResponse(contentType, charset, this.body?.byteStream())

View file

@ -7,9 +7,8 @@ import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.syncproviders.AccountManager import com.lagradost.cloudstream3.syncproviders.AccountManager
import com.lagradost.cloudstream3.syncproviders.OAuth2API import com.lagradost.cloudstream3.syncproviders.OAuth2API
import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.appString import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.appString
@ -217,7 +216,7 @@ class AniListApi(index: Int) : AccountManager(index), SyncAPI {
) )
) )
val res = post( val res = app.post(
"https://graphql.anilist.co/", "https://graphql.anilist.co/",
//headers = mapOf(), //headers = mapOf(),
data = data,//(if (vars == null) mapOf("query" to q) else mapOf("query" to q, "variables" to vars)) data = data,//(if (vars == null) mapOf("query" to q) else mapOf("query" to q, "variables" to vars))
@ -323,7 +322,7 @@ class AniListApi(index: Int) : AccountManager(index), SyncAPI {
} }
""" """
val data = post( val data = app.post(
"https://graphql.anilist.co", "https://graphql.anilist.co",
data = mapOf("query" to q), data = mapOf("query" to q),
cacheTime = 0, cacheTime = 0,
@ -346,38 +345,10 @@ class AniListApi(index: Int) : AccountManager(index), SyncAPI {
} }
private fun Context.checkToken(): Boolean { private fun Context.checkToken(): Boolean {
if (unixTime > getKey( return unixTime > getKey(
accountId, accountId,
ANILIST_UNIXTIME_KEY, 0L ANILIST_UNIXTIME_KEY, 0L
)!! )!!
) {
/*getCurrentActivity()?.runOnUiThread {
val alertDialog: AlertDialog? = activity?.let {
val builder = AlertDialog.Builder(it, R.style.AlertDialogCustom)
builder.apply {
setPositiveButton(
"Login"
) { dialog, id ->
authenticateAniList()
}
setNegativeButton(
"Cancel"
) { dialog, id ->
// User cancelled the dialog
}
}
// Set other dialog properties
builder.setTitle("AniList token has expired")
// Create the AlertDialog
builder.create()
}
alertDialog?.show()
}*/
return true
} else {
return false
}
} }
fun Context.getDataAboutId(id: Int): AniListTitleHolder? { fun Context.getDataAboutId(id: Int): AniListTitleHolder? {
@ -443,7 +414,7 @@ class AniListApi(index: Int) : AccountManager(index), SyncAPI {
return try { return try {
if (!checkToken()) { if (!checkToken()) {
// println("VARS_ " + vars) // println("VARS_ " + vars)
post( app.post(
"https://graphql.anilist.co/", "https://graphql.anilist.co/",
headers = mapOf( headers = mapOf(
"Authorization" to "Bearer " + getKey( "Authorization" to "Bearer " + getKey(

View file

@ -8,11 +8,8 @@ import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.put
import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.syncproviders.AccountManager import com.lagradost.cloudstream3.syncproviders.AccountManager
import com.lagradost.cloudstream3.syncproviders.OAuth2API import com.lagradost.cloudstream3.syncproviders.OAuth2API
import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.appString import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.appString
@ -62,7 +59,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI {
override fun search(context: Context, name: String): List<SyncAPI.SyncSearchResult> { override fun search(context: Context, name: String): List<SyncAPI.SyncSearchResult> {
val url = "https://api.myanimelist.net/v2/anime?q=$name&limit=$MAL_MAX_SEARCH_LIMIT" val url = "https://api.myanimelist.net/v2/anime?q=$name&limit=$MAL_MAX_SEARCH_LIMIT"
var res = get( var res = app.get(
url, headers = mapOf( url, headers = mapOf(
"Authorization" to "Bearer " + context.getKey<String>( "Authorization" to "Bearer " + context.getKey<String>(
accountId, accountId,
@ -130,7 +127,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI {
var res = "" var res = ""
try { try {
//println("cc::::: " + codeVerifier) //println("cc::::: " + codeVerifier)
res = post( res = app.post(
"https://myanimelist.net/v1/oauth2/token", "https://myanimelist.net/v1/oauth2/token",
data = mapOf( data = mapOf(
"client_id" to key, "client_id" to key,
@ -193,7 +190,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI {
private fun Context.refreshToken() { private fun Context.refreshToken() {
try { try {
val res = post( val res = app.post(
"https://myanimelist.net/v1/oauth2/token", "https://myanimelist.net/v1/oauth2/token",
data = mapOf( data = mapOf(
"client_id" to key, "client_id" to key,
@ -337,7 +334,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI {
// https://myanimelist.net/apiconfig/references/api/v2#operation/users_user_id_animelist_get // https://myanimelist.net/apiconfig/references/api/v2#operation/users_user_id_animelist_get
val url = val url =
"https://api.myanimelist.net/v2/users/$user/animelist?fields=list_status,num_episodes,media_type,status,start_date,end_date,synopsis,alternative_titles,mean,genres,rank,num_list_users,nsfw,average_episode_duration,num_favorites,popularity,num_scoring_users,start_season,favorites_info,broadcast,created_at,updated_at&nsfw=1&limit=100&offset=$offset" "https://api.myanimelist.net/v2/users/$user/animelist?fields=list_status,num_episodes,media_type,status,start_date,end_date,synopsis,alternative_titles,mean,genres,rank,num_list_users,nsfw,average_episode_duration,num_favorites,popularity,num_scoring_users,start_season,favorites_info,broadcast,created_at,updated_at&nsfw=1&limit=100&offset=$offset"
val res = get( val res = app.get(
url, headers = mapOf( url, headers = mapOf(
"Authorization" to "Bearer " + getKey<String>( "Authorization" to "Bearer " + getKey<String>(
accountId, accountId,
@ -356,7 +353,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI {
return try { return try {
// https://myanimelist.net/apiconfig/references/api/v2#operation/anime_anime_id_get // https://myanimelist.net/apiconfig/references/api/v2#operation/anime_anime_id_get
val url = "https://api.myanimelist.net/v2/anime/$id?fields=id,title,num_episodes,my_list_status" val url = "https://api.myanimelist.net/v2/anime/$id?fields=id,title,num_episodes,my_list_status"
val res = get( val res = app.get(
url, headers = mapOf( url, headers = mapOf(
"Authorization" to "Bearer " + getKey<String>( "Authorization" to "Bearer " + getKey<String>(
accountId, accountId,
@ -377,7 +374,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI {
allTitles.clear() allTitles.clear()
checkMalToken() checkMalToken()
while (!isDone) { while (!isDone) {
val res = get( val res = app.get(
"https://api.myanimelist.net/v2/users/$user/animelist?fields=list_status&limit=1000&offset=${index * 1000}", "https://api.myanimelist.net/v2/users/$user/animelist?fields=list_status&limit=1000&offset=${index * 1000}",
headers = mapOf( headers = mapOf(
"Authorization" to "Bearer " + getKey<String>( "Authorization" to "Bearer " + getKey<String>(
@ -447,7 +444,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI {
private fun Context.getMalUser(setSettings: Boolean = true): MalUser? { private fun Context.getMalUser(setSettings: Boolean = true): MalUser? {
checkMalToken() checkMalToken()
return try { return try {
val res = get( val res = app.get(
"https://api.myanimelist.net/v2/users/@me", "https://api.myanimelist.net/v2/users/@me",
headers = mapOf( headers = mapOf(
"Authorization" to "Bearer " + getKey<String>( "Authorization" to "Bearer " + getKey<String>(
@ -529,7 +526,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI {
num_watched_episodes: Int? = null, num_watched_episodes: Int? = null,
): String { ): String {
return try { return try {
put( app.put(
"https://api.myanimelist.net/v2/anime/$id/my_list_status", "https://api.myanimelist.net/v2/anime/$id/my_list_status",
headers = mapOf( headers = mapOf(
"Authorization" to "Bearer " + getKey<String>( "Authorization" to "Bearer " + getKey<String>(

View file

@ -1,7 +1,6 @@
package com.lagradost.cloudstream3.torrentproviders package com.lagradost.cloudstream3.torrentproviders
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.Qualities
@ -25,7 +24,7 @@ class NyaaProvider : MainAPI() {
override fun search(query: String): List<SearchResponse> { override fun search(query: String): List<SearchResponse> {
val url = "$mainUrl/?f=0&c=0_0&q=$query&s=seeders&o=desc" val url = "$mainUrl/?f=0&c=0_0&q=$query&s=seeders&o=desc"
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val returnValues = ArrayList<SearchResponse>() val returnValues = ArrayList<SearchResponse>()
@ -45,7 +44,7 @@ class NyaaProvider : MainAPI() {
} }
override fun load(url: String): LoadResponse { override fun load(url: String): LoadResponse {
val response = get(url).text val response = app.get(url).text
val document = Jsoup.parse(response) val document = Jsoup.parse(response)
val title = document.selectFirst("h3.panel-title").text() val title = document.selectFirst("h3.panel-title").text()
val description = document.selectFirst("div#torrent-description").text() val description = document.selectFirst("div#torrent-description").text()

View file

@ -28,8 +28,8 @@ import com.lagradost.cloudstream3.DubStatus
import com.lagradost.cloudstream3.MainActivity.Companion.setLocale import com.lagradost.cloudstream3.MainActivity.Companion.setLocale
import com.lagradost.cloudstream3.MainActivity.Companion.showToast import com.lagradost.cloudstream3.MainActivity.Companion.showToast
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.network.initRequestClient
import com.lagradost.cloudstream3.syncproviders.AccountManager import com.lagradost.cloudstream3.syncproviders.AccountManager
import com.lagradost.cloudstream3.syncproviders.OAuth2API import com.lagradost.cloudstream3.syncproviders.OAuth2API
import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.aniListApi import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.aniListApi
@ -350,9 +350,9 @@ class SettingsFragment : PreferenceFragmentCompat() {
.putInt(getString(R.string.preferred_media_settings), prefValues[it]) .putInt(getString(R.string.preferred_media_settings), prefValues[it])
.apply() .apply()
val apilist = AppUtils.filterProviderByPreferredMedia(apis, prefValues[it]) val apilist = AppUtils.filterProviderByPreferredMedia(apis, prefValues[it])
val apiRandom = if (apilist?.size > 0) { apilist.random().name } else { "" } val apiRandom = if (apilist.size > 0) { apilist.random().name } else { "" }
context?.setKey(HOMEPAGE_API, apiRandom) context?.setKey(HOMEPAGE_API, apiRandom)
context?.initRequestClient() (context ?: AcraApplication.context)?.let { ctx -> app.initClient(ctx) }
} }
return@setOnPreferenceClickListener true return@setOnPreferenceClickListener true
} }
@ -465,7 +465,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
true, true,
{}) { {}) {
settingsManager.edit().putInt(getString(R.string.dns_pref), prefValues[it]).apply() settingsManager.edit().putInt(getString(R.string.dns_pref), prefValues[it]).apply()
context?.initRequestClient() (context ?: AcraApplication.context)?.let { ctx -> app.initClient(ctx) }
} }
return@setOnPreferenceClickListener true return@setOnPreferenceClickListener true
} }

View file

@ -1,9 +1,9 @@
package com.lagradost.cloudstream3.utils package com.lagradost.cloudstream3.utils
import com.lagradost.cloudstream3.USER_AGENT import com.lagradost.cloudstream3.USER_AGENT
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.extractors.* import com.lagradost.cloudstream3.extractors.*
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
import com.lagradost.cloudstream3.network.post
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import org.jsoup.Jsoup import org.jsoup.Jsoup
@ -126,7 +126,7 @@ fun getPostForm(requestUrl : String, html : String) : String? {
} }
Thread.sleep(5000) // ye this is needed, wont work with 0 delay Thread.sleep(5000) // ye this is needed, wont work with 0 delay
val postResponse = post( val postResponse = app.post(
requestUrl, requestUrl,
headers = mapOf( headers = mapOf(
"content-type" to "application/x-www-form-urlencoded", "content-type" to "application/x-www-form-urlencoded",

View file

@ -1,6 +1,6 @@
package com.lagradost.cloudstream3.utils package com.lagradost.cloudstream3.utils
import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import org.jsoup.Jsoup import org.jsoup.Jsoup
import java.util.* import java.util.*
@ -18,7 +18,7 @@ object FillerEpisodeCheck {
private fun getFillerList(): Boolean { private fun getFillerList(): Boolean {
if (list != null) return true if (list != null) return true
try { try {
val result = get("$MAIN_URL/shows").text val result = app.get("$MAIN_URL/shows").text
val documented = Jsoup.parse(result) val documented = Jsoup.parse(result)
val localHTMLList = documented.select("div#ShowList > div.Group > ul > li > a") val localHTMLList = documented.select("div#ShowList > div.Group > ul > li > a")
val localList = HashMap<String, String>() val localList = HashMap<String, String>()
@ -73,7 +73,7 @@ object FillerEpisodeCheck {
val realQuery = fixName(query.replace(blackListRegex, "")).replace("shippuuden", "shippuden") val realQuery = fixName(query.replace(blackListRegex, "")).replace("shippuuden", "shippuden")
if (!localList.containsKey(realQuery)) return null if (!localList.containsKey(realQuery)) return null
val href = localList[realQuery]?.replace(MAIN_URL, "") ?: return null // JUST IN CASE val href = localList[realQuery]?.replace(MAIN_URL, "") ?: return null // JUST IN CASE
val result = get("$MAIN_URL$href").text val result = app.get("$MAIN_URL$href").text
val documented = Jsoup.parse(result) ?: return null val documented = Jsoup.parse(result) ?: return null
val hashMap = HashMap<Int, Boolean>() val hashMap = HashMap<Int, Boolean>()
documented.select("table.EpisodeList > tbody > tr").forEach { documented.select("table.EpisodeList > tbody > tr").forEach {

View file

@ -1,5 +1,6 @@
package com.lagradost.cloudstream3.utils package com.lagradost.cloudstream3.utils
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.GlideBuilder import com.bumptech.glide.GlideBuilder
@ -9,13 +10,15 @@ import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.module.AppGlideModule import com.bumptech.glide.module.AppGlideModule
import com.bumptech.glide.request.Request
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.signature.ObjectKey import com.bumptech.glide.signature.ObjectKey
import com.lagradost.cloudstream3.network.initRequestClient import com.lagradost.cloudstream3.network.Requests
import java.io.InputStream import java.io.InputStream
@GlideModule @GlideModule
class GlideModule : AppGlideModule() { class GlideModule : AppGlideModule() {
@SuppressLint("CheckResult")
override fun applyOptions(context: Context, builder: GlideBuilder) { override fun applyOptions(context: Context, builder: GlideBuilder) {
super.applyOptions(context, builder) super.applyOptions(context, builder)
builder.apply { builder.apply {
@ -28,7 +31,7 @@ class GlideModule : AppGlideModule() {
// Needed for DOH // Needed for DOH
// https://stackoverflow.com/a/61634041 // https://stackoverflow.com/a/61634041
override fun registerComponents(context: Context, glide: Glide, registry: Registry) { override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
val client = context.initRequestClient() val client = Requests().initClient(context)
registry.replace( registry.replace(
GlideUrl::class.java, GlideUrl::class.java,
InputStream::class.java, InputStream::class.java,

View file

@ -21,9 +21,9 @@ import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.BuildConfig import com.lagradost.cloudstream3.BuildConfig
import com.lagradost.cloudstream3.MainActivity.Companion.showToast import com.lagradost.cloudstream3.MainActivity.Companion.showToast
import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import java.io.File import java.io.File
import kotlin.concurrent.thread import kotlin.concurrent.thread
@ -84,7 +84,7 @@ class InAppUpdater {
val url = "https://api.github.com/repos/LagradOst/CloudStream-3/releases" val url = "https://api.github.com/repos/LagradOst/CloudStream-3/releases"
val headers = mapOf("Accept" to "application/vnd.github.v3+json") val headers = mapOf("Accept" to "application/vnd.github.v3+json")
val response = val response =
mapper.readValue<List<GithubRelease>>(get(url, headers = headers).text) mapper.readValue<List<GithubRelease>>(app.get(url, headers = headers).text)
val versionRegex = Regex("""(.*?((\d+)\.(\d+)\.(\d+))\.apk)""") val versionRegex = Regex("""(.*?((\d+)\.(\d+)\.(\d+))\.apk)""")
val versionRegexLocal = Regex("""(.*?((\d+)\.(\d+)\.(\d+)).*)""") val versionRegexLocal = Regex("""(.*?((\d+)\.(\d+)\.(\d+)).*)""")
@ -140,7 +140,7 @@ class InAppUpdater {
val releaseUrl = "https://api.github.com/repos/LagradOst/CloudStream-3/releases" val releaseUrl = "https://api.github.com/repos/LagradOst/CloudStream-3/releases"
val headers = mapOf("Accept" to "application/vnd.github.v3+json") val headers = mapOf("Accept" to "application/vnd.github.v3+json")
val response = val response =
mapper.readValue<List<GithubRelease>>(get(releaseUrl, headers = headers).text) mapper.readValue<List<GithubRelease>>(app.get(releaseUrl, headers = headers).text)
val found = val found =
response.lastOrNull { rel -> response.lastOrNull { rel ->
@ -149,7 +149,7 @@ class InAppUpdater {
val foundAsset = found?.assets?.getOrNull(0) val foundAsset = found?.assets?.getOrNull(0)
val tagResponse = val tagResponse =
mapper.readValue<GithubTag>(get(tagUrl, headers = headers).text) mapper.readValue<GithubTag>(app.get(tagUrl, headers = headers).text)
val shouldUpdate = (getString(R.string.prerelease_commit_hash) != tagResponse.github_object.sha) val shouldUpdate = (getString(R.string.prerelease_commit_hash) != tagResponse.github_object.sha)

View file

@ -1,7 +1,7 @@
package com.lagradost.cloudstream3.utils package com.lagradost.cloudstream3.utils
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import javax.crypto.Cipher import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.IvParameterSpec
@ -82,7 +82,7 @@ class M3u8Helper {
fun m3u8Generation(m3u8: M3u8Stream, returnThis: Boolean): List<M3u8Stream> { fun m3u8Generation(m3u8: M3u8Stream, returnThis: Boolean): List<M3u8Stream> {
val generate = sequence { val generate = sequence {
val m3u8Parent = getParentLink(m3u8.streamUrl) val m3u8Parent = getParentLink(m3u8.streamUrl)
val response = get(m3u8.streamUrl, headers = m3u8.headers).text val response = app.get(m3u8.streamUrl, headers = m3u8.headers).text
for (match in QUALITY_REGEX.findAll(response)) { for (match in QUALITY_REGEX.findAll(response)) {
var (quality, m3u8Link, m3u8Link2) = match.destructured var (quality, m3u8Link, m3u8Link2) = match.destructured
@ -146,7 +146,7 @@ class M3u8Helper {
val secondSelection = selectBest(streams.ifEmpty { listOf(selected) }) val secondSelection = selectBest(streams.ifEmpty { listOf(selected) })
if (secondSelection != null) { if (secondSelection != null) {
val m3u8Response = get(secondSelection.streamUrl, headers = headers).text val m3u8Response = app.get(secondSelection.streamUrl, headers = headers).text
var encryptionUri: String? var encryptionUri: String?
var encryptionIv = byteArrayOf() var encryptionIv = byteArrayOf()
@ -164,7 +164,7 @@ class M3u8Helper {
} }
encryptionIv = match.component3().toByteArray() encryptionIv = match.component3().toByteArray()
val encryptionKeyResponse = get(encryptionUri, headers = headers) val encryptionKeyResponse = app.get(encryptionUri, headers = headers)
encryptionData = encryptionKeyResponse.body?.bytes() ?: byteArrayOf() encryptionData = encryptionKeyResponse.body?.bytes() ?: byteArrayOf()
} }
@ -187,7 +187,7 @@ class M3u8Helper {
while (lastYield != c) { while (lastYield != c) {
try { try {
val tsResponse = get(url, headers = headers) val tsResponse = app.get(url, headers = headers)
var tsData = tsResponse.body?.bytes() ?: byteArrayOf() var tsData = tsResponse.body?.bytes() ?: byteArrayOf()
if (encryptionState) { if (encryptionState) {

View file

@ -2,9 +2,9 @@ package com.lagradost.cloudstream3.utils
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mapper import com.lagradost.cloudstream3.mapper
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.network.text
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -16,7 +16,7 @@ object SyncUtil {
//Gogoanime, Twistmoe and 9anime //Gogoanime, Twistmoe and 9anime
val url = val url =
"https://raw.githubusercontent.com/MALSync/MAL-Sync-Backup/master/data/pages/$site/$slug.json" "https://raw.githubusercontent.com/MALSync/MAL-Sync-Backup/master/data/pages/$site/$slug.json"
val response = get(url, cacheTime = 1, cacheUnit = TimeUnit.DAYS).text val response = app.get(url, cacheTime = 1, cacheUnit = TimeUnit.DAYS).text
val mapped = mapper.readValue<MalSyncPage?>(response) val mapped = mapper.readValue<MalSyncPage?>(response)
val overrideMal = mapped?.malId ?: mapped?.Mal?.id ?: mapped?.Anilist?.malId val overrideMal = mapped?.malId ?: mapped?.Mal?.id ?: mapped?.Anilist?.malId