Make extensions use YourUploadExtractor lib (#1336)

This commit is contained in:
Claudemirovsky 2023-02-26 20:45:53 -03:00 committed by GitHub
parent aab558292b
commit 135be1df02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 170 additions and 454 deletions

View File

@ -39,7 +39,7 @@ class AOAPIInterceptor(client: OkHttpClient) : Interceptor {
val tokenObject = Json.decodeFromString<JsonObject>(tokenResponse)
tokenObject["access_token"]!!.jsonPrimitive.content
} catch(_: Throwable) {
} catch (_: Throwable) {
""
}
}

View File

@ -12,7 +12,7 @@ class UQLoadExtractor(private val client: OkHttpClient) {
val videoUrl = check.substringAfter("sources: [\"").substringBefore("\"")
return if (check.contains("sources"))
Video(url, quality, videoUrl)
else
null
else
null
}
}

View File

@ -13,8 +13,8 @@ import eu.kanade.tachiyomi.animesource.model.SEpisode
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.OkHttpClient

View File

@ -40,7 +40,7 @@ class AnimeLoads : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val lang = "de"
override val supportsLatest = false
override val id: Long = 655155856096L
override val client: OkHttpClient = network.client.newBuilder()

View File

@ -327,7 +327,7 @@ class JsInterceptor : Interceptor {
webView?.loadUrl(origRequestUrl, headers)
}
}
latch.await(60, TimeUnit.SECONDS)
handler.post {

View File

@ -14,7 +14,6 @@ import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.EpisodeListingWrapper
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.EpisodeSourcesDto
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.HosterSourceDto
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.VideoLinkDto
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.de.fireanime.extractors.FireCdnExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -23,6 +22,7 @@ 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.animesource.online.AnimeHttpSource
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.network.interceptor.rateLimit

View File

@ -11,6 +11,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
compileOnly libs.bundles.coroutines
implementation(project(':lib-fembed-extractor'))
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"

View File

@ -7,7 +7,6 @@ import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.en.kissanime.extractors.DailymotionExtractor
import eu.kanade.tachiyomi.animeextension.en.kissanime.extractors.Mp4uploadExtractor
import eu.kanade.tachiyomi.animeextension.en.kissanime.extractors.VodstreamExtractor
import eu.kanade.tachiyomi.animeextension.en.kissanime.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
import eu.kanade.tachiyomi.animesource.model.AnimesPage
@ -16,6 +15,7 @@ import eu.kanade.tachiyomi.animesource.model.SEpisode
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.asObservableSuccess
@ -179,7 +179,7 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val episodeId = (baseUrl + episode.url).toHttpUrl().queryParameter("id")!!
var document = client.newCall(
GET(baseUrl + episode.url, headers = headers)
GET(baseUrl + episode.url, headers = headers),
).execute().asJsoup()
var newDocument = document
@ -188,7 +188,7 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
if (!server.hasAttr("selected")) {
newDocument = client.newCall(
GET(url, headers = headers)
GET(url, headers = headers),
).execute().asJsoup()
}
@ -202,7 +202,7 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
"Origin", baseUrl,
"Referer", url,
"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0",
"X-Requested-With", "XMLHttpRequest"
"X-Requested-With", "XMLHttpRequest",
)
val getIframeBody = "episode_id=$episodeId&ctk=$ctk".toRequestBody("application/x-www-form-urlencoded".toMediaType())
@ -210,8 +210,8 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val iframe = json.decodeFromString<IframeResponse>(
client.newCall(
POST("$baseUrl/ajax/anime/load_episodes_v2?s=$serverName", body = getIframeBody, headers = getIframeHeaders)
).execute().body!!.string()
POST("$baseUrl/ajax/anime/load_episodes_v2?s=$serverName", body = getIframeBody, headers = getIframeHeaders),
).execute().body!!.string(),
)
var iframeUrl = Jsoup.parse(iframe.value).selectFirst("iframe").attr("src")
@ -258,7 +258,6 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
FembedExtractor(client).videosFromUrl(newUrl, prefix = "${server.name} - ")
}
url.contains("yourupload") -> {
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
YourUploadExtractor(client).videoFromUrl(url, headers = headers, name = server.name)
}
url.contains("mp4upload") -> {
@ -275,7 +274,7 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
else -> null
}
}.getOrNull()
}.filterNotNull().flatten()
}.filterNotNull().flatten(),
)
return Observable.just(videoList.sort())
@ -293,19 +292,19 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val quality = preferences.getString("preferred_quality", "1080")!!
return this.sortedWith(
compareBy { it.quality.contains(quality) }
compareBy { it.quality.contains(quality) },
).reversed()
}
data class Server(
val name: String,
val url: String,
val password: String? = null
val password: String? = null,
)
@Serializable
data class IframeResponse(
val value: String
val value: String,
)
private fun parseDate(dateStr: String): Long {

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.kissanime.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers, name: String): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url, headers = headers)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, name, basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -4,10 +4,10 @@ import dev.datlag.jsunpacker.JsUnpacker
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.OkHttpClient
import okhttp3.Headers
import okhttp3.OkHttpClient
//From Vizer Extension
// From Vizer Extension
class MixDropExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, lang: String = ""): List<Video> {
val doc = client.newCall(GET(url)).execute().asJsoup()

View File

@ -10,6 +10,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation(project(':lib-fembed-extractor'))
implementation(project(':lib-streamtape-extractor'))
implementation(project(':lib-okru-extractor'))

View File

@ -4,7 +4,6 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.animeflv.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -17,6 +16,7 @@ import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.decodeFromString
@ -61,7 +61,7 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val anime = SAnime.create()
anime.setUrlWithoutDomain(
baseUrl + element.select("div.Description a.Button")
.attr("href")
.attr("href"),
)
anime.title = element.select("a h3").text()
anime.thumbnail_url = try {
@ -116,45 +116,24 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val json = servers!!.jsonObject
val quality = json!!["title"]!!.jsonPrimitive!!.content
var url = json!!["code"]!!.jsonPrimitive!!.content
if (quality == "SB") {
try {
videoList.addAll(
StreamSBExtractor(client).videosFromUrl(url, headers)
)
} catch (_: Exception) {}
}
if (quality == "Fembed") {
try {
videoList.addAll(
FembedExtractor(client).videosFromUrl(url)
)
} catch (_: Exception) {}
}
if (quality == "Stape") {
try {
val url1 = json!!["url"]!!.jsonPrimitive!!.content
val video = StreamTapeExtractor(client).videoFromUrl(url1)
if (video != null) videoList.add(video)
} catch (_: Exception) {}
}
if (quality == "Doodstream") {
try {
val video = DoodExtractor(client).videoFromUrl(url, "DoodStream", false)
if (video != null) videoList.add(video)
} catch (_: Exception) {}
}
if (quality == "Okru") {
try {
val videos = OkruExtractor(client).videosFromUrl(url)
videoList.addAll(videos)
} catch (_: Exception) {}
}
if (quality == "YourUpload") {
try {
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
YourUploadExtractor(client).videoFromUrl(url, headers = headers).map { videoList.add(it) }
} catch (_: Exception) {}
}
val extractedVideos = runCatching {
when (quality) {
"SB" -> StreamSBExtractor(client).videosFromUrl(url, headers)
"Fembed" -> FembedExtractor(client).videosFromUrl(url)
"Stape" -> {
val stapeUrl = json!!["url"]!!.jsonPrimitive!!.content
StreamTapeExtractor(client).videoFromUrl(stapeUrl)
?.let(::listOf)
}
"Doodstream" ->
DoodExtractor(client).videoFromUrl(url, "DoodStream", false)
?.let(::listOf)
"Okru" -> OkruExtractor(client).videosFromUrl(url)
"YourUpload" -> YourUploadExtractor(client).videoFromUrl(url, headers = headers)
else -> null
}
}.getOrNull() ?: emptyList<Video>()
videoList.addAll(extractedVideos)
}
}
}
@ -170,7 +149,7 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun List<Video>.sort(): List<Video> {
return try {
val videoSorted = this.sortedWith(
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) }
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) },
).toTypedArray()
val userPreferredQuality = preferences.getString("preferred_quality", "Fembed:720p")
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
@ -212,7 +191,7 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
GenreFilter(),
StateFilter(),
TypeFilter(),
OrderByFilter()
OrderByFilter(),
)
private class GenreFilter : UriPartFilter(
@ -259,8 +238,8 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("Terror", "terror"),
Pair("Vampiros", "vampiros"),
Pair("Yaoi", "yaoi"),
Pair("Yuri", "yuri")
)
Pair("Yuri", "yuri"),
),
)
private class StateFilter : UriPartFilter(
@ -269,8 +248,8 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("<Seleccionar>", ""),
Pair("En emisión", "1"),
Pair("Finalizado", "2"),
Pair("Próximamente", "3")
)
Pair("Próximamente", "3"),
),
)
private class TypeFilter : UriPartFilter(
@ -280,8 +259,8 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("TV", "tv"),
Pair("Película", "movie"),
Pair("Especial", "special"),
Pair("OVA", "ova")
)
Pair("OVA", "ova"),
),
)
private class OrderByFilter : UriPartFilter(
@ -291,8 +270,8 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("Recientemente Actualizados", "updated"),
Pair("Recientemente Agregados", "added"),
Pair("Nombre A-Z", "title"),
Pair("Calificación", "rating")
)
Pair("Calificación", "rating"),
),
)
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
@ -346,13 +325,13 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
"Okru:1080p", "Okru:720p", "Okru:480p", "Okru:360p", "Okru:240p", "Okru:144p", // Okru
"StreamSB:1080p", "StreamSB:720p", "StreamSB:480p", "StreamSB:360p", "StreamSB:240p", "StreamSB:144p", // StreamSB
"YourUpload", "DoodStream", "StreamTape"
"YourUpload", "DoodStream", "StreamTape",
) // video servers without resolution
entryValues = arrayOf(
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
"Okru:1080p", "Okru:720p", "Okru:480p", "Okru:360p", "Okru:240p", "Okru:144p", // Okru
"StreamSB:1080p", "StreamSB:720p", "StreamSB:480p", "StreamSB:360p", "StreamSB:240p", "StreamSB:144p", // StreamSB
"YourUpload", "DoodStream", "StreamTape"
"YourUpload", "DoodStream", "StreamTape",
) // video servers without resolution
setDefaultValue("Fembed:720p")
summary = "%s"

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.animeflv.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "YourUpload", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -10,6 +10,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation(project(':lib-fembed-extractor'))
implementation(project(':lib-dood-extractor'))
implementation project(path: ':lib-streamsb-extractor')

