diff --git a/src/de/aniflix/src/eu/kanade/tachiyomi/animeextension/de/aniflix/Aniflix.kt b/src/de/aniflix/src/eu/kanade/tachiyomi/animeextension/de/aniflix/Aniflix.kt index 043d4d883..a0a4ac8f0 100644 --- a/src/de/aniflix/src/eu/kanade/tachiyomi/animeextension/de/aniflix/Aniflix.kt +++ b/src/de/aniflix/src/eu/kanade/tachiyomi/animeextension/de/aniflix/Aniflix.kt @@ -12,6 +12,7 @@ import eu.kanade.tachiyomi.animeextension.de.aniflix.dto.Release import eu.kanade.tachiyomi.animeextension.de.aniflix.dto.Season import eu.kanade.tachiyomi.animeextension.de.aniflix.extractors.DoodExtractor import eu.kanade.tachiyomi.animeextension.de.aniflix.extractors.StreamTapeExtractor +import eu.kanade.tachiyomi.animeextension.de.aniflix.extractors.VoeExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimesPage @@ -193,7 +194,7 @@ class Aniflix : ConfigurableAnimeSource, AnimeHttpSource() { for (stream in streams) { val quality = "${stream.hoster?.name}, ${stream.lang}" val link = stream.link ?: return emptyList() - val hosterSelection = preferences.getStringSet("hoster_selection", setOf("dood", "stape")) + val hosterSelection = preferences.getStringSet("hoster_selection", setOf("dood", "stape", "voe")) when { link.contains("https://dood") && hosterSelection?.contains("dood") == true -> { val video = try { DoodExtractor(client).videoFromUrl(link, quality) } catch (e: Exception) { null } @@ -207,6 +208,12 @@ class Aniflix : ConfigurableAnimeSource, AnimeHttpSource() { videoList.add(video) } } + link.contains("https://voe.sx") && hosterSelection?.contains("voe") == true -> { + val video = VoeExtractor(client).videoFromUrl(link, quality) + if (video != null) { + videoList.add(video) + } + } } } return videoList @@ -250,8 +257,8 @@ class Aniflix : ConfigurableAnimeSource, AnimeHttpSource() { val hosterPref = ListPreference(screen.context).apply { key = "preferred_hoster" title = "Standard-Hoster" - entries = arrayOf("Streamtape", "Doodstream") - entryValues = arrayOf("https://streamtape.com", "https://dood") + entries = arrayOf("Streamtape", "Doodstream", "Voe") + entryValues = arrayOf("https://streamtape.com", "https://dood", "https://voe.sx") setDefaultValue("https://streamtape.com") summary = "%s" @@ -280,9 +287,9 @@ class Aniflix : ConfigurableAnimeSource, AnimeHttpSource() { val subSelection = MultiSelectListPreference(screen.context).apply { key = "hoster_selection" title = "Hoster auswählen" - entries = arrayOf("Streamtape", "Doodstream") - entryValues = arrayOf("stape", "dood") - setDefaultValue(setOf("stape", "dood")) + entries = arrayOf("Streamtape", "Doodstream", "Voe") + entryValues = arrayOf("stape", "dood", "voe") + setDefaultValue(setOf("stape", "dood", "voe")) setOnPreferenceChangeListener { _, newValue -> preferences.edit().putStringSet(key, newValue as Set).commit() diff --git a/src/de/aniflix/src/eu/kanade/tachiyomi/animeextension/de/aniflix/extractors/VoeExtractor.kt b/src/de/aniflix/src/eu/kanade/tachiyomi/animeextension/de/aniflix/extractors/VoeExtractor.kt new file mode 100644 index 000000000..a04133ccd --- /dev/null +++ b/src/de/aniflix/src/eu/kanade/tachiyomi/animeextension/de/aniflix/extractors/VoeExtractor.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.animeextension.de.aniflix.extractors + +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.OkHttpClient + +class VoeExtractor(private val client: OkHttpClient) { + + fun videoFromUrl(url: String, quality: String): Video? { + val document = client.newCall(GET(url)).execute().asJsoup() + val script = document.select("script:containsData(function d04ad2e48229ae25a282e15c7c2f69a2(dea04c5949242bfd216e35def894b930))") + .firstOrNull()?.data()?.substringAfter("\"hls\": \"") ?: return null + val videoUrl = script.substringAfter("\"hls\": \"").substringBefore("\",") + return Video(url, quality, videoUrl, null) + } +}