Add docchi, fix lib lycoris/vk/lulustream, fix OgladajAnime #674

Merged
Hayanek merged 7 commits from main into main 2025-02-14 20:33:12 -06:00
4 changed files with 103 additions and 5 deletions
Showing only changes of commit 615be7605e - Show all commits

View file

@ -0,0 +1,3 @@
plugins {
id("lib-android")
}

View file

@ -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 = ""
)
}
}

View file

@ -1,7 +1,7 @@
ext {
extName = 'OgladajAnime'
extClass = '.OgladajAnime'
extVersionCode = 3
extVersionCode = 5
isNsfw = true
}
@ -14,4 +14,6 @@ dependencies {
implementation(project(':lib:vk-extractor'))
implementation(project(':lib:googledrive-extractor'))
implementation(project(':lib:cda-extractor'))
implementation(project(':lib:dood-extractor'))
implementation(project(':lib:lycoris-extractor'))
}

View file

@ -12,6 +12,8 @@ import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
import eu.kanade.tachiyomi.lib.cdaextractor.CdaPlExtractor
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.sibnetextractor.SibnetExtractor
import eu.kanade.tachiyomi.lib.vkextractor.VkExtractor
@ -57,7 +59,7 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// ============================== Popular ===============================
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"
@ -72,7 +74,7 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// =============================== 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()
@ -82,7 +84,7 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// =============================== 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)
@ -176,6 +178,8 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
private val mp4uploadExtractor by lazy { Mp4uploadExtractor(client) }
private val dailymotionExtractor by lazy { DailymotionExtractor(client, headers) }
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> {
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
}
val url = getPlayerUrl(player.id)
@ -229,6 +233,12 @@ class OgladajAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
serverUrl.contains("sibnet.ru") -> {
sibnetExtractor.videosFromUrl(serverUrl, prefix)
}
serverUrl.contains("dood") -> {
doodExtractor.videosFromUrl(serverUrl, "$prefix Dood")
}
serverUrl.contains("lycoris.cafe") -> {
lycorisExtractor.getVideosFromUrl(serverUrl, headers, prefix)
}
else -> emptyList()
}
}