diff --git a/src/en/allanime/build.gradle b/src/en/allanime/build.gradle index be6aac365..54fde51d0 100644 --- a/src/en/allanime/build.gradle +++ b/src/en/allanime/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'AllAnime' pkgNameSuffix = 'en.allanime' extClass = '.AllAnime' - extVersionCode = 3 + extVersionCode = 4 libVersion = '13' } diff --git a/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/AllAnime.kt b/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/AllAnime.kt index 04651fa0b..a88f8d752 100644 --- a/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/AllAnime.kt +++ b/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/AllAnime.kt @@ -248,13 +248,14 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { val hosterSelection = preferences.getStringSet( "hoster_selection", - setOf("default", "luf-mp4", "si-hls", "s-mp4", "ac-hls") + setOf("default", "ac", "luf-mp4", "si-hls", "s-mp4", "ac-hls") )!! for (video in videoJson.data.episode.sourceUrls) { when { video.sourceUrl.startsWith("/apivtwo/") && ( (hosterSelection.contains("default") && video.sourceName.lowercase().contains("default")) || + (hosterSelection.contains("ac") && video.sourceName.lowercase().contains("ac")) || (hosterSelection.contains("luf-mp4") && video.sourceName.lowercase().contains("luf-mp4")) || (hosterSelection.contains("si-hls") && video.sourceName.lowercase().contains("si-hls")) || (hosterSelection.contains("s-mp4") && video.sourceName.lowercase().contains("s-mp4")) || @@ -391,8 +392,8 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { val serverPref = ListPreference(screen.context).apply { key = "preferred_server" title = "Preferred Video Server" - entries = arrayOf("Site Default", "Luf-mp4", "Vid-mp4", "Yt-mp4", "Ok.ru", "Mp4upload", "Sl-mp4", "Uv-mp4", "S-mp4", "Ac-Hls", "Default") - entryValues = arrayOf("site_default", "luf-mp4", "vid-mp4", "yt-mp4", "okru", "mp4upload", "sl-mp4", "uv-mp4", "s-mp4", "ac-hls", "default") + entries = arrayOf("Site Default", "Ac", "Luf-mp4", "Vid-mp4", "Yt-mp4", "Ok.ru", "Mp4upload", "Sl-mp4", "Uv-mp4", "S-mp4", "Ac-Hls", "Default") + entryValues = arrayOf("site_default", "ac", "luf-mp4", "vid-mp4", "yt-mp4", "okru", "mp4upload", "sl-mp4", "uv-mp4", "s-mp4", "ac-hls", "default") setDefaultValue("site_default") summary = "%s" @@ -407,9 +408,9 @@ class AllAnime : ConfigurableAnimeSource, AnimeHttpSource() { val hostSelection = MultiSelectListPreference(screen.context).apply { key = "hoster_selection" title = "Enable/Disable Hosts" - entries = arrayOf("Default", "Luf-mp4", "Si-Hls", "S-mp4", "Ac-Hls", "Uv-mp4", "Pn-Hls") - entryValues = arrayOf("default", "luf-mp4", "si-hls", "s-mp4", "ac-hls", "uv-mp4", "pn-hls") - setDefaultValue(setOf("default", "luf-mp4", "si-hls", "s-mp4", "ac-hls")) + entries = arrayOf("Default", "Ac", "Luf-mp4", "Si-Hls", "S-mp4", "Ac-Hls", "Uv-mp4", "Pn-Hls") + entryValues = arrayOf("default", "ac", "luf-mp4", "si-hls", "s-mp4", "ac-hls", "uv-mp4", "pn-hls") + setDefaultValue(setOf("default", "ac", "luf-mp4", "si-hls", "s-mp4", "ac-hls")) setOnPreferenceChangeListener { _, newValue -> preferences.edit().putStringSet(key, newValue as Set).commit() diff --git a/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/extractors/AllAnimeExtractor.kt b/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/extractors/AllAnimeExtractor.kt index 2b77f925d..bf5cedab6 100644 --- a/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/extractors/AllAnimeExtractor.kt +++ b/src/en/allanime/src/eu/kanade/tachiyomi/animeextension/en/allanime/extractors/AllAnimeExtractor.kt @@ -19,14 +19,29 @@ data class VideoLink( val link: String, val hls: Boolean? = null, val mp4: Boolean? = null, + val crIframe: Boolean? = null, val resolutionStr: String, - val subtitles: List? = null + val subtitles: List? = null, + val portData: Stream? = null, ) { @Serializable data class Subtitles( val lang: String, val src: String, ) + + @Serializable + data class Stream( + val streams: List + ) { + @Serializable + data class StreamObject( + val format: String, + val url: String, + val audio_lang: String, + val hardsub_lang: String, + ) + } } } @@ -103,6 +118,50 @@ class AllAnimeExtractor(private val client: OkHttpClient) { } } } + } else if (link.crIframe == true) { + link.portData!!.streams.forEach { + if (it.format == "adaptive_dash") { + try { + videoList.add( + Video( + it.url, + "Original (AC - Dash${if (it.hardsub_lang.isEmpty()) "" else " - Hardsub: ${it.hardsub_lang}"})", + it.url, + subtitleTracks = subtitles + ) + ) + } catch (a: Error) { + videoList.add( + Video( + it.url, + "Original (AC - Dash${if (it.hardsub_lang.isEmpty()) "" else " - Hardsub: ${it.hardsub_lang}"})", + it.url + ) + ) + } + } else if (it.format == "adaptive_hls") { + val resp = runCatching { + client.newCall( + GET(it.url, headers = Headers.headersOf("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0")) + ).execute() + }.getOrNull() + + if (resp != null && resp.code == 200) { + val masterPlaylist = resp.body!!.string() + masterPlaylist.substringAfter("#EXT-X-STREAM-INF:").split("#EXT-X-STREAM-INF:") + .forEach { t -> + val quality = t.substringAfter("RESOLUTION=").substringAfter("x").substringBefore(",") + "p (AC - HLS${if (it.hardsub_lang.isEmpty()) "" else " - Hardsub: ${it.hardsub_lang}"})" + var videoUrl = t.substringAfter("\n").substringBefore("\n") + + try { + videoList.add(Video(videoUrl, quality, videoUrl, subtitleTracks = subtitles)) + } catch (_: Error) { + videoList.add(Video(videoUrl, quality, videoUrl)) + } + } + } + } + } } else {} }