From 76c8129672716bf4448cad1d48b996bc3fa03ec7 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 8 Nov 2023 07:10:00 +0700 Subject: [PATCH] feat(id/samehadaku): Add search filters (#2478) --- src/id/samehadaku/build.gradle | 2 +- .../id/samehadaku/Samehadaku.kt | 131 +++++++------ .../id/samehadaku/SamehadakuFilters.kt | 183 ++++++++++++++++++ 3 files changed, 253 insertions(+), 63 deletions(-) create mode 100644 src/id/samehadaku/src/eu/kanade/tachiyomi/animeextension/id/samehadaku/SamehadakuFilters.kt diff --git a/src/id/samehadaku/build.gradle b/src/id/samehadaku/build.gradle index 364c700ae..1daec5f02 100644 --- a/src/id/samehadaku/build.gradle +++ b/src/id/samehadaku/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Samehadaku' pkgNameSuffix = 'id.samehadaku' extClass = '.Samehadaku' - extVersionCode = 2 + extVersionCode = 3 libVersion = '13' } diff --git a/src/id/samehadaku/src/eu/kanade/tachiyomi/animeextension/id/samehadaku/Samehadaku.kt b/src/id/samehadaku/src/eu/kanade/tachiyomi/animeextension/id/samehadaku/Samehadaku.kt index 5fe622b49..c8e9c93dd 100644 --- a/src/id/samehadaku/src/eu/kanade/tachiyomi/animeextension/id/samehadaku/Samehadaku.kt +++ b/src/id/samehadaku/src/eu/kanade/tachiyomi/animeextension/id/samehadaku/Samehadaku.kt @@ -6,10 +6,11 @@ import androidx.preference.ListPreference import androidx.preference.PreferenceScreen 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 -import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource +import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.util.asJsoup @@ -27,9 +28,9 @@ import uy.kohesive.injekt.api.get import java.text.SimpleDateFormat import java.util.Locale -class Samehadaku : ConfigurableAnimeSource, ParsedAnimeHttpSource() { +class Samehadaku : ConfigurableAnimeSource, AnimeHttpSource() { override val name: String = "Samehadaku" - override val baseUrl: String = "https://samehadaku.rent" + override val baseUrl: String = "https://samehadaku.mom" override val lang: String = "id" override val supportsLatest: Boolean = true @@ -42,75 +43,76 @@ class Samehadaku : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/daftar-anime-2/page/$page/?order=popular") - override fun popularAnimeSelector(): String = "div.relat > article" - - override fun popularAnimeFromElement(element: Element): SAnime = - getAnimeFromAnimeElement(element) - - override fun popularAnimeNextPageSelector(): String = "div.pagination > a.arrow_pag" + override fun popularAnimeParse(response: Response): AnimesPage = + getAnimeParse(response.asJsoup(), "div.relat > article") // =============================== Latest =============================== override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/daftar-anime-2/page/$page/?order=latest") - override fun latestUpdatesSelector(): String = "div.relat > article" - - override fun latestUpdatesFromElement(element: Element): SAnime = - getAnimeFromAnimeElement(element) - - override fun latestUpdatesNextPageSelector(): String = "div.pagination > a.arrow_pag" + override fun latestUpdatesParse(response: Response): AnimesPage = + getAnimeParse(response.asJsoup(), "div.relat > article") // =============================== Search =============================== - override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request = - GET("$baseUrl/page/$page/?s=$query") + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + val params = SamehadakuFilters.getSearchParameters(filters) + return GET("$baseUrl/daftar-anime-2/page/$page/?s=$query${params.filter}", headers) + } - override fun searchAnimeSelector(): String = "main.site-main.relat > article" + override fun searchAnimeParse(response: Response): AnimesPage { + val doc = response.asJsoup() + val searchSelector = "main.site-main.relat > article" + return if (doc.selectFirst(searchSelector) != null) { + getAnimeParse(doc, searchSelector) + } else { + getAnimeParse(doc, "div.relat > article") + } + } - override fun searchAnimeFromElement(element: Element): SAnime = - getAnimeFromAnimeElement(element) + // ============================== Filters =============================== - override fun searchAnimeNextPageSelector(): String = "div.pagination > a.arrow_pag" + override fun getFilterList(): AnimeFilterList = SamehadakuFilters.FILTER_LIST // =========================== Anime Details ============================ - override fun animeDetailsParse(document: Document): SAnime { - val detail = document.selectFirst("div.infox > div.spe")!! + override fun animeDetailsParse(response: Response): SAnime { + val doc = response.asJsoup() + val detail = doc.selectFirst("div.infox > div.spe")!! return SAnime.create().apply { author = detail.getInfo("Studio") status = parseStatus(detail.getInfo("Status")) - title = document.selectFirst("h3.anim-detail")!!.text().split("Detail Anime ")[1] + title = doc.selectFirst("h3.anim-detail")!!.text().split("Detail Anime ")[1] thumbnail_url = - document.selectFirst("div.infoanime.widget_senction > div.thumb > img")!! + doc.selectFirst("div.infoanime.widget_senction > div.thumb > img")!! .attr("src") description = - document.selectFirst("div.entry-content.entry-content-single > p")!!.text() + doc.selectFirst("div.entry-content.entry-content-single > p")!!.text() } } // ============================== Episodes ============================== - override fun episodeListSelector(): String = - "div.whites.lsteps.widget_senction > div.lstepsiode.listeps > ul > li" - - override fun episodeFromElement(element: Element): SEpisode { - val episode = element.selectFirst("span.eps > a")!!.text() - return SEpisode.create().apply { - setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) - episode_number = episode.toFloatOrNull() ?: 1F - name = element.selectFirst("span.lchx > a")!!.text() - date_upload = element.selectFirst("span.date")!!.text().toDate() - } + override fun episodeListParse(response: Response): List { + val doc = response.asJsoup() + return doc.select("div.lstepsiode > ul > li") + .map { + val episode = it.selectFirst("span.eps > a")!! + SEpisode.create().apply { + setUrlWithoutDomain(episode.attr("href")) + episode_number = episode.text().trim().toFloatOrNull() ?: 1F + name = it.selectFirst("span.lchx > a")!!.text() + date_upload = it.selectFirst("span.date")!!.text().toDate() + } + } } // ============================ Video Links ============================= - override fun videoListSelector(): String = "#server > ul > li > div" - override fun videoListParse(response: Response): List