feat(multisrc): New theme: AnimeStream (#1653)

This commit is contained in:
Claudemirovsky
2023-05-30 09:51:11 +00:00
committed by GitHub
parent 26a6f43dce
commit 4b42d5569f
46 changed files with 880 additions and 1432 deletions

View File

@ -0,0 +1,26 @@
package eu.kanade.tachiyomi.animeextension.pt.rinecloud
import eu.kanade.tachiyomi.animeextension.pt.rinecloud.extractors.RineCloudExtractor
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.multisrc.animestream.AnimeStream
class RineCloud : AnimeStream(
"pt-BR",
"RineCloud",
"https://rine.cloud",
) {
override fun headersBuilder() = super.headersBuilder().add("Referer", baseUrl)
// ============================ Video Links =============================
override val prefQualityValues = arrayOf("1080p", "720p", "480p", "360p", "240p")
override val prefQualityEntries = prefQualityValues
override fun getVideoList(url: String, name: String): List<Video> {
return when {
"rine.cloud" in url -> {
RineCloudExtractor(client).videosFromUrl(url, headers)
}
else -> emptyList()
}
}
}

View File

@ -0,0 +1,43 @@
package eu.kanade.tachiyomi.animeextension.pt.rinecloud.extractors
import android.util.Base64
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.lib.unpacker.Unpacker
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.OkHttpClient
class RineCloudExtractor(private val client: OkHttpClient) {
fun videosFromUrl(url: String, headers: Headers): List<Video> {
val playerDoc = client.newCall(GET(url, headers)).execute().asJsoup()
val scriptData = playerDoc.selectFirst("script:containsData(JuicyCodes.Run)")
?.data()
?: return emptyList()
val decodedData = scriptData.substringAfter("(").substringBefore(")")
.split("+\"")
.joinToString("") { it.replace("\"", "") }
.let { Base64.decode(it, Base64.DEFAULT) }
.let(::String)
val unpackedJs = Unpacker.unpack(decodedData).ifEmpty { return emptyList() }
val masterPlaylistUrl = unpackedJs.substringAfter("sources:[")
.substringAfter("file\":\"")
.substringBefore('"')
val playlistData = client.newCall(GET(masterPlaylistUrl, headers)).execute()
.body.string()
val separator = "#EXT-X-STREAM-INF:"
return playlistData.substringAfter(separator).split(separator).map {
val quality = it.substringAfter("RESOLUTION=")
.substringAfter("x")
.substringBefore("\n")
.substringBefore(",") + "p"
val videoUrl = it.substringAfter("\n").substringBefore("\n")
Video(videoUrl, "RineCloud - $quality", videoUrl, headers = headers)
}
}
}