Commit Graph
2537 Commits
Author SHA1 Message Date
zarzet d91bfae155 perf(library): dispose unused playback row subscriptions
Auto-dispose media-item playback providers after their last listener leaves so scrolling does not retain every visited row subscription. Test disposal of 200 rows, active-row behavior and reattachment.
2026-09-20 17:21:01 +07:00
zarzet cb5ce3df62 perf(metadata): move normalized Rust values into response envelopes
Move normalized maps and track arrays into response envelopes instead of serializing them into another Value tree. Cover JSON parity, Unicode, track numbering and cancellation.
2026-09-20 17:21:01 +07:00
zarzet 3b662cc114 perf(rust): reduce peak allocations when resizing cover artwork
Write JPEG resize output directly into RGB and release the original decoded image before encoding. Preserve PNG alpha handling and existing image quality.

Verified byte-identical output for 336 image fixtures and lower isolated peak heap allocation.
2026-09-20 17:20:52 +07:00
zarzet 5053ed93ee perf(mornye): reuse exact luminance contributions for contrast sampling
Use 6 KiB of lookup tables to avoid repeated Color allocations and exponentiation during frame sampling. Exhaustively verify exact Flutter luminance parity for every 8-bit RGB value.
2026-09-20 17:20:52 +07:00
zarzet 6038ce5777 perf(mornye): release outgoing artwork decoders when replaced
Retain the outgoing decoder only while its frame remains displayed, then release its provider subscription as soon as replacement artwork is ready. Verify decoder disposal while preserving cover transitions.
2026-09-20 17:20:52 +07:00
zarzet a7717ddfbf perf(player): scope position and contrast rebuilds to controls
Keep playback position updates inside the timeline subtree and notify only artwork foreground controls when contrast changes. Preserve layout and transport state; add regression coverage for stable artwork and transport widgets.
2026-09-20 17:20:52 +07:00
zarzet 0c930c691f fix(player): preserve offline motion artwork and smooth cover changes 2026-09-20 12:20:24 +07:00
zarzet dc25370350 feat(artists): add branded headers and incremental release loading 2026-09-20 11:46:16 +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 d5ac292d36 fix(ios): keep release feed bundle identity in sync
Use com.zarz.spotiflac for the app and matching test targets. Read the bundle identifier from the built IPA when updating apps.json so the release feed matches the distributed application.

Validation: Xcode project plist lint and binary IPA bundle identifier extraction passed.
2026-09-19 12:10:25 +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 1ebdac8645 style: remove trailing whitespace 2026-09-18 00:31:27 +07:00
zarzet 054041e40d perf(extensions): collect unreachable JavaScript cycles after idle bursts 2026-09-17 18:27:46 +07:00
zarzet df87f1e950 perf(images): decode local covers to their fitted display size 2026-09-17 18:25:24 +07:00
zarzet 26a97b44b9 perf(extensions): share retained source text across manager and VMs 2026-09-17 18:20:34 +07:00
zarzet e984c1ddba perf(extensions): reuse owned UTF-8 buffers at text boundaries 2026-09-17 18:20:27 +07:00
zarzet a9a395b9f8 perf(metadata): preserve typed values across the Rust extension bridge 2026-09-17 18:07:56 +07:00
zarzet 2c4e391643 perf(extensions): validate JSON without allocating argument trees 2026-09-17 18:07:22 +07:00
zarzet 91ef538c87 perf(cue): parse SAF previews without copying audio 2026-09-17 17:38:49 +07:00
zarzet 1387a28d66 perf(android): batch SAF library recovery metadata queries 2026-09-17 17:38:15 +07:00
zarzet 1ef81b4530 perf(library): batch album deletion and refresh once 2026-09-17 17:32:12 +07:00
zarzet c868aac2cc perf(android): batch SAF lookups during download publication 2026-09-17 03:30:30 +07:00
zarzet 3eb44dc892 perf(downloads): log finalization stage durations 2026-09-17 02:59:29 +07:00
zarzet 0dd1a9ac82 perf(audio): validate FLAC remuxes before encoder fallback 2026-09-17 02:59:29 +07:00
zarzet 622a457c13 perf(downloads): reuse lyrics supplied by the backend 2026-09-17 02:59:28 +07:00
zarzet dab5f770ab perf(downloads): reuse HTTP connections between tracks 2026-09-17 02:59:28 +07:00
zarzet 1a4b90db43 fix(android): validate native metadata editor results 2026-09-17 02:59:28 +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 fd777c34d9 perf(player): commit seek gestures once after scrubbing 2026-09-17 02:59:21 +07:00
zarzet a064e96c37 perf(ui): pause motion headers when collapsed 2026-09-17 02:59:21 +07:00
zarzet 7064f1a53a perf(theme): bound cover palette decoding and coalesce requests 2026-09-17 02:59:14 +07:00
zarzet 96b037bb34 perf(rust): skip audio rewrites for identical FLAC metadata 2026-09-17 02:59:14 +07:00
zarzet 3e50dd75d6 chore(rust): update crypto, network and UniFFI dependencies 2026-09-17 02:59:14 +07:00
zarzet 6cd2c82790 chore(android): update native dependencies and build tooling 2026-09-17 02:59:14 +07:00
zarzet e7cf7e6335 chore(deps): update Flutter and iOS plugin dependencies 2026-09-17 02:59:14 +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 b2ea07c41e fix: preserve source artist credits when downloading
Keep full source artist credits in download responses and embedded tags, falling back to provider credits only when the source is empty. Add regression coverage for new and existing files.
2026-09-17 02:12:10 +07:00
zarzet a5530dc5bd chore(analyzer): exclude archived internal sources 2026-09-15 22:23:37 +07:00
zarzet 9317306897 chore(release): set app version to 5.0.0+152 2026-09-15 21:45:11 +07:00
zarzet e063e6d5da feat(metadata): display saved ReplayGain values and refresh after analysis 2026-09-15 21:44:59 +07:00
zarzet 0ad17f0caa fix(library): reset checkpoints and artwork on forced full scans 2026-09-15 21:44:53 +07:00
zarzet 097af1532f fix(metadata): read tags and covers from MP4 files named opus 2026-09-15 21:44:45 +07:00
zarzet 347208b3d9 fix(library): preserve cached covers across directory aliases 2026-09-15 21:44:36 +07:00
zarzet ae78519490 fix(download): log provider failures before fallback 2026-09-15 21:44:22 +07:00
zarzet eb717a6e7b fix(extensions): restore URL globals for provider link resolution 2026-09-15 21:44:11 +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 8c7d2aad5c fix(download): preserve filenames after automatic SAF conversion 2026-09-08 19:51:25 +07:00