mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
[Sora] fixed Crunchyroll
This commit is contained in:
parent
e61f39b11f
commit
65c3ff8d2e
4 changed files with 49 additions and 21 deletions
|
@ -1,5 +1,5 @@
|
|||
// use an integer for version numbers
|
||||
version = 74
|
||||
version = 75
|
||||
|
||||
|
||||
cloudstream {
|
||||
|
|
|
@ -1369,10 +1369,10 @@ object SoraExtractor : SoraStream() {
|
|||
}
|
||||
|
||||
val videoQuality =
|
||||
Regex("\\d{3,4}p\\.?(.*?)\\[").find(quality)?.groupValues?.getOrNull(1)?.trim()
|
||||
Regex("\\d{3,4}[Pp]\\.?(.*?)\\[").find(quality)?.groupValues?.getOrNull(1)?.trim()
|
||||
?: ""
|
||||
val qualities =
|
||||
Regex("(\\d{3,4})p").find(quality)?.groupValues?.getOrNull(1)?.toIntOrNull()
|
||||
Regex("(\\d{3,4})[Pp]").find(quality)?.groupValues?.getOrNull(1)?.toIntOrNull()
|
||||
?: Qualities.Unknown.value
|
||||
val size =
|
||||
Regex("(?i)\\[(\\S+\\s?(gb|mb))[]/]").find(quality)?.groupValues?.getOrNull(1)
|
||||
|
@ -1674,38 +1674,40 @@ object SoraExtractor : SoraStream() {
|
|||
} ?: return
|
||||
|
||||
val detail = app.get("$consumetCrunchyrollAPI/info?id=${id.id}&mediaType=series").text
|
||||
val episodeId = tryParseJson<ConsumetDetails>(detail)?.episodes?.filter {
|
||||
(it.number == episode || it.title.equals(epsTitle, true))
|
||||
}?.let { eps ->
|
||||
listOf(eps.filter { it.type == "Subbed" }.map { it.id }
|
||||
.getOrNull(season?.minus(1) ?: 0) to "Subbed",
|
||||
eps.filter { it.type == "English Dub" }.map { it.id }
|
||||
.getOrNull(season?.minus(1) ?: 0) to "English Dub")
|
||||
}
|
||||
val epsId = tryParseJson<CrunchyrollDetails>(detail)?.findCrunchyrollId(
|
||||
title,
|
||||
season,
|
||||
episode,
|
||||
epsTitle
|
||||
) ?: return
|
||||
|
||||
episodeId?.apmap { (id, type) ->
|
||||
epsId.apmap {
|
||||
val json =
|
||||
app.get("$consumetCrunchyrollAPI/watch?episodeId=${id ?: return@apmap null}&format=srt")
|
||||
app.get("$consumetCrunchyrollAPI/watch?episodeId=${it?.first ?: return@apmap null}")
|
||||
.parsedSafe<ConsumetSourcesResponse>()
|
||||
|
||||
json?.sources?.map source@{ source ->
|
||||
M3u8Helper.generateM3u8(
|
||||
"Crunchyroll [$type]",
|
||||
callback.invoke(
|
||||
ExtractorLink(
|
||||
"Crunchyroll [${it.second ?: ""}]",
|
||||
"Crunchyroll [${it.second ?: ""}]",
|
||||
source.url ?: return@source null,
|
||||
"",
|
||||
).forEach(callback)
|
||||
"https://static.crunchyroll.com/",
|
||||
getQualityFromName(source.quality),
|
||||
true
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
json?.subtitles?.map subtitle@{ sub ->
|
||||
subtitleCallback.invoke(
|
||||
SubtitleFile(
|
||||
sub.lang?.replace(Regex("\\[\\S+]"), "")?.trim() ?: "",
|
||||
sub.lang ?: "",
|
||||
sub.url ?: return@subtitle null
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
suspend fun invokeMoviesbay(
|
||||
|
@ -2151,6 +2153,10 @@ data class ConsumetDetails(
|
|||
@JsonProperty("episodes") val episodes: ArrayList<ConsumetEpisodes>? = arrayListOf(),
|
||||
)
|
||||
|
||||
data class CrunchyrollDetails(
|
||||
@JsonProperty("episodes") val episodes: HashMap<String, List<HashMap<String, String>>>? = hashMapOf(),
|
||||
)
|
||||
|
||||
data class ConsumetResults(
|
||||
@JsonProperty("id") val id: String? = null,
|
||||
@JsonProperty("title") val title: String? = null,
|
||||
|
|
|
@ -92,7 +92,7 @@ open class SoraStream : TmdbProvider() {
|
|||
const val uhdmoviesAPI = "https://uhdmovies.org.in"
|
||||
const val fwatayakoAPI = "https://5100.svetacdn.in"
|
||||
const val gMoviesAPI = "https://gdrivemovies.xyz"
|
||||
const val fdMoviesAPI = "https://freedrivemovie.com"
|
||||
const val fdMoviesAPI = "https://freedrivemovie.lol"
|
||||
const val m4uhdAPI = "https://m4uhd.tv"
|
||||
const val tvMoviesAPI = "https://www.tvseriesnmovies.com"
|
||||
const val moviezAddAPI = "https://m.bloginguru.info"
|
||||
|
|
|
@ -468,6 +468,28 @@ fun Document.findTvMoviesIframe(): String? {
|
|||
?.substringBefore("'>")
|
||||
}
|
||||
|
||||
fun CrunchyrollDetails.findCrunchyrollId(
|
||||
title: String?,
|
||||
season: Int?,
|
||||
episode: Int?,
|
||||
epsTitle: String?
|
||||
): List<Pair<String?, String?>?> {
|
||||
val sub = when (title) {
|
||||
"One Piece" -> this.episodes?.get("subbed13")?.matchingEpisode(episode) to "Raw"
|
||||
"Hunter x Hunter" -> this.episodes?.get("subbed5")?.matchingEpisode(episode) to "Raw"
|
||||
else -> this.episodes?.get("subbed$season")?.matchingEpisode(episode) to "Raw"
|
||||
}
|
||||
val dub = this.episodes?.get("English Dub$season")?.matchingEpisode(episode) to "English Dub"
|
||||
|
||||
return listOf(sub, dub)
|
||||
}
|
||||
|
||||
fun List<HashMap<String, String>>?.matchingEpisode(episode: Int?): String? {
|
||||
return this?.find {
|
||||
it["episode_number"] == "$episode"
|
||||
}?.get("id")
|
||||
}
|
||||
|
||||
fun String?.fixTitle(): String? {
|
||||
return this?.replace(Regex("[!%:'?]|( &)"), "")?.replace(" ", "-")?.lowercase()
|
||||
?.replace("-–-", "-")
|
||||
|
|
Loading…
Reference in a new issue