From 5a872a91166ab7937963ae697dc2be9a5eb162a1 Mon Sep 17 00:00:00 2001 From: mobby45 <68152858+mobby45@users.noreply.github.com> Date: Wed, 8 Jan 2025 00:50:41 +0100 Subject: [PATCH 01/41] Hentai zm turc (#492) * Fix HentaiZM Extension * Fix HentaiZM Extension * Fix HentaiZM Extension * Update build.gradle * Update HentaiZM.kt * Update HentaiZM.kt * Update HentaiZM.kt --------- Co-authored-by: Dark25 --- src/tr/hentaizm/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tr/hentaizm/build.gradle b/src/tr/hentaizm/build.gradle index 3fdc45e1..d273fcf6 100644 --- a/src/tr/hentaizm/build.gradle +++ b/src/tr/hentaizm/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'HentaiZM' extClass = '.HentaiZM' - extVersionCode = 7 + extVersionCode = 8 isNsfw = true } -- 2.47.2 From 695854722a46cd08ca220a6f88d126ee34eaff99 Mon Sep 17 00:00:00 2001 From: WebDitto Date: Tue, 7 Jan 2025 22:32:13 -0300 Subject: [PATCH 02/41] fix(pt/anitube): Fixed pt/Anitube source (fix #469,#494) (#495) --- src/pt/anitube/build.gradle | 2 +- .../pt/anitube/extractors/AnitubeExtractor.kt | 27 +++++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/pt/anitube/build.gradle b/src/pt/anitube/build.gradle index 519039b0..b84e0541 100644 --- a/src/pt/anitube/build.gradle +++ b/src/pt/anitube/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Anitube' extClass = '.Anitube' - extVersionCode = 20 + extVersionCode = 21 } apply from: "$rootDir/common.gradle" diff --git a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/extractors/AnitubeExtractor.kt b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/extractors/AnitubeExtractor.kt index 6c96aad9..25276c01 100644 --- a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/extractors/AnitubeExtractor.kt +++ b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/extractors/AnitubeExtractor.kt @@ -6,7 +6,7 @@ import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.util.asJsoup -import eu.kanade.tachiyomi.util.parallelMapNotNullBlocking +import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking import okhttp3.FormBody import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl @@ -77,6 +77,17 @@ class AnitubeExtractor( return getAdsUrl(serverUrl, thumbUrl, newLink, newHeaders) } + if (docLink.data().contains("window.location.href = redirectUrl")) { + val newLink = docLink.data() + .substringAfter("redirectUrl = `") + .substringBefore("`") + .replace("\${token}", finalLink.toHttpUrl().queryParameter("t") ?: "") + val newHeaders = linkHeaders.newBuilder().set("Referer", finalLink).build() + Log.d(tag, "Following javascript redirection to $newLink") + + return getAdsUrl(serverUrl, thumbUrl, newLink, newHeaders) + } + val referer: String = docLink.location() ?: link Log.d(tag, "Final URL: $referer") @@ -112,7 +123,7 @@ class AnitubeExtractor( // Try default url Log.e(tag, "Failed to get the ADS URL, trying the default") - return "https://www.popads.net/js/adblock.js" + return "https://s4.cdnpc.net/vite-bundle/main.css?version=v93" } private fun getAuthCode(serverUrl: String, thumbUrl: String, link: String): String { @@ -154,7 +165,7 @@ class AnitubeExtractor( .build() val publicidade = - client.newCall(POST("$ADS_URL/", headers = newHeaders, body = body)) + client.newCall(POST(ADS_URL, headers = newHeaders, body = body)) .execute() .body.string() .substringAfter("\"publicidade\"") @@ -173,7 +184,7 @@ class AnitubeExtractor( authCode = client.newCall( GET( - "$ADS_URL/?token=$publicidade", + "$ADS_URL?token=$publicidade", headers = newHeaders, ), ) @@ -226,19 +237,19 @@ class AnitubeExtractor( var quality = "$quality - Anitube" } } - .parallelMapNotNullBlocking { + .parallelCatchingFlatMapBlocking { if (!checkVideoExists(it.url).exists) { Log.d(tag, "Video not exists: ${it.url.substringBefore("?")}") - return@parallelMapNotNullBlocking null + return@parallelCatchingFlatMapBlocking emptyList() } - Video(it.url, it.quality, it.url, headers = headers) + listOf(Video(it.url, it.quality, it.url, headers = headers)) } .reversed() } companion object { private const val PREF_AUTHCODE_KEY = "authcode" - private const val ADS_URL = "https://ads.anitube.vip" + private const val ADS_URL = "https://ads.anitube.vip/adblock.php" private const val SITE_URL = "https://www.anitube.vip/playerricas.php" } } -- 2.47.2 From 48f1bac534bd0bf870acb56e20bb83b650b13ff4 Mon Sep 17 00:00:00 2001 From: imper1aldev <23511335+imper1aldev@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:50:22 -0600 Subject: [PATCH 03/41] fix(src/es): PelisPlusPh & MonosChinos fixes (#497) * PelisPlusPh fixes Closes #489 * MonosChinos fixes Closes #450 --- src/es/monoschinos/build.gradle | 2 +- .../es/monoschinos/MonosChinos.kt | 109 ++++++++++-------- .../es/monoschinos/MonosChinosFilters.kt | 82 +++++++++---- src/es/pelisplushd/build.gradle | 2 +- .../es/pelisplushd/Pelisplushd.kt | 2 + .../es/pelisplushd/PelisplushdFactory.kt | 2 +- .../es/pelisplushd/Pelisplusph.kt | 7 +- .../es/pelisplushd/Pelisplusto.kt | 2 + 8 files changed, 130 insertions(+), 78 deletions(-) diff --git a/src/es/monoschinos/build.gradle b/src/es/monoschinos/build.gradle index a22dc4c4..e716c223 100644 --- a/src/es/monoschinos/build.gradle +++ b/src/es/monoschinos/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'MonosChinos' extClass = '.MonosChinos' - extVersionCode = 29 + extVersionCode = 30 } apply from: "$rootDir/common.gradle" diff --git a/src/es/monoschinos/src/eu/kanade/tachiyomi/animeextension/es/monoschinos/MonosChinos.kt b/src/es/monoschinos/src/eu/kanade/tachiyomi/animeextension/es/monoschinos/MonosChinos.kt index 9adcbbcf..9f786cbe 100644 --- a/src/es/monoschinos/src/eu/kanade/tachiyomi/animeextension/es/monoschinos/MonosChinos.kt +++ b/src/es/monoschinos/src/eu/kanade/tachiyomi/animeextension/es/monoschinos/MonosChinos.kt @@ -24,7 +24,6 @@ import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking -import eu.kanade.tachiyomi.util.parseAs import okhttp3.FormBody import okhttp3.Request import okhttp3.Response @@ -37,7 +36,7 @@ class MonosChinos : ConfigurableAnimeSource, AnimeHttpSource() { override val name = "MonosChinos" - override val baseUrl = "https://monoschinos2.com" + override val baseUrl = "https://monoschinos2.net" override val id = 6957694006954649296 @@ -80,7 +79,7 @@ class MonosChinos : ConfigurableAnimeSource, AnimeHttpSource() { status = document.select(".lh-sm .ms-2").eachText().let { items -> when { items.any { it.contains("Finalizado") } -> SAnime.COMPLETED - items.any { it.contains("Estreno") } -> SAnime.ONGOING + items.any { it.contains("En emision") || it.contains("Estreno") } -> SAnime.ONGOING else -> SAnime.UNKNOWN } } @@ -88,12 +87,12 @@ class MonosChinos : ConfigurableAnimeSource, AnimeHttpSource() { return animeDetails } - override fun popularAnimeRequest(page: Int) = GET("$baseUrl/animes?p=$page", headers) + override fun popularAnimeRequest(page: Int) = GET("$baseUrl/animes?pag=$page", headers) override fun popularAnimeParse(response: Response): AnimesPage { val document = response.asJsoup() val elements = document.select(".ficha_efecto a") - val nextPage = document.select(".pagination [rel=\"next\"]").any() + val nextPage = document.select(".pagination [title=\"Siguiente página\"]").any() val animeList = elements.map { element -> SAnime.create().apply { title = element.selectFirst(".title_cap")!!.text() @@ -106,13 +105,13 @@ class MonosChinos : ConfigurableAnimeSource, AnimeHttpSource() { override fun latestUpdatesParse(response: Response) = popularAnimeParse(response) - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/emision?p=$page", headers) + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/animes?estado=en+emision&pag=$page", headers) override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { val params = MonosChinosFilters.getSearchParameters(filters) return when { - query.isNotBlank() -> GET("$baseUrl/buscar?q=$query", headers) - params.filter.isNotBlank() -> GET("$baseUrl/animes${params.getQuery()}&p=$page", headers) + query.isNotBlank() -> GET("$baseUrl/animes?buscar=$query&pag=$page", headers) + params.filter.isNotBlank() -> GET("$baseUrl/animes${params.getQuery()}&pag=$page", headers) else -> popularAnimeRequest(page) } } @@ -121,31 +120,50 @@ class MonosChinos : ConfigurableAnimeSource, AnimeHttpSource() { override fun episodeListParse(response: Response): List { val document = response.asJsoup() - val token = document.select("meta[name='csrf-token']").attr("content") - val capListLink = document.select(".caplist").attr("data-ajax") val referer = document.location() + val dt = document.select("#dt") - val detail = getEpisodeDetails(capListLink, token, referer) - val total = detail.eps.size - val perPage = detail.perpage ?: return emptyList() + val total = dt.attr("data-e").toInt() + val perPage = 50.0 val pages = (total / perPage).ceilPage() + val i = dt.attr("data-i") + val u = dt.attr("data-u") + var pageIdx = 1 return (1..pages).parallelCatchingFlatMapBlocking { - getEpisodePage(detail.paginateUrl ?: "", it, token, referer).caps.mapIndexed { idx, ep -> - val episodeNumber = (ep.episodio ?: (idx + 1)) - SEpisode.create().apply { - name = "Capítulo $episodeNumber" - episode_number = episodeNumber.toFloat() - setUrlWithoutDomain(ep.url ?: "") - } - } - }.reversed() + val formBody = FormBody.Builder() + .add("acc", "episodes") + .add("i", i) + .add("u", u) + .add("p", pageIdx.toString()) + .build() + + val request = Request.Builder() + .url("$baseUrl/ajax_pagination") + .post(formBody) + .header("accept", "application/json, text/javascript, */*; q=0.01") + .header("accept-language", "es-419,es;q=0.8") + .header("content-type", "application/x-www-form-urlencoded; charset=UTF-8") + .header("origin", baseUrl) + .header("referer", referer) + .header("x-requested-with", "XMLHttpRequest") + .build() + pageIdx++ + + client.newCall(request).execute().getEpisodes() + } } - private fun getEpisodeDetails(capListLink: String, token: String, referer: String): EpisodesDto { - val formBody = FormBody.Builder().add("_token", token).build() + override fun videoListParse(response: Response): List