From 0f98d9e934996b7cb0e3dcbc1c43f3b40c55c77c Mon Sep 17 00:00:00 2001 From: Secozzi <49240133+Secozzi@users.noreply.github.com> Date: Sun, 12 Mar 2023 22:51:00 +0100 Subject: [PATCH] Add multimovies extension (#1380) --- lib/streamsb-extractor/build.gradle.kts | 1 + .../streamsbextractor/StreamSBExtractor.kt | 54 +- .../streamsbextractor/StreamSBExtractorDto.kt | 20 + src/en/multimovies/AndroidManifest.xml | 2 + src/en/multimovies/build.gradle | 20 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3699 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1919 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5215 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9739 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 14308 bytes src/en/multimovies/res/web_hi_res_512.png | Bin 0 -> 68792 bytes .../en/multimovies/Multimovies.kt | 429 ++++++++ .../extractors/AutoEmbedExtractor.kt | 927 ++++++++++++++++++ .../extractors/MixDropExtractor.kt | 29 + .../extractors/RabbitStreamExtractor.kt | 166 ++++ .../extractors/StreamlareExtractor.kt | 46 + 16 files changed, 1686 insertions(+), 8 deletions(-) create mode 100644 lib/streamsb-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamsbextractor/StreamSBExtractorDto.kt create mode 100644 src/en/multimovies/AndroidManifest.xml create mode 100644 src/en/multimovies/build.gradle create mode 100644 src/en/multimovies/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/multimovies/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/multimovies/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/multimovies/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/multimovies/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/multimovies/res/web_hi_res_512.png create mode 100644 src/en/multimovies/src/eu/kanade/tachiyomi/animeextension/en/multimovies/Multimovies.kt create mode 100644 src/en/multimovies/src/eu/kanade/tachiyomi/animeextension/en/multimovies/extractors/AutoEmbedExtractor.kt create mode 100644 src/en/multimovies/src/eu/kanade/tachiyomi/animeextension/en/multimovies/extractors/MixDropExtractor.kt create mode 100644 src/en/multimovies/src/eu/kanade/tachiyomi/animeextension/en/multimovies/extractors/RabbitStreamExtractor.kt create mode 100644 src/en/multimovies/src/eu/kanade/tachiyomi/animeextension/en/multimovies/extractors/StreamlareExtractor.kt diff --git a/lib/streamsb-extractor/build.gradle.kts b/lib/streamsb-extractor/build.gradle.kts index a4b917a72..6ffaf2993 100644 --- a/lib/streamsb-extractor/build.gradle.kts +++ b/lib/streamsb-extractor/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("com.android.library") + id("kotlinx-serialization") // for the DTO kotlin("android") } diff --git a/lib/streamsb-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamsbextractor/StreamSBExtractor.kt b/lib/streamsb-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamsbextractor/StreamSBExtractor.kt index 27d39a3ac..4c2a92043 100644 --- a/lib/streamsb-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamsbextractor/StreamSBExtractor.kt +++ b/lib/streamsb-extractor/src/main/java/eu/kanade/tachiyomi/lib/streamsbextractor/StreamSBExtractor.kt @@ -5,8 +5,6 @@ import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.network.GET import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.jsonObject import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient @@ -50,14 +48,30 @@ class StreamSBExtractor(private val client: OkHttpClient) { .build() return try { val master = fixUrl(url, common) - val json = Json.decodeFromString( + val json = Json { ignoreUnknownKeys = true }.decodeFromString( client.newCall(GET(master, newHeaders)) .execute().body.string() ) - val masterUrl = json["stream_data"]!!.jsonObject["file"].toString().trim('"') + val masterUrl = json.stream_data.file.trim('"') + val subtitleList = json.stream_data.subs?.let { + it.map { s -> Track(s.file, s.label) } + } ?: emptyList() + val masterPlaylist = client.newCall(GET(masterUrl, newHeaders)) .execute() .body.string() + + val audioList = mutableListOf() + val audioRegex = Regex("""#EXT-X-MEDIA:TYPE=AUDIO.*?NAME="(.*?)".*?URI="(.*?)"""") + audioList.addAll( + audioRegex.findAll(masterPlaylist).map { + Track( + it.groupValues[2], + it.groupValues[1] + ) + } + ) + val separator = "#EXT-X-STREAM-INF" masterPlaylist.substringAfter(separator).split(separator).map { val resolution = it.substringAfter("RESOLUTION=") @@ -72,7 +86,11 @@ class StreamSBExtractor(private val client: OkHttpClient) { else it } val videoUrl = it.substringAfter("\n").substringBefore("\n") - Video(videoUrl, quality, videoUrl, headers = newHeaders) + if (audioList.isEmpty()) { + Video(videoUrl, quality, videoUrl, headers = newHeaders, subtitleTracks = subtitleList) + } else { + Video(videoUrl, quality, videoUrl, headers = newHeaders, subtitleTracks = subtitleList, audioTracks = audioList) + } } } catch (e: Exception) { emptyList