View File

@ -4,7 +4,6 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.cuevana.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -16,6 +15,7 @@ import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.util.asJsoup
@ -112,14 +112,15 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val langPrefix = try {
val optLanguage = it.parent().attr("id")
val languageTag = document.selectFirst("li[data-tplayernv=$optLanguage]").closest(".open_submenu").selectFirst("div:first-child").text()
if (languageTag.lowercase().contains("latino"))
if (languageTag.lowercase().contains("latino")) {
"[LAT]"
else if (languageTag.lowercase().contains("españa"))
} else if (languageTag.lowercase().contains("españa")) {
"[CAST]"
else if (languageTag.lowercase().contains("subtitulado"))
} else if (languageTag.lowercase().contains("subtitulado")) {
"[SUB]"
else
} else {
""
}
} catch (e: Exception) { "" }
val iframe = urlServerSolver(it.attr("data-src"))
if (iframe.contains("api.cuevana3.me/fembed/")) {
@ -255,12 +256,12 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
} catch (e: Exception) { }
}
if (normalizeUrl.contains("yourupload")) {
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
val videos = YourUploadExtractor(client).videoFromUrl(url, headers = headers)
videos.map { videoList.add(it) }
videoList.addAll(videos)
}
if (normalizeUrl.contains("doodstream") || normalizeUrl.contains("dood.")) {
DoodExtractor(client).videoFromUrl(url, "$prefix DoodStream", false)
?.let { videoList.add(it) }
}
if (normalizeUrl.contains("sbstream")) {
runCatching {
@ -268,7 +269,9 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
}.getOrNull()?.let { videoList.addAll(it) }
}
if (normalizeUrl.contains("okru")) {
OkruExtractor(client).videosFromUrl(url, prefix, true)
videoList.addAll(
OkruExtractor(client).videosFromUrl(url, prefix, true),
)
}
return videoList
}
@ -290,7 +293,7 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun List<Video>.sort(): List<Video> {
return try {
val videoSorted = this.sortedWith(
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) }
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) },
).toTypedArray()
val userPreferredQuality = preferences.getString("preferred_quality", "Voex")
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
@ -347,7 +350,7 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
GenreFilter()
GenreFilter(),
)
private class GenreFilter : UriPartFilter(
@ -370,8 +373,8 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("Musical", "musical"),
Pair("Romance", "romance"),
Pair("Terror", "terror"),
Pair("Thriller", "thriller")
)
Pair("Thriller", "thriller"),
),
)
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
@ -384,7 +387,7 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
"StreamSB:1080p", "StreamSB:720p", "StreamSB:480p", "StreamSB:360p", "StreamSB:240p", "StreamSB:144p", // StreamSB
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
"Streamlare:1080p", "Streamlare:720p", "Streamlare:480p", "Streamlare:360p", "Streamlare:240p", // Streamlare
"StreamTape", "Amazon", "Voex", "DoodStream", "YourUpload"
"StreamTape", "Amazon", "Voex", "DoodStream", "YourUpload",
)
val videoQualityPref = ListPreference(screen.context).apply {
key = "preferred_quality"

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.cuevana.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "YourUpload", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -11,6 +11,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation(project(':lib-streamtape-extractor'))
}

View File

@ -4,7 +4,6 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.jkhentai.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -13,6 +12,7 @@ import eu.kanade.tachiyomi.animesource.model.SEpisode
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.OkHttpClient
@ -47,7 +47,7 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun popularAnimeFromElement(element: Element): SAnime {
val anime = SAnime.create()
anime.setUrlWithoutDomain(
element.select("div.imagen a").attr("href")
element.select("div.imagen a").attr("href"),
)
anime.title = element.select("h2").text()
anime.thumbnail_url = element.select("div.imagen img").attr("src")
@ -84,18 +84,16 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val videoList = mutableListOf<Video>()
document.select("div#contenedor div.items.ptts div#movie div.post div#player-container ul.player-menu li").forEach { it ->
val server = it.select("a").text()
document.select("div#contenedor div.items.ptts div#movie div.post div#player-container div.play-c").forEach() {
if (server == "StreamTape") {
val url = it.select("div.player-content iframe").attr("src")
val video = StreamTapeExtractor(client).videoFromUrl(url, server)
if (video != null) {
videoList.add(video)
}
}
if (server == "Upload") {
val url = it.select("div.player-content iframe").attr("src")
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
YourUploadExtractor(client).videoFromUrl(url, headers = headers).map { vid -> videoList.add(vid) }
document.select("div#contenedor div.items.ptts div#movie div.post div#player-container div.play-c").forEach {
val url = it.select("div.player-content iframe").attr("src")
when (server) {
"StreamTape" ->
StreamTapeExtractor(client).videoFromUrl(url, server)
?.also { videoList.add(it) }
"Upload" ->
YourUploadExtractor(client).videoFromUrl(url, headers = headers)
.also { videoList.addAll(it) }
else -> null
}
}
}
@ -111,7 +109,7 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun List<Video>.sort(): List<Video> {
return try {
val videoSorted = this.sortedWith(
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) }
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) },
).toTypedArray()
val userPreferredQuality = preferences.getString("preferred_quality", "StreamTape")
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
@ -167,7 +165,7 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
GenreFilter()
GenreFilter(),
)
private class GenreFilter : UriPartFilter(
@ -215,8 +213,8 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("Maids", "maids"),
Pair("Netorase", "netorase"),
Pair("Shota", "shota"),
Pair("Succubus", "succubus")
)
Pair("Succubus", "succubus"),
),
)
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.jkhentai.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "YourUpload", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -10,6 +10,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation(project(':lib-fembed-extractor'))
implementation(project(':lib-okru-extractor'))
implementation(project(':lib-dood-extractor'))

View File

@ -7,7 +7,6 @@ import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.latanime.extractors.Mp4uploadExtractor
import eu.kanade.tachiyomi.animeextension.es.latanime.extractors.UploadExtractor
import eu.kanade.tachiyomi.animeextension.es.latanime.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.HttpUrl.Companion.toHttpUrl
@ -106,7 +106,7 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
YearFilter(),
GenreFilter(),
LetterFilter()
LetterFilter(),
)
private class YearFilter : UriPartFilter(
@ -154,8 +154,8 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("1985", "1985"),
Pair("1984", "1984"),
Pair("1983", "1983"),
Pair("1982", "1982")
)
Pair("1982", "1982"),
),
)
private class GenreFilter : UriPartFilter(
@ -207,8 +207,8 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("Aenime", "aenime"),
Pair("Donghua", "donghua"),
Pair("Blu-ray", "blu-ray"),
Pair("Monogatari", "monogatari")
)
Pair("Monogatari", "monogatari"),
),
)
private class LetterFilter : UriPartFilter(
@ -241,8 +241,8 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("W", "W"),
Pair("X", "X"),
Pair("Y", "Y"),
Pair("Z", "Z")
)
Pair("Z", "Z"),
),
)
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
@ -332,8 +332,7 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
videoList.addAll(videos)
}
url.contains("yourupload") -> {
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
val videos = YourUploadExtractor(client).videoFromUrl(url, headers = headers, prefix = prefix)
val videos = YourUploadExtractor(client).videoFromUrl(url, headers = headers, name = "Original", prefix = prefix)
videoList.addAll(videos)
}
url.contains("sbembed.com") || url.contains("sbembed1.com") || url.contains("sbplay.org") ||
@ -367,7 +366,7 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val quality = preferences.getString("preferred_quality", "1080")!!
return this.sortedWith(
compareBy { it.quality.contains(quality) }
compareBy { it.quality.contains(quality) },
).reversed()
}

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.latanime.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers, prefix: String): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url, headers = headers)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "${prefix}Original", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -10,6 +10,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation(project(':lib-fembed-extractor'))
implementation(project(':lib-streamtape-extractor'))
implementation(project(':lib-okru-extractor'))

