From 564ebfaf5164b33d57b40e4569b9cb0edcf2f827 Mon Sep 17 00:00:00 2001 From: Secozzi <49240133+Secozzi@users.noreply.github.com> Date: Sat, 17 Jun 2023 20:47:57 +0200 Subject: [PATCH] fix(en/nineanime): Update mp4upload extractor, add preference to toggle hosts, small refactor (#1752) --- src/en/nineanime/build.gradle | 2 +- .../animeextension/en/nineanime/NineAnime.kt | 161 +++++++++++------- .../extractors/Mp4uploadExtractor.kt | 24 ++- 3 files changed, 122 insertions(+), 65 deletions(-) diff --git a/src/en/nineanime/build.gradle b/src/en/nineanime/build.gradle index c682a6d13..547de2f68 100644 --- a/src/en/nineanime/build.gradle +++ b/src/en/nineanime/build.gradle @@ -6,7 +6,7 @@ ext { extName = '9anime' pkgNameSuffix = 'en.nineanime' extClass = '.NineAnime' - extVersionCode = 44 + extVersionCode = 45 libVersion = '13' } diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/NineAnime.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/NineAnime.kt index 3c165a3af..bd42b9c91 100644 --- a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/NineAnime.kt +++ b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/NineAnime.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.animeextension.en.nineanime import android.app.Application import android.content.SharedPreferences import androidx.preference.ListPreference +import androidx.preference.MultiSelectListPreference import androidx.preference.PreferenceScreen import androidx.preference.SwitchPreferenceCompat import eu.kanade.tachiyomi.animeextension.en.nineanime.extractors.Mp4uploadExtractor @@ -22,7 +23,6 @@ import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.runBlocking import kotlinx.serialization.Serializable -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonPrimitive @@ -44,7 +44,7 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val name = "9anime" - override val baseUrl by lazy { preferences.getString("preferred_domain", "https://9anime.to")!! } + override val baseUrl by lazy { preferences.getString(PREF_DOMAIN_KEY, PREF_DOMAIN_DEFAULT)!! } override val lang = "en" @@ -62,9 +62,7 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // ============================== Popular =============================== - override fun popularAnimeRequest(page: Int): Request { - return GET("$baseUrl/filter?sort=trending&page=$page") - } + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/filter?sort=trending&page=$page") override fun popularAnimeSelector(): String = "div.ani.items > div.item" @@ -79,9 +77,7 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // =============================== Latest =============================== - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/filter?sort=recently_updated&page=$page") - } + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/filter?sort=recently_updated&page=$page") override fun latestUpdatesSelector(): String = popularAnimeSelector() @@ -128,29 +124,28 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun searchAnimeNextPageSelector(): String = popularAnimeNextPageSelector() + // ============================== Filters =============================== + override fun getFilterList(): AnimeFilterList = NineAnimeFilters.FILTER_LIST // =========================== Anime Details ============================ - override fun animeDetailsParse(document: Document): SAnime { - val anime = SAnime.create() - anime.title = document.select("h1.title").text() - anime.genre = document.select("div:contains(Genre) > span > a").joinToString { it.text() } - anime.description = document.select("div.synopsis > div.shorting > div.content").text() - anime.author = document.select("div:contains(Studio) > span > a").text() - anime.status = parseStatus(document.select("div:contains(Status) > span").text()) + override fun animeDetailsParse(document: Document): SAnime = SAnime.create().apply { + title = document.select("h1.title").text() + genre = document.select("div:contains(Genre) > span > a").joinToString { it.text() } + description = document.select("div.synopsis > div.shorting > div.content").text() + author = document.select("div:contains(Studio) > span > a").text() + status = parseStatus(document.select("div:contains(Status) > span").text()) - // add alternative name to anime description val altName = "Other name(s): " document.select("h1.title").attr("data-jp").let { - if (it.isBlank().not()) { - anime.description = when { - anime.description.isNullOrBlank() -> altName + it - else -> anime.description + "\n\n$altName" + it + if (it.isNotBlank()) { + description = when { + description.isNullOrBlank() -> altName + it + else -> description + "\n\n$altName" + it } } } - return anime } // ============================== Episodes ============================== @@ -178,24 +173,25 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun episodeFromElement(element: Element): SEpisode = throw Exception("not Used") private fun episodeFromElements(element: Element, url: String): SEpisode { - val episode = SEpisode.create() val epNum = element.attr("data-num") val ids = element.attr("data-ids") val sub = element.attr("data-sub").toInt().toBoolean() val dub = element.attr("data-dub").toInt().toBoolean() - val extraInfo = if (element.hasClass("filler") && preferences.getBoolean("mark_fillers", true)) { + val extraInfo = if (element.hasClass("filler") && preferences.getBoolean(PREF_MARK_FILLERS_KEY, PREF_MARK_FILLERS_DEFAULT)) { " • Filler Episode" } else { "" } - episode.url = "$ids&epurl=$url/ep-$epNum" - episode.episode_number = epNum.toFloat() - episode.scanlator = ((if (sub) "Sub" else "") + if (dub) ", Dub" else "") + extraInfo val name = element.parent()?.select("span.d-title")?.text().orEmpty() val namePrefix = "Episode $epNum" - episode.name = "Episode $epNum" + - if (name.isNotEmpty() && name != namePrefix) ": $name" else "" - return episode + + return SEpisode.create().apply { + this.name = "Episode $epNum" + + if (name.isNotEmpty() && name != namePrefix) ": $name" else "" + this.url = "$ids&epurl=$url/ep-$epNum" + episode_number = epNum.toFloat() + scanlator = ((if (sub) "Sub" else "") + if (dub) ", Dub" else "") + extraInfo + } } // ============================ Video Links ============================= @@ -212,6 +208,7 @@ class NineAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { val epurl = response.request.header("url").toString() val responseObject = json.decodeFromString(response.body.string()) val document = Jsoup.parse(JSONUtil.unescape(responseObject["result"]!!.jsonPrimitive.content)) + val hosterSelection = preferences.getStringSet(PREF_HOSTER_KEY, PREF_HOSTER_DEFAULT)!! val videoList = mutableListOf