diff --git a/src/en/ask4movie/build.gradle b/src/en/ask4movie/build.gradle deleted file mode 100644 index eb9ecc1b..00000000 --- a/src/en/ask4movie/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -ext { - extName = 'Ask4Movie' - extClass = '.Ask4Movie' - extVersionCode = 14 -} - -apply from: "$rootDir/common.gradle" - -dependencies { - implementation(project(':lib:filemoon-extractor')) - implementation(libs.jsunpacker) -} \ No newline at end of file diff --git a/src/en/ask4movie/res/mipmap-hdpi/ic_launcher.png b/src/en/ask4movie/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index afb3bad2..00000000 Binary files a/src/en/ask4movie/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/ask4movie/res/mipmap-mdpi/ic_launcher.png b/src/en/ask4movie/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 57a6e852..00000000 Binary files a/src/en/ask4movie/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/ask4movie/res/mipmap-xhdpi/ic_launcher.png b/src/en/ask4movie/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index d84dcdfc..00000000 Binary files a/src/en/ask4movie/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/ask4movie/res/mipmap-xxhdpi/ic_launcher.png b/src/en/ask4movie/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 21634ab2..00000000 Binary files a/src/en/ask4movie/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/ask4movie/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/ask4movie/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index d0ef4959..00000000 Binary files a/src/en/ask4movie/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/ask4movie/res/web_hi_res_512.png b/src/en/ask4movie/res/web_hi_res_512.png deleted file mode 100644 index 06cad2b6..00000000 Binary files a/src/en/ask4movie/res/web_hi_res_512.png and /dev/null differ diff --git a/src/en/ask4movie/src/eu/kanade/tachiyomi/animeextension/en/ask4movie/Ask4Movie.kt b/src/en/ask4movie/src/eu/kanade/tachiyomi/animeextension/en/ask4movie/Ask4Movie.kt deleted file mode 100644 index 4ab0a61a..00000000 --- a/src/en/ask4movie/src/eu/kanade/tachiyomi/animeextension/en/ask4movie/Ask4Movie.kt +++ /dev/null @@ -1,254 +0,0 @@ -package eu.kanade.tachiyomi.animeextension.en.ask4movie - -import eu.kanade.tachiyomi.animesource.model.AnimeFilter -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.lib.filemoonextractor.FilemoonExtractor -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element - -class Ask4Movie : ParsedAnimeHttpSource() { - - override val name = "Ask4Movie" - - // TODO: Check frequency of url changes to potentially - // add back overridable baseurl preference - override val baseUrl = "https://ask4movie.li" - - override val lang = "en" - - override val supportsLatest = true - - // ============================== Popular =============================== - - override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/channel_cat/trending/page/$page/", headers) - - override fun popularAnimeSelector(): String = "div.all-channels div.channel-content" - - override fun popularAnimeFromElement(element: Element): SAnime = SAnime.create().apply { - setUrlWithoutDomain(element.selectFirst("p.channel-name a")!!.attr("abs:href")) - thumbnail_url = element.select("div.channel-avatar a img").attr("src") - title = element.select("p.channel-name a").text() - } - - override fun popularAnimeNextPageSelector(): String = "div.wp-pagenavi a.nextpostslink" - - // =============================== Latest =============================== - - override fun latestUpdatesRequest(page: Int): Request = GET(baseUrl, headers) - - override fun latestUpdatesSelector(): String = "div.row:has(div.title:contains(Recently Added)) > div.slide > div.slide-item" - - override fun latestUpdatesFromElement(element: Element): SAnime { - val a = element.selectFirst("div.main-slide a[href]")!! - - return SAnime.create().apply { - setUrlWithoutDomain(a.attr("abs:href")) - thumbnail_url = element.select("div.item-thumb").attr("style") - .substringAfter("background-image: url(").substringBefore(")") - title = a.text() - } - } - - override fun latestUpdatesNextPageSelector(): String? = null - - // =============================== Search =============================== - - override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { - val filterList = if (filters.isEmpty()) getFilterList() else filters - val tvSeriesFilter = filterList.find { it is TVSeriesFilter } as TVSeriesFilter - val moviesFilter = filterList.find { it is MoviesFilter } as MoviesFilter - - return when { - query.isNotBlank() -> GET("$baseUrl/?s=$query", headers) - tvSeriesFilter.state != 0 -> GET("$baseUrl${tvSeriesFilter.toUriPart()}${page.toPage()}/") - moviesFilter.state != 0 -> GET("$baseUrl${moviesFilter.toUriPart()}${page.toPage()}/") - else -> popularAnimeRequest(page) - } - } - - override fun searchAnimeParse(response: Response): AnimesPage { - return if (response.request.url.encodedPath.contains("/channel_cat/")) { - popularAnimeParse(response) - } else { - super.searchAnimeParse(response) - } - } - - override fun searchAnimeSelector(): String = "div.cacus-sub-wrap > div.item,div#search-content > div.item" - - override fun searchAnimeFromElement(element: Element): SAnime = SAnime.create().apply { - setUrlWithoutDomain(element.selectFirst("div.description a")!!.attr("abs:href")) - thumbnail_url = element.attr("style") - .substringAfter("background-image: url(").substringBefore(")") - title = element.selectFirst("div.description a")!!.text() - } - - override fun searchAnimeNextPageSelector(): String = "div.wp-pagenavi > span.current + a" - - // =========================== Anime Details ============================ - - override fun animeDetailsParse(document: Document): SAnime = SAnime.create().apply { - genre = document.select("div.categories:contains(Genres) a").joinToString(", ") { it.text() } - .ifBlank { document.selectFirst("div.channel-description > p:has(span:contains(Genre)) em")?.text() } - description = document.selectFirst("div.custom.video-the-content p")?.ownText() - ?: document.selectFirst("div.channel-description > p:not(:has(em))")?.text() - } - - // ============================== Episodes ============================== - - override fun episodeListParse(response: Response): List { - val document = response.asJsoup() - val episodeList = mutableListOf() - - // Select multiple seasons - val seasonsList = document.select("div.row > div.cactus-sub-wrap > div.item") - if (seasonsList.isNotEmpty()) { - seasonsList.forEach { season -> - val link = season.selectFirst("a.btn-play-nf")!!.attr("abs:href") - val seasonName = "Season ${season.selectFirst("div.description p a")!!.text().substringAfter("(Season ").substringBefore(")")} " - val newDocument = client.newCall( - GET(link, headers), - ).execute().asJsoup() - - val groupList = episodesFromGroupLinks(newDocument, seasonName) - episodeList.addAll(groupList.ifEmpty { episodesFromSingle(newDocument, seasonName) }) - } - } else { - val groupList = episodesFromGroupLinks(document) - episodeList.addAll(groupList.ifEmpty { episodesFromSingle(document) }) - } - - return episodeList - } - - // Returns episode list when episodes are in red boxes below the player - private fun episodesFromGroupLinks(document: Document, prefix: String = ""): List { - return document.select("ul.group-links-list > li.group-link").mapNotNull { link -> - val a = link.selectFirst("a") ?: return@mapNotNull null - SEpisode.create().apply { - url = a.attr("data-embed-src") - episode_number = a.text().toFloatOrNull() ?: 0F - name = "${prefix}Ep. ${a.text()}" - } - }.reversed() - } - - private fun episodesFromSingle(document: Document, prefix: String = ""): List { - return listOf( - SEpisode.create().apply { - url = document.selectFirst("div#player-embed > iframe[src~=filemoon]")!!.attr("src") - episode_number = 1F - name = "${prefix}Ep. 1" - }, - ) - } - - override fun episodeListSelector() = throw UnsupportedOperationException() - - override fun episodeFromElement(element: Element): SEpisode = throw UnsupportedOperationException() - - // ============================ Video Links ============================= - - override suspend fun getVideoList(episode: SEpisode): List