From c7408b551f386d63b6a6b63e241b9c60e72349b0 Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Fri, 25 Aug 2023 14:49:38 -0300 Subject: [PATCH] feat(ar/animeblkom): Add domain preference (#2083) --- src/ar/animeblkom/build.gradle | 8 +- .../ar/animeblkom/AnimeBlkom.kt | 155 ++++++++++-------- 2 files changed, 91 insertions(+), 72 deletions(-) diff --git a/src/ar/animeblkom/build.gradle b/src/ar/animeblkom/build.gradle index 8915bd65e..d272534e9 100644 --- a/src/ar/animeblkom/build.gradle +++ b/src/ar/animeblkom/build.gradle @@ -1,11 +1,13 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) +} ext { extName = 'أنمي بالكوم' pkgNameSuffix = 'ar.animeblkom' extClass = '.AnimeBlkom' - extVersionCode = 11 + extVersionCode = 12 libVersion = '13' } diff --git a/src/ar/animeblkom/src/eu/kanade/tachiyomi/animeextension/ar/animeblkom/AnimeBlkom.kt b/src/ar/animeblkom/src/eu/kanade/tachiyomi/animeextension/ar/animeblkom/AnimeBlkom.kt index 7b15b2f6f..c930c43ff 100644 --- a/src/ar/animeblkom/src/eu/kanade/tachiyomi/animeextension/ar/animeblkom/AnimeBlkom.kt +++ b/src/ar/animeblkom/src/eu/kanade/tachiyomi/animeextension/ar/animeblkom/AnimeBlkom.kt @@ -1,7 +1,6 @@ package eu.kanade.tachiyomi.animeextension.ar.animeblkom import android.app.Application -import android.content.SharedPreferences import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource @@ -15,8 +14,6 @@ import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.Headers -import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document @@ -29,7 +26,7 @@ class AnimeBlkom : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val name = "أنمي بالكوم" - override val baseUrl = "https://animeblkom.net" + override val baseUrl by lazy { preferences.getString(PREF_DOMAIN_KEY, PREF_DOMAIN_DEFAULT)!! } override val lang = "ar" @@ -37,10 +34,10 @@ class AnimeBlkom : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val client = network.cloudflareClient - override fun headersBuilder() = Headers.Builder() - .add("referer", baseUrl).add("user-agent", NEW_USER_AGENT) + override fun headersBuilder() = super.headersBuilder() + .add("referer", baseUrl) - private val preferences: SharedPreferences by lazy { + private val preferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } @@ -60,6 +57,58 @@ class AnimeBlkom : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun popularAnimeNextPageSelector() = "ul.pagination li.page-item a[rel=next]" + // =============================== Latest =============================== + override fun latestUpdatesNextPageSelector(): String = throw Exception("Not used") + + override fun latestUpdatesFromElement(element: Element): SAnime = throw Exception("Not used") + + override fun latestUpdatesRequest(page: Int): Request = throw Exception("Not used") + + override fun latestUpdatesSelector(): String = throw Exception("Not used") + + // =============================== Search =============================== + override fun searchAnimeFromElement(element: Element) = popularAnimeFromElement(element) + + override fun searchAnimeNextPageSelector() = popularAnimeNextPageSelector() + + override fun searchAnimeSelector() = popularAnimeSelector() + + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + val url = if (query.isNotBlank()) { + "$baseUrl/search?query=$query&page=$page" + } else { + filters + .filterIsInstance() + .firstOrNull() + ?.takeIf { it.state > 0 } + ?.let { filter -> + val genreN = getTypeList()[filter.state].query + "$baseUrl/$genreN?page=$page" + } + ?: throw Exception("اختر فلتر") + } + return GET(url, headers) + } + + // =========================== Anime Details ============================ + override fun animeDetailsParse(document: Document): SAnime { + return SAnime.create().apply { + thumbnail_url = document.selectFirst("div.poster img")!!.attr("data-original") + title = document.selectFirst("div.name span h1")!!.text() + genre = document.select("p.genres a").joinToString { it.text() } + description = document.selectFirst("div.story p, div.story")?.text() + author = document.selectFirst("div:contains(الاستديو) span > a")?.text() + status = document.selectFirst("div.info-table div:contains(حالة الأنمي) span.info")?.text()?.let { + when { + it.contains("مستمر") -> SAnime.ONGOING + it.contains("مكتمل") -> SAnime.COMPLETED + else -> null + } + } ?: SAnime.UNKNOWN + artist = document.selectFirst("div:contains(المخرج) > span.info")?.text() + } + } + // ============================== Episodes ============================== override fun episodeListParse(response: Response): List { val document = response.asJsoup() @@ -100,6 +149,7 @@ class AnimeBlkom : ConfigurableAnimeSource, ParsedAnimeHttpSource() { runCatching { extractVideos(it) }.getOrElse { emptyList() } }.flatten() } + private fun extractVideos(element: Element): List