From d2c26b543b3e6ed882201ba3d27acfdb13211e13 Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Tue, 5 Sep 2023 06:07:42 -0300 Subject: [PATCH] feat(tr/turkanime): Add fansub selection preference + group videos by fansubber (#2146) --- src/tr/turkanime/build.gradle | 23 +- .../animeextension/tr/turkanime/TurkAnime.kt | 259 ++++++++++++------ .../tr/turkanime/extractors/MytvExtractor.kt | 26 -- .../turkanime/extractors/SibnetExtractor.kt | 38 --- .../tr/turkanime/extractors/VkExtractor.kt | 41 --- 5 files changed, 193 insertions(+), 194 deletions(-) delete mode 100644 src/tr/turkanime/src/eu/kanade/tachiyomi/animeextension/tr/turkanime/extractors/MytvExtractor.kt delete mode 100644 src/tr/turkanime/src/eu/kanade/tachiyomi/animeextension/tr/turkanime/extractors/SibnetExtractor.kt delete mode 100644 src/tr/turkanime/src/eu/kanade/tachiyomi/animeextension/tr/turkanime/extractors/VkExtractor.kt diff --git a/src/tr/turkanime/build.gradle b/src/tr/turkanime/build.gradle index 393f01db6..b661b4c22 100644 --- a/src/tr/turkanime/build.gradle +++ b/src/tr/turkanime/build.gradle @@ -5,23 +5,26 @@ plugins { } dependencies { - implementation(project(':lib-googledrive-extractor')) - implementation(project(':lib-filemoon-extractor')) - implementation(project(':lib-mp4upload-extractor')) - implementation(project(":lib-cryptoaes")) - implementation(project(":lib-synchrony")) - implementation(project(":lib-voe-extractor")) - implementation(project(":lib-sendvid-extractor")) - implementation(project(":lib-dood-extractor")) - implementation(project(":lib-okru-extractor")) implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1" + implementation(project(":lib-cryptoaes")) + implementation(project(":lib-dood-extractor")) + implementation(project(':lib-filemoon-extractor')) + implementation(project(':lib-googledrive-extractor')) + implementation(project(':lib-mp4upload-extractor')) + implementation(project(":lib-mytv-extractor")) + implementation(project(":lib-okru-extractor")) + implementation(project(":lib-sendvid-extractor")) + implementation(project(":lib-sibnet-extractor")) + implementation(project(":lib-synchrony")) + implementation(project(":lib-vk-extractor")) + implementation(project(":lib-voe-extractor")) } ext { extName = 'Türk Anime TV' pkgNameSuffix = 'tr.turkanime' extClass = '.TurkAnime' - extVersionCode = 9 + extVersionCode = 10 libVersion = '13' } diff --git a/src/tr/turkanime/src/eu/kanade/tachiyomi/animeextension/tr/turkanime/TurkAnime.kt b/src/tr/turkanime/src/eu/kanade/tachiyomi/animeextension/tr/turkanime/TurkAnime.kt index 4101b1388..4a38bf683 100644 --- a/src/tr/turkanime/src/eu/kanade/tachiyomi/animeextension/tr/turkanime/TurkAnime.kt +++ b/src/tr/turkanime/src/eu/kanade/tachiyomi/animeextension/tr/turkanime/TurkAnime.kt @@ -1,8 +1,9 @@ package eu.kanade.tachiyomi.animeextension.tr.turkanime import android.app.Application -import android.content.SharedPreferences import android.util.Base64 +import android.widget.Toast +import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.MultiSelectListPreference import androidx.preference.PreferenceScreen @@ -10,12 +11,9 @@ import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.AlucardExtract import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.EmbedgramExtractor import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MVidooExtractor import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MailRuExtractor -import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MytvExtractor -import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.SibnetExtractor import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.StreamVidExtractor import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.UqloadExtractor import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.VTubeExtractor -import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.VkExtractor import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.VudeoExtractor import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.WolfstreamExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource @@ -30,9 +28,12 @@ import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor +import eu.kanade.tachiyomi.lib.mytvextractor.MytvExtractor import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor import eu.kanade.tachiyomi.lib.sendvidextractor.SendvidExtractor +import eu.kanade.tachiyomi.lib.sibnetextractor.SibnetExtractor import eu.kanade.tachiyomi.lib.synchrony.Deobfuscator +import eu.kanade.tachiyomi.lib.vkextractor.VkExtractor import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST @@ -54,6 +55,7 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { @@ -67,16 +69,13 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val client = network.cloudflareClient - private val json = Json { - ignoreUnknownKeys = true - } + private val json: Json by injectLazy() - private val preferences: SharedPreferences by lazy { + private val preferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } // ============================== Popular =============================== - override fun popularAnimeRequest(page: Int) = GET("$baseUrl/ajax/rankagore?sayfa=$page", xmlHeader) override fun popularAnimeSelector() = "div.panel-visible" @@ -84,11 +83,11 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun popularAnimeNextPageSelector() = "button.btn-default[data-loading-text*=Sonraki]" override fun popularAnimeFromElement(element: Element): SAnime { - val animeTitle = element.select("div.panel-title > a").first()!! + val animeTitle = element.selectFirst("div.panel-title > a")!! val name = animeTitle.attr("title") .substringBefore(" izle") - val img = element.select("img.media-object") - val animeId = element.select("a.reactions").first()!!.attr("data-unique-id") + val img = element.selectFirst("img.media-object") + val animeId = element.selectFirst("a.reactions")!!.attr("data-unique-id") val animeUrl = animeTitle.attr("abs:href").toHttpUrl() .newBuilder() .addQueryParameter("animeId", animeId) @@ -96,12 +95,11 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { return SAnime.create().apply { setUrlWithoutDomain(animeUrl) title = name - thumbnail_url = "https:" + img.attr("data-src") + thumbnail_url = img?.attr("abs:data-src") } } // =============================== Latest =============================== - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/ajax/yenieklenenseriler?sayfa=$page", xmlHeader) override fun latestUpdatesSelector() = popularAnimeSelector() @@ -111,11 +109,10 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun latestUpdatesNextPageSelector() = popularAnimeNextPageSelector() // =============================== Search =============================== - override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList) = POST( "$baseUrl/arama?sayfa=$page", - Headers.headersOf("content-type", "application/x-www-form-urlencoded"), + headers, FormBody.Builder().add("arama", query).build(), ) @@ -152,11 +149,10 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun searchAnimeNextPageSelector() = popularAnimeNextPageSelector() // =========================== Anime Details ============================ - override fun animeDetailsParse(document: Document): SAnime { - val img = document.select("div.imaj > img.media-object").ifEmpty { null } - val studio = document.select("div#animedetay > table tr:contains(Stüdyo) > td:last-child a").ifEmpty { null } - val desc = document.select("div#animedetay p.ozet").ifEmpty { null } + val img = document.selectFirst("div.imaj > img.media-object") + val studio = document.selectFirst("div#animedetay > table tr:contains(Stüdyo) > td:last-child a") + val desc = document.selectFirst("div#animedetay p.ozet") val genres = document.select("div#animedetay > table tr:contains(Anime Türü) > td:last-child a") .ifEmpty { null } return SAnime.create().apply { @@ -169,24 +165,23 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } // ============================== Episodes ============================== - override fun episodeListRequest(anime: SAnime): Request { val animeId = (baseUrl + anime.url).toHttpUrl().queryParameter("animeId") ?: client.newCall(GET(baseUrl + anime.url)).execute().asJsoup() .selectFirst("a[data-unique-id]")!!.attr("data-unique-id") - return GET("https://www.turkanime.co/ajax/bolumler?animeId=$animeId", xmlHeader) + return GET("$baseUrl/ajax/bolumler?animeId=$animeId", xmlHeader) } override fun episodeListSelector() = "ul.menum li" override fun episodeFromElement(element: Element): SEpisode { - val a = element.select("a:has(span.bolumAdi)") + val a = element.selectFirst("a:has(span.bolumAdi)")!! val title = a.attr("title") val substring = title.substringBefore(". Bölüm") val numIdx = substring.indexOfLast { !it.isDigit() } + 1 val numbers = substring.slice(numIdx..substring.lastIndex) return SEpisode.create().apply { - setUrlWithoutDomain("https:" + a.attr("href")) + setUrlWithoutDomain(a.attr("abs:href")) name = title episode_number = numbers.toFloatOrNull() ?: 1F } @@ -196,20 +191,26 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { super.episodeListParse(response).reversed() // ============================ Video Links ============================= - override fun videoListParse(response: Response): List