feat(es/AnimeOnlineNinja): Use filemoon extractor + some fixes (#2046)

This commit is contained in:
Claudemirovsky 2023-08-14 18:09:48 -03:00 committed by GitHub
parent 581c577c73
commit bed46c03e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 11 deletions

View File

@ -18,11 +18,12 @@ class FilemoonExtractor(private val client: OkHttpClient) {
fun videosFromUrl(url: String, prefix: String = "Filemoon - ", headers: Headers? = null): List<Video> { fun videosFromUrl(url: String, prefix: String = "Filemoon - ", headers: Headers? = null): List<Video> {
return runCatching { return runCatching {
val doc = client.newCall(GET(url)).execute().asJsoup() val doc = client.newCall(GET(url)).execute().asJsoup()
val jsEval = doc.selectFirst("script:containsData(eval)")!!.data() val jsEval = doc.selectFirst("script:containsData(eval):containsData(m3u8)")!!.data()
val unpacked = JsUnpacker.unpackAndCombine(jsEval).orEmpty() val unpacked = JsUnpacker.unpackAndCombine(jsEval).orEmpty()
val masterUrl = unpacked.takeIf(String::isNotBlank) val masterUrl = unpacked.takeIf(String::isNotBlank)
?.substringAfter("{file:\"") ?.substringAfter("{file:\"", "")
?.substringBefore("\"}") ?.substringBefore("\"}", "")
?.takeIf(String::isNotBlank)
?: return emptyList() ?: return emptyList()
val masterPlaylist = client.newCall(GET(masterUrl)).execute().body.string() val masterPlaylist = client.newCall(GET(masterUrl)).execute().body.string()

View File

@ -1,5 +1,6 @@
dependencies { dependencies {
implementation(project(':lib-streamtape-extractor')) implementation(project(':lib-streamtape-extractor'))
implementation(project(':lib-dood-extractor')) implementation(project(':lib-dood-extractor'))
implementation(project(':lib-filemoon-extractor'))
implementation(project(':lib-mixdrop-extractor')) implementation(project(':lib-mixdrop-extractor'))
} }

View File

@ -7,6 +7,7 @@ import eu.kanade.tachiyomi.animeextension.es.animeonlineninja.extractors.UploadE
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor
import eu.kanade.tachiyomi.lib.mixdropextractor.MixDropExtractor import eu.kanade.tachiyomi.lib.mixdropextractor.MixDropExtractor
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay
@ -21,7 +22,7 @@ import uy.kohesive.injekt.api.get
class AnimeOnlineNinja : DooPlay( class AnimeOnlineNinja : DooPlay(
"es", "es",
"AnimeOnline.Ninja", "AnimeOnline.Ninja",
"https://www1.animeonline.ninja", "https://ww3.animeonline.ninja",
) { ) {
override val client by lazy { override val client by lazy {
if (preferences.getBoolean(PREF_VRF_INTERCEPT_KEY, PREF_VRF_INTERCEPT_DEFAULT)) { if (preferences.getBoolean(PREF_VRF_INTERCEPT_KEY, PREF_VRF_INTERCEPT_DEFAULT)) {
@ -109,20 +110,28 @@ class AnimeOnlineNinja : DooPlay(
} }
} }
private val filemoonExtractor by lazy { FilemoonExtractor(client) }
private val doodExtractor by lazy { DoodExtractor(client) }
private val streamTapeExtractor by lazy { StreamTapeExtractor(client) }
private val mixDropExtractor by lazy { MixDropExtractor(client) }
private val uqloadExtractor by lazy { UploadExtractor(client) }
private fun extractVideos(url: String, lang: String): List<Video> { private fun extractVideos(url: String, lang: String): List<Video> {
return when { return when {
"saidochesto.top" in url || "MULTISERVER" in lang.uppercase() -> "saidochesto.top" in url || "MULTISERVER" in lang.uppercase() ->
extractFromMulti(url) extractFromMulti(url)
"filemoon" in url ->
filemoonExtractor.videosFromUrl(url, "$lang Filemoon - ", headers)
"dood" in url -> "dood" in url ->
DoodExtractor(client).videoFromUrl(url, "$lang DoodStream", false) doodExtractor.videoFromUrl(url, "$lang DoodStream", false)
?.let(::listOf) ?.let(::listOf)
"streamtape" in url -> "streamtape" in url ->
StreamTapeExtractor(client).videoFromUrl(url, "$lang StreamTape") streamTapeExtractor.videoFromUrl(url, "$lang StreamTape")
?.let(::listOf) ?.let(::listOf)
"mixdrop" in url -> "mixdrop" in url ->
MixDropExtractor(client).videoFromUrl(url, lang) mixDropExtractor.videoFromUrl(url, lang)
"uqload" in url -> "uqload" in url ->
UploadExtractor(client).videoFromUrl(url, headers, lang) uqloadExtractor.videoFromUrl(url, headers, lang)
?.let(::listOf) ?.let(::listOf)
"wolfstream" in url -> { "wolfstream" in url -> {
client.newCall(GET(url, headers)).execute() client.newCall(GET(url, headers)).execute()

View File

@ -121,8 +121,10 @@ abstract class DooPlay(
protected open fun getSeasonEpisodes(season: Element): List<SEpisode> { protected open fun getSeasonEpisodes(season: Element): List<SEpisode> {
val seasonName = season.selectFirst("span.se-t")!!.text() val seasonName = season.selectFirst("span.se-t")!!.text()
return season.select(episodeListSelector()).map { element -> return season.select(episodeListSelector()).mapNotNull { element ->
runCatching {
episodeFromElement(element, seasonName) episodeFromElement(element, seasonName)
}.onFailure { it.printStackTrace() }.getOrNull()
} }
} }

View File

@ -12,7 +12,7 @@ class DooPlayGenerator : ThemeSourceGenerator {
override val sources = listOf( override val sources = listOf(
SingleLang("AnimeOnline360", "https://animeonline360.me", "en", isNsfw = false), SingleLang("AnimeOnline360", "https://animeonline360.me", "en", isNsfw = false),
SingleLang("AnimeOnline.Ninja", "https://www1.animeonline.ninja", "es", className = "AnimeOnlineNinja", isNsfw = false, overrideVersionCode = 29), SingleLang("AnimeOnline.Ninja", "https://ww3.animeonline.ninja", "es", className = "AnimeOnlineNinja", isNsfw = false, overrideVersionCode = 30),
SingleLang("AnimePlayer", "https://animeplayer.com.br", "pt-BR", isNsfw = true, overrideVersionCode = 1), SingleLang("AnimePlayer", "https://animeplayer.com.br", "pt-BR", isNsfw = true, overrideVersionCode = 1),
SingleLang("AnimePlayer", "https://animeplayer.com.br", "pt-BR", isNsfw = true), SingleLang("AnimePlayer", "https://animeplayer.com.br", "pt-BR", isNsfw = true),
SingleLang("AnimeSync", "https://animesync.org", "pt-BR", isNsfw = true), SingleLang("AnimeSync", "https://animesync.org", "pt-BR", isNsfw = true),