Commit Graph
372 Commits
Author SHA1 Message Date
zarzet 040c328479 feat(widgets): add native Android and iOS home screen players
Publish artwork, metadata, and transport state through a shared Dart bridge. Add configurable Android RemoteViews and iOS WidgetKit players with controls and links into the full player.

Serialize widget commands and session restoration, and share one headless-capable iOS Flutter engine with the foreground scene. Include native integration tests, Dart bridge tests, and widget setup documentation.
2026-09-25 01:22:58 +07:00
zarzet b7d4ceb7e1 Merge pull request #589 with lossless replacement safeguards
Keep automatic Hi-Res replacement off by default. Require exact full-duration PCM equivalence across every channel before and after processing. Retain the original through publication and history persistence, restore it on failure or cancellation, and bound WAV format parsing.

Validated with 30 Rust tests, 46 Dart tests, clean analyzer/Clippy checks, Android ARM64 and iOS builds, and iOS simulator startup.
2026-09-25 01:02:39 +07:00
Bartolo 14ce4bc868 Add Hi-Res authenticity check
Introduce a per-file Hi-Res authenticity checker and optional auto re-download for flagged fake Hi-Res downloads. Adds Rust checker modules (fft, evidence, FLAC/WAV decoding, tests) and a mobile API (check_hires_authenticity). Wire platform bindings for Android/iOS and PlatformBridge. Add Dart HiResCheckService, UI HiResCheckCard, settings toggle (redownloadFakeHiRes) and integration in the download pipeline to quarantine and replace suspicious files with LOSSLESS when safe. Adds claxon FLAC dependency.
2026-09-23 22:29:15 +02:00
zarzet 3eea711ed3 feat(onboarding): add theme-aware 5.0 upgrade introduction 2026-09-22 00:15:29 +07:00
zarzet c87c9ff848 feat(library): add Mornye browsing and contextual compact navigation
Add category browsing, a two-column Recently Added grid, and a dedicated download queue. Keep compact navigation icons and their animations aligned with the active tab.

Keep profile avatars circular and report lyric enrichment outcomes accurately, preserving existing lyrics and supporting instrumental markers.
2026-09-21 23:02:52 +07:00
zarzet d8d46108bc feat(profile): add local profiles with backup and restore
Move Mornye Settings to the Home avatar and keep search above the profile card. Center the metadata artwork and actions, and make artist names clickable in the Material player.
2026-09-21 17:28:18 +07:00
zarzet 5b519070a3 feat(player): add beat-matched AutoMix and refine Mornye navigation
Add default-off local beat analysis, pitch-preserving tempo matching, crossfade fallback, and cancellation-safe two-deck playback. Expose AutoMix in settings and the Mornye queue.

Separate Search from Home, remove the Mornye greeting, and keep Home/Search icons moving continuously between full and compact navigation. Restore expansion on upward Library scrolling.

Validate beat analysis, transport handoff and cancellation, settings persistence, and navigation behavior. Flutter analysis and the signed iOS simulator build pass.
2026-09-20 20:36:26 +07:00
zarzet 48ba08976a perf(bridge): reduce metadata copies and decode large JSON off the UI isolate
Keep decoded cache objects private and copy only at public return boundaries. Decode large metadata and persisted JSON in a worker, and read spill files in the decoding isolate with cleanup on failure.

Protect replacement in-flight requests from stale cleanup. Cover nested mutation isolation, coalescing, invalidation, restoration, spill cleanup and retries.
2026-09-20 17:21:11 +07:00
zarzet de238fd0cd perf(audio): share the Opus artwork metadata buffer
Write picture headers and payload into one backing allocation instead of copying a second complete block. Verify byte parity for JPEG, PNG and extensionless artwork, including a large fixture.
2026-09-20 17:21:01 +07:00
zarzet 0c930c691f fix(player): preserve offline motion artwork and smooth cover changes 2026-09-20 12:20:24 +07:00
zarzet e61ff64adc feat(mornye): cache motion covers and refine player and search
Save album motion videos in app storage during downloads and prefer offline playback with an aspect-aware layout. Add cache management for saved videos.

Center active lyrics on opening, expand lyrics during manual scrolling, and adjust landscape header spacing. Group search rows and skeletons with dividers and remove redundant result icons.

