feat(fr/franime,frenchanime)): add vidmoly extractor and missing players

This commit is contained in:
Dark25 2024-08-01 22:37:03 +02:00
parent 62f4a7ae48
commit c56e03abca
6 changed files with 90 additions and 16 deletions

View file

@ -0,0 +1,7 @@
plugins {
id("lib-android")
}
dependencies {
implementation(project(":lib:playlist-utils"))
}

View file

@ -0,0 +1,40 @@
package eu.kanade.tachiyomi.lib.vidmolyextractor
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.OkHttpClient
import okhttp3.internal.commonEmptyHeaders
class VidMolyExtractor(private val client: OkHttpClient, headers: Headers = commonEmptyHeaders) {
private val baseUrl = "https://vidmoly.to"
private val playlistUtils by lazy { PlaylistUtils(client) }
private val headers: Headers = headers.newBuilder()
.set("Origin", baseUrl)
.set("Referer", "$baseUrl/")
.build()
private val sourcesRegex = Regex("sources: (.*?]),")
private val urlsRegex = Regex("""file:"(.*?)"""")
fun videosFromUrl(url: String, prefix: String = ""): List<Video> {
val document = client.newCall(
GET(url, headers.newBuilder().set("Sec-Fetch-Dest", "iframe").build())
).execute().asJsoup()
val script = document.selectFirst("script:containsData(sources)")!!.data()
val sources = sourcesRegex.find(script)!!.groupValues[1]
val urls = urlsRegex.findAll(sources).map { it.groupValues[1] }.toList()
return urls.flatMap {
playlistUtils.extractFromHls(it,
videoNameGen = { quality -> "${prefix}VidMoly - $quality" },
masterHeaders = headers,
videoHeaders = headers,
)
}
}
}

View file

@ -1,7 +1,7 @@
ext {
extName = 'FrAnime'
extClass = '.FrAnime'
extVersionCode = 11
extVersionCode = 12
isNsfw = true
}
apply from: "$rootDir/common.gradle"
@ -11,4 +11,5 @@ dependencies {
implementation(project(':lib:vk-extractor'))
implementation(project(':lib:sendvid-extractor'))
implementation(project(':lib:sibnet-extractor'))
implementation(project(':lib:vidmoly-extractor'))
}

View file

@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
import eu.kanade.tachiyomi.lib.sendvidextractor.SendvidExtractor
import eu.kanade.tachiyomi.lib.sibnetextractor.SibnetExtractor
import eu.kanade.tachiyomi.lib.vidmolyextractor.VidMolyExtractor
import eu.kanade.tachiyomi.lib.vkextractor.VkExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.await
@ -123,14 +124,19 @@ class FrAnime : AnimeHttpSource() {
val players = if (episodeLang == "vo") episodeData.languages.vo.players else episodeData.languages.vf.players
val sendvidExtractor by lazy { SendvidExtractor(client, headers) }
val sibnetExtractor by lazy { SibnetExtractor(client) }
val vkExtractor by lazy { VkExtractor(client, headers) }
val vidMolyExtractor by lazy { VidMolyExtractor(client) }
val videos = players.withIndex().parallelCatchingFlatMap { (index, playerName) ->
val apiUrl = "$videoBaseUrl/$episodeLang/$index"
val playerUrl = client.newCall(GET(apiUrl, headers)).await().body.string()
when (playerName) {
"vido" -> listOf(Video(playerUrl, "FRAnime (Vido)", playerUrl))
"sendvid" -> SendvidExtractor(client, headers).videosFromUrl(playerUrl)
"sibnet" -> SibnetExtractor(client).videosFromUrl(playerUrl)
"vk" -> VkExtractor(client, headers).videosFromUrl(playerUrl)
"sendvid" -> sendvidExtractor.videosFromUrl(playerUrl)
"sibnet" -> sibnetExtractor.videosFromUrl(playerUrl)
"vk" -> vkExtractor.videosFromUrl(playerUrl)
"vidmoly" -> vidMolyExtractor.videosFromUrl(playerUrl)
else -> emptyList()
}
}

View file

@ -3,7 +3,7 @@ ext {
extClass = '.FrenchAnime'
themePkg = 'datalifeengine'
baseUrl = 'https://french-anime.com'
overrideVersionCode = 8
overrideVersionCode = 9
}
apply from: "$rootDir/common.gradle"
@ -19,4 +19,6 @@ dependencies {
implementation(project(':lib:sibnet-extractor'))
implementation(project(':lib:okru-extractor'))
implementation(project(':lib:streamhub-extractor'))
implementation(project(':lib:vidmoly-extractor'))
implementation(project(':lib:voe-extractor'))
}

View file

@ -10,7 +10,9 @@ import eu.kanade.tachiyomi.lib.streamhubextractor.StreamHubExtractor
import eu.kanade.tachiyomi.lib.streamvidextractor.StreamVidExtractor
import eu.kanade.tachiyomi.lib.upstreamextractor.UpstreamExtractor
import eu.kanade.tachiyomi.lib.uqloadextractor.UqloadExtractor
import eu.kanade.tachiyomi.lib.vidmolyextractor.VidMolyExtractor
import eu.kanade.tachiyomi.lib.vidoextractor.VidoExtractor
import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor
import eu.kanade.tachiyomi.lib.vudeoextractor.VudeoExtractor
import eu.kanade.tachiyomi.multisrc.datalifeengine.DataLifeEngine
import eu.kanade.tachiyomi.network.GET
@ -86,21 +88,37 @@ class FrenchAnime : DataLifeEngine(
override fun episodeFromElement(element: Element): SEpisode = throw UnsupportedOperationException()
// ============================ Video Links =============================
private val doodExtractor by lazy { DoodExtractor(client) }
private val upstreamExtractor by lazy { UpstreamExtractor(client) }
private val vudeoExtractor by lazy { VudeoExtractor(client) }
private val uqloadExtractor by lazy { UqloadExtractor(client) }
private val streamHideVidExtractor by lazy { StreamHideVidExtractor(client) }
private val streamVidExtractor by lazy { StreamVidExtractor(client) }
private val vidoExtractor by lazy { VidoExtractor(client) }
private val sibnetExtractor by lazy { SibnetExtractor(client) }
private val okruExtractor by lazy { OkruExtractor(client) }
private val streamHubExtractor by lazy { StreamHubExtractor(client) }
private val vidmolyExtractor by lazy { VidMolyExtractor(client) }
private val voeExtractor by lazy { VoeExtractor(client) }
override suspend fun getVideoList(episode: SEpisode): List<Video> {
val list = episode.url.split(",").filter { it.isNotBlank() }.parallelCatchingFlatMap {
with(it) {
when {
contains("dood") -> DoodExtractor(client).videosFromUrl(this)
contains("upstream") -> UpstreamExtractor(client).videosFromUrl(this)
contains("vudeo") -> VudeoExtractor(client).videosFromUrl(this)
contains("uqload") -> UqloadExtractor(client).videosFromUrl(this)
contains("dood") ||
contains("d0000d") -> doodExtractor.videosFromUrl(this)
contains("upstream") -> upstreamExtractor.videosFromUrl(this)
contains("vudeo") -> vudeoExtractor.videosFromUrl(this)
contains("uqload") -> uqloadExtractor.videosFromUrl(this)
contains("guccihide") ||
contains("streamhide") -> StreamHideVidExtractor(client).videosFromUrl(this)
contains("streamvid") -> StreamVidExtractor(client).videosFromUrl(this)
contains("vido") -> VidoExtractor(client).videosFromUrl(this)
contains("sibnet") -> SibnetExtractor(client).videosFromUrl(this)
contains("ok.ru") -> OkruExtractor(client).videosFromUrl(this)
contains("streamhub.gg") -> StreamHubExtractor(client).videosFromUrl(this)
contains("streamhide") -> streamHideVidExtractor.videosFromUrl(this)
contains("streamvid") -> streamVidExtractor.videosFromUrl(this)
contains("vido") -> vidoExtractor.videosFromUrl(this)
contains("sibnet") -> sibnetExtractor.videosFromUrl(this)
contains("ok.ru") -> okruExtractor.videosFromUrl(this)
contains("streamhub.gg") -> streamHubExtractor.videosFromUrl(this)
contains("vidmoly") -> vidmolyExtractor.videosFromUrl(this)
contains("voe.sx") -> voeExtractor.videosFromUrl(this)
else -> emptyList()
}
}