Skip to content

Commit

Permalink
Add: DatalifeEngine multisrc, Wiflix theme and migrated FrenchAnime
Browse files Browse the repository at this point in the history
  • Loading branch information
hollowshiroyuki committed Sep 23, 2023
1 parent 4e7a213 commit cb5ad3c
Show file tree
Hide file tree
Showing 24 changed files with 303 additions and 406 deletions.
12 changes: 12 additions & 0 deletions multisrc/overrides/datalifeengine/frenchanime/additional.gradle
Original file line number Diff line number Diff line change
@@ -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'))
}
File renamed without changes
119 changes: 119 additions & 0 deletions multisrc/overrides/datalifeengine/frenchanime/src/FrenchAnime.kt
Original file line number Diff line number Diff line change
@@ -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 changes: 11 additions & 0 deletions multisrc/overrides/datalifeengine/wiflix/additional.gradle
Original file line number Diff line number Diff line change
@@ -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'))
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
104 changes: 104 additions & 0 deletions multisrc/overrides/datalifeengine/wiflix/src/Wiflix.kt
Original file line number Diff line number Diff line change
@@ -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")
}
Loading

0 comments on commit cb5ad3c

Please sign in to comment.