Validation: Flutter analysis clean; 723 tests passed, 4 skipped; iOS simulator build installed.
2026-09-19 17:26:26 +07:00
zarzet 63e1a9b9c8 feat(ui): add Mornye glass theme and adaptive music player
Add a selectable Mornye theme with shared glass controls, dialogs, sheets, notifications, and collection headers while retaining Material components.

Update player artwork, lyrics transitions and highlighting, synchronized rolling time labels, volume controls, and compact navigation. Unify metadata, Library, search, and extension surfaces; preserve restored artwork and report extension load failures.

Validation: full Flutter analyzer clean; 713 tests passed and 4 skipped; pinned Dart formatting and diff checks passed; signed ARM64 and ARM32 release APKs built and verified.
2026-09-19 12:10:10 +07:00
zarzet 1ef81b4530 perf(library): batch album deletion and refresh once 2026-09-17 17:32:12 +07:00
zarzet 0dd1a9ac82 perf(audio): validate FLAC remuxes before encoder fallback 2026-09-17 02:59:29 +07:00
zarzet 39a3e680a4 perf(lyrics): stream MP3 audio when updating ID3 lyrics 2026-09-17 02:59:22 +07:00
zarzet cd4b8ead90 perf(analysis): serialize and cancel owned FFmpeg sessions 2026-09-17 02:59:22 +07:00
zarzet 92089d5fcc perf(backup): move archive processing off the UI isolate 2026-09-17 02:59:21 +07:00
zarzet f0ed293d48 feat: add opt-in Discord Rich Presence on Android
Use the official Discord Social SDK through JNI to share built-in player activity, clear presence when playback stops, and guard against late callbacks after disabling. Package the SDK optionally through SPOTIFLAC_DISCORD_SDK_DIR with license notices.

Credit: @itsmegaaa for the Rich Presence initiative and contribution in #575 and #576.

Validation: 15 Dart tests, scoped Flutter analysis, and one Android 16 ARM64 SDK/JNI instrumentation test passed. Visible presence on a signed-in Discord profile remains unverified.
2026-09-17 02:12:24 +07:00
zarzet 0ad17f0caa fix(library): reset checkpoints and artwork on forced full scans 2026-09-15 21:44:53 +07:00
zarzet 347208b3d9 fix(library): preserve cached covers across directory aliases 2026-09-15 21:44:36 +07:00
zarzet aa99726439 feat(backend): migrate production backend to Rust
Replace the Go backend with the Rust workspace and route Android/iOS through
UniFFI bindings. Include the migrated extension runtime, network, providers,
media metadata, downloads and library operations, with version 5.0.0+147.

Remove Go sources, adapters, native build selection and CI dependencies.
Build Rust unconditionally and lock the iOS Rust pod using a relative path.
Retain legacy source and migration evidence in a local ignored archive.

Validation: Android Kotlin compile and 53 native tests; Swift Rust-branch
equivalence and syntax; CocoaPods install; workflow, shell, Ruby, plist and
diff checks. Reuse the preceding 100 Rust tests, fmt/Clippy and five-ABI
build checkpoint; no new APK or iOS application build for this cleanup.

Known follow-up: URL/URLSearchParams globals are missing from the Rust JS
runtime. A controlled extension replay confirms a URL-resolution regression;
this commit does not fix that runtime gap.
2026-09-14 22:58:27 +07:00
zarzet 1da0da18a6 feat(backup): allow selecting categories and settings-only backups 2026-09-08 19:51:25 +07:00
zarzet c27dc7c1b6 fix(replaygain): report decoder failures and reject incomplete scans 2026-09-07 16:36:50 +07:00
zarzet c48406f5d0 fix(download): resolve missing album folders before publishing 2026-09-07 16:13:41 +07:00
zarzet 81ce677149 fix(download): remove legacy HIGH quality conversion 2026-09-07 01:20:28 +07:00
zarzet bfffb8da11 fix(replaygain): write and verify native Opus gain tags
Preserve audio and artwork while replacing conflicting Opus gain tags with R128 comments. Verify manual, download, and album writes, handle SAF failures, and refresh playback normalization after saving.
2026-09-06 21:03:57 +07:00
zarzet 7920554f5c fix(metadata): preserve Opus tags during batch re-enrichment 2026-09-06 17:29:54 +07:00
zarzet 1b0c28b91a fix(download): route verification notifications to pending challenges 2026-09-06 16:03:46 +07:00
zarzet 34dd2f0ae9 style(dart): apply pinned formatter to existing files
Normalize three existing formatting differences with the pinned Dart formatter. No behavior changes.
2026-09-06 14:05:10 +07:00
zarzet 09c31d9dba refactor(batch): share local track actions and phase settings
Use shared coordinators for queueing FLAC replacements and batch metadata enrichment from album and queue screens. Keep selection lifecycle handling in each screen and synchronize a settings snapshot once per phase.

