fix(tr/hdfilmcehennemi): Update baseUrl + add another extractor (#2490)

This commit is contained in:
Claudemirovsky 2023-11-10 05:59:20 -03:00 committed by GitHub
parent b1cd92ca4e
commit 3b482c19db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 74 additions and 8 deletions

View File

@ -13,7 +13,7 @@
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="www.hdfilmcehennemi.life"
android:host="www.hdfilmcehennemi.de"
android:pathPattern="/..*"
android:scheme="https" />
</intent-filter>

View File

@ -8,7 +8,7 @@ ext {
extName = 'HDFilmCehennemi'
pkgNameSuffix = 'tr.hdfilmcehennemi'
extClass = '.HDFilmCehennemi'
extVersionCode = 3
extVersionCode = 4
libVersion = '13'
containsNsfw = true
}

View File

@ -5,6 +5,7 @@ import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.tr.hdfilmcehennemi.extractors.RapidrameExtractor
import eu.kanade.tachiyomi.animeextension.tr.hdfilmcehennemi.extractors.VidmolyExtractor
import eu.kanade.tachiyomi.animeextension.tr.hdfilmcehennemi.extractors.XBetExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
import eu.kanade.tachiyomi.animesource.model.AnimesPage
@ -37,7 +38,7 @@ class HDFilmCehennemi : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val name = "HDFilmCehennemi"
override val baseUrl = "https://www.hdfilmcehennemi.life"
override val baseUrl = "https://www.hdfilmcehennemi.de"
override val lang = "tr"
@ -96,8 +97,6 @@ class HDFilmCehennemi : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
val headers = headersBuilder()
.add("Referer", "$baseUrl/")
.add("Origin", baseUrl)
.add("X-Requested-With", "XMLHttpRequest")
.build()
@ -175,6 +174,7 @@ class HDFilmCehennemi : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// ============================ Video Links =============================
private val vidmolyExtractor by lazy { VidmolyExtractor(client, headers) }
private val rapidrameExtractor by lazy { RapidrameExtractor(client, headers) }
private val xbetExtractor by lazy { XBetExtractor(client, headers, json) }
override fun videoListParse(response: Response): List<Video> {
val doc = response.use { it.asJsoup() }
@ -190,9 +190,10 @@ class HDFilmCehennemi : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
when {
url.contains("vidmoly") -> vidmolyExtractor.videosFromUrl(url)
url.contains("$baseUrl/playerr") -> rapidrameExtractor.videosFromUrl(url)
else -> emptyList<Video>()
url.contains("trstx.org") -> xbetExtractor.videosFromUrl(url)
else -> emptyList()
}
}.getOrNull() ?: emptyList<Video>()
}.getOrNull().orEmpty()
}.flatten().ifEmpty { throw Exception("No videos available xD") }
}

View File

@ -8,7 +8,7 @@ import android.util.Log
import kotlin.system.exitProcess
/**
* Springboard that accepts https://www.hdfilmcehennemi.life/<item> intents
* Springboard that accepts https://www.hdfilmcehennemi.de/<item> intents
* and redirects them to the main Aniyomi process.
*/
class HDFilmCehennemiUrlActivity : Activity() {

View File

@ -0,0 +1,65 @@
package eu.kanade.tachiyomi.animeextension.tr.hdfilmcehennemi.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Response
class XBetExtractor(
private val client: OkHttpClient,
private val headers: Headers,
private val json: Json,
) {
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
fun videosFromUrl(url: String): List<Video> {
val doc = client.newCall(GET(url, headers)).execute()
.use { it.asJsoup() }
val script = doc.selectFirst("script:containsData(playerConfigs =)")?.data()
?: return emptyList()
val host = "https://${url.toHttpUrl().host}"
val postPath = script.substringAfter("file\":\"").substringBefore('"')
.replace("\\", "")
val postHeaders = headers.newBuilder()
.set("Referer", url)
.set("Origin", host)
.build()
val postRes = client.newCall(POST(host + postPath, postHeaders)).execute()
.parseAs<List<VideoItemDto>> { it.replace("[],", "") }
return postRes.flatMap { video ->
runCatching {
val playlistUrl = client.newCall(POST(host + video.path, postHeaders)).execute()
.use { it.body.string() }
playlistUtils.extractFromHls(
playlistUrl,
url,
videoNameGen = { "[${video.title}] XBet - $it" },
)
}.getOrElse { emptyList() }
}
}
@Serializable
data class VideoItemDto(val file: String, val title: String) {
val path = "/playlist/${file.removeSuffix("~")}.txt"
}
private inline fun <reified T> Response.parseAs(transform: (String) -> String = { it }): T {
val responseBody = use { transform(it.body.string()) }
return json.decodeFromString(responseBody)
}
}