Make extensions use YourUploadExtractor lib (#1336)
This commit is contained in:
parent
aab558292b
commit
135be1df02
@ -13,8 +13,8 @@ import eu.kanade.tachiyomi.animesource.model.SEpisode
|
|||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
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.fembedextractor.FembedExtractor
|
||||||
|
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
@ -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.EpisodeSourcesDto
|
||||||
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.HosterSourceDto
|
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.HosterSourceDto
|
||||||
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.VideoLinkDto
|
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.animeextension.de.fireanime.extractors.FireCdnExtractor
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
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.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
|
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.POST
|
||||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||||
|
@ -11,6 +11,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
compileOnly libs.bundles.coroutines
|
compileOnly libs.bundles.coroutines
|
||||||
implementation(project(':lib-fembed-extractor'))
|
implementation(project(':lib-fembed-extractor'))
|
||||||
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
|
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
|
||||||
|
@ -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.DailymotionExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.en.kissanime.extractors.Mp4uploadExtractor
|
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.VodstreamExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.en.kissanime.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimesPage
|
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.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
|
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.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||||
@ -179,7 +179,7 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val episodeId = (baseUrl + episode.url).toHttpUrl().queryParameter("id")!!
|
val episodeId = (baseUrl + episode.url).toHttpUrl().queryParameter("id")!!
|
||||||
|
|
||||||
var document = client.newCall(
|
var document = client.newCall(
|
||||||
GET(baseUrl + episode.url, headers = headers)
|
GET(baseUrl + episode.url, headers = headers),
|
||||||
).execute().asJsoup()
|
).execute().asJsoup()
|
||||||
var newDocument = document
|
var newDocument = document
|
||||||
|
|
||||||
@ -188,7 +188,7 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
if (!server.hasAttr("selected")) {
|
if (!server.hasAttr("selected")) {
|
||||||
newDocument = client.newCall(
|
newDocument = client.newCall(
|
||||||
GET(url, headers = headers)
|
GET(url, headers = headers),
|
||||||
).execute().asJsoup()
|
).execute().asJsoup()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
"Origin", baseUrl,
|
"Origin", baseUrl,
|
||||||
"Referer", url,
|
"Referer", url,
|
||||||
"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0",
|
"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())
|
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>(
|
val iframe = json.decodeFromString<IframeResponse>(
|
||||||
client.newCall(
|
client.newCall(
|
||||||
POST("$baseUrl/ajax/anime/load_episodes_v2?s=$serverName", body = getIframeBody, headers = getIframeHeaders)
|
POST("$baseUrl/ajax/anime/load_episodes_v2?s=$serverName", body = getIframeBody, headers = getIframeHeaders),
|
||||||
).execute().body!!.string()
|
).execute().body!!.string(),
|
||||||
)
|
)
|
||||||
var iframeUrl = Jsoup.parse(iframe.value).selectFirst("iframe").attr("src")
|
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} - ")
|
FembedExtractor(client).videosFromUrl(newUrl, prefix = "${server.name} - ")
|
||||||
}
|
}
|
||||||
url.contains("yourupload") -> {
|
url.contains("yourupload") -> {
|
||||||
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
|
|
||||||
YourUploadExtractor(client).videoFromUrl(url, headers = headers, name = server.name)
|
YourUploadExtractor(client).videoFromUrl(url, headers = headers, name = server.name)
|
||||||
}
|
}
|
||||||
url.contains("mp4upload") -> {
|
url.contains("mp4upload") -> {
|
||||||
@ -275,7 +274,7 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
}.filterNotNull().flatten()
|
}.filterNotNull().flatten(),
|
||||||
)
|
)
|
||||||
|
|
||||||
return Observable.just(videoList.sort())
|
return Observable.just(videoList.sort())
|
||||||
@ -293,19 +292,19 @@ class KissAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val quality = preferences.getString("preferred_quality", "1080")!!
|
val quality = preferences.getString("preferred_quality", "1080")!!
|
||||||
|
|
||||||
return this.sortedWith(
|
return this.sortedWith(
|
||||||
compareBy { it.quality.contains(quality) }
|
compareBy { it.quality.contains(quality) },
|
||||||
).reversed()
|
).reversed()
|
||||||
}
|
}
|
||||||
|
|
||||||
data class Server(
|
data class Server(
|
||||||
val name: String,
|
val name: String,
|
||||||
val url: String,
|
val url: String,
|
||||||
val password: String? = null
|
val password: String? = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class IframeResponse(
|
data class IframeResponse(
|
||||||
val value: String
|
val value: String,
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun parseDate(dateStr: String): Long {
|
private fun parseDate(dateStr: String): Long {
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,8 +4,8 @@ import dev.datlag.jsunpacker.JsUnpacker
|
|||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
|
||||||
// From Vizer Extension
|
// From Vizer Extension
|
||||||
class MixDropExtractor(private val client: OkHttpClient) {
|
class MixDropExtractor(private val client: OkHttpClient) {
|
||||||
|
@ -10,6 +10,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-fembed-extractor'))
|
implementation(project(':lib-fembed-extractor'))
|
||||||
implementation(project(':lib-streamtape-extractor'))
|
implementation(project(':lib-streamtape-extractor'))
|
||||||
implementation(project(':lib-okru-extractor'))
|
implementation(project(':lib-okru-extractor'))
|
||||||
|
@ -4,7 +4,6 @@ import android.app.Application
|
|||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.es.animeflv.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
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.okruextractor.OkruExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
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.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import kotlinx.serialization.decodeFromString
|
import kotlinx.serialization.decodeFromString
|
||||||
@ -61,7 +61,7 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val anime = SAnime.create()
|
val anime = SAnime.create()
|
||||||
anime.setUrlWithoutDomain(
|
anime.setUrlWithoutDomain(
|
||||||
baseUrl + element.select("div.Description a.Button")
|
baseUrl + element.select("div.Description a.Button")
|
||||||
.attr("href")
|
.attr("href"),
|
||||||
)
|
)
|
||||||
anime.title = element.select("a h3").text()
|
anime.title = element.select("a h3").text()
|
||||||
anime.thumbnail_url = try {
|
anime.thumbnail_url = try {
|
||||||
@ -116,45 +116,24 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val json = servers!!.jsonObject
|
val json = servers!!.jsonObject
|
||||||
val quality = json!!["title"]!!.jsonPrimitive!!.content
|
val quality = json!!["title"]!!.jsonPrimitive!!.content
|
||||||
var url = json!!["code"]!!.jsonPrimitive!!.content
|
var url = json!!["code"]!!.jsonPrimitive!!.content
|
||||||
if (quality == "SB") {
|
val extractedVideos = runCatching {
|
||||||
try {
|
when (quality) {
|
||||||
videoList.addAll(
|
"SB" -> StreamSBExtractor(client).videosFromUrl(url, headers)
|
||||||
StreamSBExtractor(client).videosFromUrl(url, headers)
|
"Fembed" -> FembedExtractor(client).videosFromUrl(url)
|
||||||
)
|
"Stape" -> {
|
||||||
} catch (_: Exception) {}
|
val stapeUrl = json!!["url"]!!.jsonPrimitive!!.content
|
||||||
|
StreamTapeExtractor(client).videoFromUrl(stapeUrl)
|
||||||
|
?.let(::listOf)
|
||||||
}
|
}
|
||||||
if (quality == "Fembed") {
|
"Doodstream" ->
|
||||||
try {
|
DoodExtractor(client).videoFromUrl(url, "DoodStream", false)
|
||||||
videoList.addAll(
|
?.let(::listOf)
|
||||||
FembedExtractor(client).videosFromUrl(url)
|
"Okru" -> OkruExtractor(client).videosFromUrl(url)
|
||||||
)
|
"YourUpload" -> YourUploadExtractor(client).videoFromUrl(url, headers = headers)
|
||||||
} catch (_: Exception) {}
|
else -> null
|
||||||
}
|
|
||||||
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) {}
|
|
||||||
}
|
}
|
||||||
|
}.getOrNull() ?: emptyList<Video>()
|
||||||
|
videoList.addAll(extractedVideos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -170,7 +149,7 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun List<Video>.sort(): List<Video> {
|
override fun List<Video>.sort(): List<Video> {
|
||||||
return try {
|
return try {
|
||||||
val videoSorted = this.sortedWith(
|
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()
|
).toTypedArray()
|
||||||
val userPreferredQuality = preferences.getString("preferred_quality", "Fembed:720p")
|
val userPreferredQuality = preferences.getString("preferred_quality", "Fembed:720p")
|
||||||
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
|
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
|
||||||
@ -212,7 +191,7 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
GenreFilter(),
|
GenreFilter(),
|
||||||
StateFilter(),
|
StateFilter(),
|
||||||
TypeFilter(),
|
TypeFilter(),
|
||||||
OrderByFilter()
|
OrderByFilter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class GenreFilter : UriPartFilter(
|
private class GenreFilter : UriPartFilter(
|
||||||
@ -259,8 +238,8 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("Terror", "terror"),
|
Pair("Terror", "terror"),
|
||||||
Pair("Vampiros", "vampiros"),
|
Pair("Vampiros", "vampiros"),
|
||||||
Pair("Yaoi", "yaoi"),
|
Pair("Yaoi", "yaoi"),
|
||||||
Pair("Yuri", "yuri")
|
Pair("Yuri", "yuri"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class StateFilter : UriPartFilter(
|
private class StateFilter : UriPartFilter(
|
||||||
@ -269,8 +248,8 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("<Seleccionar>", ""),
|
Pair("<Seleccionar>", ""),
|
||||||
Pair("En emisión", "1"),
|
Pair("En emisión", "1"),
|
||||||
Pair("Finalizado", "2"),
|
Pair("Finalizado", "2"),
|
||||||
Pair("Próximamente", "3")
|
Pair("Próximamente", "3"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class TypeFilter : UriPartFilter(
|
private class TypeFilter : UriPartFilter(
|
||||||
@ -280,8 +259,8 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("TV", "tv"),
|
Pair("TV", "tv"),
|
||||||
Pair("Película", "movie"),
|
Pair("Película", "movie"),
|
||||||
Pair("Especial", "special"),
|
Pair("Especial", "special"),
|
||||||
Pair("OVA", "ova")
|
Pair("OVA", "ova"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class OrderByFilter : UriPartFilter(
|
private class OrderByFilter : UriPartFilter(
|
||||||
@ -291,8 +270,8 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("Recientemente Actualizados", "updated"),
|
Pair("Recientemente Actualizados", "updated"),
|
||||||
Pair("Recientemente Agregados", "added"),
|
Pair("Recientemente Agregados", "added"),
|
||||||
Pair("Nombre A-Z", "title"),
|
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>>) :
|
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
|
"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
|
"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
|
"StreamSB:1080p", "StreamSB:720p", "StreamSB:480p", "StreamSB:360p", "StreamSB:240p", "StreamSB:144p", // StreamSB
|
||||||
"YourUpload", "DoodStream", "StreamTape"
|
"YourUpload", "DoodStream", "StreamTape",
|
||||||
) // video servers without resolution
|
) // video servers without resolution
|
||||||
entryValues = arrayOf(
|
entryValues = arrayOf(
|
||||||
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
|
"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
|
"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
|
"StreamSB:1080p", "StreamSB:720p", "StreamSB:480p", "StreamSB:360p", "StreamSB:240p", "StreamSB:144p", // StreamSB
|
||||||
"YourUpload", "DoodStream", "StreamTape"
|
"YourUpload", "DoodStream", "StreamTape",
|
||||||
) // video servers without resolution
|
) // video servers without resolution
|
||||||
setDefaultValue("Fembed:720p")
|
setDefaultValue("Fembed:720p")
|
||||||
summary = "%s"
|
summary = "%s"
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,6 +10,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-fembed-extractor'))
|
implementation(project(':lib-fembed-extractor'))
|
||||||
implementation(project(':lib-dood-extractor'))
|
implementation(project(':lib-dood-extractor'))
|
||||||
implementation project(path: ':lib-streamsb-extractor')
|
implementation project(path: ':lib-streamsb-extractor')
|
||||||
|
@ -4,7 +4,6 @@ import android.app.Application
|
|||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.es.cuevana.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
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.fembedextractor.FembedExtractor
|
||||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
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.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
@ -112,14 +112,15 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val langPrefix = try {
|
val langPrefix = try {
|
||||||
val optLanguage = it.parent().attr("id")
|
val optLanguage = it.parent().attr("id")
|
||||||
val languageTag = document.selectFirst("li[data-tplayernv=$optLanguage]").closest(".open_submenu").selectFirst("div:first-child").text()
|
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]"
|
"[LAT]"
|
||||||
else if (languageTag.lowercase().contains("españa"))
|
} else if (languageTag.lowercase().contains("españa")) {
|
||||||
"[CAST]"
|
"[CAST]"
|
||||||
else if (languageTag.lowercase().contains("subtitulado"))
|
} else if (languageTag.lowercase().contains("subtitulado")) {
|
||||||
"[SUB]"
|
"[SUB]"
|
||||||
else
|
} else {
|
||||||
""
|
""
|
||||||
|
}
|
||||||
} catch (e: Exception) { "" }
|
} catch (e: Exception) { "" }
|
||||||
val iframe = urlServerSolver(it.attr("data-src"))
|
val iframe = urlServerSolver(it.attr("data-src"))
|
||||||
if (iframe.contains("api.cuevana3.me/fembed/")) {
|
if (iframe.contains("api.cuevana3.me/fembed/")) {
|
||||||
@ -255,12 +256,12 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
} catch (e: Exception) { }
|
} catch (e: Exception) { }
|
||||||
}
|
}
|
||||||
if (normalizeUrl.contains("yourupload")) {
|
if (normalizeUrl.contains("yourupload")) {
|
||||||
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
|
|
||||||
val videos = YourUploadExtractor(client).videoFromUrl(url, headers = headers)
|
val videos = YourUploadExtractor(client).videoFromUrl(url, headers = headers)
|
||||||
videos.map { videoList.add(it) }
|
videoList.addAll(videos)
|
||||||
}
|
}
|
||||||
if (normalizeUrl.contains("doodstream") || normalizeUrl.contains("dood.")) {
|
if (normalizeUrl.contains("doodstream") || normalizeUrl.contains("dood.")) {
|
||||||
DoodExtractor(client).videoFromUrl(url, "$prefix DoodStream", false)
|
DoodExtractor(client).videoFromUrl(url, "$prefix DoodStream", false)
|
||||||
|
?.let { videoList.add(it) }
|
||||||
}
|
}
|
||||||
if (normalizeUrl.contains("sbstream")) {
|
if (normalizeUrl.contains("sbstream")) {
|
||||||
runCatching {
|
runCatching {
|
||||||
@ -268,7 +269,9 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
}.getOrNull()?.let { videoList.addAll(it) }
|
}.getOrNull()?.let { videoList.addAll(it) }
|
||||||
}
|
}
|
||||||
if (normalizeUrl.contains("okru")) {
|
if (normalizeUrl.contains("okru")) {
|
||||||
OkruExtractor(client).videosFromUrl(url, prefix, true)
|
videoList.addAll(
|
||||||
|
OkruExtractor(client).videosFromUrl(url, prefix, true),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
return videoList
|
return videoList
|
||||||
}
|
}
|
||||||
@ -290,7 +293,7 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun List<Video>.sort(): List<Video> {
|
override fun List<Video>.sort(): List<Video> {
|
||||||
return try {
|
return try {
|
||||||
val videoSorted = this.sortedWith(
|
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()
|
).toTypedArray()
|
||||||
val userPreferredQuality = preferences.getString("preferred_quality", "Voex")
|
val userPreferredQuality = preferences.getString("preferred_quality", "Voex")
|
||||||
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
|
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
|
||||||
@ -347,7 +350,7 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
||||||
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
||||||
GenreFilter()
|
GenreFilter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class GenreFilter : UriPartFilter(
|
private class GenreFilter : UriPartFilter(
|
||||||
@ -370,8 +373,8 @@ class Cuevana : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("Musical", "musical"),
|
Pair("Musical", "musical"),
|
||||||
Pair("Romance", "romance"),
|
Pair("Romance", "romance"),
|
||||||
Pair("Terror", "terror"),
|
Pair("Terror", "terror"),
|
||||||
Pair("Thriller", "thriller")
|
Pair("Thriller", "thriller"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
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
|
"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
|
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
|
||||||
"Streamlare:1080p", "Streamlare:720p", "Streamlare:480p", "Streamlare:360p", "Streamlare:240p", // Streamlare
|
"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 {
|
val videoQualityPref = ListPreference(screen.context).apply {
|
||||||
key = "preferred_quality"
|
key = "preferred_quality"
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,6 +11,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-streamtape-extractor'))
|
implementation(project(':lib-streamtape-extractor'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ import android.app.Application
|
|||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.es.jkhentai.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
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.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
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.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
@ -47,7 +47,7 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun popularAnimeFromElement(element: Element): SAnime {
|
override fun popularAnimeFromElement(element: Element): SAnime {
|
||||||
val anime = SAnime.create()
|
val anime = SAnime.create()
|
||||||
anime.setUrlWithoutDomain(
|
anime.setUrlWithoutDomain(
|
||||||
element.select("div.imagen a").attr("href")
|
element.select("div.imagen a").attr("href"),
|
||||||
)
|
)
|
||||||
anime.title = element.select("h2").text()
|
anime.title = element.select("h2").text()
|
||||||
anime.thumbnail_url = element.select("div.imagen img").attr("src")
|
anime.thumbnail_url = element.select("div.imagen img").attr("src")
|
||||||
@ -84,18 +84,16 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val videoList = mutableListOf<Video>()
|
val videoList = mutableListOf<Video>()
|
||||||
document.select("div#contenedor div.items.ptts div#movie div.post div#player-container ul.player-menu li").forEach { it ->
|
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()
|
val server = it.select("a").text()
|
||||||
document.select("div#contenedor div.items.ptts div#movie div.post div#player-container div.play-c").forEach() {
|
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 url = it.select("div.player-content iframe").attr("src")
|
||||||
val video = StreamTapeExtractor(client).videoFromUrl(url, server)
|
when (server) {
|
||||||
if (video != null) {
|
"StreamTape" ->
|
||||||
videoList.add(video)
|
StreamTapeExtractor(client).videoFromUrl(url, server)
|
||||||
}
|
?.also { videoList.add(it) }
|
||||||
}
|
"Upload" ->
|
||||||
if (server == "Upload") {
|
YourUploadExtractor(client).videoFromUrl(url, headers = headers)
|
||||||
val url = it.select("div.player-content iframe").attr("src")
|
.also { videoList.addAll(it) }
|
||||||
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
|
else -> null
|
||||||
YourUploadExtractor(client).videoFromUrl(url, headers = headers).map { vid -> videoList.add(vid) }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -111,7 +109,7 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun List<Video>.sort(): List<Video> {
|
override fun List<Video>.sort(): List<Video> {
|
||||||
return try {
|
return try {
|
||||||
val videoSorted = this.sortedWith(
|
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()
|
).toTypedArray()
|
||||||
val userPreferredQuality = preferences.getString("preferred_quality", "StreamTape")
|
val userPreferredQuality = preferences.getString("preferred_quality", "StreamTape")
|
||||||
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
|
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
|
||||||
@ -167,7 +165,7 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
||||||
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
||||||
GenreFilter()
|
GenreFilter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class GenreFilter : UriPartFilter(
|
private class GenreFilter : UriPartFilter(
|
||||||
@ -215,8 +213,8 @@ class Jkhentai : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("Maids", "maids"),
|
Pair("Maids", "maids"),
|
||||||
Pair("Netorase", "netorase"),
|
Pair("Netorase", "netorase"),
|
||||||
Pair("Shota", "shota"),
|
Pair("Shota", "shota"),
|
||||||
Pair("Succubus", "succubus")
|
Pair("Succubus", "succubus"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,6 +10,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-fembed-extractor'))
|
implementation(project(':lib-fembed-extractor'))
|
||||||
implementation(project(':lib-okru-extractor'))
|
implementation(project(':lib-okru-extractor'))
|
||||||
implementation(project(':lib-dood-extractor'))
|
implementation(project(':lib-dood-extractor'))
|
||||||
|
@ -7,7 +7,6 @@ import androidx.preference.ListPreference
|
|||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.es.latanime.extractors.Mp4uploadExtractor
|
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.UploadExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.es.latanime.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
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.fembedextractor.FembedExtractor
|
||||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
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.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
@ -106,7 +106,7 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
||||||
YearFilter(),
|
YearFilter(),
|
||||||
GenreFilter(),
|
GenreFilter(),
|
||||||
LetterFilter()
|
LetterFilter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class YearFilter : UriPartFilter(
|
private class YearFilter : UriPartFilter(
|
||||||
@ -154,8 +154,8 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("1985", "1985"),
|
Pair("1985", "1985"),
|
||||||
Pair("1984", "1984"),
|
Pair("1984", "1984"),
|
||||||
Pair("1983", "1983"),
|
Pair("1983", "1983"),
|
||||||
Pair("1982", "1982")
|
Pair("1982", "1982"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class GenreFilter : UriPartFilter(
|
private class GenreFilter : UriPartFilter(
|
||||||
@ -207,8 +207,8 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("Aenime", "aenime"),
|
Pair("Aenime", "aenime"),
|
||||||
Pair("Donghua", "donghua"),
|
Pair("Donghua", "donghua"),
|
||||||
Pair("Blu-ray", "blu-ray"),
|
Pair("Blu-ray", "blu-ray"),
|
||||||
Pair("Monogatari", "monogatari")
|
Pair("Monogatari", "monogatari"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class LetterFilter : UriPartFilter(
|
private class LetterFilter : UriPartFilter(
|
||||||
@ -241,8 +241,8 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("W", "W"),
|
Pair("W", "W"),
|
||||||
Pair("X", "X"),
|
Pair("X", "X"),
|
||||||
Pair("Y", "Y"),
|
Pair("Y", "Y"),
|
||||||
Pair("Z", "Z")
|
Pair("Z", "Z"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
||||||
@ -332,8 +332,7 @@ class Latanime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
videoList.addAll(videos)
|
videoList.addAll(videos)
|
||||||
}
|
}
|
||||||
url.contains("yourupload") -> {
|
url.contains("yourupload") -> {
|
||||||
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
|
val videos = YourUploadExtractor(client).videoFromUrl(url, headers = headers, name = "Original", prefix = prefix)
|
||||||
val videos = YourUploadExtractor(client).videoFromUrl(url, headers = headers, prefix = prefix)
|
|
||||||
videoList.addAll(videos)
|
videoList.addAll(videos)
|
||||||
}
|
}
|
||||||
url.contains("sbembed.com") || url.contains("sbembed1.com") || url.contains("sbplay.org") ||
|
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")!!
|
val quality = preferences.getString("preferred_quality", "1080")!!
|
||||||
|
|
||||||
return this.sortedWith(
|
return this.sortedWith(
|
||||||
compareBy { it.quality.contains(quality) }
|
compareBy { it.quality.contains(quality) },
|
||||||
).reversed()
|
).reversed()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,6 +10,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-fembed-extractor'))
|
implementation(project(':lib-fembed-extractor'))
|
||||||
implementation(project(':lib-streamtape-extractor'))
|
implementation(project(':lib-streamtape-extractor'))
|
||||||
implementation(project(':lib-okru-extractor'))
|
implementation(project(':lib-okru-extractor'))
|
||||||
|
@ -6,7 +6,6 @@ import androidx.preference.ListPreference
|
|||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.es.legionanime.extractors.JkanimeExtractor
|
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.Mp4uploadExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.es.legionanime.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animeextension.es.legionanime.extractors.ZippyExtractor
|
import eu.kanade.tachiyomi.animeextension.es.legionanime.extractors.ZippyExtractor
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
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.fembedextractor.FembedExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
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.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
@ -99,7 +99,8 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val body = FormBody.Builder().add("apyki", apyki).build()
|
val body = FormBody.Builder().add("apyki", apyki).build()
|
||||||
return POST(
|
return POST(
|
||||||
"$baseUrl/v2/directories?studio=0¬_genre=&year=&orderBy=2&language=&type=&duration=&search=&letter=0&limit=24&genre=&season=&page=${(page - 1) * 24}&status=",
|
"$baseUrl/v2/directories?studio=0¬_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()
|
val body = FormBody.Builder().add("apyki", apyki).build()
|
||||||
return POST(
|
return POST(
|
||||||
"$baseUrl/v2/directories?studio=0¬_genre=&year=&orderBy=4&language=&type=&duration=&search=&letter=0&limit=24&genre=&season=&page=${(page - 1) * 24}&status=",
|
"$baseUrl/v2/directories?studio=0¬_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
|
thumbnail_url = aip.random() + animeDetail["img_url"]!!.jsonPrimitive.content
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
true
|
true,
|
||||||
)
|
)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
return AnimesPage(emptyList(), false)
|
return AnimesPage(emptyList(), false)
|
||||||
@ -145,16 +147,22 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val genre = try {
|
val genre = try {
|
||||||
if (genreFilter.isNotEmpty()) {
|
if (genreFilter.isNotEmpty()) {
|
||||||
genreFilter.filter { it.state }.map { genres[it.name] }.joinToString("%2C") { it.toString() }
|
genreFilter.filter { it.state }.map { genres[it.name] }.joinToString("%2C") { it.toString() }
|
||||||
} else ""
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
} catch (e: Exception) { "" }
|
} catch (e: Exception) { "" }
|
||||||
|
|
||||||
val excludeGenre = if (excludeGenreFilter.isNotEmpty()) {
|
val excludeGenre = if (excludeGenreFilter.isNotEmpty()) {
|
||||||
excludeGenreFilter.filter { it.state }.map { genres[it.name] }.joinToString("%2C") { it.toString() }
|
excludeGenreFilter.filter { it.state }.map { genres[it.name] }.joinToString("%2C") { it.toString() }
|
||||||
} else ""
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
|
||||||
val studio = if (studioFilter.isNotEmpty()) {
|
val studio = if (studioFilter.isNotEmpty()) {
|
||||||
studioFilter.filter { it.state }.map { studiosMap[it.name] }.joinToString("%2C") { it.toString() }
|
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 ""
|
val status = if (stateFilter.state != 0) stateFilter.toUriPart() else ""
|
||||||
|
|
||||||
@ -162,7 +170,8 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
return POST(
|
return POST(
|
||||||
url,
|
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
|
thumbnail_url = aip.random() + animeDetail["img_url"]!!.jsonPrimitive.content
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
false
|
false,
|
||||||
)
|
)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
return AnimesPage(emptyList(), false)
|
return AnimesPage(emptyList(), false)
|
||||||
@ -231,7 +240,6 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
url.contains("yourupload") -> {
|
url.contains("yourupload") -> {
|
||||||
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
|
|
||||||
videoList.addAll(YourUploadExtractor(client).videoFromUrl(url, headers))
|
videoList.addAll(YourUploadExtractor(client).videoFromUrl(url, headers))
|
||||||
}
|
}
|
||||||
url.contains("zippyshare") -> {
|
url.contains("zippyshare") -> {
|
||||||
@ -269,7 +277,7 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
return POST(
|
return POST(
|
||||||
episode.url,
|
episode.url,
|
||||||
headers1,
|
headers1,
|
||||||
body
|
body,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,7 +298,7 @@ class LegionAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("Emision", "1"),
|
Pair("Emision", "1"),
|
||||||
Pair("Finalizado", "2"),
|
Pair("Finalizado", "2"),
|
||||||
Pair("Proximamente", "3"),
|
Pair("Proximamente", "3"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
class TagCheckBox(tag: String) : AnimeFilter.CheckBox(tag, false)
|
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
|
"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
|
"Okru:1080p", "Okru:720p", "Okru:480p", "Okru:360p", "Okru:240p", // Okru
|
||||||
"StreamSB:360p", "StreamSB:480p", "StreamSB:720p", "StreamSB:1080p", // StreamSB
|
"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 {
|
val videoQualityPref = ListPreference(screen.context).apply {
|
||||||
key = "preferred_quality"
|
key = "preferred_quality"
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.animeextension.es.monoschinos
|
|||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import android.util.Log
|
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.es.monoschinos.extractors.Mp4uploadExtractor
|
import eu.kanade.tachiyomi.animeextension.es.monoschinos.extractors.Mp4uploadExtractor
|
||||||
|
@ -10,6 +10,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-fembed-extractor'))
|
implementation(project(':lib-fembed-extractor'))
|
||||||
implementation(project(':lib-streamtape-extractor'))
|
implementation(project(':lib-streamtape-extractor'))
|
||||||
implementation(project(':lib-streamsb-extractor'))
|
implementation(project(':lib-streamsb-extractor'))
|
||||||
|
@ -6,7 +6,6 @@ import android.util.Base64
|
|||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.StreamlareExtractor
|
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.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
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.streamsbextractor.StreamSBExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
||||||
import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor
|
import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor
|
||||||
|
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
@ -52,7 +52,7 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun popularAnimeFromElement(element: Element): SAnime {
|
override fun popularAnimeFromElement(element: Element): SAnime {
|
||||||
val anime = SAnime.create()
|
val anime = SAnime.create()
|
||||||
anime.setUrlWithoutDomain(
|
anime.setUrlWithoutDomain(
|
||||||
element.select("a").attr("href")
|
element.select("a").attr("href"),
|
||||||
)
|
)
|
||||||
anime.title = element.select("a div.listing-content p").text()
|
anime.title = element.select("a div.listing-content p").text()
|
||||||
anime.thumbnail_url = element.select("a img").attr("src").replace("/w154/", "/w200/")
|
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/")
|
val url2 = url.replace("https://doodstream.com/e/", "https://dood.to/e/")
|
||||||
DoodExtractor(client).videoFromUrl(url2, "DoodStream", false)?.let { videoList.add(it) }
|
DoodExtractor(client).videoFromUrl(url2, "DoodStream", false)?.let { videoList.add(it) }
|
||||||
} else if (server.lowercase() == "upload") {
|
} else if (server.lowercase() == "upload") {
|
||||||
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
|
|
||||||
return YourUploadExtractor(client).videoFromUrl(url, headers = headers)
|
return YourUploadExtractor(client).videoFromUrl(url, headers = headers)
|
||||||
}
|
}
|
||||||
} catch (_: Exception) {}
|
} catch (_: Exception) {}
|
||||||
@ -212,7 +211,7 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun List<Video>.sort(): List<Video> {
|
override fun List<Video>.sort(): List<Video> {
|
||||||
return try {
|
return try {
|
||||||
val videoSorted = this.sortedWith(
|
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()
|
).toTypedArray()
|
||||||
val userPreferredQuality = preferences.getString("preferred_quality", "Voex")
|
val userPreferredQuality = preferences.getString("preferred_quality", "Voex")
|
||||||
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
|
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"),
|
AnimeFilter.Header("La busqueda por texto ignora el filtro de año"),
|
||||||
GenreFilter(),
|
GenreFilter(),
|
||||||
AnimeFilter.Header("Busqueda por año"),
|
AnimeFilter.Header("Busqueda por año"),
|
||||||
Tags("Año")
|
Tags("Año"),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class GenreFilter : UriPartFilter(
|
private class GenreFilter : UriPartFilter(
|
||||||
@ -301,8 +300,8 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
Pair("Romance", "generos/romance"),
|
Pair("Romance", "generos/romance"),
|
||||||
Pair("Suspense", "generos/suspense"),
|
Pair("Suspense", "generos/suspense"),
|
||||||
Pair("Terror", "generos/terror"),
|
Pair("Terror", "generos/terror"),
|
||||||
Pair("Western", "generos/western")
|
Pair("Western", "generos/western"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class Tags(name: String) : AnimeFilter.Text(name)
|
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
|
"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
|
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
|
||||||
"Streamlare:1080p", "Streamlare:720p", "Streamlare:480p", "Streamlare:360p", "Streamlare:240p", // Streamlare
|
"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 {
|
val videoQualityPref = ListPreference(screen.context).apply {
|
||||||
key = "preferred_quality"
|
key = "preferred_quality"
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,6 +10,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-fembed-extractor'))
|
implementation(project(':lib-fembed-extractor'))
|
||||||
implementation(project(':lib-okru-extractor'))
|
implementation(project(':lib-okru-extractor'))
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import android.app.Application
|
|||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.es.tioanimeh.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
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.animesource.online.ParsedAnimeHttpSource
|
||||||
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
|
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
|
||||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
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.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
@ -87,15 +87,16 @@ open class TioanimeH(override val name: String, override val baseUrl: String) :
|
|||||||
when (serverName.lowercase()) {
|
when (serverName.lowercase()) {
|
||||||
"fembed" -> {
|
"fembed" -> {
|
||||||
videoList.addAll(
|
videoList.addAll(
|
||||||
FembedExtractor(client).videosFromUrl(serverUrl)
|
FembedExtractor(client).videosFromUrl(serverUrl),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
"okru" -> {
|
"okru" -> {
|
||||||
OkruExtractor(client).videosFromUrl(serverUrl).map { vid -> videoList.add(vid) }
|
OkruExtractor(client).videosFromUrl(serverUrl).map { vid -> videoList.add(vid) }
|
||||||
}
|
}
|
||||||
"yourupload" -> {
|
"yourupload" -> {
|
||||||
val headers = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
|
videoList.addAll(
|
||||||
YourUploadExtractor(client).videoFromUrl(serverUrl, headers = headers).map { vid -> videoList.add(vid) }
|
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> {
|
override fun List<Video>.sort(): List<Video> {
|
||||||
return try {
|
return try {
|
||||||
val videoSorted = this.sortedWith(
|
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()
|
).toTypedArray()
|
||||||
val userPreferredQuality = preferences.getString("preferred_quality", "Fembed:720p")
|
val userPreferredQuality = preferences.getString("preferred_quality", "Fembed:720p")
|
||||||
val preferredIdx = videoSorted.indexOfFirst { x -> x.quality == userPreferredQuality }
|
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(
|
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
||||||
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
||||||
GenreFilter()
|
GenreFilter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
class GenreFilter : UriPartFilter(
|
class GenreFilter : UriPartFilter(
|
||||||
@ -204,7 +205,7 @@ open class TioanimeH(override val name: String, override val baseUrl: String) :
|
|||||||
Pair("Virgenes(como tu)", "virgenes"),
|
Pair("Virgenes(como tu)", "virgenes"),
|
||||||
Pair("Yaoi", "Yaoi"),
|
Pair("Yaoi", "Yaoi"),
|
||||||
Pair("Yuri", "yuri"),
|
Pair("Yuri", "yuri"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
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(
|
val qualities = arrayOf(
|
||||||
"Fembed:1080p", "Fembed:720p", "Fembed:480p", "Fembed:360p", "Fembed:240p", "Fembed:144p", // Fembed
|
"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
|
"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 {
|
val videoQualityPref = ListPreference(screen.context).apply {
|
||||||
key = "preferred_quality"
|
key = "preferred_quality"
|
||||||
|
@ -9,7 +9,7 @@ import okhttp3.Request
|
|||||||
class TioanimeHFactory : AnimeSourceFactory {
|
class TioanimeHFactory : AnimeSourceFactory {
|
||||||
override fun createSources(): List<AnimeSource> = listOf(
|
override fun createSources(): List<AnimeSource> = listOf(
|
||||||
tioanime(),
|
tioanime(),
|
||||||
tiohentai()
|
tiohentai(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ class tioanime : TioanimeH("TioAnime", "https://tioanime.com") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
||||||
GenreFilter()
|
GenreFilter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class GenreFilter : UriPartFilter(
|
private class GenreFilter : UriPartFilter(
|
||||||
@ -71,8 +71,8 @@ class tioanime : TioanimeH("TioAnime", "https://tioanime.com") {
|
|||||||
Pair("Terror", "terror"),
|
Pair("Terror", "terror"),
|
||||||
Pair("Vampiros", "vampiros"),
|
Pair("Vampiros", "vampiros"),
|
||||||
Pair("Yaoi", "yaoi"),
|
Pair("Yaoi", "yaoi"),
|
||||||
Pair("Yuri", "yuri")
|
Pair("Yuri", "yuri"),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,6 +11,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
|
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.LinkBoxExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.id.kuronime.extractors.Mp4uploadExtractor
|
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.StreamlareExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.id.kuronime.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
import eu.kanade.tachiyomi.animesource.model.SAnime
|
import eu.kanade.tachiyomi.animesource.model.SAnime
|
||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
|
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
@ -127,7 +127,7 @@ class Kuronime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
val hosterSelection = preferences.getStringSet(
|
val hosterSelection = preferences.getStringSet(
|
||||||
"hoster_selection",
|
"hoster_selection",
|
||||||
setOf("animeku", "mp4upload", "yourupload", "streamlare", "linkbox")
|
setOf("animeku", "mp4upload", "yourupload", "streamlare", "linkbox"),
|
||||||
)!!
|
)!!
|
||||||
|
|
||||||
document.select("select.mirror > option[value]").forEach { opt ->
|
document.select("select.mirror > option[value]").forEach { opt ->
|
||||||
@ -135,7 +135,7 @@ class Kuronime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
document.selectFirst("iframe").attr("data-src")
|
document.selectFirst("iframe").attr("data-src")
|
||||||
} else {
|
} else {
|
||||||
Jsoup.parse(
|
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")
|
).select("iframe[data-src~=.]").attr("data-src")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,8 +148,7 @@ class Kuronime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
videoList.addAll(Mp4uploadExtractor(client).getVideoFromUrl(decoded, headers, opt.text()))
|
videoList.addAll(Mp4uploadExtractor(client).getVideoFromUrl(decoded, headers, opt.text()))
|
||||||
}
|
}
|
||||||
hosterSelection.contains("yourupload") && decoded.contains("yourupload.com") -> {
|
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(), "Original - "))
|
||||||
videoList.addAll(YourUploadExtractor(client).videoFromUrl(decoded, headers, opt.text()))
|
|
||||||
}
|
}
|
||||||
hosterSelection.contains("streamlare") && decoded.contains("streamlare.com") -> {
|
hosterSelection.contains("streamlare") && decoded.contains("streamlare.com") -> {
|
||||||
videoList.addAll(StreamlareExtractor(client).videosFromUrl(decoded, opt.text()))
|
videoList.addAll(StreamlareExtractor(client).videosFromUrl(decoded, opt.text()))
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,6 +11,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-fembed-extractor'))
|
implementation(project(':lib-fembed-extractor'))
|
||||||
implementation(project(':lib-okru-extractor'))
|
implementation(project(':lib-okru-extractor'))
|
||||||
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
|
implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1"
|
||||||
|
@ -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.BloggerExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.GdrivePlayerExtractor
|
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.LinkBoxExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.YourUploadExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimesPage
|
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.animesource.online.ParsedAnimeHttpSource
|
||||||
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
|
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
|
||||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
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.GET
|
||||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
@ -210,7 +210,7 @@ class NeoNime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
val hosterSelection = preferences.getStringSet(
|
val hosterSelection = preferences.getStringSet(
|
||||||
"hoster_selection",
|
"hoster_selection",
|
||||||
setOf("blogger", "linkbox", "fembed", "okru", "yourupload", "gdriveplayer")
|
setOf("blogger", "linkbox", "fembed", "okru", "yourupload", "gdriveplayer"),
|
||||||
)!!
|
)!!
|
||||||
|
|
||||||
document.select("div.player2 > div.embed2 > div").forEach {
|
document.select("div.player2 > div.embed2 > div").forEach {
|
||||||
@ -235,17 +235,19 @@ class NeoNime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
videoList.addAll(BloggerExtractor(client).videosFromUrl(link, it.text()))
|
videoList.addAll(BloggerExtractor(client).videosFromUrl(link, it.text()))
|
||||||
}
|
}
|
||||||
hosterSelection.contains("linkbox") && link.contains("yourupload.com") -> {
|
hosterSelection.contains("linkbox") && link.contains("yourupload.com") -> {
|
||||||
val yuHeaders = headers.newBuilder().add("referer", "https://www.yourupload.com/").build()
|
videoList.addAll(YourUploadExtractor(client).videoFromUrl(link, headers, it.text(), "Original - "))
|
||||||
videoList.addAll(YourUploadExtractor(client).videoFromUrl(link, yuHeaders, it.text()))
|
|
||||||
}
|
}
|
||||||
hosterSelection.contains("gdriveplayer") && link.contains("neonime.fun") -> {
|
hosterSelection.contains("gdriveplayer") && link.contains("neonime.fun") -> {
|
||||||
val headers = Headers.headersOf(
|
val headers = Headers.headersOf(
|
||||||
"Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
"Accept",
|
||||||
"Referer", response.request.url.toString(),
|
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
||||||
"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0"
|
"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(
|
var iframe = client.newCall(
|
||||||
GET(link, headers = headers)
|
GET(link, headers = headers),
|
||||||
).execute().asJsoup()
|
).execute().asJsoup()
|
||||||
|
|
||||||
var iframeUrl = iframe.selectFirst("iframe").attr("src")
|
var iframeUrl = iframe.selectFirst("iframe").attr("src")
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user