Skip to content

Commit

Permalink
Mass update 2
Browse files Browse the repository at this point in the history
  • Loading branch information
adly98 committed Sep 10, 2024
1 parent cff17e0 commit 683039a
Show file tree
Hide file tree
Showing 41 changed files with 537 additions and 275 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class GoogleDriveEpisodes(private val client: OkHttpClient, private val headers:
).execute().asJsoup()
if (driveDocument.selectFirst("title:contains(Error 404 \\(Not found\\))") != null) return

val keyScript = driveDocument.select("script").first { script ->
val keyScript = drivescript").first { script ->
KEY_REGEX.find(script.data()) != null
}.data()
val key = KEY_REGEX.find(keyScript)?.groupValues?.get(1) ?: ""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import eu.kanade.tachiyomi.network.GET
import kotlinx.serialization.json.Json
import okhttp3.Headers
import okhttp3.OkHttpClient
import kotlin.math.abs

class MultiServers(private val client: OkHttpClient, private val headers: Headers) {
private val json = Json { ignoreUnknownKeys = true }
Expand All @@ -22,7 +23,7 @@ class MultiServers(private val client: OkHttpClient, private val headers: Header
if (type == "mirror") {
val resolved = json.decodeFromString<IframeResponse>(iframe)
resolved.props.streams.data.forEach {
val quality = it.resolution.substringAfter("x") + "p"
val quality = it.resolution.substringAfter("x").let(::stnQuality)
val size = it.size.let(::convertSize)
it.mirrors.forEach { mirror ->
val link = if (mirror.link.startsWith("/")) "https:${mirror.link}" else mirror.link
Expand All @@ -40,6 +41,12 @@ class MultiServers(private val client: OkHttpClient, private val headers: Header
}

data class Provider(val url: String, val name: String, val quality: String, val size: String)
private fun stnQuality(quality: String): String {
val intQuality = quality.toInt()
val standardQualities = listOf(144, 240, 360, 480, 720, 1080)
val result = standardQualities.minByOrNull { abs(it - intQuality) } ?: quality
return "${result}p"
}
private fun convertSize(bits: Long): String {
val bytes = bits / 8
return when {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.OkHttpClient
import kotlin.math.abs

class OkruExtractor(private val client: OkHttpClient) {
private val playlistUtils by lazy { PlaylistUtils(client) }
Expand All @@ -20,9 +21,14 @@ class OkruExtractor(private val client: OkHttpClient) {
Pair("lowest", "240p"),
Pair("mobile", "144p"),
)
return qualities.find { it.first == quality }?.second ?: quality
return qualities.find { it.first == quality }?.second ?: quality.filter(Char::isDigit).let(::stnQuality)
}
private fun stnQuality(quality: String): String {
val intQuality = quality.toInt()
val standardQualities = listOf(144, 240, 360, 480, 720, 1080)
val result = standardQualities.minByOrNull { abs(it - intQuality) } ?: quality
return "${result}p"
}

fun videosFromUrl(url: String, prefix: String = "", fixQualities: Boolean = true): List<Video> {
val document = client.newCall(GET(url)).execute().asJsoup()
val videoString = document.selectFirst("div[data-options]")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.internal.commonEmptyHeaders
import kotlin.math.abs

class PlaylistUtils(private val client: OkHttpClient, private val headers: Headers = commonEmptyHeaders) {

Expand Down Expand Up @@ -129,7 +130,7 @@ class PlaylistUtils(private val client: OkHttpClient, private val headers: Heade
val resolution = it.substringAfter("RESOLUTION=")
.substringBefore("\n")
.substringAfter("x")
.substringBefore(",") + "p"
.substringBefore(",").let(::stnQuality)

val videoUrl = it.substringAfter("\n").substringBefore("\n").let { url ->
getAbsoluteUrl(url, playlistUrl, masterUrlBasePath)?.trimEnd()
Expand Down Expand Up @@ -328,6 +329,13 @@ class PlaylistUtils(private val client: OkHttpClient, private val headers: Heade

// ============================= Utilities ==============================

private fun stnQuality(quality: String): String {
val intQuality = quality.toInt()
val standardQualities = listOf(144, 240, 360, 480, 720, 1080)
val result = standardQualities.minByOrNull { abs(it - intQuality) } ?: quality
return "${result}p"
}

companion object {
private const val PLAYLIST_SEPARATOR = "#EXT-X-STREAM-INF:"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,19 @@ import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.OkHttpClient
import java.util.Locale

class StreamWishExtractor(private val client: OkHttpClient, private val headers: Headers) {
private val playlistUtils by lazy { PlaylistUtils(client, headers) }

fun videosFromUrl(url: String, prefix: String) = videosFromUrl(url) { "$prefix - $it" }
fun videosFromUrl(url: String, prefix: String) = videosFromUrl(url) { "${prefix.proper()}: $it" }

fun videosFromUrl(url: String, videoNameGen: (String) -> String = { quality -> "StreamWish - $quality" }): List<Video> {
val doc = client.newCall(GET(url, headers)).execute()
.asJsoup()
private fun String.proper(): String {
return this.replaceFirstChar { if (it.isLowerCase()) it.titlecase(
Locale.getDefault()) else it.toString() }
}
fun videosFromUrl(url: String, videoNameGen: (String) -> String = { quality -> "StreamWish: $quality" }): List<Video> {
val doc = client.newCall(GET(url, headers)).execute().asJsoup()
// Sometimes the script body is packed, sometimes it isn't
val scriptBody = doc.selectFirst("script:containsData(m3u8)")?.data()
?.let { script ->
Expand Down
7 changes: 7 additions & 0 deletions lib/url-resolver/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("lib-android")
}

dependencies {
implementation(project(":lib:playlist-utils"))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package eu.kanade.tachiyomi.lib.universalextractor

import android.annotation.SuppressLint
import android.app.Application
import android.os.Handler
import android.os.Looper
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebView
import android.webkit.WebViewClient
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils
import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import uy.kohesive.injekt.injectLazy
import java.util.Locale
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit

class UrlResolver(private val client: OkHttpClient) {
private val context: Application by injectLazy()
private val handler by lazy { Handler(Looper.getMainLooper()) }
@SuppressLint("SetJavaScriptEnabled")
fun videosFromUrl(origRequestUrl: String, origRequestHeader: Headers, customQuality: String? = null): List<Video> {
val host = origRequestUrl.toHttpUrl().host.substringBefore(".").proper()
val latch = CountDownLatch(1)
var webView: WebView? = null
var resultUrl = ""
val playlistUtils by lazy { PlaylistUtils(client, origRequestHeader) }
val headers = origRequestHeader.toMultimap().mapValues { it.value.getOrNull(0) ?: "" }.toMutableMap()

handler.post {
val newView = WebView(context)
webView = newView
with(newView.settings) {
javaScriptEnabled = true
domStorageEnabled = true
databaseEnabled = true
useWideViewPort = false
loadWithOverviewMode = false
userAgentString = origRequestHeader["User-Agent"]
}
newView.webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(
view: WebView,
request: WebResourceRequest,
): WebResourceResponse? {
val url = request.url.toString()
if (VIDEO_REGEX.containsMatchIn(url)) {
resultUrl = url
latch.countDown()
}
return super.shouldInterceptRequest(view, request)
}
}

webView?.loadUrl(origRequestUrl, headers)
}

latch.await(TIMEOUT_SEC, TimeUnit.SECONDS)

handler.post {
webView?.stopLoading()
webView?.destroy()
webView = null
}
return when {
"m3u8" in resultUrl -> playlistUtils.extractFromHls(resultUrl, origRequestUrl, videoNameGen = { "$host: $it" })
"mpd" in resultUrl -> playlistUtils.extractFromDash(resultUrl, { it -> "$host: $it" }, referer = origRequestUrl)
"mp4" in resultUrl -> Video(resultUrl, "$host: ${customQuality ?: "Mirror"}", resultUrl, origRequestHeader.newBuilder().add("referer", origRequestUrl).build()).let(::listOf)
else -> emptyList()
}
}

private fun String.proper(): String {
return this.replaceFirstChar { if (it.isLowerCase()) it.titlecase(
Locale.getDefault()) else it.toString() }
}

companion object {
const val TIMEOUT_SEC: Long = 20
private val VIDEO_REGEX by lazy { Regex("\\.(mp4|m3u8|mpd)") }
}
}
2 changes: 1 addition & 1 deletion src/ar/anime4up/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
ext {
extName = 'Anime4up'
extClass = '.Anime4Up'
extVersionCode = 62
extVersionCode = 1
}

apply from: "$rootDir/common.gradle"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ class Anime4Up : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
thumbnail_url = absUrl("src")
title = attr("alt") + " (${element.select(".episodes-card-title h3").text()})"
}
setUrlWithoutDomain(element.select(".anime-card-details h3 a").attr("href"))
setUrlWithoutDomain(element.select(".anime-card-poster a.overlay").attr("href"))
}

override fun latestUpdatesNextPageSelector(): String = popularAnimeNextPageSelector()
Expand Down
2 changes: 1 addition & 1 deletion src/ar/animeblkom/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
ext {
extName = 'Anime Blkom'
extClass = '.AnimeBlkom'
extVersionCode = 17
extVersionCode = 1
}

apply from: "$rootDir/common.gradle"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class AnimeBlkom : ConfigurableAnimeSource, ParsedAnimeHttpSource() {

override val lang = "ar"

override val supportsLatest = false
override val supportsLatest = true

override fun headersBuilder() = super.headersBuilder()
.add("referer", baseUrl)
Expand All @@ -53,14 +53,16 @@ class AnimeBlkom : ConfigurableAnimeSource, ParsedAnimeHttpSource() {

override fun popularAnimeNextPageSelector() = "ul.pagination li.page-item a[rel=next]"

// =============================== Latest ===============================
override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException()
// =============================== Latest =============================== override fun latestUpdatesRequest(page: Int): Request {
val newH = headers.newBuilder().add("x-requested-with", "XMLHttpRequest").build()
return GET("$baseUrl/?page=$page", newH)
}

override fun latestUpdatesSelector(): String = throw UnsupportedOperationException()
override fun latestUpdatesSelector(): String = "div.recent-episode > a"

override fun latestUpdatesFromElement(element: Element): SAnime = throw UnsupportedOperationException()
override fun latestUpdatesFromElement(element: Element): SAnime = popularAnimeFromElement(element)

override fun latestUpdatesNextPageSelector(): String = throw UnsupportedOperationException()
override fun latestUpdatesNextPageSelector(): String = "a"

// =============================== Search ===============================
override fun searchAnimeFromElement(element: Element) = popularAnimeFromElement(element)
Expand Down Expand Up @@ -89,7 +91,7 @@ class AnimeBlkom : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// =========================== Anime Details ============================
override fun animeDetailsParse(document: Document) = SAnime.create().apply {
thumbnail_url = document.selectFirst("div.poster img")!!.attr("abs:data-original")
title = document.selectFirst("div.name span h1")!!.text().replace(" (anime)","")
title = document.selectFirst("div.name span h1")!!.text().substringBefore(" (")
genre = document.select("p.genres a").joinToString { it.text() }
description = document.selectFirst("div.story p, div.story")?.text()
author = document.selectFirst("div:contains(الاستديو) span > a")?.text()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class Animeiat : ConfigurableAnimeSource, AnimeHttpSource() {

override val lang = "ar"

override val supportsLatest = false
override val supportsLatest = true

private val json = Json {
ignoreUnknownKeys = true
Expand Down
6 changes: 5 additions & 1 deletion src/ar/animelek/build.gradle
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
ext {
extName = 'AnimeLek'
extClass = '.AnimeLek'
extVersionCode = 34
extVersionCode = 1
}

apply from: "$rootDir/common.gradle"

dependencies {
implementation(project(':lib:streamtape-extractor'))
implementation(project(':lib:multiservers'))
implementation(project(':lib:okru-extractor'))
implementation(project(':lib:dood-extractor'))
implementation(project(':lib:vidbom-extractor'))
implementation(project(':lib:mixdrop-extractor'))
implementation(project(':lib:mp4upload-extractor'))
implementation(project(':lib:streamwish-extractor'))
}
Loading

0 comments on commit 683039a

Please sign in to comment.