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_ENDPOINT: ${{ secrets.ANICHI_ENDPOINT }}
ANICHI_APP: ${{ secrets.ANICHI_APP }}
GOMOVIES_KEY: ${{ secrets.GOMOVIES_KEY }}
PRIMEWIRE_KEY: ${{ secrets.PRIMEWIRE_KEY }}
run: |
cd $GITHUB_WORKSPACE/src
echo SORA_API=$SORA_API >> local.properties
@ -69,7 +69,7 @@ jobs:
echo ANICHI_SERVER=$ANICHI_SERVER >> local.properties
echo ANICHI_ENDPOINT=$ANICHI_ENDPOINT >> 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
run: |

View File

@ -1,7 +1,7 @@
import org.jetbrains.kotlin.konan.properties.Properties
// use an integer for version numbers
version = 156
version = 157
android {
defaultConfig {
@ -14,7 +14,7 @@ android {
buildConfigField("String", "SORATED", "\"${properties.getProperty("SORATED")}\"")
buildConfigField("String", "DUMP_API", "\"${properties.getProperty("DUMP_API")}\"")
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_REFRESH_TOKEN", "\"${properties.getProperty("CRUNCHYROLL_REFRESH_TOKEN")}\"")

View File

@ -1127,13 +1127,19 @@ object SoraExtractor : SoraStream() {
link ?: return@apmap
)
val base = getBaseUrl(driveLink ?: return@apmap)
val resDoc = app.get(driveLink).document
val bitLink = resDoc.selectFirst("a.btn.btn-outline-success")?.attr("href")
val downloadLink = if (bitLink.isNullOrEmpty()) {
val backupIframe = resDoc.select("a.btn.btn-outline-warning").attr("href")
extractBackupUHD(backupIframe ?: return@apmap)
} else {
extractMirrorUHD(bitLink, base)
val driveReq = app.get(driveLink)
val driveRes = driveReq.document
val bitLink = driveRes.select("a.btn.btn-outline-success").attr("href")
val downloadLink = when {
driveRes.select("button.btn.btn-success").text()
.contains("Direct Download", true) -> extractDirectUHD(driveLink, driveReq)
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)
@ -2138,7 +2144,7 @@ object SoraExtractor : SoraStream() {
}
suspend fun invokeGomovies(
suspend fun invokePrimewire(
title: String? = null,
year: Int? = null,
season: Int? = null,
@ -2152,9 +2158,9 @@ object SoraExtractor : SoraStream() {
"$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(
it.attr("data-filmName"),
it.attr("data-year"),
@ -2183,21 +2189,21 @@ object SoraExtractor : SoraStream() {
app.get(
fixUrl(
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")
} ?: 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 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 headers = mapOf("X-Requested-With" to "XMLHttpRequest")
val qualities = intArrayOf(2160, 1440, 1080, 720, 480, 360)
app.get(
"$gomoviesAPI$serverUrl",
"$primewireAPI$serverUrl",
cookies = cookies, referer = url, headers = headers
).document.select("ul li").amap { el ->
val server = el.attr("data-value")
@ -2207,16 +2213,16 @@ object SoraExtractor : SoraStream() {
referer = url,
headers = headers
).text
val json = base64Decode(encryptedData).decryptGomoviesJson()
val links = tryParseJson<List<GomoviesSources>>(json) ?: return@amap
val json = base64Decode(encryptedData).decodePrimewireXor()
val links = tryParseJson<List<PrimewireSources>>(json) ?: return@amap
links.forEach { video ->
qualities.filter { it <= video.max.toInt() }.forEach {
callback(
ExtractorLink(
"Gomovies",
"Gomovies",
"Primewire",
"Primewire",
video.src.split("360", limit = 3).joinToString(it.toString()),
"$gomoviesAPI/",
"$primewireAPI/",
it,
)
)
@ -2535,7 +2541,8 @@ object SoraExtractor : SoraStream() {
) {
val referer = "https://2now.tv/"
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
callback.invoke(
ExtractorLink(

View File

@ -9,12 +9,6 @@ data class FDMovieIFrame(
val type: String,
)
data class BaymoviesConfig(
val country: String,
val downloadTime: String,
val workers: List<String>
)
data class AniIds(
var id: Int? = null,
var idMal: Int? = null
@ -37,26 +31,7 @@ data class AniSearch(
@JsonProperty("data") var data: AniData? = AniData()
)
data class Tmdb2Anilist(
@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(
data class PrimewireSources(
@JsonProperty("src") val src: String,
@JsonProperty("file") val file: String? = null,
@JsonProperty("label") val label: Int? = null,
@ -202,15 +177,6 @@ data class IndexSearch(
@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(
@JsonProperty("id") val id: Int? = 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.invokeGMovies
import com.hexated.SoraExtractor.invokeGoku
import com.hexated.SoraExtractor.invokeGomovies
import com.hexated.SoraExtractor.invokeKisskh
import com.hexated.SoraExtractor.invokeLing
import com.hexated.SoraExtractor.invokeM4uhd
@ -46,6 +45,7 @@ import com.hexated.SoraExtractor.invokeMoment
import com.hexated.SoraExtractor.invokeMultimovies
import com.hexated.SoraExtractor.invokeNetmovies
import com.hexated.SoraExtractor.invokePobmovies
import com.hexated.SoraExtractor.invokePrimewire
import com.hexated.SoraExtractor.invokeTvMovies
import com.hexated.SoraExtractor.invokeUhdmovies
import com.hexated.SoraExtractor.invokeWatchOnline
@ -111,7 +111,6 @@ open class SoraStream : TmdbProvider() {
const val flixonAPI = "https://flixon.lol"
const val smashyStreamAPI = "https://embed.smashystream.com"
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 biliBiliAPI = "https://api-vn.otakuz.live/server"
const val watchOnlineAPI = "https://watchonline.ag"
@ -129,6 +128,7 @@ open class SoraStream : TmdbProvider() {
const val netmoviesAPI = "https://netmovies.to"
const val momentAPI = "https://moment-explanation-i-244.site"
const val doomoviesAPI = "https://doomovies.net"
const val primewireAPI = "https://real-primewire.club"
// INDEX SITE
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(

View File

@ -10,7 +10,6 @@ import com.hexated.SoraExtractor.invokeFlixon
import com.hexated.SoraExtractor.invokeFmovies
import com.hexated.SoraExtractor.invokeFwatayako
import com.hexated.SoraExtractor.invokeGoku
import com.hexated.SoraExtractor.invokeGomovies
import com.hexated.SoraExtractor.invokeHDMovieBox
import com.hexated.SoraExtractor.invokeIdlix
import com.hexated.SoraExtractor.invokeKimcartoon
@ -32,6 +31,7 @@ import com.hexated.SoraExtractor.invokeFourCartoon
import com.hexated.SoraExtractor.invokeMoment
import com.hexated.SoraExtractor.invokeMultimovies
import com.hexated.SoraExtractor.invokeNetmovies
import com.hexated.SoraExtractor.invokePrimewire
import com.hexated.SoraExtractor.invokeVidSrc
import com.hexated.SoraExtractor.invokeWatchOnline
import com.hexated.SoraExtractor.invokeWatchsomuch
@ -268,7 +268,7 @@ class SoraStreamLite : SoraStream() {
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(

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? {
val resumeDoc = app.get(url)
@ -425,14 +453,8 @@ suspend fun invokeSmashyFfix(
ref: String,
callback: (ExtractorLink) -> Unit,
) {
val script =
app.get(url, referer = ref).document.selectFirst("script:containsData(player =)")?.data()
?: return
val source =
Regex("['\"]?file['\"]?:\\s*\"([^\"]+)").find(script)?.groupValues?.get(
1
) ?: return
val res = app.get(url, referer = ref).text
val source = Regex("['\"]?file['\"]?:\\s*\"([^\"]+)").find(res)?.groupValues?.get(1) ?: return
source.split(",").map { links ->
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))
}
fun String.decryptGomoviesJson(key: String = BuildConfig.GOMOVIES_KEY): String {
fun String.decodePrimewireXor(key: String = BuildConfig.PRIMEWIRE_KEY): String {
val sb = StringBuilder()
var i = 0
while (i < this.length) {
@ -1297,7 +1319,7 @@ fun String.decryptGomoviesJson(key: String = BuildConfig.GOMOVIES_KEY): String {
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 =
this.filter { it.first.equals(cookieKey, ignoreCase = true) }.mapNotNull {
it.second.split(";").firstOrNull()

View File

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