feat(pt/darkmahou): New Source: DarkMahou (Torrent) (#441)

This commit is contained in:
WebDitto 2024-12-19 21:08:52 -03:00 committed by GitHub
parent ce2611d1bd
commit 715d57d43f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 116 additions and 0 deletions

View file

@ -0,0 +1,14 @@
ext {
extName = 'DarkMahou'
extClass = '.DarkMahou'
themePkg = 'animestream'
baseUrl = 'https://darkmahou.org'
overrideVersionCode = 1
}
apply from: "$rootDir/common.gradle"
dependencies {
implementation(project(":lib:unpacker"))
implementation(project(":lib:playlist-utils"))
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View file

@ -0,0 +1,69 @@
package eu.kanade.tachiyomi.animeextension.pt.darkmahou
import android.util.Log
import eu.kanade.tachiyomi.animeextension.pt.darkmahou.extractors.DarkMahouExtractor
import eu.kanade.tachiyomi.animesource.model.SAnime
import eu.kanade.tachiyomi.animesource.model.SEpisode
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.multisrc.animestream.AnimeStream
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Response
import org.jsoup.nodes.Element
class DarkMahou : AnimeStream(
"pt-BR",
"DarkMahou (Torrent)",
"https://darkmahou.org",
) {
override fun headersBuilder() = super.headersBuilder().add("Referer", baseUrl)
override val animeListUrl = "$baseUrl/animes"
// =============================== Search ===============================
override fun searchAnimeFromElement(element: Element): SAnime {
return SAnime.create().apply {
setUrlWithoutDomain(element.attr("abs:href"))
title = element.selectFirst("div.tt span.ntitle")!!.ownText()
thumbnail_url = element.selectFirst("img")?.getImageUrl()
}
}
// ============================== Filters ===============================
override val fetchFilters = false
override val filtersSelector = "form.filters > div.filter > ul"
// ============================== Episodes ==============================
override fun episodeListSelector() = "div.mctnx div.soraddl"
override fun episodeListParse(response: Response): List<SEpisode> {
return super.episodeListParse(response).reversed()
}
override fun episodeFromElement(element: Element): SEpisode {
return SEpisode.create().apply {
element.selectFirst(".sorattl h3")!!.text().let {
name = it
episode_number = it.substringAfterLast(" ").toFloatOrNull() ?: 0F
setUrlWithoutDomain(
element.ownerDocument()!!.location()
.toHttpUrl()
.newBuilder()
.fragment(it)
.toString(),
)
}
}
}
// ============================ Video Links =============================
override val prefQualityValues = arrayOf("1080p", "720p", "480p", "360p", "240p")
override val prefQualityEntries = prefQualityValues
private val darkmahouExtractor by lazy { DarkMahouExtractor(client, headers) }
override suspend fun getVideoList(episode: SEpisode): List<Video> {
Log.i(name, "getVideoList -> URL => ${episode.url} || Name => ${episode.name}")
return darkmahouExtractor.videosFromUrl(episode.url)
}
}

View file

@ -0,0 +1,33 @@
package eu.kanade.tachiyomi.animeextension.pt.darkmahou.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
class DarkMahouExtractor(private val client: OkHttpClient, private val headers: Headers) {
fun videosFromUrl(url: String): List<Video> {
val doc = client.newCall(GET(url, headers)).execute().asJsoup()
val fragment = url.toHttpUrl().fragment
val soraurls = doc.select("div.mctnx div.soraddl .sorattl h3").find {
it.text() == fragment
}?.closest(".soraddl")?.select(".soraurl") ?: return emptyList()
return soraurls.flatMap {
val prefix = if (it.text().lowercase().contains("dublado")) {
"Dublado"
} else {
"Legendado"
}
it.select(".slink a").map {
val videoUrl = it.attr("href")
val quality = it.text().trim()
Video(videoUrl, "$prefix - $quality", videoUrl)
}
}
}
}