mirror of
				https://github.com/hexated/cloudstream-extensions-hexated.git
				synced 2024-08-15 00:03:22 +00:00 
			
		
		
		
	sora: fix UHD?
This commit is contained in:
		
							parent
							
								
									8a61d0891e
								
							
						
					
					
						commit
						5654e31246
					
				
					 8 changed files with 71 additions and 76 deletions
				
			
		
							
								
								
									
										4
									
								
								.github/workflows/build.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/build.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -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: | | ||||
|  |  | |||
|  | @ -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")}\"") | ||||
| 
 | ||||
|  |  | |||
|  | @ -1127,14 +1127,20 @@ 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") | ||||
|             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 { | ||||
|                 } | ||||
|                 else -> { | ||||
|                     extractMirrorUHD(bitLink, base) | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             val tags = getUhdTags(quality) | ||||
|             val qualities = getIndexQuality(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( | ||||
|  |  | |||
|  | @ -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, | ||||
|  |  | |||
|  | @ -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( | ||||
|  |  | |||
|  | @ -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( | ||||
|  |  | |||
|  | @ -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() | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue