{ "version": 1, "patches": [ { "id": "EnableLegacyUi", "order": 10, "fileNames": [ "enable-legacy-ui.patch" ], "title": "Enable Legacy UI", "description": "[This patch will stop working soon] - Replaces the New Compose based UI with the Legacy UI (disables player-market-ui feature flag)", "default": false, "requires": [ "DebugMenuUnlock" ], "disables": [ "LyricsRlApi", "PlayerBackdrop", "QualityBadgeColors", "PlayerMovePlayingFrom", "PlayerOneHanded", "LyricsProgressPill", "LyricsDisableCover", "LyricsReplaceLyricsButton", "LyricsReplaceShareButton", "LyricsKeepControlsVisible" ] }, { "id": "LyricsRlApi", "order": 20, "fileNames": [ "lyrics-rl-api.patch", "lyrics-rl-api-observer.patch", "lyrics-rl-api-isrc.patch" ], "title": "Radiant Lyrics API - WIP", "description": "Use Radiant Lyrics API to fetch Lyrics (Syllable Level & Higher Quality)", "default": false, "defaultVariantIndex": 0, "variants": [ { "title": "Line", "fileNames": [] }, { "title": "Word", "fileNames": [ "lyrics-rl-api-word.patch" ] }, { "title": "Syllable", "fileNames": [ "lyrics-rl-api-syllable.patch" ] } ], "extensionFiles": [ "radiant/RLAPILyricsHook.smali", "radiant/RLAPILyricsWorker.smali", "radiant/IsrcCache.smali", "radiant/WordLyrics.smali", "radiant/WordLyricsTick.smali", "radiant/SylBrush.smali", "radiant/SylLayout.smali" ], "advancedOptions": [ { "type": "toggle", "key": "romanize", "title": "Romanization", "description": "Return a romanized transcription and show that instead of the original script", "default": false, "token": "RL_ROMANIZE", "inline": true }, { "type": "toggle", "key": "synthesize", "title": "WIP | AI Generate Syllables", "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" }, { "type": "toggle", "key": "context_aware", "title": "Context Aware Lyrics", "description": "Display voice context cues (adlibs and duet singers get displayed seperately)", "default": true, "token": "RL_CTX_ON" }, { "type": "choice", "key": "context_aware_mode", "title": "Show", "description": "", "entries": [ "Adlibs", "Singers", "Both" ], "values": [ "0x1", "0x2", "0x3" ], "defaultIndex": 0, "requiresOption": "context_aware", "token": "RL_CTX" } ] }, { "id": "PlayerBackdrop", "order": 30, "fileNames": [], "title": "Player Backdrop", "description": "Swap the player backdrop for the Kawarp shader, or fine-tune TIDAL's own blurred cover", "default": true, "defaultVariantIndex": 1, "variants": [ { "title": "Tidal", "fileNames": [ "player-backdrop-playback.patch" ], "extensionFiles": [ "radiant/BackdropFx.smali" ] }, { "title": "Radiant", "fileNames": [ "player-backdrop-kawarp.patch" ], "extensionFiles": [ "radiant/Kawarp.smali", "dev/kawarp/KawarpEngine.smali" ], "minSdk": 33 } ], "advancedOptions": [ { "type": "slider", "key": "blur_strength", "title": "Blur Strength", "description": "The value of Blur applied to the backdrop cover", "default": 50, "min": 0, "max": 100, "steps": 19, "displayAsPercent": true, "token": "RL_BLUR", "encode": { "kind": "int", "scale": 1.0 }, "requiresVariant": 0 }, { "type": "slider", "key": "contrast", "title": "Contrast", "description": "The value of Contrast applied to the backdrop cover", "default": 50, "min": 0, "max": 100, "steps": 19, "displayAsPercent": true, "token": "RL_CONTRAST", "encode": { "kind": "floatBits", "scale": 0.02 }, "requiresVariant": 0 }, { "type": "slider", "key": "saturation", "title": "Saturation", "description": "The value of Saturation applied to the backdrop cover", "default": 50, "min": 0, "max": 100, "steps": 19, "displayAsPercent": true, "token": "RL_SATURATION", "encode": { "kind": "floatBits", "scale": 0.02 }, "requiresVariant": 0 }, { "type": "slider", "key": "brightness", "title": "Brightness", "description": "The value of Brightness applied to the backdrop cover", "default": 50, "min": 0, "max": 100, "steps": 19, "displayAsPercent": true, "token": "RL_BRIGHTNESS", "encode": { "kind": "floatBits", "scale": 0.02 }, "requiresVariant": 0 }, { "type": "toggle", "key": "kawarp_reactive", "title": "Playback Reactive", "description": "Cover shader reacts to playback state by freezing/resuming", "default": true, "token": "RL_KW_REACTIVE", "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_blur", "title": "Blur Passes", "description": "Kawase blur passes, higher is softer but costs more GPU", "default": 6, "min": 1, "max": 40, "steps": 38, "displayAsPercent": false, "token": "RL_KW_BLUR", "encode": { "kind": "int", "scale": 1.0 }, "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_warp", "title": "Warp Intensity", "description": "Strength of the fluidity effect", "default": 100, "min": 0, "max": 100, "steps": 19, "displayAsPercent": true, "token": "RL_KW_WARP", "encode": { "kind": "floatBits", "scale": 0.01 }, "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_speed", "title": "Animation Speed", "description": "How fast the backdrop flows", "default": 175, "min": 0, "max": 500, "steps": 19, "displayAsPercent": true, "token": "RL_KW_SPEED", "encode": { "kind": "floatBits", "scale": 0.01 }, "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_scale", "title": "Backdrop Scale", "description": "Zoom level of the effect", "default": 100, "min": 10, "max": 400, "steps": 12, "displayAsPercent": true, "token": "RL_KW_SCALE", "encode": { "kind": "floatBits", "scale": 0.01 }, "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_contrast", "title": "Contrast", "description": "Contrast of the backdrop", "default": 100, "min": 0, "max": 300, "steps": 11, "displayAsPercent": true, "token": "RL_KW_CONTRAST", "encode": { "kind": "floatBits", "scale": 0.01 }, "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_saturation", "title": "Saturation", "description": "Colour intensity of the backdrop", "default": 100, "min": 0, "max": 400, "steps": 15, "displayAsPercent": true, "token": "RL_KW_SAT", "encode": { "kind": "floatBits", "scale": 0.01 }, "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_brightness", "title": "Brightness", "description": "The value of Brightness applied to the backdrop", "default": 100, "min": 0, "max": 200, "steps": 19, "displayAsPercent": true, "token": "RL_KW_BRIGHT", "encode": { "kind": "floatBits", "scale": 0.01 }, "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_darken", "title": "Auto Darken Bright Covers", "description": "Prevents bright covers from making text unreadable", "default": 80, "min": 0, "max": 100, "steps": 19, "displayAsPercent": true, "token": "RL_KW_DARKEN", "encode": { "kind": "floatBits", "scale": 0.01 }, "requiresVariant": 1 }, { "type": "slider", "key": "kawarp_dither", "title": "Dithering", "description": "Breaks up color banding in smooth gradients", "default": 15, "min": 0, "max": 100, "steps": 19, "displayAsPercent": false, "token": "RL_KW_DITHER", "encode": { "kind": "floatBits", "scale": 0.001 }, "requiresVariant": 1 }, { "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)", "default": false, "inline": true, "fileNames": [ "home-backdrop.patch", "collection-backdrop.patch", "cover-capture.patch" ] } ] }, { "id": "QualityBadgeColors", "order": 36, "fileNames": [ "player-quality-badge-colors.patch" ], "title": "Quality Badge Colors", "description": "Brings color back to the player quality badge.", "default": true }, { "id": "PlayerMovePlayingFrom", "order": 37, "fileNames": [ "player-move-playing-from.patch" ], "extensionFiles": [ "radiant/PlayingFrom.smali" ], "title": "Playing From", "description": "Shows the source name (playlist/album/mix) above the track title", "default": true }, { "id": "PlayerOneHanded", "order": 38, "fileNames": [ "player-one-handed.patch" ], "title": "One-Handed Mode", "description": "Mirrors the bottom player buttons left-to-right for easier one-handed reach.", "default": false }, { "id": "LyricsProgressPill", "order": 40, "fileNames": [ "lyrics-progress-pill.patch", "lyrics-fade-region.patch" ], "title": "Lyrics Progress Pill", "description": "Restores the old Track Progress Pill in the top of the Lyrics screen!", "default": true, "requires": [ "LyricsDisableCover", "LyricsReplaceLyricsButton", "LyricsReplaceShareButton" ] }, { "id": "LyricsDisableCover", "order": 41, "fileNames": [ "lyrics-disable-cover.patch" ], "title": "Disable Lyrics Cover", "description": "Removes the mini track cover from the lyrics screen.", "default": true }, { "id": "LyricsReplaceLyricsButton", "order": 42, "fileNames": [ "lyrics-replace-lyrics-button.patch", "lyrics-sparkle-conditional-visibility.patch" ], "title": "Replace Lyrics Button", "description": "Replaces the Lyrics button with the RL Sparkle!", "default": true }, { "id": "LyricsReplaceShareButton", "order": 43, "fileNames": [ "lyrics-replace-share-button.patch" ], "title": "Replace Share Button", "description": "Replaces the share button with the Tidal Connect button from the top of the screen. (it's in the menu already)", "default": true }, { "id": "MiniPlayerRedesign", "order": 50, "fileNames": [], "title": "Redesigned Mini-Player", "description": "Integrates the Seekbar into the control panel at the bottom of the screen.", "default": false, "defaultVariantIndex": 2, "variants": [ { "title": "Floating", "fileNames": [] }, { "title": "Grey", "fileNames": [ "mini-player-grey.patch" ] }, { "title": "Black", "fileNames": [ "mini-player-black.patch" ] } ], "advancedOptions": [ { "type": "toggle", "key": "dynamic_bg", "title": "Mini-Player Dynamic Background", "description": "Colorizes the Mini-Player depending on the currently playing track.", "default": false, "inline": true, "fileNames": [ "mini-player-dynamic-bg.patch" ], "extensionFiles": [ "radiant/MiniPlayerBackground.smali" ], "hidesVariants": [ 2 ], "relabelVariants": { "1": "Legacy" } }, { "type": "toggle", "key": "border", "title": "Progress Border", "description": "Draws an animated progress ring around the floating mini-player. Requires the Floating style.", "default": false, "requiresVariant": 0, "fileNames": [ "mini-player-floating-border.patch" ], "extensionFiles": [ "radiant/MiniSeekerFloating.smali" ] }, { "type": "toggle", "key": "gestures", "title": "Mini-Player Gestures", "description": "Adds swipe up gesture to the mini-player to reopen the player", "default": true, "fileNames": [ "mini-player-up-gesture.patch", "player-swipe-gesture.patch", "lyrics-gesture-scroll-guard.patch" ], "extensionFiles": [ "radiant/gestures/MiniPlayerGestures.smali", "radiant/gestures/MiniPlayerGestures$Gesture.smali", "radiant/gestures/MiniPlayerGestures$FeedbackLayer.smali", "radiant/gestures/MiniPlayerGestures$FeedbackResetAnimator.smali", "radiant/gestures/MiniPlayerGestures$RootGesture.smali", "radiant/gestures/MiniPlayerGestures$ApplyPending.smali", "radiant/gestures/LyricsDrag.smali", "radiant/gestures/LyricsDrag$Guard.smali" ] }, { "type": "choice", "key": "swipe_up_drag", "title": "Swipe Up Style", "entries": [ "Static", "Drag" ], "values": [ "0x0", "0x1" ], "defaultIndex": 1, "requiresOption": "gestures", "token": "RL_MINI_PLAYER_SWIPE_UP_DRAG" }, { "type": "toggle", "key": "next_prev", "title": "Next/Previous Gestures", "description": "Swipe left or right on the mini-player to skip tracks.", "default": false, "requiresOption": "gestures", "fileNames": [ "mini-player-left-right-gesture.patch" ], "extensionFiles": [ "radiant/gestures/MiniPlayerTrackGestures.smali", "radiant/gestures/MiniPlayerTrackGestures$Gesture.smali", "radiant/gestures/MiniPlayerTrackGestures$OffsetLayer.smali", "radiant/gestures/MiniPlayerTrackGestures$ResetAnimator.smali", "radiant/gestures/MiniPlayerTrackGestures$TextDraw.smali", "com/tidal/android/feature/appscaffold/ui/r$c.smali" ] } ] }, { "id": "LyricsKeepControlsVisible", "order": 60, "fileNames": [ "lyrics-keep-controls-visible.patch" ], "extensionFiles": [ "radiant/LyricsReinitGuard.smali" ], "title": "Keep Controls Visible", "description": "Inverts the auto-hide behavior on the lyrics screen, playback controls stay visible by default and only hide when you tap them off. Also stops the open lyrics view from randomly closing when the player re-fetches the same track.", "default": true }, { "id": "WazeIntegration", "order": 90, "category": "integration", "pathLocked": true, "fileNames": [ "integration-waze-playback.patch" ], "extensionFiles": [ "radiant/WazeInitReceiver.smali", "radiant/WazeServiceConnection.smali" ], "title": "Waze Integration", "description": "Control TIDAL playback from the Waze app", "default": true, "advancedOptions": [ { "type": "choice", "key": "browse_root", "title": "Media Menu", "entries": [ "Auto Menu", "Home", "Recents" ], "values": [ "ROOT_AUTO", "HOME_V2::home_page_v2_id", "RECENTLY_PLAYED::home/pages/CONTINUE_LISTEN_TO/view-all" ], "defaultIndex": 0, "token": "RL_WAZE_ROOT_ID" }, { "type": "color", "key": "accent_color", "title": "Accent Color", "default": -16747037, "token": "RL_WAZE_THEME_COLOR" } ] }, { "id": "DebugMenuUnlock", "order": 100, "fileNames": [ "debug-menu-unlock.patch" ], "title": "Unlock Debug Menu", "description": "Reveals TIDAL's hidden Debug Menu in Settings. (Unlocks Feature Flags & the legacy Debug Options)", "default": false } ] }