diff --git a/src/en/gogoanime/build.gradle b/src/en/gogoanime/build.gradle index 63986c22f..5002b1f49 100644 --- a/src/en/gogoanime/build.gradle +++ b/src/en/gogoanime/build.gradle @@ -1,18 +1,20 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) +} ext { extName = 'Gogoanime' pkgNameSuffix = 'en.gogoanime' extClass = '.GogoAnime' - extVersionCode = 68 + extVersionCode = 69 libVersion = '13' } dependencies { implementation(project(':lib-mp4upload-extractor')) - implementation(project(':lib-streamsb-extractor')) implementation(project(':lib-dood-extractor')) + implementation(project(':lib-playlist-utils')) implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1" } diff --git a/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GogoAnime.kt b/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GogoAnime.kt index 0e9a89bc6..10aef4a2e 100644 --- a/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GogoAnime.kt +++ b/src/en/gogoanime/src/eu/kanade/tachiyomi/animeextension/en/gogoanime/GogoAnime.kt @@ -2,13 +2,15 @@ package eu.kanade.tachiyomi.animeextension.en.gogoanime import android.app.Application import android.content.SharedPreferences +import android.widget.Toast import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.MultiSelectListPreference import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.AppInfo import eu.kanade.tachiyomi.animeextension.en.gogoanime.extractors.GogoCdnExtractor +import eu.kanade.tachiyomi.animeextension.en.gogoanime.extractors.StreamWishExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource -import eu.kanade.tachiyomi.animesource.model.AnimeFilter import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode @@ -16,7 +18,6 @@ import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor -import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup import kotlinx.coroutines.Dispatchers @@ -56,7 +57,7 @@ class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // ============================== Popular =============================== - override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/popular.html?page=$page") + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/popular.html?page=$page", headers) override fun popularAnimeSelector(): String = "div.img a" @@ -87,17 +88,13 @@ class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // =============================== Search =============================== override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { - val filterList = if (filters.isEmpty()) getFilterList() else filters - val genreFilter = filterList.find { it is GenreFilter } as GenreFilter - val recentFilter = filterList.find { it is RecentFilter } as RecentFilter - val seasonFilter = filterList.find { it is SeasonFilter } as SeasonFilter + val params = GogoAnimeFilters.getSearchParameters(filters) return when { - query.isNotBlank() -> GET("$baseUrl/search.html?keyword=$query&page=$page", headers) - genreFilter.state != 0 -> GET("$baseUrl/genre/${genreFilter.toUriPart()}?page=$page") - recentFilter.state != 0 -> GET("https://ajax.gogo-load.com/ajax/page-recent-release.html?page=$page&type=${recentFilter.toUriPart()}") - seasonFilter.state != 0 -> GET("$baseUrl/${seasonFilter.toUriPart()}?page=$page", headers) - else -> GET("$baseUrl/popular.html?page=$page") + params.genre.isNotEmpty() -> GET("$baseUrl/genre/${params.genre}?page=$page", headers) + params.recent.isNotEmpty() -> GET("https://ajax.gogo-load.com/ajax/page-recent-release.html?page=$page&type=${params.recent}", headers) + params.season.isNotEmpty() -> GET("$baseUrl/${params.season}?page=$page", headers) + else -> GET("$baseUrl/filter.html?keyword=$query&${params.filter}&page=$page", headers) } } @@ -107,6 +104,10 @@ class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun searchAnimeNextPageSelector(): String = popularAnimeNextPageSelector() + // ============================== Filters =============================== + + override fun getFilterList(): AnimeFilterList = GogoAnimeFilters.FILTER_LIST + // =========================== Anime Details ============================ override fun animeDetailsParse(document: Document): SAnime { @@ -138,8 +139,6 @@ class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { return document.select("a").map { episodeFromElement(it) } } - override fun episodeListSelector() = "ul#episode_page li a" - override fun episodeListParse(response: Response): List { val document = response.asJsoup() val totalEpisodes = document.select(episodeListSelector()).last()!!.attr("ep_end") @@ -147,6 +146,8 @@ class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { return episodesRequest(totalEpisodes, id) } + override fun episodeListSelector() = "ul#episode_page li a" + override fun episodeFromElement(element: Element): SEpisode { val ep = element.selectFirst("div.name")!!.ownText().substringAfter(" ") return SEpisode.create().apply { @@ -158,45 +159,40 @@ class GogoAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // ============================ Video Links ============================= + private val gogoExtractor by lazy { GogoCdnExtractor(client, json) } + private val streamwishExtractor by lazy { StreamWishExtractor(client, headers) } + private val doodExtractor by lazy { DoodExtractor(client) } + private val mp4uploadExtractor by lazy { Mp4uploadExtractor(client) } + override fun videoListParse(response: Response): List