feat(pl/OgladajAnime): Update OgladajANime and Add new Lib
This commit is contained in:
parent
896bbe57a1
commit
615be7605e
4 changed files with 103 additions and 5 deletions
3
lib/lycoris-extractor/build.gradle.kts
Normal file
3
lib/lycoris-extractor/build.gradle.kts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
plugins {
|
||||||
|
id("lib-android")
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
package eu.kanade.tachiyomi.lib.lycorisextractor
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
|
class LycorisCafeExtractor(private val client: OkHttpClient) {
|
||||||
|
|
||||||
|
private val urlApi = "https://zglyjsqsvevnyudbazgy.supabase.co"
|
||||||
|
|
||||||
|
private val apiLycoris = "https://www.lycoris.cafe"
|
||||||
|
|
||||||
|
private val json: Json by injectLazy()
|
||||||
|
|
||||||
|
fun getVideosFromUrl(url: String, headers: Headers, prefix: String): List<Video> {
|
||||||
|
val embedHeaders = headers.newBuilder()
|
||||||
|
.add("apikey", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InpnbHlqc3FzdmV2bnl1ZGJhemd5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2OTM0ODYxNjYsImV4cCI6MjAwOTA2MjE2Nn0.H-_D56Tk5_8ebK9X700aFFI-zOPavq7ikhRNtU2njQ0")
|
||||||
|
.add("Host", "zglyjsqsvevnyudbazgy.supabase.co")
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val httpUrl = url.toHttpUrl()
|
||||||
|
val title = httpUrl.queryParameter("title")
|
||||||
|
val episode = httpUrl.queryParameter("episode")
|
||||||
|
|
||||||
|
val response = client.newCall(
|
||||||
|
GET("$urlApi/rest/v1/anime?select=video_links&anime_title=eq.${title}&episode_number=eq.${episode}", headers = embedHeaders)
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
// Parse the document to extract JSON
|
||||||
|
val document = response.asJsoup()
|
||||||
|
val jsonString = document.body().text() // Extracts the text content of the body tag
|
||||||
|
|
||||||
|
// Deserialize JSON
|
||||||
|
val data: List<PlayerData> = json.decodeFromString(jsonString)
|
||||||
|
|
||||||
|
// Create Video objects for each quality
|
||||||
|
val videos = mutableListOf<Video>()
|
||||||
|
data.firstOrNull()?.video_links?.let { videoLinks ->
|
||||||
|
val sdLink = resolveLink(videoLinks.SD, headers)
|
||||||
|
val hdLink = resolveLink(videoLinks.HD, headers)
|
||||||
|
val fhdLink = resolveLink(videoLinks.FHD, headers)
|
||||||
|
|
||||||
|
if (fhdLink.isNotEmpty()) {
|
||||||
|
videos.add(Video(fhdLink, "${prefix}lycoris.cafe - 1080p", fhdLink))
|
||||||
|
}
|
||||||
|
if (hdLink.isNotEmpty()) {
|
||||||
|
videos.add(Video(hdLink, "${prefix}lycoris.cafe - 720p", hdLink))
|
||||||
|
}
|
||||||
|
if (sdLink.isNotEmpty()) {
|
||||||
|
videos.add(Video(sdLink, "${prefix}lycoris.cafe - 480p", sdLink))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return videos
|
||||||
|
}
|
||||||
|
private fun resolveLink(link: String, headers: Headers): String {
|
||||||
|
return if(!link.startsWith("https://")) decodeOrFetchLink(link, headers) else link
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun decodeOrFetchLink(encodedUrl: String, headers: Headers): String {
|
||||||
|
val response = client.newCall(GET("$apiLycoris/api/getLink?id=$encodedUrl", headers = headers)).execute()
|
||||||
|
return response.body?.string().orEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class PlayerData(
|
||||||
|
val video_links: VideoLinks,
|
||||||
|
) {
|
||||||
|
@Serializable
|
||||||
|
data class VideoLinks(
|
||||||
|
val HD: String = "",
|
||||||
|
val SD: String = "",
|
||||||
|
val FHD: String = "",
|
||||||
|
val Source: String = "",
|
||||||
|
val SourceMKV: String = ""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
ext {
|
ext {
|
||||||
extName = 'OgladajAnime'
|
extName = 'OgladajAnime'
|
||||||
extClass = '.OgladajAnime'
|
extClass = '.OgladajAnime'
|
||||||
extVersionCode = 3
|
extVersionCode = 5
|
||||||
isNsfw = true
|
isNsfw = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,4 +14,6 @@ dependencies {
|
||||||
implementation(project(':lib:vk-extractor'))
|
implementation(project(':lib:vk-extractor'))
|
||||||
implementation(project(':lib:googledrive-extractor'))
|
implementation(project(':lib:googledrive-extractor'))
|
||||||
implementation(project(':lib:cda-extractor'))
|
implementation(project(':lib:cda-extractor'))
|
||||||
|
implementation(project(':lib:dood-extractor'))
|
||||||
|
implementation(project(':lib:lycoris-extractor'))
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@ 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.cdaextractor.CdaPlExtractor
|
import eu.kanade.tachiyomi.lib.cdaextractor.CdaPlExtractor
|
||||||
import eu.kanade.tachiyomi.lib.dailymotionextractor.DailymotionExtractor
|
import eu.kanade.tachiyomi.lib.dailymotionextractor.DailymotionExtractor
|
||||||
|
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
||||||
|
import eu.kanade.tachiyomi.lib.lycorisextractor.LycorisCafeExtractor
|
||||||
import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor
|
import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor
|
||||||
import eu.kanade.tachiyomi.lib.sibnetextractor.SibnetExtractor
|
import eu.kanade.tachiyomi.lib.sibnetextractor.SibnetExtractor
|
||||||
import eu.kanade.tachiyomi.lib.vkextractor.VkExtractor
|
import eu.kanade.tachiyomi.lib.vkextractor.VkExtractor
|
||||||
|
@ -57,7 +59,7 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
|
|
||||||
// ============================== Popular ===============================
|
// ============================== Popular ===============================
|
||||||
override fun popularAnimeRequest(page: Int): Request {
|
override fun popularAnimeRequest(page: Int): Request {
|
||||||
return GET("$baseUrl/search/page/$page", headers)
|
return GET("$baseUrl/search/page/$page", apiHeaders)
|
||||||
}
|
}
|
||||||
override fun popularAnimeSelector(): String = "div#anime_main div.card.bg-white"
|
override fun popularAnimeSelector(): String = "div#anime_main div.card.bg-white"
|
||||||
|
|
||||||
|
@ -72,7 +74,7 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
|
|
||||||
// =============================== Latest ===============================
|
// =============================== Latest ===============================
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/search/new/$page", headers)
|
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/search/new/$page", apiHeaders)
|
||||||
|
|
||||||
override fun latestUpdatesSelector(): String = popularAnimeSelector()
|
override fun latestUpdatesSelector(): String = popularAnimeSelector()
|
||||||
|
|
||||||
|
@ -82,7 +84,7 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
|
|
||||||
// =============================== Search ===============================
|
// =============================== Search ===============================
|
||||||
|
|
||||||
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request = GET("$baseUrl/search/name/$query", headers)
|
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request = GET("$baseUrl/search/name/$query", apiHeaders)
|
||||||
|
|
||||||
override fun searchAnimeFromElement(element: Element): SAnime = popularAnimeFromElement(element)
|
override fun searchAnimeFromElement(element: Element): SAnime = popularAnimeFromElement(element)
|
||||||
|
|
||||||
|
@ -176,6 +178,8 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
private val mp4uploadExtractor by lazy { Mp4uploadExtractor(client) }
|
private val mp4uploadExtractor by lazy { Mp4uploadExtractor(client) }
|
||||||
private val dailymotionExtractor by lazy { DailymotionExtractor(client, headers) }
|
private val dailymotionExtractor by lazy { DailymotionExtractor(client, headers) }
|
||||||
private val sibnetExtractor by lazy { SibnetExtractor(client) }
|
private val sibnetExtractor by lazy { SibnetExtractor(client) }
|
||||||
|
private val doodExtractor by lazy { DoodExtractor(client) }
|
||||||
|
private val lycorisExtractor by lazy { LycorisCafeExtractor(client) }
|
||||||
|
|
||||||
override fun videoListParse(response: Response): List<Video> {
|
override fun videoListParse(response: Response): List<Video> {
|
||||||
val jsonResponse = json.decodeFromString<ApiResponse>(response.body.string())
|
val jsonResponse = json.decodeFromString<ApiResponse>(response.body.string())
|
||||||
|
@ -205,7 +209,7 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.url !in listOf("vk", "cda", "mp4upload", "sibnet", "dailymotion")) {
|
if (player.url !in listOf("vk", "cda", "mp4upload", "sibnet", "dailymotion", "dood", "lycoris")) {
|
||||||
return@mapNotNull null
|
return@mapNotNull null
|
||||||
}
|
}
|
||||||
val url = getPlayerUrl(player.id)
|
val url = getPlayerUrl(player.id)
|
||||||
|
@ -229,6 +233,12 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
serverUrl.contains("sibnet.ru") -> {
|
serverUrl.contains("sibnet.ru") -> {
|
||||||
sibnetExtractor.videosFromUrl(serverUrl, prefix)
|
sibnetExtractor.videosFromUrl(serverUrl, prefix)
|
||||||
}
|
}
|
||||||
|
serverUrl.contains("dood") -> {
|
||||||
|
doodExtractor.videosFromUrl(serverUrl, "$prefix Dood")
|
||||||
|
}
|
||||||
|
serverUrl.contains("lycoris.cafe") -> {
|
||||||
|
lycorisExtractor.getVideosFromUrl(serverUrl, headers, prefix)
|
||||||
|
}
|
||||||
else -> emptyList()
|
else -> emptyList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue