From fd9fb1273023c50ac3ac047f87cf4de249aaa63d Mon Sep 17 00:00:00 2001 From: cristal-node <47137955+cristal-node@users.noreply.github.com> Date: Sun, 19 Jan 2025 06:02:31 +0900 Subject: [PATCH] feat(all/subsplease): debrid support for all/Subsplease (#568) * adding debrid sources by torrentio api * version update --- src/all/subsplease/build.gradle | 2 +- .../all/subsplease/Subsplease.kt | 88 ++++++++++++++++++- 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/src/all/subsplease/build.gradle b/src/all/subsplease/build.gradle index 9bc65153..076ef4d1 100644 --- a/src/all/subsplease/build.gradle +++ b/src/all/subsplease/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Subsplease' extClass = '.Subsplease' - extVersionCode = 1 + extVersionCode = 2 containsNsfw = false } diff --git a/src/all/subsplease/src/eu/kanade/tachiyomi/animeextension/all/subsplease/Subsplease.kt b/src/all/subsplease/src/eu/kanade/tachiyomi/animeextension/all/subsplease/Subsplease.kt index 250e0045..4eedcc59 100644 --- a/src/all/subsplease/src/eu/kanade/tachiyomi/animeextension/all/subsplease/Subsplease.kt +++ b/src/all/subsplease/src/eu/kanade/tachiyomi/animeextension/all/subsplease/Subsplease.kt @@ -2,6 +2,8 @@ package eu.kanade.tachiyomi.animeextension.all.subsplease import android.app.Application import android.content.SharedPreferences +import android.widget.Toast +import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource @@ -107,6 +109,19 @@ class Subsplease : ConfigurableAnimeSource, AnimeHttpSource() { return videosFromElement(responseString, num) } + private fun debrid(magnet: String): String { + val regex = Regex("xt=urn:btih:([A-Fa-f0-9]{40}|[A-Za-z0-9]{32})|dn=([^&]+)") + var infohash = "" + var title = "" + regex.findAll(magnet).forEach { match -> + match.groups[1]?.value?.let { infohash = it } + match.groups[2]?.value?.let { title = it } + } + val token = preferences.getString(PREF_TOKEN_KEY, null) + val debridProvider = preferences.getString(PREF_DEBRID_KEY, "none") + return "https://torrentio.strem.fun/$debridProvider/$token/$infohash/null/0/$title" + } + private fun videosFromElement(jsonLine: String?, num: String): List<Video> { val jsonData = jsonLine ?: return emptyList() val jObject = json.decodeFromString<JsonObject>(jsonData) @@ -120,7 +135,11 @@ class Subsplease : ConfigurableAnimeSource, AnimeHttpSource() { for (item in dowArray) { val quality = item.jsonObject["res"]!!.jsonPrimitive.content + "p" val videoUrl = item.jsonObject["magnet"]!!.jsonPrimitive.content - videoList.add(Video(videoUrl, quality, videoUrl)) + if (preferences.getString(PREF_DEBRID_KEY, "none") == "none") { + videoList.add(Video(videoUrl, quality, videoUrl)) + } else { + videoList.add(Video(debrid(videoUrl), quality, debrid(videoUrl))) + } } } } @@ -188,7 +207,8 @@ class Subsplease : ConfigurableAnimeSource, AnimeHttpSource() { // Preferences override fun setupPreferenceScreen(screen: PreferenceScreen) { - val qualityPref = ListPreference(screen.context).apply { + // quality + ListPreference(screen.context).apply { key = "preferred_quality" title = "Default-Quality" entries = arrayOf("1080p", "720p", "480p") @@ -202,7 +222,67 @@ class Subsplease : ConfigurableAnimeSource, AnimeHttpSource() { val entry = entryValues[index] as String preferences.edit().putString(key, entry).commit() } - } - screen.addPreference(qualityPref) + }.also(screen::addPreference) + + // Debrid provider + ListPreference(screen.context).apply { + key = PREF_DEBRID_KEY + title = "Debrid Provider" + entries = PREF_DEBRID_ENTRIES + entryValues = PREF_DEBRID_VALUES + setDefaultValue("none") + summary = "%s" + + setOnPreferenceChangeListener { _, newValue -> + val selected = newValue as String + val index = findIndexOfValue(selected) + val entry = entryValues[index] as String + preferences.edit().putString(key, entry).commit() + } + }.also(screen::addPreference) + + // Token + EditTextPreference(screen.context).apply { + key = PREF_TOKEN_KEY + title = "Token" + setDefaultValue(PREF_TOKEN_DEFAULT) + summary = PREF_TOKEN_SUMMARY + + setOnPreferenceChangeListener { _, newValue -> + runCatching { + val value = (newValue as String).trim().ifBlank { PREF_TOKEN_DEFAULT } + Toast.makeText(screen.context, "Restart Aniyomi to apply new setting.", Toast.LENGTH_LONG).show() + preferences.edit().putString(key, value).commit() + }.getOrDefault(false) + } + }.also(screen::addPreference) + } + + companion object { + // Token + private const val PREF_TOKEN_KEY = "token" + private const val PREF_TOKEN_DEFAULT = "" + private const val PREF_TOKEN_SUMMARY = "Debrid API Token" + + // Debrid + private const val PREF_DEBRID_KEY = "debrid_provider" + private val PREF_DEBRID_ENTRIES = arrayOf( + "None", + "RealDebrid", + "Premiumize", + "AllDebrid", + "DebridLink", + "Offcloud", + "TorBox", + ) + private val PREF_DEBRID_VALUES = arrayOf( + "none", + "realdebrid", + "premiumize", + "alldebrid", + "debridlink", + "offcloud", + "torbox", + ) } }