refactor: Move some extractor to libraries for datalife engine multisrc (#2246)
@ -0,0 +1,12 @@
|
||||
dependencies {
|
||||
implementation(project(':lib-dood-extractor'))
|
||||
implementation(project(':lib-vido-extractor'))
|
||||
implementation(project(':lib-uqload-extractor'))
|
||||
implementation(project(':lib-vudeo-extractor'))
|
||||
implementation(project(':lib-streamhidevid-extractor'))
|
||||
implementation(project(':lib-upstream-extractor'))
|
||||
implementation(project(':lib-streamvid-extractor'))
|
||||
implementation(project(':lib-sibnet-extractor'))
|
||||
implementation(project(':lib-okru-extractor'))
|
||||
implementation(project(':lib-streamhub-extractor'))
|
||||
}
|
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 77 KiB |
119
multisrc/overrides/datalifeengine/frenchanime/src/FrenchAnime.kt
Normal file
@ -0,0 +1,119 @@
|
||||
package eu.kanade.tachiyomi.animeextension.fr.frenchanime
|
||||
|
||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||
import eu.kanade.tachiyomi.animesource.model.Video
|
||||
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
||||
import eu.kanade.tachiyomi.lib.sibnetextractor.SibnetExtractor
|
||||
import eu.kanade.tachiyomi.lib.streamhidevidextractor.StreamHideVidExtractor
|
||||
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.vidoextractor.VidoExtractor
|
||||
import eu.kanade.tachiyomi.lib.vudeoextractor.VudeoExtractor
|
||||
import eu.kanade.tachiyomi.multisrc.datalifeengine.DataLifeEngine
|
||||
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
|
||||
import rx.Observable
|
||||
import java.lang.Exception
|
||||
|
||||
class FrenchAnime : DataLifeEngine(
|
||||
"French Anime",
|
||||
"https://french-anime.com",
|
||||
"fr",
|
||||
) {
|
||||
|
||||
override val categories = arrayOf(
|
||||
Pair("<Sélectionner>", ""),
|
||||
Pair("Animes VF", "/animes-vf/"),
|
||||
Pair("Animes VOSTFR", "/animes-vostfr/"),
|
||||
Pair("Films VF et VOSTFR", "/films-vf-vostfr/"),
|
||||
)
|
||||
|
||||
override val genres = arrayOf(
|
||||
Pair("<Sélectionner>", ""),
|
||||
Pair("Action", "/genre/action/"),
|
||||
Pair("Aventure", "/genre/aventure/"),
|
||||
Pair("Arts martiaux", "/genre/arts-martiaux/"),
|
||||
Pair("Combat", "/genre/combat/"),
|
||||
Pair("Comédie", "/genre/comedie/"),
|
||||
Pair("Drame", "/genre/drame/"),
|
||||
Pair("Epouvante", "/genre/epouvante/"),
|
||||
Pair("Fantastique", "/genre/fantastique/"),
|
||||
Pair("Fantasy", "/genre/fantasy/"),
|
||||
Pair("Mystère", "/genre/mystere/"),
|
||||
Pair("Romance", "/genre/romance/"),
|
||||
Pair("Shonen", "/genre/shonen/"),
|
||||
Pair("Surnaturel", "/genre/surnaturel/"),
|
||||
Pair("Sci-Fi", "/genre/sci-fi/"),
|
||||
Pair("School life", "/genre/school-life/"),
|
||||
Pair("Ninja", "/genre/ninja/"),
|
||||
Pair("Seinen", "/genre/seinen/"),
|
||||
Pair("Horreur", "/genre/horreur/"),
|
||||
Pair("Tranche de vie", "/genre/tranchedevie/"),
|
||||
Pair("Psychologique", "/genre/psychologique/"),
|
||||
)
|
||||
|
||||
// ============================== Popular ===============================
|
||||
|
||||
override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/animes-vostfr/page/$page/")
|
||||
|
||||
// ============================== Episodes ==============================
|
||||
|
||||
override fun episodeListParse(response: Response): List<SEpisode> {
|
||||
val document = response.asJsoup()
|
||||
val episodeList = mutableListOf<SEpisode>()
|
||||
|
||||
val epsData = document.selectFirst("div.eps")?.text() ?: return emptyList()
|
||||
epsData.split(" ").filter { it.isNotBlank() }.forEach {
|
||||
val data = it.split("!", limit = 2)
|
||||
val episode = SEpisode.create()
|
||||
episode.episode_number = data[0].toFloatOrNull() ?: 0F
|
||||
episode.name = "Episode ${data[0]}"
|
||||
episode.url = data[1]
|
||||
episodeList.add(episode)
|
||||
}
|
||||
|
||||
return episodeList.reversed()
|
||||
}
|
||||
|
||||
override fun episodeListSelector(): String = throw Exception("not used")
|
||||
|
||||
override fun episodeFromElement(element: Element): SEpisode = throw Exception("not used")
|
||||
|
||||
// ============================ Video Links =============================
|
||||
|
||||
override fun fetchVideoList(episode: SEpisode): Observable<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("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)
|
||||
else -> emptyList()
|
||||
}
|
||||
}
|
||||
}.sort()
|
||||
if (list.isEmpty()) throw Exception("no player found")
|
||||
return Observable.just(list)
|
||||
}
|
||||
|
||||
override fun videoFromElement(element: Element): Video = throw Exception("Not Used")
|
||||
|
||||
override fun videoListSelector(): String = throw Exception("Not Used")
|
||||
|
||||
override fun videoUrlParse(document: Document): String = throw Exception("Not Used")
|
||||
}
|
11
multisrc/overrides/datalifeengine/wiflix/additional.gradle
Normal file
@ -0,0 +1,11 @@
|
||||
dependencies {
|
||||
implementation(project(':lib-dood-extractor'))
|
||||
implementation(project(':lib-vido-extractor'))
|
||||
implementation(project(':lib-uqload-extractor'))
|
||||
implementation(project(':lib-streamdav-extractor'))
|
||||
// ? implementation(project(':lib-waaw1-extractor'))
|
||||
implementation(project(':lib-vudeo-extractor'))
|
||||
implementation(project(':lib-streamhidevid-extractor'))
|
||||
implementation(project(':lib-upstream-extractor'))
|
||||
implementation(project(':lib-voe-extractor'))
|
||||
}
|
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 15 KiB |
BIN
multisrc/overrides/datalifeengine/wiflix/res/web_hi_res_512.png
Normal file
After Width: | Height: | Size: 71 KiB |
104
multisrc/overrides/datalifeengine/wiflix/src/Wiflix.kt
Normal file
@ -0,0 +1,104 @@
|
||||
package eu.kanade.tachiyomi.animeextension.fr.wiflix
|
||||
|
||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||
import eu.kanade.tachiyomi.animesource.model.Video
|
||||
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
||||
import eu.kanade.tachiyomi.lib.streamdavextractor.StreamDavExtractor
|
||||
import eu.kanade.tachiyomi.lib.streamhidevidextractor.StreamHideVidExtractor
|
||||
import eu.kanade.tachiyomi.lib.upstreamextractor.UpstreamExtractor
|
||||
import eu.kanade.tachiyomi.lib.uqloadextractor.UqloadExtractor
|
||||
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
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.nodes.Element
|
||||
import rx.Observable
|
||||
|
||||
class Wiflix : DataLifeEngine(
|
||||
"Wiflix",
|
||||
"https://wiflix.voto",
|
||||
"fr",
|
||||
) {
|
||||
|
||||
override val categories = arrayOf(
|
||||
Pair("<Sélectionner>", ""),
|
||||
Pair("Séries", "/serie-en-streaming/"),
|
||||
Pair("Films", "/film-en-streaming/"),
|
||||
)
|
||||
|
||||
override val genres = arrayOf(
|
||||
Pair("<Sélectionner>", ""),
|
||||
Pair("Action", "/film-en-streaming/action/"),
|
||||
Pair("Animation", "/film-en-streaming/animation/"),
|
||||
Pair("Arts Martiaux", "/film-en-streaming/arts-martiaux/"),
|
||||
Pair("Aventure", "/film-en-streaming/aventure/"),
|
||||
Pair("Biopic", "/film-en-streaming/biopic/"),
|
||||
Pair("Comédie", "/film-en-streaming/comedie/"),
|
||||
Pair("Comédie Dramatique", "/film-en-streaming/comedie-dramatique/"),
|
||||
Pair("Épouvante Horreur", "/film-en-streaming/horreur/"),
|
||||
Pair("Drame", "/film-en-streaming/drame/"),
|
||||
Pair("Documentaire", "/film-en-streaming/documentaire/"),
|
||||
Pair("Espionnage", "/film-en-streaming/espionnage/"),
|
||||
Pair("Famille", "/film-en-streaming/famille/"),
|
||||
Pair("Fantastique", "/film-en-streaming/fantastique/"),
|
||||
Pair("Guerre", "/film-en-streaming/guerre/"),
|
||||
Pair("Historique", "/film-en-streaming/historique/"),
|
||||
Pair("Musical", "/film-en-streaming/musical/"),
|
||||
Pair("Policier", "/film-en-streaming/policier/"),
|
||||
Pair("Romance", "/film-en-streaming/romance/"),
|
||||
Pair("Science-Fiction", "/film-en-streaming/science-fiction/"),
|
||||
Pair("Spectacles", "/film-en-streaming/spectacles/"),
|
||||
Pair("Thriller", "/film-en-streaming/thriller/"),
|
||||
Pair("Western", "/film-en-streaming/western/"),
|
||||
)
|
||||
|
||||
// ============================== Popular ===============================
|
||||
|
||||
override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/serie-en-streaming/page/$page/")
|
||||
|
||||
// ============================== Episodes ==============================
|
||||
|
||||
override fun episodeListSelector(): String = ".hostsblock div:has(a[href*=https])"
|
||||
|
||||
override fun episodeListParse(response: Response): List<SEpisode> = super.episodeListParse(response).sort()
|
||||
|
||||
override fun episodeFromElement(element: Element): SEpisode = SEpisode.create().apply {
|
||||
episode_number = element.className().filter { it.isDigit() }.toFloat()
|
||||
name = "Episode ${episode_number.toInt()}"
|
||||
scanlator = if (element.className().contains("vf")) "VF" else "VOSTFR"
|
||||
url = element.select("a").joinToString(",") { it.attr("href").removePrefix("/vd.php?u=") }
|
||||
}
|
||||
|
||||
// ============================ Video Links =============================
|
||||
|
||||
override fun fetchVideoList(episode: SEpisode): Observable<List<Video>> {
|
||||
val list = episode.url.split(",").filter { it.isNotBlank() }.parallelCatchingFlatMap {
|
||||
with(it) {
|
||||
when {
|
||||
contains("doods.pro") -> DoodExtractor(client).videosFromUrl(this)
|
||||
contains("vido.lol") -> VidoExtractor(client).videosFromUrl(this)
|
||||
contains("uqload.co") -> UqloadExtractor(client).videosFromUrl(this)
|
||||
contains("waaw1.tv") -> emptyList()
|
||||
contains("vudeo.co") -> VudeoExtractor(client).videosFromUrl(this)
|
||||
contains("streamvid.net") -> StreamHideVidExtractor(client).videosFromUrl(this)
|
||||
contains("upstream.to") -> UpstreamExtractor(client).videosFromUrl(this)
|
||||
contains("streamdav.com") -> StreamDavExtractor(client).videosFromUrl(this)
|
||||
contains("voe.sx") -> listOfNotNull(VoeExtractor(client).videoFromUrl(this))
|
||||
else -> emptyList()
|
||||
}
|
||||
}
|
||||
}.sort()
|
||||
if (list.isEmpty()) throw Exception("no player found")
|
||||
return Observable.just(list)
|
||||
}
|
||||
|
||||
override fun videoFromElement(element: Element): Video = throw Exception("Not Used")
|
||||
|
||||
override fun videoListSelector(): String = throw Exception("Not Used")
|
||||
|
||||
override fun videoUrlParse(document: Document): String = throw Exception("Not Used")
|
||||
}
|