diff --git a/src/ar/arabanime/build.gradle b/src/ar/arabanime/build.gradle index bb0df8e9c..a637d50f5 100644 --- a/src/ar/arabanime/build.gradle +++ b/src/ar/arabanime/build.gradle @@ -1,12 +1,14 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlinx-serialization' +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.serialization) +} ext { extName = 'ArabAnime' pkgNameSuffix = 'ar.arabanime' extClass = '.ArabAnime' - extVersionCode = 1 + extVersionCode = 2 libVersion = '13' } diff --git a/src/ar/arabanime/src/eu/kanade/tachiyomi/animeextension/ar/arabanime/ArabAnime.kt b/src/ar/arabanime/src/eu/kanade/tachiyomi/animeextension/ar/arabanime/ArabAnime.kt index 8e42d9d39..5f375111c 100644 --- a/src/ar/arabanime/src/eu/kanade/tachiyomi/animeextension/ar/arabanime/ArabAnime.kt +++ b/src/ar/arabanime/src/eu/kanade/tachiyomi/animeextension/ar/arabanime/ArabAnime.kt @@ -1,7 +1,7 @@ package eu.kanade.tachiyomi.animeextension.ar.arabanime import android.app.Application -import android.content.SharedPreferences +import android.util.Base64 import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animeextension.ar.arabanime.dto.AnimeItem @@ -26,6 +26,7 @@ import okhttp3.Request import okhttp3.Response import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy class ArabAnime : ConfigurableAnimeSource, AnimeHttpSource() { @@ -37,83 +38,112 @@ class ArabAnime : ConfigurableAnimeSource, AnimeHttpSource() { override val supportsLatest = true - private val json = Json { - ignoreUnknownKeys = true - } + override val client = network.cloudflareClient - private val preferences: SharedPreferences by lazy { + private val json: Json by injectLazy() + + private val preferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } // ============================== Popular =============================== + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/api?page=$page") + override fun popularAnimeParse(response: Response): AnimesPage { val responseJson = json.decodeFromString(response.body.string()) - val animeList = responseJson.Shows.map { - val animeJson = json.decodeFromString(it.decodeBase64()) - SAnime.create().apply { - setUrlWithoutDomain(animeJson.info_src) - title = animeJson.anime_name - thumbnail_url = animeJson.anime_cover_image_url - } + val animeList = responseJson.Shows.mapNotNull { + runCatching { + val animeJson = json.decodeFromString(it.decodeBase64()) + SAnime.create().apply { + setUrlWithoutDomain(animeJson.info_src) + title = animeJson.anime_name + thumbnail_url = animeJson.anime_cover_image_url + } + }.getOrNull() } val hasNextPage = responseJson.current_page < responseJson.last_page return AnimesPage(animeList, hasNextPage) } - override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/api?page=$page") + // =============================== Latest =============================== + override fun latestUpdatesRequest(page: Int) = GET(baseUrl) - // ============================== Episodes ============================== - override fun episodeListParse(response: Response): List { - val showData = response.asJsoup().select("div#data").text().decodeBase64() - val episodesJson = json.decodeFromString(showData) - return episodesJson.EPS.map { - SEpisode.create().apply { - name = it.episode_name - episode_number = it.episode_number.toFloat() - setUrlWithoutDomain(it.`info-src`) - } - }.reversed() - } + override fun latestUpdatesParse(response: Response): AnimesPage { + val latestEpisodes = response.use { it.asJsoup() }.select("div.as-episode") + val animeList = latestEpisodes.map { + SAnime.create().apply { + val ahref = it.selectFirst("a.as-info")!! + title = ahref.text() + val url = ahref.attr("href").replace("watch", "show").substringBeforeLast("/") + setUrlWithoutDomain(url) - // ============================ Video Links ============================= - override fun videoListRequest(episode: SEpisode): Request = GET("$baseUrl/${episode.url}") - - override fun videoListParse(response: Response): List