View File

@ -6,7 +6,6 @@ import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.legionanime.extractors.JkanimeExtractor
import eu.kanade.tachiyomi.animeextension.es.legionanime.extractors.Mp4uploadExtractor
import eu.kanade.tachiyomi.animeextension.es.legionanime.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animeextension.es.legionanime.extractors.ZippyExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.util.asJsoup
@ -99,7 +99,8 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val body = FormBody.Builder().add("apyki", apyki).build()
return POST(
"$baseUrl/v2/directories?studio=0&not_genre=&year=&orderBy=2&language=&type=&duration=&search=&letter=0&limit=24&genre=&season=&page=${(page - 1) * 24}&status=",
headers = headers1, body = body
headers = headers1,
body = body,
)
}
@ -109,7 +110,8 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val body = FormBody.Builder().add("apyki", apyki).build()
return POST(
"$baseUrl/v2/directories?studio=0&not_genre=&year=&orderBy=4&language=&type=&duration=&search=&letter=0&limit=24&genre=&season=&page=${(page - 1) * 24}&status=",
headers = headers1, body = body
headers = headers1,
body = body,
)
}
@ -127,7 +129,7 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
thumbnail_url = aip.random() + animeDetail["img_url"]!!.jsonPrimitive.content
}
},
true
true,
)
} catch (e: Exception) {
return AnimesPage(emptyList(), false)
@ -145,16 +147,22 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val genre = try {
if (genreFilter.isNotEmpty()) {
genreFilter.filter { it.state }.map { genres[it.name] }.joinToString("%2C") { it.toString() }
} else ""
} else {
""
}
} catch (e: Exception) { "" }
val excludeGenre = if (excludeGenreFilter.isNotEmpty()) {
excludeGenreFilter.filter { it.state }.map { genres[it.name] }.joinToString("%2C") { it.toString() }
} else ""
} else {
""
}
val studio = if (studioFilter.isNotEmpty()) {
studioFilter.filter { it.state }.map { studiosMap[it.name] }.joinToString("%2C") { it.toString() }
} else 0
} else {
0
}
val status = if (stateFilter.state != 0) stateFilter.toUriPart() else ""
@ -162,7 +170,8 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
return POST(
url,
headers = headers1, body = body
headers = headers1,
body = body,
)
}
@ -180,7 +189,7 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
thumbnail_url = aip.random() + animeDetail["img_url"]!!.jsonPrimitive.content
}
},
false
false,
)
} catch (e: Exception) {
return AnimesPage(emptyList(), false)
@ -231,7 +240,6 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
}
}
url.contains("yourupload") -> {
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
videoList.addAll(YourUploadExtractor(client).videoFromUrl(url, headers))
}
url.contains("zippyshare") -> {
@ -269,7 +277,7 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
return POST(
episode.url,
headers1,
body
body,
)
}
@ -290,7 +298,7 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("Emision", "1"),
Pair("Finalizado", "2"),
Pair("Proximamente", "3"),
)
),
)
class TagCheckBox(tag: String) : AnimeFilter.CheckBox(tag, false)
@ -310,7 +318,7 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
"FHD-ALT Fembed:1080p", "FHD-ALT Fembed:720p", "FHD-ALT Fembed:480p", "FHD-ALT Fembed:360p", "FHD-ALT Fembed:240p", // Fembed-ALT
"Okru:1080p", "Okru:720p", "Okru:480p", "Okru:360p", "Okru:240p", // Okru
"StreamSB:360p", "StreamSB:480p", "StreamSB:720p", "StreamSB:1080p", // StreamSB
"Xtreme S", "Nozomi", "Desu", "F1S-TAPE", "F1NIX" // video servers without resolution
"Xtreme S", "Nozomi", "Desu", "F1S-TAPE", "F1NIX", // video servers without resolution
)
val videoQualityPref = ListPreference(screen.context).apply {
key = "preferred_quality"

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.legionanime.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "YourUpload", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.animeextension.es.monoschinos
import android.app.Application
import android.content.SharedPreferences
import android.util.Base64
import android.util.Log
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.monoschinos.extractors.Mp4uploadExtractor
@ -88,19 +87,19 @@ class MonosChinos : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// val server = it.select("a").text()
val urlBase64 = it.select("a").attr("data-player")
val url = Base64.decode(urlBase64, Base64.DEFAULT).toString(Charsets.UTF_8).substringAfter("=")
when {
url.contains("fembed") -> videoList.addAll(FembedExtractor(client).videosFromUrl(url))
url.contains("ok") -> if (!url.contains("streamcherry")) videoList.addAll(OkruExtractor(client).videosFromUrl(url))
url.contains("solidfiles") -> videoList.addAll(SolidFilesExtractor(client).videosFromUrl(url))
url.contains("uqload") -> {
val video = UploadExtractor(client).videoFromUrl(url, headers)
if (video != null) videoList.add(video)
}
url.contains("mp4upload") -> {
val videoHeaders = headersBuilder().add("Referer", "https://mp4upload.com/").build()
videoList.add(Mp4uploadExtractor().getVideoFromUrl(url, videoHeaders))
}
when {
url.contains("fembed") -> videoList.addAll(FembedExtractor(client).videosFromUrl(url))
url.contains("ok") -> if (!url.contains("streamcherry")) videoList.addAll(OkruExtractor(client).videosFromUrl(url))
url.contains("solidfiles") -> videoList.addAll(SolidFilesExtractor(client).videosFromUrl(url))
url.contains("uqload") -> {
val video = UploadExtractor(client).videoFromUrl(url, headers)
if (video != null) videoList.add(video)
}
url.contains("mp4upload") -> {
val videoHeaders = headersBuilder().add("Referer", "https://mp4upload.com/").build()
videoList.add(Mp4uploadExtractor().getVideoFromUrl(url, videoHeaders))
}
}
}
return videoList.filter { video -> video.url.contains("http") }

View File

@ -10,6 +10,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation(project(':lib-fembed-extractor'))
implementation(project(':lib-streamtape-extractor'))
implementation(project(':lib-streamsb-extractor'))

View File

@ -6,7 +6,6 @@ import android.util.Base64
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.StreamlareExtractor
import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.OkHttpClient
@ -52,7 +52,7 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun popularAnimeFromElement(element: Element): SAnime {
val anime = SAnime.create()
anime.setUrlWithoutDomain(
element.select("a").attr("href")
element.select("a").attr("href"),
)
anime.title = element.select("a div.listing-content p").text()
anime.thumbnail_url = element.select("a img").attr("src").replace("/w154/", "/w200/")
@ -196,7 +196,6 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val url2 = url.replace("https://doodstream.com/e/", "https://dood.to/e/")
DoodExtractor(client).videoFromUrl(url2, "DoodStream", false)?.let { videoList.add(it) }
} else if (server.lowercase() == "upload") {
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
return YourUploadExtractor(client).videoFromUrl(url, headers = headers)
}
} catch (_: Exception) {}
@ -212,7 +211,7 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun List<Video>.sort(): List<Video> {
return try {
val videoSorted = this.sortedWith(
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) }
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) },
).toTypedArray()
val userPreferredQuality = preferences.getString("preferred_quality", "Voex")
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
@ -273,7 +272,7 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
AnimeFilter.Header("La busqueda por texto ignora el filtro de año"),
GenreFilter(),
AnimeFilter.Header("Busqueda por año"),
Tags("Año")
Tags("Año"),
)
private class GenreFilter : UriPartFilter(
@ -301,8 +300,8 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
Pair("Romance", "generos/romance"),
Pair("Suspense", "generos/suspense"),
Pair("Terror", "generos/terror"),
Pair("Western", "generos/western")
)
Pair("Western", "generos/western"),
),
)
private class Tags(name: String) : AnimeFilter.Text(name)
@ -317,7 +316,7 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
"StreamSB:1080p", "StreamSB:720p", "StreamSB:480p", "StreamSB:360p", "StreamSB:240p", "StreamSB:144p", // StreamSB
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
"Streamlare:1080p", "Streamlare:720p", "Streamlare:480p", "Streamlare:360p", "Streamlare:240p", // Streamlare
"StreamTape", "Amazon", "Voex", "DoodStream", "YourUpload"
"StreamTape", "Amazon", "Voex", "DoodStream", "YourUpload",
)
val videoQualityPref = ListPreference(screen.context).apply {
key = "preferred_quality"

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.pelisplushd.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "YourUpload", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -10,6 +10,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation(project(':lib-fembed-extractor'))
implementation(project(':lib-okru-extractor'))
}

View File

@ -4,7 +4,6 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.tioanimeh.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -14,6 +13,7 @@ import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.OkHttpClient
@ -87,15 +87,16 @@ open class TioanimeH(override val name: String, override val baseUrl: String) :
when (serverName.lowercase()) {
"fembed" -> {
videoList.addAll(
FembedExtractor(client).videosFromUrl(serverUrl)
FembedExtractor(client).videosFromUrl(serverUrl),
)
}
"okru" -> {
OkruExtractor(client).videosFromUrl(serverUrl).map { vid -> videoList.add(vid) }
}
"yourupload" -> {
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
YourUploadExtractor(client).videoFromUrl(serverUrl, headers = headers).map { vid -> videoList.add(vid) }
videoList.addAll(
YourUploadExtractor(client).videoFromUrl(serverUrl, headers = headers),
)
}
}
}
@ -112,7 +113,7 @@ open class TioanimeH(override val name: String, override val baseUrl: String) :
override fun List<Video>.sort(): List<Video> {
return try {
val videoSorted = this.sortedWith(
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) }
compareBy<Video> { it.quality.replace("[0-9]".toRegex(), "") }.thenByDescending { getNumberFromString(it.quality) },
).toTypedArray()
val userPreferredQuality = preferences.getString("preferred_quality", "Fembed:720p")
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
@ -175,7 +176,7 @@ open class TioanimeH(override val name: String, override val baseUrl: String) :
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
GenreFilter()
GenreFilter(),
)
class GenreFilter : UriPartFilter(
@ -204,7 +205,7 @@ open class TioanimeH(override val name: String, override val baseUrl: String) :
Pair("Virgenes(como tu)", "virgenes"),
Pair("Yaoi", "Yaoi"),
Pair("Yuri", "yuri"),
)
),
)
open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
@ -216,7 +217,7 @@ open class TioanimeH(override val name: String, override val baseUrl: String) :
val qualities = arrayOf(
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
"Okru:1080p", "Okru:720p", "Okru:480p", "Okru:360p", "Okru:240p", "Okru:144p", // Okru
"YourUpload" // video servers without resolution
"YourUpload", // video servers without resolution
)
val videoQualityPref = ListPreference(screen.context).apply {
key = "preferred_quality"

View File

@ -9,7 +9,7 @@ import okhttp3.Request
class TioanimeHFactory : AnimeSourceFactory {
override fun createSources(): List<AnimeSource> = listOf(
tioanime(),
tiohentai()
tiohentai(),
)
}
@ -25,7 +25,7 @@ class tioanime : TioanimeH("TioAnime", "https://tioanime.com") {
}
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
GenreFilter()
GenreFilter(),
)
private class GenreFilter : UriPartFilter(
@ -71,8 +71,8 @@ class tioanime : TioanimeH("TioAnime", "https://tioanime.com") {
Pair("Terror", "terror"),
Pair("Vampiros", "vampiros"),
Pair("Yaoi", "yaoi"),
Pair("Yuri", "yuri")
)
Pair("Yuri", "yuri"),
),
)
}

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.tioanimeh.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "YourUpload", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -11,6 +11,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
}

