mirror of
				https://github.com/hexated/cloudstream-extensions-hexated.git
				synced 2024-08-15 00:03:22 +00:00 
			
		
		
		
	sora: fixed few sources
This commit is contained in:
		
							parent
							
								
									fabb6c3217
								
							
						
					
					
						commit
						81b044fcbf
					
				
					 8 changed files with 50 additions and 37 deletions
				
			
		|  | @ -1,5 +1,5 @@ | |||
| // use an integer for version numbers | ||||
| version = 21 | ||||
| version = 22 | ||||
| 
 | ||||
| 
 | ||||
| cloudstream { | ||||
|  |  | |||
|  | @ -199,7 +199,7 @@ class KuramanimeProvider : MainAPI() { | |||
|         val token = res.select("meta[name=csrf-token]").attr("content") | ||||
|         headers = mapOf( | ||||
|             "Accept" to "application/json, text/javascript, */*; q=0.01", | ||||
|             "Authorization" to "Bearer YTNWeVlXMWhibWx0WlRwaVMwNUNTWFk1U1d4NVFsbDBObE5KWW10a1JWVXpkWFIzTTA5c05rcFJPSFJ6T2pFM01EQTFOemN5TnpBd01EQT0%3D", | ||||
|             "Authorization" to "Bearer ${getAuth()}", | ||||
|             "X-Requested-With" to "XMLHttpRequest", | ||||
|             "X-CSRF-TOKEN" to token | ||||
|         ) | ||||
|  | @ -224,6 +224,11 @@ class KuramanimeProvider : MainAPI() { | |||
|         return true | ||||
|     } | ||||
| 
 | ||||
|     private fun getAuth() : String { | ||||
|         val key = "kuramanime2:LEcXGYdOGcMCV8jM5fhRdM2mneSj6kaNts:${APIHolder.unixTimeMS};" | ||||
|         return base64Encode(base64Encode(key.toByteArray()).toByteArray()) | ||||
|     } | ||||
| 
 | ||||
|     private suspend fun getMisc(): String { | ||||
|         val misc = app.get( | ||||
|             "$mainUrl/misc/post/EVhcpMNbO77acNZcHr2XVjaG8WAdNC1u", | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| import org.jetbrains.kotlin.konan.properties.Properties | ||||
| 
 | ||||
| // use an integer for version numbers | ||||
| version = 196 | ||||
| version = 197 | ||||
| 
 | ||||
| android { | ||||
|     defaultConfig { | ||||
|  |  | |||
|  | @ -686,13 +686,19 @@ object SoraExtractor : SoraStream() { | |||
|             "$vidsrctoAPI/embed/tv/$imdbId/$season/$episode" | ||||
|         } | ||||
| 
 | ||||
|         val id = app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id") ?: return | ||||
|         val mediaId = app.get(url).document.selectFirst("ul.episodes li a")?.attr("data-id") ?: return | ||||
| 
 | ||||
|         val subtitles = app.get("$vidsrctoAPI/ajax/embed/episode/$id/subtitles").text | ||||
|         tryParseJson<List<FmoviesSubtitles>>(subtitles)?.map { | ||||
|         app.get("$vidsrctoAPI/ajax/embed/episode/$mediaId/sources").parsedSafe<VidsrctoSources>()?.result?.apmap { | ||||
|             val encUrl = app.get("$vidsrctoAPI/ajax/embed/source/${it.id}").parsedSafe<VidsrctoResponse>()?.result?.url | ||||
|             loadExtractor(vidsrctoDecrypt(encUrl ?: return@apmap), "$vidsrctoAPI/", subtitleCallback, callback) | ||||
|         } | ||||
| 
 | ||||
|         val subtitles = app.get("$vidsrctoAPI/ajax/embed/episode/$mediaId/subtitles").text | ||||
|         tryParseJson<List<VidsrctoSubtitles>>(subtitles)?.map { | ||||
|             subtitleCallback.invoke( | ||||
|                 SubtitleFile( | ||||
|                     it.label ?: "", it.file ?: return@map | ||||
|                     it.label ?: "", | ||||
|                     it.file ?: return@map | ||||
|                 ) | ||||
|             ) | ||||
|         } | ||||
|  | @ -1497,18 +1503,19 @@ object SoraExtractor : SoraStream() { | |||
|         val mediaLink = | ||||
|             app.get(matchMedia?.first ?: return).document.selectFirst("a#jake1")?.attr("href") | ||||
|         val detailDoc = app.get(mediaLink ?: return).document | ||||
|         val media = detailDoc.selectFirst("div.entry-content pre span")?.text()?.split("|") | ||||
|         val media = detailDoc.selectFirst("div.entry-content pre span")?.text() | ||||
|             ?.split("|") | ||||
|             ?.map { it.trim() } | ||||
| 
 | ||||
|         val iframe = (if (season == null) { | ||||
|             media?.mapIndexed { index, name -> | ||||
|                 detailDoc.select("div.entry-content > pre")[index.plus(1)].selectFirst("a") | ||||
|                 detailDoc.select("div.entry-content > h2")[index].selectFirst("a") | ||||
|                     ?.attr("href") to name | ||||
|             } | ||||
|         } else { | ||||
|             media?.mapIndexed { index, name -> | ||||
|                 val linkMedia = | ||||
|                     detailDoc.select("div.entry-content > pre")[index.plus(1)].selectFirst("a") | ||||
|                     detailDoc.select("div.entry-content > h2")[index].selectFirst("a") | ||||
|                         ?.attr("href") | ||||
|                 app.get( | ||||
|                     linkMedia ?: return@mapIndexed null | ||||
|  | @ -1518,25 +1525,19 @@ object SoraExtractor : SoraStream() { | |||
|         })?.filter { it?.first?.startsWith("http") == true } | ||||
| 
 | ||||
|         iframe?.apmap { | ||||
|             val token = app.get( | ||||
|                 it?.first ?: return@apmap null | ||||
|             ).document.select("input[name=_csrf_token_645a83a41868941e4692aa31e7235f2]") | ||||
|                 .attr("value") | ||||
|             val shortLink = app.post( | ||||
|                 it.first ?: return@apmap null, | ||||
|                 data = mapOf("_csrf_token_645a83a41868941e4692aa31e7235f2" to token) | ||||
|             ).document.selectFirst("a[rel=nofollow]")?.attr("href") | ||||
|             val iframeDoc = app.get(it?.first ?: return@apmap).document | ||||
|             val formUrl = iframeDoc.select("form").attr("action") | ||||
|             val formData = iframeDoc.select("form button").associate { v -> v.attr("name") to v.attr("value") } | ||||
| 
 | ||||
| //            val videoUrl = extractRebrandly(shortLink ?: return@apmapIndexed null ) | ||||
|             val quality = | ||||
|                 Regex("(\\d{3,4})p").find(it.second)?.groupValues?.getOrNull(1)?.toIntOrNull() | ||||
|             val videoUrl = app.post(formUrl, data = formData, referer = it.first).document.selectFirst("div.d-flex.justify-content-center.flex-wrap a")?.attr("href") | ||||
|             val quality = Regex("(\\d{3,4})p").find(it.second)?.groupValues?.getOrNull(1)?.toIntOrNull() | ||||
|             val qualityName = it.second.replace("${quality}p", "").trim() | ||||
| 
 | ||||
|             callback.invoke( | ||||
|                 ExtractorLink( | ||||
|                     "$api", | ||||
|                     "$api $qualityName", | ||||
|                     shortLink ?: return@apmap null, | ||||
|                     videoUrl ?: return@apmap, | ||||
|                     "", | ||||
|                     quality ?: Qualities.Unknown.value | ||||
|                 ) | ||||
|  |  | |||
|  | @ -162,7 +162,21 @@ data class WatchOnlineResponse( | |||
|     @JsonProperty("subtitles") val subtitles: ArrayList<WatchOnlineSubtitles>? = arrayListOf(), | ||||
| ) | ||||
| 
 | ||||
| data class FmoviesSubtitles( | ||||
| data class VidsrctoResult( | ||||
|     @JsonProperty("id") val id: String? = null, | ||||
|     @JsonProperty("title") val title: String? = null, | ||||
|     @JsonProperty("url") val url: String? = null, | ||||
| ) | ||||
| 
 | ||||
| data class VidsrctoResponse( | ||||
|     @JsonProperty("result") val result: VidsrctoResult? = null, | ||||
| ) | ||||
| 
 | ||||
| data class VidsrctoSources( | ||||
|     @JsonProperty("result") val result: ArrayList<VidsrctoResult>? = arrayListOf(), | ||||
| ) | ||||
| 
 | ||||
| data class VidsrctoSubtitles( | ||||
|     @JsonProperty("label") val label: String? = null, | ||||
|     @JsonProperty("file") val file: String? = null, | ||||
| ) | ||||
|  |  | |||
|  | @ -33,7 +33,6 @@ import com.hexated.SoraExtractor.invokeRidomovies | |||
| import com.hexated.SoraExtractor.invokeSmashyStream | ||||
| import com.hexated.SoraExtractor.invokeDumpStream | ||||
| import com.hexated.SoraExtractor.invokeEmovies | ||||
| import com.hexated.SoraExtractor.invokeGomovies | ||||
| import com.hexated.SoraExtractor.invokeHdmovies4u | ||||
| import com.hexated.SoraExtractor.invokeMoment | ||||
| import com.hexated.SoraExtractor.invokeMultimovies | ||||
|  | @ -682,9 +681,6 @@ open class SoraStream : TmdbProvider() { | |||
|                     callback | ||||
|                 ) | ||||
|             }, | ||||
|             { | ||||
|                 if (!res.isAnime) invokeGomovies(res.title, res.year, res.season, res.episode, callback) | ||||
|             }, | ||||
|             { | ||||
|                 if (!res.isAnime) invokeShowflix( | ||||
|                     res.title, | ||||
|  |  | |||
|  | @ -22,7 +22,6 @@ import com.hexated.SoraExtractor.invokeRidomovies | |||
| import com.hexated.SoraExtractor.invokeSmashyStream | ||||
| import com.hexated.SoraExtractor.invokeDumpStream | ||||
| import com.hexated.SoraExtractor.invokeEmovies | ||||
| import com.hexated.SoraExtractor.invokeGomovies | ||||
| import com.hexated.SoraExtractor.invokeMoment | ||||
| import com.hexated.SoraExtractor.invokeMultimovies | ||||
| import com.hexated.SoraExtractor.invokeNetmovies | ||||
|  | @ -245,15 +244,6 @@ class SoraStreamLite : SoraStream() { | |||
|                     callback | ||||
|                 ) | ||||
|             }, | ||||
|             { | ||||
|                 if (!res.isAnime) invokeGomovies( | ||||
|                     res.title, | ||||
|                     res.year, | ||||
|                     res.season, | ||||
|                     res.episode, | ||||
|                     callback | ||||
|                 ) | ||||
|             }, | ||||
|             { | ||||
|                 invokeMoment(res.imdbId, res.season, res.episode, callback) | ||||
|             }, | ||||
|  |  | |||
|  | @ -1145,6 +1145,13 @@ fun String.decodePrimewireXor(key: String): String { | |||
|     return sb.toString() | ||||
| } | ||||
| 
 | ||||
| fun vidsrctoDecrypt(text: String): String { | ||||
|     val parse = Base64.decode(text.toByteArray(), Base64.URL_SAFE) | ||||
|     val cipher = Cipher.getInstance("RC4") | ||||
|     cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec("8z5Ag5wgagfsOuhz".toByteArray(), "RC4"), cipher.parameters) | ||||
|     return decode(cipher.doFinal(parse).toString(Charsets.UTF_8)) | ||||
| } | ||||
| 
 | ||||
| fun String?.createSlug(): String? { | ||||
|     return this?.replace(Regex("[^\\w\\s-]"), "") | ||||
|         ?.replace(" ", "-") | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue