Crossfade & Animated Covers

This commit is contained in:
meowarex committed 2026-10-11 18:18:12 +00:00
1 parent d47693ccaa
commit f5cd48be5a
158 files changed
+7211 -1855

No files matched your search

+2 -2
View File
@@ -31,8 +31,8 @@ android {
defaultConfig {
minSdk = 24
targetSdk = 36
versionCode = 68
versionName = "1.1.8"
versionCode = 84
versionName = "1.5.0"
vectorDrawables {
useSupportLibrary = true
@@ -82,7 +82,13 @@
"description": "[Only works with API results] - Generates Syllable timings from Line timings using a self trained AI model ",
"default": false,
"inline": true,
"token": "RL_SYNTHESIZE"
"token": "RL_SYNTHESIZE",
"fileNames": [
"lyrics-ai-indicator.patch"
],
"extensionFiles": [
"radiant/AiSparkle.smali"
]
},
{
"type": "toggle",
@@ -378,17 +384,43 @@
"type": "toggle",
"key": "cover_everywhere",
"title": "Cover Everywhere - WIP",
"description": "Applies TIDAL's native blurred album-art backdrop to every Compose based page (Home & Collection)",
"description": "Applies TIDAL's native blurred album-art backdrop to every Compose based page (Home, Collection, Search, Save For Later, Profile, Downloads & Settings)",
"default": false,
"inline": true,
"fileNames": [
"home-backdrop.patch",
"collection-backdrop.patch",
"cover-everywhere-pages.patch",
"cover-capture.patch"
]
}
]
},
{
"id": "AnimatedCovers",
"order": 34,
"fileNames": [
"animated-covers.patch"
],
"title": "Animated Covers",
"description": "Replaces cover art with animated artwork when available",
"default": true,
"extensionFiles": [
"radiant/AnimatedCovers.smali",
"radiant/AnimatedCoverView.smali",
"radiant/RoundOutline.smali"
]
},
{
"id": "PlayerCrossfade",
"order": 35,
"fileNames": [
"player-crossfade.patch"
],
"title": "Audio Crossfade",
"description": "[Temporary Patch] - Unlocks TIDAL's crossfade between tracks. Set the duration in TIDAL Settings > Audio & Playback (enables the mf-player-crossfade feature flag)",
"default": true
},
{
"id": "QualityBadgeColors",
"order": 36,
@@ -592,7 +624,7 @@
"lyrics-sparkle-conditional-visibility.patch"
],
"title": "Replace Lyrics Button",
"description": "Replaces the Lyrics button with the RL Sparkle!",
"description": "Replaces the Lyrics button with the RL Sparkle! Spins while lyrics load, and shows a greyed-out crossed note when a track has no lyrics",
"default": true
},
{
@@ -369,7 +369,8 @@ class SmaliPatchStep(
if (matchesAt(target, sourceLines, hint)) return hint
// Walk outward from the hint, alternating below/above, until finds a unique match.
val maxRadius = target.size
// Also reach hints past the end of the file
val maxRadius = maxOf(target.size, hint)
for (offset in 1..maxRadius) {
val below = hint + offset
if (below + sourceLines.size <= target.size && matchesAt(target, sourceLines, below)) {
@@ -5,6 +5,7 @@ import android.content.pm.PackageManager.NameNotFoundException
import com.meowarex.rlmobile.R
import com.meowarex.rlmobile.installers.InstallerResult
import com.meowarex.rlmobile.manager.InstallerManager
import com.meowarex.rlmobile.manager.PathManager
import com.meowarex.rlmobile.patcher.StepRunner
import com.meowarex.rlmobile.patcher.steps.StepGroup
import com.meowarex.rlmobile.patcher.steps.base.Step
@@ -21,6 +22,7 @@ import org.koin.core.component.inject
class DowngradeCheckStep(private val options: PatchOptions) : Step(), KoinComponent {
private val context: Application by inject()
private val installers: InstallerManager by inject()
private val paths: PathManager by inject()
override val group = StepGroup.Prepare
override val localizedName = R.string.patch_step_downgrade_check
@@ -38,9 +40,11 @@ class DowngradeCheckStep(private val options: PatchOptions) : Step(), KoinCompon
}
container.log("Version of installed TIDAL app: $currentVersion")
val targetVersion = container
.getStep<FetchInfoStep>()
.data.tidalVersionCode
// Custom APK can be newer than data.json
val targetVersion = customApkVersionCode(container)
?: container
.getStep<FetchInfoStep>()
.data.tidalVersionCode
container.log("Target TIDAL version: $targetVersion")
@@ -59,4 +63,15 @@ class DowngradeCheckStep(private val options: PatchOptions) : Step(), KoinCompon
}
}
}
private fun customApkVersionCode(container: StepRunner): Int? {
val file = options.customTidalApk?.getFile(paths)?.takeIf { it.exists() } ?: return null
return try {
@Suppress("DEPRECATION")
context.packageManager.getPackageArchiveInfo(file.absolutePath, 0)?.versionCode
} catch (t: Throwable) {
container.log("Failed to read custom TIDAL APK version: ${t.message}")
null
}
}
}