Cover cancellation, partial failure, screen disposal, and settings changes between preview and apply.
2026-09-06 14:04:05 +07:00
zarzet 7c12f548d7 fix(library): bound playlist picker SQL parameters
Deduplicate requested track keys and aggregate match counts in batches of 500 parameters. Use scalar preview lookups instead of expanding another playlist ID list.

Cover large selections, duplicate keys, empty selections, and cover selection in regression tests.
2026-09-06 14:04:05 +07:00
zarzet 3d35058b02 fix(playback): retain ReplayGain for SAF descriptor leases
Carry the original display name through playback leases to format-aware metadata reads. Cache successful normalization results by source identity, bound the cache, and retry transient read failures.

Add regressions for descriptor hints, album gain fallback, and failed-read retries.
2026-09-06 14:04:04 +07:00
zarzet b32bdbc291 perf(metadata): read complete SAF tags through descriptors
Add complete metadata reads with a display-name hint in Go and both native bridges. Read seekable SAF descriptors directly and use temporary copies only when direct reading fails.

Add format parity tests for MP3, FLAC, M4A, and WAV plus a Dart bridge hint regression.
2026-09-06 14:04:04 +07:00
zarzet 39dc17f9de refactor(ffmpeg): remove unused live DASH subsystem
Remove the unreachable live streaming and DASH manifest call graph, its state, result model, enum, and exclusive imports. Remove the uncalled availability probe while retaining active file conversion and decryption paths.
2026-09-06 14:03:49 +07:00
zarzet 099e211f5a fix(conversion): reserve FLAC outputs without overwriting files
Reuse the conversion output lifecycle for M4A conversion and native FLAC suffix correction. Reserve destination names atomically, reject empty output, and clean partial files while preserving the input on failure.

Add regressions for existing outputs, concurrent conversions, staging, and cleanup.
2026-09-06 14:03:49 +07:00
zarzet 62ef538690 perf(library): page missing-file cleanup with safe SAF batch checks 2026-09-06 02:34:49 +07:00
zarzet ffe088f831 perf(artwork): batch and throttle cached preview validation 2026-09-06 02:34:49 +07:00
zarzet ab21de45c1 perf(library): reuse collection lookups across selection rebuilds 2026-09-06 02:34:49 +07:00
zarzet 7b87a8ee15 perf(search): decode large extension results off the UI isolate 2026-09-06 02:34:49 +07:00
zarzet 856139f908 fix(search): let latest live queries supersede cancelled requests 2026-09-06 02:34:49 +07:00
zarzet d95d070565 perf(library): stream normalized scan timestamp snapshots 2026-09-06 02:34:49 +07:00
zarzet 3368cf8c5d perf(cache): enforce cover byte budget during foreground use 2026-09-06 02:33:43 +07:00
zarzet 15ffb3abf5 feat(metadata): add safe batch editing and matching 2026-09-04 16:55:44 +07:00
zarzet 4aba2926f8 fix(conversion): preserve Unicode SAF document names 2026-09-04 12:39:03 +07:00
zarzet 0d148113f0 perf(library): resume and parallelize SAF indexing 2026-09-01 02:14:15 +07:00
zarzet a1ee346f2f chore(logging): sanitize diagnostics and reduce noise 2026-08-31 01:49:49 +07:00
zarzet 8f17cd1682 fix(backup): use compact sflb file extension 2026-08-30 23:34:57 +07:00
zarzet 897fb7d523 feat(backup): stream versioned ZIP archives 2026-08-30 23:19:09 +07:00
zarzet 2c9881944d feat(updater): resume and verify APK downloads 2026-08-30 23:19:00 +07:00
zarzet bd07d5c233 perf(import): batch playlist metadata enrichment 2026-08-30 23:18:38 +07:00