diff --git a/lib/fireplayer-extractor/src/main/java/eu/kanade/tachiyomi/lib/fireplayerextractor/FireplayerExtractor.kt b/lib/fireplayer-extractor/src/main/java/eu/kanade/tachiyomi/lib/fireplayerextractor/FireplayerExtractor.kt index 4afa8d95..f9735def 100644 --- a/lib/fireplayer-extractor/src/main/java/eu/kanade/tachiyomi/lib/fireplayerextractor/FireplayerExtractor.kt +++ b/lib/fireplayer-extractor/src/main/java/eu/kanade/tachiyomi/lib/fireplayerextractor/FireplayerExtractor.kt @@ -36,7 +36,6 @@ class FireplayerExtractor( val script = doc.selectFirst("script:containsData(eval):containsData(p,a,c,k,e,d)")?.data() - ?.replace(Regex("[\\u00E0-\\u00FC]"), "-") // Fix a bug in JsUnpacker with accents ?.let(JsUnpacker::unpackAndCombine) ?: doc.selectFirst("script:containsData(FirePlayer)")?.data() diff --git a/src/pt/anitube/build.gradle b/src/pt/anitube/build.gradle index 519039b0..a468f926 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 = 19 } apply from: "$rootDir/common.gradle" diff --git a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/Anitube.kt b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/Anitube.kt index 4f5f8ae6..9d5e4d02 100644 --- a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/Anitube.kt +++ b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/Anitube.kt @@ -4,7 +4,6 @@ import android.app.Application import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.PreferenceScreen -import androidx.preference.SwitchPreferenceCompat import eu.kanade.tachiyomi.animeextension.pt.anitube.extractors.AnitubeDownloadExtractor import eu.kanade.tachiyomi.animeextension.pt.anitube.extractors.AnitubeExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource @@ -200,10 +199,8 @@ class Anitube : ConfigurableAnimeSource, ParsedAnimeHttpSource() { val links = mutableListOf(document.location()) - if (preferences.getBoolean(PREF_FILE4GO_KEY, PREF_FILE4GO_DEFAULT)!!) { - document.selectFirst("div.abaItemDown > a")?.attr("href")?.let { - links.add(it) - } + document.selectFirst("div.abaItemDown > a")?.attr("href")?.let { + links.add(it) } val epName = document.selectFirst("meta[itemprop=name]")!!.attr("content") @@ -238,16 +235,6 @@ class Anitube : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } }.also(screen::addPreference) - SwitchPreferenceCompat(screen.context).apply { - key = PREF_FILE4GO_KEY - title = "Usar File4Go como mirror" - setDefaultValue(PREF_FILE4GO_DEFAULT) - summary = PREF_FILE4GO_SUMMARY - setOnPreferenceChangeListener { _, newValue -> - preferences.edit().putBoolean(key, newValue as Boolean).commit() - } - }.also(screen::addPreference) - // Auth Code EditTextPreference(screen.context).apply { key = PREF_AUTHCODE_KEY @@ -321,9 +308,6 @@ class Anitube : ConfigurableAnimeSource, ParsedAnimeHttpSource() { private const val PREF_AUTHCODE_KEY = "authcode" private const val PREF_AUTHCODE_SUMMARY = "Código de Autenticação" private const val PREF_AUTHCODE_DEFAULT = "" - private const val PREF_FILE4GO_KEY = "file4go" - private const val PREF_FILE4GO_SUMMARY = "Usar File4Go como mirror" - private const val PREF_FILE4GO_DEFAULT = false private const val PREF_QUALITY_KEY = "preferred_quality" private const val PREF_QUALITY_TITLE = "Qualidade preferida" private const val PREF_QUALITY_DEFAULT = "HD" diff --git a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/extractors/AnitubeDownloadExtractor.kt b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/extractors/AnitubeDownloadExtractor.kt index a5e864ce..2d0bb1d6 100644 --- a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/extractors/AnitubeDownloadExtractor.kt +++ b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/extractors/AnitubeDownloadExtractor.kt @@ -8,7 +8,6 @@ import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.parallelMapNotNullBlocking import okhttp3.FormBody import okhttp3.Headers -import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient class AnitubeDownloadExtractor( @@ -21,33 +20,23 @@ class AnitubeDownloadExtractor( private fun videosFromFile4Go(url: String, quality: String): Video? { Log.d(tag, "Checking download for $url") + val docDownload = client.newCall(GET(url)).execute().asJsoup() - val newHeaders = headers.newBuilder() - .set("Referer", "https://${url.toHttpUrl().host}/") - .add("Accept", "*/*") - .add("Cache-Control", "no-cache") - .add("Pragma", "no-cache") - .add("Connection", "keep-alive") - .add("Sec-Fetch-Dest", "empty") - .add("Sec-Fetch-Mode", "cors") - .add("Sec-Fetch-Site", "same-site") - .build() + val form = + docDownload.selectFirst("button.download")?.closest("form") - val id = url.split('/').last() - val idusuario = - client.newCall(GET("$ADS_URL/file4go.php", headers = newHeaders)) - .execute() - .body.string() - .substringAfter("\"publicidade\"") - .substringAfter('"') - .substringBefore('"') + if (form == null) { + Log.d(tag, "Download form not found for $url") + return null + } val body = FormBody.Builder().apply { - add("id", id) - add("idusuario", idusuario) + form.select("input[name]").forEach { + add(it.attr("name"), it.attr("value")) + } }.build() - val postUrl = "https://www.file4go.net/getdownload_new_anitube.php" + val postUrl = form.attr("action") val postHeaders = headers.newBuilder() .set("Referer", url) @@ -106,8 +95,4 @@ class AnitubeDownloadExtractor( return videosFromDownloadPage(url, epName) } - - companion object { - private const val ADS_URL = "https://ads.anitube.vip" - } } diff --git a/src/pt/megaflix/build.gradle b/src/pt/megaflix/build.gradle index ff685850..ede65fca 100644 --- a/src/pt/megaflix/build.gradle +++ b/src/pt/megaflix/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Megaflix' extClass = '.Megaflix' - extVersionCode = 20 + extVersionCode = 19 isNsfw = true } diff --git a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt index e64a0785..edb032cb 100644 --- a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt +++ b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.animeextension.pt.megaflix import android.app.Application +import android.util.Base64 import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animeextension.pt.megaflix.extractors.MegaflixExtractor @@ -13,7 +14,6 @@ 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.lib.mixdropextractor.MixDropExtractor -import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor import eu.kanade.tachiyomi.lib.streamwishextractor.StreamWishExtractor import eu.kanade.tachiyomi.lib.vidhideextractor.VidHideExtractor @@ -35,7 +35,7 @@ class Megaflix : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val name = "Megaflix" - override val baseUrl = "https://megaflix.ac" + override val baseUrl = "https://megaflix.co" override val lang = "pt-BR" @@ -73,11 +73,7 @@ class Megaflix : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun latestUpdatesNextPageSelector() = "div.nav-links > a:containsOwn(PRÓXIMO)" // =============================== Search =============================== - override suspend fun getSearchAnime( - page: Int, - query: String, - filters: AnimeFilterList, - ): AnimesPage { + override suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { return if (query.startsWith(PREFIX_SEARCH)) { // URL intent handler val path = query.removePrefix(PREFIX_SEARCH) client.newCall(GET("$baseUrl/$path")) @@ -139,7 +135,6 @@ class Megaflix : ConfigurableAnimeSource, ParsedAnimeHttpSource() { episode_number = 1F }, ) - else -> seasons.parallelFlatMapBlocking(::episodesFromSeason).reversed() } } @@ -168,14 +163,12 @@ class Megaflix : ConfigurableAnimeSource, ParsedAnimeHttpSource() { .parallelCatchingFlatMapBlocking { element -> val language = element.text().substringAfter("-") val id = element.attr("href") - val url = element.closest("body")?.selectFirst("div$id iframe") - ?.let { - val iframeUrl = it.attr("src") - client.newCall(GET(iframeUrl, headers)) - .execute() - .asJsoup() - .selectFirst("iframe") - ?.attr("src") + val url = element.parents().get(5)?.selectFirst("div$id a") + ?.run { + attr("href") + .substringAfter("token=") + .let { String(Base64.decode(it, Base64.DEFAULT)) } + .substringAfter("||") } ?: return@parallelCatchingFlatMapBlocking emptyList() getVideoList(url, language) @@ -183,9 +176,6 @@ class Megaflix : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } /*--------------------------------Video extractors------------------------------------*/ - private val webViewResolver by lazy { WebViewResolver() } - private val playlistUtils by lazy { PlaylistUtils(client, headers) } - private val mixdropExtractor by lazy { MixDropExtractor(client) } private val streamtapeExtractor by lazy { StreamTapeExtractor(client) } private val megaflixExtractor by lazy { MegaflixExtractor(client, headers) } @@ -203,17 +193,6 @@ class Megaflix : ConfigurableAnimeSource, ParsedAnimeHttpSource() { arrayOf("filemoon", "moonplayer").any(url) -> filemoonExtractor.videosFromUrl(url, prefix = "$language Filemoon:") arrayOf("vidhide", "vid.").any(url) -> vidHideExtractor.videosFromUrl(url, videoNameGen = { "$language VidHide:$it" }) arrayOf("wishembed", "streamwish", "strwish", "wish", "jwplayerhls").any(url) -> streamWishExtractor.videosFromUrl(url, videoNameGen = { "$language StreamWish:$it" }) - arrayOf("fembedder").any(url) -> { - val webViewResult = webViewResolver.getUrl(url, headers) - if (webViewResult.isBlank()) { - return emptyList() - } - return if (webViewResult.contains("m3u8")) { - playlistUtils.extractFromHls(webViewResult) - } else { - listOf(Video(url, "Default", url)) - } - } else -> emptyList() } } diff --git a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/MegaflixUrlActivity.kt b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/MegaflixUrlActivity.kt index cec9a93d..f3f5edff 100644 --- a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/MegaflixUrlActivity.kt +++ b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/MegaflixUrlActivity.kt @@ -8,7 +8,7 @@ import android.util.Log import kotlin.system.exitProcess /** - * Springboard that accepts https://megaflix.ac// intents + * Springboard that accepts https://megaflix.co// intents * and redirects them to the main Aniyomi process. */ class MegaflixUrlActivity : Activity() { diff --git a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/WebViewResolver.kt b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/WebViewResolver.kt deleted file mode 100644 index a1c377b0..00000000 --- a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/WebViewResolver.kt +++ /dev/null @@ -1,69 +0,0 @@ -package eu.kanade.tachiyomi.animeextension.pt.megaflix - -import android.annotation.SuppressLint -import android.app.Application -import android.os.Handler -import android.os.Looper -import android.webkit.WebResourceRequest -import android.webkit.WebResourceResponse -import android.webkit.WebView -import android.webkit.WebViewClient -import okhttp3.Headers -import uy.kohesive.injekt.injectLazy -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit - -class WebViewResolver() { - private val context: Application by injectLazy() - private val handler by lazy { Handler(Looper.getMainLooper()) } - - @SuppressLint("SetJavaScriptEnabled") - fun getUrl(origRequestUrl: String, origRequestheader: Headers): String { - val latch = CountDownLatch(1) - var webView: WebView? = null - var resultUrl = "" - val headers = origRequestheader.toMultimap().mapValues { it.value.getOrNull(0) ?: "" }.toMutableMap() - - handler.post { - val webview = WebView(context) - webView = webview - with(webview.settings) { - javaScriptEnabled = true - domStorageEnabled = true - databaseEnabled = true - useWideViewPort = false - loadWithOverviewMode = false - userAgentString = origRequestheader["User-Agent"] - } - webview.webViewClient = object : WebViewClient() { - override fun shouldInterceptRequest( - view: WebView, - request: WebResourceRequest, - ): WebResourceResponse? { - val url = request.url.toString() - if (VIDEO_REGEX.containsMatchIn(url)) { - resultUrl = url - latch.countDown() - } - return super.shouldInterceptRequest(view, request) - } - } - - webView?.loadUrl(origRequestUrl, headers) - } - - latch.await(TIMEOUT_SEC, TimeUnit.SECONDS) - - handler.post { - webView?.stopLoading() - webView?.destroy() - webView = null - } - return resultUrl - } - - companion object { - const val TIMEOUT_SEC: Long = 20 - private val VIDEO_REGEX by lazy { Regex("\\.(mp4|m3u8)") } - } -} diff --git a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/extractors/MegaflixExtractor.kt b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/extractors/MegaflixExtractor.kt index 849511d8..a7a4e96e 100644 --- a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/extractors/MegaflixExtractor.kt +++ b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/extractors/MegaflixExtractor.kt @@ -21,7 +21,7 @@ class MegaflixExtractor(private val client: OkHttpClient, private val headers: H return playlistUtils.extractFromHls( playlistUrl, - "https://megaflix.ac", + "https://megaflix.co", videoNameGen = { "Megaflix($lang) - $it" }, ) } diff --git a/src/pt/pobreflix/build.gradle b/src/pt/pobreflix/build.gradle index dc3a63cd..ec1d8eb7 100644 --- a/src/pt/pobreflix/build.gradle +++ b/src/pt/pobreflix/build.gradle @@ -2,8 +2,8 @@ ext { extName = 'Pobreflix' extClass = '.Pobreflix' themePkg = 'dooplay' - baseUrl = 'https://pobreflix.global' - overrideVersionCode = 13 + baseUrl = 'https://pobreflix1.art' + overrideVersionCode = 10 isNsfw = true } @@ -11,7 +11,6 @@ apply from: "$rootDir/common.gradle" dependencies { implementation(project(":lib:filemoon-extractor")) - implementation(project(":lib:fireplayer-extractor")) implementation(project(":lib:streamwish-extractor")) implementation(project(":lib:streamtape-extractor")) implementation(project(":lib:playlist-utils")) diff --git a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/Pobreflix.kt b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/Pobreflix.kt index c1159018..30783608 100644 --- a/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/Pobreflix.kt +++ b/src/pt/pobreflix/src/eu/kanade/tachiyomi/animeextension/pt/pobreflix/Pobreflix.kt @@ -1,25 +1,23 @@ package eu.kanade.tachiyomi.animeextension.pt.pobreflix import android.util.Base64 +import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.FireplayerExtractor import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.MyStreamExtractor -import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.PlayerFlixExtractor import eu.kanade.tachiyomi.animeextension.pt.pobreflix.extractors.SuperFlixExtractor import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor -import eu.kanade.tachiyomi.lib.fireplayerextractor.FireplayerExtractor import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor import eu.kanade.tachiyomi.lib.streamwishextractor.StreamWishExtractor import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.util.asJsoup -import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Response class Pobreflix : DooPlay( "pt-BR", "Pobreflix", - "https://pobreflix.global", + "https://pobreflix1.art", ) { // ============================== Popular =============================== override fun popularAnimeSelector() = "div.featured div.poster" @@ -28,52 +26,53 @@ class Pobreflix : DooPlay( override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/series/page/$page/", headers) // ============================ Video Links ============================= - private val fireplayerExtractor by lazy { FireplayerExtractor(client) } + private val embedplayerExtractor by lazy { FireplayerExtractor(client) } + private val brbeastExtractor by lazy { FireplayerExtractor(client, "https://brbeast.com") } + private val superembedsExtractor by lazy { FireplayerExtractor(client, "https://superembeds.com/") } private val filemoonExtractor by lazy { FilemoonExtractor(client) } private val mystreamExtractor by lazy { MyStreamExtractor(client, headers) } private val streamtapeExtractor by lazy { StreamTapeExtractor(client) } private val streamwishExtractor by lazy { StreamWishExtractor(client, headers) } - private val playerflixExtractor by lazy { PlayerFlixExtractor(client, headers, ::genericExtractor) } private val superflixExtractor by lazy { SuperFlixExtractor(client, headers, ::genericExtractor) } private val supercdnExtractor by lazy { SuperFlixExtractor(client, headers, ::genericExtractor, "https://supercdn.org") } override fun videoListParse(response: Response): List