sora: fix UHD?

This commit is contained in:
hexated 2023-08-19 03:48:57 +07:00
parent 8a61d0891e
commit 5654e31246
8 changed files with 71 additions and 76 deletions

View file

@ -54,7 +54,7 @@ jobs:
ANICHI_SERVER: ${{ secrets.ANICHI_SERVER }} ANICHI_SERVER: ${{ secrets.ANICHI_SERVER }}
ANICHI_ENDPOINT: ${{ secrets.ANICHI_ENDPOINT }} ANICHI_ENDPOINT: ${{ secrets.ANICHI_ENDPOINT }}
ANICHI_APP: ${{ secrets.ANICHI_APP }} ANICHI_APP: ${{ secrets.ANICHI_APP }}
GOMOVIES_KEY: ${{ secrets.GOMOVIES_KEY }} PRIMEWIRE_KEY: ${{ secrets.PRIMEWIRE_KEY }}
run: | run: |
cd $GITHUB_WORKSPACE/src cd $GITHUB_WORKSPACE/src
echo SORA_API=$SORA_API >> local.properties echo SORA_API=$SORA_API >> local.properties
@ -69,7 +69,7 @@ jobs:
echo ANICHI_SERVER=$ANICHI_SERVER >> local.properties echo ANICHI_SERVER=$ANICHI_SERVER >> local.properties
echo ANICHI_ENDPOINT=$ANICHI_ENDPOINT >> local.properties echo ANICHI_ENDPOINT=$ANICHI_ENDPOINT >> local.properties
echo ANICHI_APP=$ANICHI_APP >> local.properties echo ANICHI_APP=$ANICHI_APP >> local.properties
echo GOMOVIES_KEY=$GOMOVIES_KEY >> local.properties echo PRIMEWIRE_KEY=$PRIMEWIRE_KEY >> local.properties
- name: Build Plugins - name: Build Plugins
run: | run: |

View file