View File

@ -11,13 +11,13 @@ import eu.kanade.tachiyomi.animeextension.id.kuronime.extractors.HxFileExtractor
import eu.kanade.tachiyomi.animeextension.id.kuronime.extractors.LinkBoxExtractor
import eu.kanade.tachiyomi.animeextension.id.kuronime.extractors.Mp4uploadExtractor
import eu.kanade.tachiyomi.animeextension.id.kuronime.extractors.StreamlareExtractor
import eu.kanade.tachiyomi.animeextension.id.kuronime.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
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.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Request
@ -127,7 +127,7 @@ class Kuronime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val hosterSelection = preferences.getStringSet(
"hoster_selection",
setOf("animeku", "mp4upload", "yourupload", "streamlare", "linkbox")
setOf("animeku", "mp4upload", "yourupload", "streamlare", "linkbox"),
)!!
document.select("select.mirror > option[value]").forEach { opt ->
@ -135,7 +135,7 @@ class Kuronime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
document.selectFirst("iframe").attr("data-src")
} else {
Jsoup.parse(
String(Base64.decode(opt.attr("value"), Base64.DEFAULT))
String(Base64.decode(opt.attr("value"), Base64.DEFAULT)),
).select("iframe[data-src~=.]").attr("data-src")
}
@ -148,8 +148,7 @@ class Kuronime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
videoList.addAll(Mp4uploadExtractor(client).getVideoFromUrl(decoded, headers, opt.text()))
}
hosterSelection.contains("yourupload") && decoded.contains("yourupload.com") -> {
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
videoList.addAll(YourUploadExtractor(client).videoFromUrl(decoded, headers, opt.text()))
videoList.addAll(YourUploadExtractor(client).videoFromUrl(decoded, headers, opt.text(), "Original - "))
}
hosterSelection.contains("streamlare") && decoded.contains("streamlare.com") -> {
videoList.addAll(StreamlareExtractor(client).videosFromUrl(decoded, opt.text()))

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.id.kuronime.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers, name: String): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url, headers = headers)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "Original - $name", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}

