From 896bbe57a14f9d4c41dfffe9d83eb094a1ed291e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20Franti=C5=A1ek=20Straka?= <71689727+JosefFStraka@users.noreply.github.com> Date: Mon, 23 Dec 2024 22:39:23 +0100 Subject: [PATCH] fix: Aniplay (#452) * en/AniPlay: many changes to video fetching and extension structure, added explicit case for Yuki * en/AniPlay: version bump --- src/en/aniplay/build.gradle | 2 +- .../animeextension/en/aniplay/AniPlay.kt | 192 +++++++++++------- .../animeextension/en/aniplay/AniPlayDto.kt | 48 +++-- 3 files changed, 154 insertions(+), 88 deletions(-) diff --git a/src/en/aniplay/build.gradle b/src/en/aniplay/build.gradle index e78b9bfe..64c01315 100644 --- a/src/en/aniplay/build.gradle +++ b/src/en/aniplay/build.gradle @@ -2,7 +2,7 @@ ext { extName = 'AniPlay' extClass = '.AniPlay' themePkg = 'anilist' - overrideVersionCode = 6 + overrideVersionCode = 7 } apply from: "$rootDir/common.gradle" diff --git a/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt b/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt index 5c0b5c1e..40302b02 100644 --- a/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt +++ b/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt @@ -17,7 +17,6 @@ import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils import eu.kanade.tachiyomi.multisrc.anilist.AniListAnimeHttpSource import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.util.parallelFlatMap -import eu.kanade.tachiyomi.util.parallelMap import eu.kanade.tachiyomi.util.parseAs import kotlinx.serialization.SerializationException import kotlinx.serialization.encodeToString @@ -183,99 +182,152 @@ class AniPlay : AniListAnimeHttpSource(), ConfigurableAnimeSource { } ?: emptyList() - val headersWithAction = - headers.newBuilder() - // next.js stuff I guess - .add("Next-Action", getHeaderValue(baseHost, NEXT_ACTION_SOURCES_LIST)) - .build() - var timeouts = 0 var maxTimeout = 0 - val episodeDataList = extras.parallelFlatMap { extra -> + val videos = extras.parallelFlatMap { extra -> val languages = mutableListOf("sub").apply { if (extra.hasDub) add("dub") } - languages.parallelMap { language -> - maxTimeout += 1 + languages.parallelFlatMap { language -> val epNum = if (extra.episodeNum == extra.episodeNum.toInt().toFloat()) { - extra.episodeNum.toInt().toString() // If it has no fractional part, convert it to an integer + extra.episodeNum.toInt().toString() } else { - extra.episodeNum.toString() // If it has a fractional part, leave it as a float + extra.episodeNum.toString() } - val requestBody = "[\"$animeId\",\"${extra.source}\",\"${extra.episodeId}\",\"$epNum\",\"$language\"]" - .toRequestBody("application/json".toMediaType()) - val params = mapOf( "host" to extra.source, "ep" to epNum, "type" to language, ) + val builder = Uri.parse("$baseUrl/anime/watch/$animeId").buildUpon() params.map { (k, v) -> builder.appendQueryParameter(k, v); } - val url = builder.build().toString() + val url = builder.build() + + val headersWithAction = + headers.newBuilder() + .add("Next-Action", getHeaderValue(baseHost, NEXT_ACTION_SOURCES_LIST)) + .build() + + val requestBody = "[\"$animeId\",\"${extra.source}\",\"${extra.episodeId}\",\"$epNum\",\"$language\"]" + .toRequestBody("application/json".toMediaType()) + + val request = POST(url.toString(), headersWithAction, requestBody) + + maxTimeout += 1 try { - val request = POST(url, headersWithAction, requestBody) - val response = client.newCall(request).execute() + getVideos(extra, language, request) + } catch (e: java.net.SocketTimeoutException) { + Log.e("AniPlay", "VideoList $url SocketTimeoutException", e) + timeouts++ + emptyList() + } catch (e: IOException) { + Log.e("AniPlay", "VideoList $url IOException", e) + emptyList() + } catch (e: Exception) { + Log.e("AniPlay", "VideoList $url Exception", e) + emptyList() + } + } + } - val responseString = response.body.string() - val sourcesString = extractSourcesList(responseString) ?: return@parallelMap null - val data = sourcesString.parseAs() + if (videos.isEmpty() && timeouts != 0 && maxTimeout == timeouts) { + throw Exception("Timed out") + } + return videos.sort() + } + + private fun getVideos(extra: EpisodeExtra, language: String, request: Request): List