@ -1,7 +1,7 @@
import org.jetbrains.kotlin.konan.properties.Properties import org.jetbrains.kotlin.konan.properties.Properties
// use an integer for version numbers // use an integer for version numbers
version = 156 version = 157
android { android {
defaultConfig { defaultConfig {
@ -14,7 +14,7 @@ android {
buildConfigField("String", "SORATED", "\"${properties.getProperty("SORATED")}\"") buildConfigField("String", "SORATED", "\"${properties.getProperty("SORATED")}\"")
buildConfigField("String", "DUMP_API", "\"${properties.getProperty("DUMP_API")}\"") buildConfigField("String", "DUMP_API", "\"${properties.getProperty("DUMP_API")}\"")
buildConfigField("String", "DUMP_KEY", "\"${properties.getProperty("DUMP_KEY")}\"") buildConfigField("String", "DUMP_KEY", "\"${properties.getProperty("DUMP_KEY")}\"")
buildConfigField("String", "GOMOVIES_KEY", "\"${properties.getProperty("GOMOVIES_KEY")}\"") buildConfigField("String", "PRIMEWIRE_KEY", "\"${properties.getProperty("PRIMEWIRE_KEY")}\"")
buildConfigField("String", "CRUNCHYROLL_BASIC_TOKEN", "\"${properties.getProperty("CRUNCHYROLL_BASIC_TOKEN")}\"") buildConfigField("String", "CRUNCHYROLL_BASIC_TOKEN", "\"${properties.getProperty("CRUNCHYROLL_BASIC_TOKEN")}\"")
buildConfigField("String", "CRUNCHYROLL_REFRESH_TOKEN", "\"${properties.getProperty("CRUNCHYROLL_REFRESH_TOKEN")}\"") buildConfigField("String", "CRUNCHYROLL_REFRESH_TOKEN", "\"${properties.getProperty("CRUNCHYROLL_REFRESH_TOKEN")}\"")

View file

@ -1127,13 +1127,19 @@ object SoraExtractor : SoraStream() {
link ?: return@apmap link ?: return@apmap
) )
val base = getBaseUrl(driveLink ?: return@apmap) val base = getBaseUrl(driveLink ?: return@apmap)
val resDoc = app.get(driveLink).document val driveReq = app.get(driveLink)
val bitLink = resDoc.selectFirst("a.btn.btn-outline-success")?.attr("href") val driveRes = driveReq.document
val downloadLink = if (bitLink.isNullOrEmpty()) { val bitLink = driveRes.select("a.btn.btn-outline-success").attr("href")
val backupIframe = resDoc.select("a.btn.btn-outline-warning").attr("href") val downloadLink = when {
extractBackupUHD(backupIframe ?: return@apmap) driveRes.select("button.btn.btn-success").text()
} else { .contains("Direct Download", true) -> extractDirectUHD(driveLink, driveReq)
extractMirrorUHD(bitLink, base) bitLink.isNullOrEmpty() -> {
val backupIframe = driveRes.select("a.btn.btn-outline-warning").attr("href")
extractBackupUHD(backupIframe ?: return@apmap)
}
else -> {
extractMirrorUHD(bitLink, base)
}
} }
val tags = getUhdTags(quality) val tags = getUhdTags(quality)
@ -2138,7 +2144,7 @@ object SoraExtractor : SoraStream() {
} }
suspend fun invokeGomovies( suspend fun invokePrimewire(
title: String? = null, title: String? = null,
year: Int? = null, year: Int? = null,
season: Int? = null, season: Int? = null,
@ -2152,9 +2158,9 @@ object SoraExtractor : SoraStream() {
"$title Season $season" "$title Season $season"
} }
val doc = app.get("$gomoviesAPI/search/$query").document val doc = app.get("$primewireAPI/search/$query").document
val media = doc.select("div._gory div.g_yFsxmKnYLvpKDTrdbizeYMWy").map { val media = doc.select("div.RvnMfoxhgm").map {
Triple( Triple(
it.attr("data-filmName"), it.attr("data-filmName"),
it.attr("data-year"), it.attr("data-year"),
@ -2183,21 +2189,21 @@ object SoraExtractor : SoraStream() {
app.get( app.get(
fixUrl( fixUrl(
media.third, media.third,
gomoviesAPI primewireAPI
) )
).document.selectFirst("div#g_MXOzFGouZrOAUioXjpddqkZK a:contains(Episode ${slug.second})") ).document.selectFirst("div#vvqUtffkId a:contains(Episode ${slug.second})")
?.attr("href") ?.attr("href")
} ?: return } ?: return
val res = app.get(fixUrl(iframe, gomoviesAPI), verify = false) val res = app.get(fixUrl(iframe, primewireAPI), verify = false)
val match = "var url = '(/user/servers/.*?\\?ep=.*?)';".toRegex().find(res.text) val match = "var url = '(/user/servers/.*?\\?ep=.*?)';".toRegex().find(res.text)
val serverUrl = match?.groupValues?.get(1) ?: return val serverUrl = match?.groupValues?.get(1) ?: return
val cookies = res.okhttpResponse.headers.getGomoviesCookies() val cookies = res.okhttpResponse.headers.getPrimewireCookies()
val url = res.document.select("meta[property=og:url]").attr("content") val url = res.document.select("meta[property=og:url]").attr("content")
val headers = mapOf("X-Requested-With" to "XMLHttpRequest") val headers = mapOf("X-Requested-With" to "XMLHttpRequest")
val qualities = intArrayOf(2160, 1440, 1080, 720, 480, 360) val qualities = intArrayOf(2160, 1440, 1080, 720, 480, 360)
app.get( app.get(
"$gomoviesAPI$serverUrl", "$primewireAPI$serverUrl",
cookies = cookies, referer = url, headers = headers cookies = cookies, referer = url, headers = headers
).document.select("ul li").amap { el -> ).document.select("ul li").amap { el ->
val server = el.attr("data-value") val server = el.attr("data-value")
@ -2207,16 +2213,16 @@ object SoraExtractor : SoraStream() {
referer = url, referer = url,
headers = headers headers = headers
).text ).text
val json = base64Decode(encryptedData).decryptGomoviesJson() val json = base64Decode(encryptedData).decodePrimewireXor()
val links = tryParseJson<List<GomoviesSources>>(json) ?: return@amap val links = tryParseJson<List<PrimewireSources>>(json) ?: return@amap
links.forEach { video -> links.forEach { video ->
qualities.filter { it <= video.max.toInt() }.forEach { qualities.filter { it <= video.max.toInt() }.forEach {
callback( callback(
ExtractorLink( ExtractorLink(
"Gomovies", "Primewire",
"Gomovies", "Primewire",
video.src.split("360", limit = 3).joinToString(it.toString()), video.src.split("360", limit = 3).joinToString(it.toString()),
"$gomoviesAPI/", "$primewireAPI/",
it, it,
) )
) )
@ -2535,7 +2541,8 @@ object SoraExtractor : SoraStream() {
) { ) {
val referer = "https://2now.tv/" val referer = "https://2now.tv/"
val slug = getEpisodeSlug(season, episode) val slug = getEpisodeSlug(season, episode)
val url = if (season == null) "$nowTvAPI/$tmdbId.mp4" else "$nowTvAPI/tv/$tmdbId/s${season}e${slug.second}.mp4" val url =
if (season == null) "$nowTvAPI/$tmdbId.mp4" else "$nowTvAPI/tv/$tmdbId/s${season}e${slug.second}.mp4"
if (!app.get(url, referer = referer).isSuccessful) return if (!app.get(url, referer = referer).isSuccessful) return
callback.invoke( callback.invoke(
ExtractorLink( ExtractorLink(

View file

@ -9,12 +9,6 @@ data class FDMovieIFrame(
val type: String, val type: String,
) )
data class BaymoviesConfig(
val country: String,
val downloadTime: String,
val workers: List<String>
)
data class AniIds( data class AniIds(
var id: Int? = null, var id: Int? = null,
var idMal: Int? = null var idMal: Int? = null
@ -37,26 +31,7 @@ data class AniSearch(
@JsonProperty("data") var data: AniData? = AniData() @JsonProperty("data") var data: AniData? = AniData()
) )
data class Tmdb2Anilist( data class PrimewireSources(
@JsonProperty("tmdb_id") val tmdb_id: String? = null,
@JsonProperty("anilist_id") val anilist_id: String? = null,
@JsonProperty("mal_id") val mal_id: String? = null,
)
data class Movie123Media(
@JsonProperty("url") val url: String? = null,
)
data class Movie123Data(
@JsonProperty("t") val t: String? = null,
@JsonProperty("s") val s: String? = null,
)
data class Movie123Search(
@JsonProperty("data") val data: ArrayList<Movie123Data>? = arrayListOf(),
)
data class GomoviesSources(
@JsonProperty("src") val src: String, @JsonProperty("src") val src: String,
@JsonProperty("file") val file: String? = null, @JsonProperty("file") val file: String? = null,
@JsonProperty("label") val label: Int? = null, @JsonProperty("label") val label: Int? = null,
@ -202,15 +177,6 @@ data class IndexSearch(
@JsonProperty("data") val data: IndexData? = null, @JsonProperty("data") val data: IndexData? = null,
) )
data class SorastreamResponse(
@JsonProperty("data") val data: SorastreamVideos? = null,
)
data class SorastreamVideos(
@JsonProperty("mediaUrl") val mediaUrl: String? = null,
@JsonProperty("currentDefinition") val currentDefinition: String? = null,
)
data class BiliBiliEpisodes( data class BiliBiliEpisodes(
@JsonProperty("id") val id: Int? = null, @JsonProperty("id") val id: Int? = null,
@JsonProperty("sourceId") val sourceId: String? = null, @JsonProperty("sourceId") val sourceId: String? = null,

View file

@ -25,7 +25,6 @@ import com.hexated.SoraExtractor.invokeFmovies
import com.hexated.SoraExtractor.invokeFwatayako import com.hexated.SoraExtractor.invokeFwatayako
import com.hexated.SoraExtractor.invokeGMovies import com.hexated.SoraExtractor.invokeGMovies
import com.hexated.SoraExtractor.invokeGoku import com.hexated.SoraExtractor.invokeGoku
import com.hexated.SoraExtractor.invokeGomovies
import com.hexated.SoraExtractor.invokeKisskh import com.hexated.SoraExtractor.invokeKisskh
import com.hexated.SoraExtractor.invokeLing import com.hexated.SoraExtractor.invokeLing
import com.hexated.SoraExtractor.invokeM4uhd import com.hexated.SoraExtractor.invokeM4uhd
@ -46,6 +45,7 @@ import com.hexated.SoraExtractor.invokeMoment
import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeMultimovies
import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokeNetmovies
import com.hexated.SoraExtractor.invokePobmovies import com.hexated.SoraExtractor.invokePobmovies
import com.hexated.SoraExtractor.invokePrimewire
import com.hexated.SoraExtractor.invokeTvMovies import com.hexated.SoraExtractor.invokeTvMovies
import com.hexated.SoraExtractor.invokeUhdmovies import com.hexated.SoraExtractor.invokeUhdmovies
import com.hexated.SoraExtractor.invokeWatchOnline import com.hexated.SoraExtractor.invokeWatchOnline
@ -111,7 +111,6 @@ open class SoraStream : TmdbProvider() {
const val flixonAPI = "https://flixon.lol" const val flixonAPI = "https://flixon.lol"
const val smashyStreamAPI = "https://embed.smashystream.com" const val smashyStreamAPI = "https://embed.smashystream.com"
const val watchSomuchAPI = "https://watchsomuch.tv" // sub only const val watchSomuchAPI = "https://watchsomuch.tv" // sub only
val gomoviesAPI = base64DecodeAPI("bQ==Y28=ZS4=aW4=bmw=LW8=ZXM=dmk=bW8=Z28=Ly8=czo=dHA=aHQ=")
const val ask4MoviesAPI = "https://ask4movie.nl" const val ask4MoviesAPI = "https://ask4movie.nl"
const val biliBiliAPI = "https://api-vn.otakuz.live/server" const val biliBiliAPI = "https://api-vn.otakuz.live/server"
const val watchOnlineAPI = "https://watchonline.ag" const val watchOnlineAPI = "https://watchonline.ag"
@ -129,6 +128,7 @@ open class SoraStream : TmdbProvider() {
const val netmoviesAPI = "https://netmovies.to" const val netmoviesAPI = "https://netmovies.to"
const val momentAPI = "https://moment-explanation-i-244.site" const val momentAPI = "https://moment-explanation-i-244.site"
const val doomoviesAPI = "https://doomovies.net" const val doomoviesAPI = "https://doomovies.net"
const val primewireAPI = "https://real-primewire.club"
// INDEX SITE // INDEX SITE
const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev" const val dahmerMoviesAPI = "https://edytjedhgmdhm.abfhaqrhbnf.workers.dev"
@ -615,7 +615,7 @@ open class SoraStream : TmdbProvider() {
) )
}, },
{ {
invokeGomovies(res.title, res.year, res.season, res.episode, callback) invokePrimewire(res.title, res.year, res.season, res.episode, callback)
}, },
// { // {
// if (!res.isAnime) invokeGdbotMovies( // if (!res.isAnime) invokeGdbotMovies(

View file

@ -10,7 +10,6 @@ import com.hexated.SoraExtractor.invokeFlixon
import com.hexated.SoraExtractor.invokeFmovies import com.hexated.SoraExtractor.invokeFmovies
import com.hexated.SoraExtractor.invokeFwatayako import com.hexated.SoraExtractor.invokeFwatayako
import com.hexated.SoraExtractor.invokeGoku import com.hexated.SoraExtractor.invokeGoku
import com.hexated.SoraExtractor.invokeGomovies
import com.hexated.SoraExtractor.invokeHDMovieBox import com.hexated.SoraExtractor.invokeHDMovieBox
import com.hexated.SoraExtractor.invokeIdlix import com.hexated.SoraExtractor.invokeIdlix
import com.hexated.SoraExtractor.invokeKimcartoon import com.hexated.SoraExtractor.invokeKimcartoon
@ -32,6 +31,7 @@ import com.hexated.SoraExtractor.invokeFourCartoon
import com.hexated.SoraExtractor.invokeMoment import com.hexated.SoraExtractor.invokeMoment
import com.hexated.SoraExtractor.invokeMultimovies import com.hexated.SoraExtractor.invokeMultimovies
import com.hexated.SoraExtractor.invokeNetmovies import com.hexated.SoraExtractor.invokeNetmovies
import com.hexated.SoraExtractor.invokePrimewire
import com.hexated.SoraExtractor.invokeVidSrc import com.hexated.SoraExtractor.invokeVidSrc
import com.hexated.SoraExtractor.invokeWatchOnline import com.hexated.SoraExtractor.invokeWatchOnline
import com.hexated.SoraExtractor.invokeWatchsomuch import com.hexated.SoraExtractor.invokeWatchsomuch
@ -268,7 +268,7 @@ class SoraStreamLite : SoraStream() {
invokeFlixon(res.id, res.imdbId, res.season, res.episode, callback) invokeFlixon(res.id, res.imdbId, res.season, res.episode, callback)
}, },
{ {
invokeGomovies(res.title, res.year, res.season, res.episode, callback) invokePrimewire(res.title, res.year, res.season, res.episode, callback)
}, },
{ {
if (!res.isAnime) invokeAsk4Movies( if (!res.isAnime) invokeAsk4Movies(

View file

@ -165,6 +165,34 @@ suspend fun extractMirrorUHD(url: String, ref: String): String? {
) )
} }
suspend fun extractDirectUHD(url: String, niceResponse: NiceResponse): String? {
val document = niceResponse.document
val script = document.selectFirst("script:containsData(cf_token)")?.data() ?: return null
val actionToken = script.substringAfter("\"key\", \"").substringBefore("\");")
val cfToken = script.substringAfter("cf_token = \"").substringBefore("\";")
val body = FormBody.Builder()
.addEncoded("action", "direct")
.addEncoded("key", actionToken)
.addEncoded("action_token", cfToken)
.build()
val cookies = mapOf("PHPSESSID" to "${niceResponse.cookies["PHPSESSID"]}")
val direct = app.post(
url,
requestBody = body,
cookies = cookies,
referer = url,
headers = mapOf(
"x-token" to "driveleech.org"
)
).parsedSafe<Map<String, String>>()?.get("url")
return app.get(
direct ?: return null, cookies = cookies,
referer = url
).text.substringAfter("worker_url = '").substringBefore("';")
}
suspend fun extractBackupUHD(url: String): String? { suspend fun extractBackupUHD(url: String): String? {
val resumeDoc = app.get(url) val resumeDoc = app.get(url)
@ -425,14 +453,8 @@ suspend fun invokeSmashyFfix(
ref: String, ref: String,
callback: (ExtractorLink) -> Unit, callback: (ExtractorLink) -> Unit,
) { ) {
val script = val res = app.get(url, referer = ref).text
app.get(url, referer = ref).document.selectFirst("script:containsData(player =)")?.data() val source = Regex("['\"]?file['\"]?:\\s*\"([^\"]+)").find(res)?.groupValues?.get(1) ?: return
?: return
val source =
Regex("['\"]?file['\"]?:\\s*\"([^\"]+)").find(script)?.groupValues?.get(
1
) ?: return
source.split(",").map { links -> source.split(",").map { links ->
val quality = Regex("\\[(\\d+)]").find(links)?.groupValues?.getOrNull(1)?.trim() val quality = Regex("\\[(\\d+)]").find(links)?.groupValues?.getOrNull(1)?.trim()
@ -1283,7 +1305,7 @@ fun decodeIndexJson(json: String): String {
return base64Decode(slug.substring(0, slug.length - 20)) return base64Decode(slug.substring(0, slug.length - 20))
} }
fun String.decryptGomoviesJson(key: String = BuildConfig.GOMOVIES_KEY): String { fun String.decodePrimewireXor(key: String = BuildConfig.PRIMEWIRE_KEY): String {
val sb = StringBuilder() val sb = StringBuilder()
var i = 0 var i = 0
while (i < this.length) { while (i < this.length) {
@ -1297,7 +1319,7 @@ fun String.decryptGomoviesJson(key: String = BuildConfig.GOMOVIES_KEY): String {
return sb.toString() return sb.toString()
} }
fun Headers.getGomoviesCookies(cookieKey: String = "set-cookie"): Map<String, String> { fun Headers.getPrimewireCookies(cookieKey: String = "set-cookie"): Map<String, String> {
val cookieList = val cookieList =
this.filter { it.first.equals(cookieKey, ignoreCase = true) }.mapNotNull { this.filter { it.first.equals(cookieKey, ignoreCase = true) }.mapNotNull {
it.second.split(";").firstOrNull() it.second.split(";").firstOrNull()

View file

@ -10,7 +10,7 @@ import org.jsoup.nodes.Element
import java.net.URI import java.net.URI
open class YomoviesProvider : MainAPI() { open class YomoviesProvider : MainAPI() {
override var mainUrl = "https://yomovies.baby" override var mainUrl = "https://yomovies.ltd"
private var directUrl = "" private var directUrl = ""
override var name = "Yomovies" override var name = "Yomovies"
override val hasMainPage = true override val hasMainPage = true