View File

@ -11,6 +11,7 @@ ext {
}
dependencies {
implementation(project(':lib-yourupload-extractor'))
implementation(project(':lib-fembed-extractor'))
implementation(project(':lib-okru-extractor'))
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"

View File

@ -8,7 +8,6 @@ import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.BloggerExtractor
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.GdrivePlayerExtractor
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.LinkBoxExtractor
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.YourUploadExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
import eu.kanade.tachiyomi.animesource.model.AnimesPage
@ -18,6 +17,7 @@ import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.util.asJsoup
@ -210,7 +210,7 @@ class NeoNime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
val hosterSelection = preferences.getStringSet(
"hoster_selection",
setOf("blogger", "linkbox", "fembed", "okru", "yourupload", "gdriveplayer")
setOf("blogger", "linkbox", "fembed", "okru", "yourupload", "gdriveplayer"),
)!!
document.select("div.player2 > div.embed2 > div").forEach {
@ -235,17 +235,19 @@ class NeoNime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
videoList.addAll(BloggerExtractor(client).videosFromUrl(link, it.text()))
}
hosterSelection.contains("linkbox") && link.contains("yourupload.com") -> {
val yuHeaders = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
videoList.addAll(YourUploadExtractor(client).videoFromUrl(link, yuHeaders, it.text()))
videoList.addAll(YourUploadExtractor(client).videoFromUrl(link, headers, it.text(), "Original - "))
}
hosterSelection.contains("gdriveplayer") && link.contains("neonime.fun") -> {
val headers = Headers.headersOf(
"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Referer", response.request.url.toString(),
"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0"
"Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Referer",
response.request.url.toString(),
"User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0",
)
var iframe = client.newCall(
GET(link, headers = headers)
GET(link, headers = headers),
).execute().asJsoup()
var iframeUrl = iframe.selectFirst("iframe").attr("src")

View File

@ -1,28 +0,0 @@
package eu.kanade.tachiyomi.animeextension.id.neonime.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.OkHttpClient
class YourUploadExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, headers: Headers, name: String): List<Video> {
val videoList = mutableListOf<Video>()
return try {
val document = client.newCall(GET(url, headers = headers)).execute()
if (document.isSuccessful) {
val content = document.asJsoup()
val baseData =
content!!.selectFirst("script:containsData(jwplayerOptions)")!!.data()
if (!baseData.isNullOrEmpty()) {
val basicUrl = baseData.substringAfter("file: '").substringBefore("',")
videoList.add(Video(basicUrl, "Original - $name", basicUrl, headers = headers))
}
}
videoList
} catch (e: Exception) {
videoList
}
}
}