diff --git a/src/tr/turkanime/build.gradle b/src/tr/turkanime/build.gradle index 72c8a8704..c28e471da 100644 --- a/src/tr/turkanime/build.gradle +++ b/src/tr/turkanime/build.gradle @@ -19,7 +19,7 @@ ext { extName = 'Türk Anime TV' pkgNameSuffix = 'tr.turkanime' extClass = '.TurkAnime' - extVersionCode = 3 + extVersionCode = 4 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 a5b5315a5..72dd533d6 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 @@ -23,6 +23,7 @@ import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.VudeoExtractor import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.WolfstreamExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.model.Video @@ -96,7 +97,7 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { .substringBefore(" izle") val img = element.select("img.media-object") val animeId = element.select("a.reactions").first()!!.attr("data-unique-id") - val animeUrl = ("https:" + animeTitle.attr("href")).toHttpUrl() + val animeUrl = animeTitle.attr("abs:href").toHttpUrl() .newBuilder() .addQueryParameter("animeId", animeId) .build().toString() @@ -107,6 +108,57 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } } + // =============================== Latest =============================== + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/ajax/yenieklenenseriler?sayfa=$page", xmlHeader) + + override fun latestUpdatesSelector() = popularAnimeSelector() + + override fun latestUpdatesFromElement(element: Element) = popularAnimeFromElement(element) + + 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"), + FormBody.Builder().add("arama", query).build(), + ) + + override fun searchAnimeParse(response: Response): AnimesPage { + val document = response.asJsoup() + val scriptElement = document.selectFirst("div.panel-body > script:containsData(window.location)") + return if (scriptElement == null) { + val animeList = document.select(searchAnimeSelector()).map(::searchAnimeFromElement) + AnimesPage(animeList, document.selectFirst(searchAnimeSelector()) != null) + } else { + val location = scriptElement.data() + .substringAfter("window.location") + .substringAfter("\"") + .substringBefore("\"") + + val slug = if (location.startsWith("/")) location else "/$location" + + val animeList = listOf( + SAnime.create().apply { + setUrlWithoutDomain(slug) + thumbnail_url = "" + title = slug.substringAfter("anime/") + }, + ) + + AnimesPage(animeList, false) + } + } + + override fun searchAnimeSelector() = popularAnimeSelector() + + override fun searchAnimeFromElement(element: Element) = popularAnimeFromElement(element) + + override fun searchAnimeNextPageSelector() = popularAnimeNextPageSelector() + // =========================== Anime Details ============================ override fun animeDetailsParse(document: Document): SAnime { @@ -127,7 +179,9 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // ============================== Episodes ============================== override fun episodeListRequest(anime: SAnime): Request { - val animeId = (baseUrl + anime.url).toHttpUrl().queryParameter("animeId")!! + 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) } @@ -146,9 +200,8 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } } - override fun episodeListParse(response: Response): List { - return super.episodeListParse(response).reversed() - } + override fun episodeListParse(response: Response): List = + super.episodeListParse(response).reversed() // ============================ Video Links ============================= @@ -172,10 +225,7 @@ class TurkAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { val selectedHoster = document.select("div#videodetay div.btn-group:not(.pull-right) > button.btn-danger") val hosters = document.select("div#videodetay div.btn-group:not(.pull-right) > button.btn-default[onclick*=videosec]") - val hosterSelection = preferences.getStringSet( - "hoster_selection", - setOf("GDRIVE", "STREAMSB", "VOE"), - )!! + val hosterSelection = preferences.getStringSet(PREF_HOSTER_KEY, PREF_HOSTER_DEFAULT)!! val videoList = mutableListOf