344 Commits
Author SHA1 Message Date
zarzet 2ded1cff68 perf(downloads): batch queue cancellation and progress cleanup 2026-10-08 08:47:47 +07:00
zarzet c67d2a2dd2 perf(downloads): batch cancellation resets for retry 2026-10-08 06:55:26 +07:00
zarzet 6325c4769c fix(downloads): preserve actual provider audio format 2026-10-08 01:50:36 +07:00
zarzet d1de833184 perf(library): index scans and snapshots with native SQLite workers
Move full and incremental ingestion, source snapshots, path keys, and download exclusion to native transactions. Preserve schema 17, FTS, WAL coordination, cancellation, and Android SAF timestamp backfill.
2026-10-06 23:29:33 +07:00
zarzet d693e1a479 perf(theme): extract cover palettes with native quantization
Port the pinned Material quantizer and Dart RNG compatibility to Rust while keeping Material Score and final color schemes in Dart. Include exact palette fixtures, licenses, and Kotlin worker ABI coverage.
2026-10-06 23:27:38 +07:00
zarzet 867371cb67 feat(native): add cancellable data workers and streamed file hashing
Introduce Android, iOS, and Dart worker dispatch with queued cancellation, binary inputs, and background JSON codecs. Move APK verification to streamed native SHA256 while retaining the isolated fallback.
2026-10-06 23:25:39 +07:00
zarzet ca747f8ce2 fix(android): release temporary media on failed SAF operations 2026-10-06 22:00:44 +07:00
zarzet f61e815e24 perf(android): trim platform assets and release Dart symbols 2026-10-06 21:58:55 +07:00
zarzet b8c50b1527 perf(android): reduce release APK size
Keep Dart debug data outside libapp.so and archive matching symbols and R8 mappings in CI. Pack native relocations, preserve JNI exports, and recompress PNG assets losslessly.

ARM64 APK shrinks from 80,306,680 to 76,080,247 bytes (5.26%). Verified with 1,877 Flutter tests, 19 native device tests, Discord SDK integration, and release startup on a 16 KiB Android emulator.
2026-10-06 15:22:42 +07:00
zarzet b8787168d1 refactor(downloads): isolate typed results and audio finalization 2026-10-06 13:09:26 +07:00
zarzet 7493c37698 refactor(android): isolate native download history persistence 2026-10-06 13:08:14 +07:00
zarzet d98ab4852d fix(library): distinguish unavailable storage from missing files 2026-10-06 13:08:12 +07:00
zarzet 772bd97f7d fix(downloads): preserve filenames after decryption and conversion 2026-10-06 00:04:14 +07:00
zarzet 5f0577837d perf(widget): publish artwork only for installed consumers 2026-10-04 01:41:55 +07:00
zarzet c69f2cef9f perf(library): scan SAF CUE audio through live descriptors 2026-10-04 01:41:35 +07:00
zarzet 4e20102bdd perf(usb): reuse PCM buffers and respect native ring capacity 2026-10-04 01:40:59 +07:00
zarzet 9c0b22e2c8 feat(build): require Discord in production and keep Lite opt-in 2026-10-04 01:40:54 +07:00
zarzet 541bfc4002 perf(media): shrink FFmpeg while preserving HTTPS motion artwork 2026-10-04 01:35:48 +07:00
zarzet f035538778 fix(library): expose failed scan files and reasons in app logs 2026-10-03 17:57:35 +07:00
zarzet e35a3cbb84 fix(library): scan remote SAF folders when root metadata is unavailable 2026-10-03 13:40:39 +07:00
zarzet fb41a86f5a fix(library): match SAF documents across folder tree aliases 2026-10-03 13:40:39 +07:00
zarzet 04ee6bc6f2 fix(lyrics): grant scoped access to selected audio files
Open temporary media directory grants for reading, embedding and exporting lyrics on iOS and Android. Resolve native file aliases consistently while retaining extension storage restrictions.

Validate with 4 iOS integration tests, 42 Flutter tests, 6 Rust file capability tests, and Android Kotlin compilation. Refs #631.
2026-10-03 12:19:03 +07:00
zarzet 115602b84e fix(library): reject filename guesses from failed NAS metadata reads 2026-10-03 03:26:35 +07:00
zarzet 0b2cf0e4e5 feat(discord): add opt-in mobile rich presence with track artwork 2026-10-03 02:14:11 +07:00
zarzet bbe2caa754 fix(android): preserve remote SAF descriptors for audio and artwork 2026-10-03 02:14:06 +07:00
zarzet b767bd16d8 fix(playback): refresh notification favorite and shuffle controls 2026-10-03 02:14:01 +07:00
zarzet 70f8bd7f35 feat(extensions): support personal account forms and direct downloads 2026-10-02 19:21:58 +07:00
zarzet 4eef5542be fix(metadata): recognize featured artist credits consistently
Handle feature and featured separators across display, Android finalization and Rust tag writing. Split conjunction credits only when separate artist IDs confirm them, and offer a picker for multi-artist navigation.
2026-10-02 18:10:00 +07:00
zarzet 4b39716b23 fix(library): preserve SD card visibility during transient access failures 2026-10-02 11:44:44 +07:00
zarzet 8758790d9f fix(download): preserve native media workspace across cache eviction 2026-10-02 11:44:29 +07:00
zarzet 718e13f24e feat(library): filter tracks missing verified ReplayGain tags 2026-10-02 01:24:26 +07:00
zarzet fbf479c102 fix(download): stop crashing native finalization on Android regex
Android's regex engine rejects Pattern.UNICODE_CHARACTER_CLASS, so NativeFinalizationPolicy failed to initialize and every native download crashed while writing metadata. List Unicode spaces explicitly and cover the separator with a device test.
2026-10-02 01:24:26 +07:00
zarzet fe36f08918 feat(backend): hold library scans in place while paused
Path and SAF scans wait at their next file checkpoint while paused and keep their position in memory. Cancel, backend shutdown and released request leases still end a paused scan.
2026-10-01 21:00:42 +07:00
zarzet 72b689b1f8 build(android): sign release APKs with APK Signature Scheme v4
Release signing now also writes the V4 .apk.idsig beside each APK, verifies it in CI and publishes it for adb incremental installs. Normal installers keep using the V1-V3 signatures inside the APK.
2026-10-01 21:00:42 +07:00
zarzet d65f3a1cc2 perf(library): overlap SAF listings and metadata reads
SD cards, USB drives and network shares pay a provider round trip per query. Folder listings are now prefetched four at a time while the walk stays serial, so order, deduplication and error counts are unchanged. Full and incremental scans share a six-worker in-order read pool; incremental scans were fully serial.

Changed files reuse the listing's name and timestamp, CUE copies skip the name and MIME queries, and directories holding CUE sheets are not listed twice.
2026-10-01 19:06:25 +07:00
zarzet 6e6d9dd00e fix(background): keep library scans and update downloads running with the screen off
Android froze the process once the activity stopped, because only track downloads held a foreground service. A dataSync BackgroundWorkService with a partial wake lock now covers library scans and in-app APK downloads, and stops when the last task ends or the system timeout fires. Its notification shows the existing localized progress, so no duplicate appears. If Android refuses the service, work continues as before.

On iOS a scan holds its own background task; on expiry it cancels the scan cleanly instead of being suspended.
2026-10-01 18:46:21 +07:00
zarzet 41340a4a21 feat(metadata): write primary-artist tags in native writers
Native tag writers accept artist_tag_mode=primary and keep only the first credited artist in ARTIST and ALBUMARTIST for every format: FLAC download embedding, FLAC/Opus edits, and the ID3, MP4, APE and RIFF writers. The Android finalizer's FFmpeg fallback applies the same rule.

Rust and Kotlin share one separator set (comma, semicolon, ampersand, a spaced x, feat/ft/featuring/with) and test the same fixtures. The Go-parity split_vorbis pattern is unchanged. Refs #618.
2026-10-01 16:12:44 +07:00
zarzet 1e246138c8 perf(download): avoid repeated progress decoding and queue regrouping 2026-09-30 23:39:22 +07:00
zarzet 9051f37cf5 perf(library): reduce scan allocations and keep SAF workers busy 2026-09-30 23:39:22 +07:00
zarzet fe88048db2 refactor(backend): retire unused native bridge entry points 2026-09-30 21:47:15 +07:00
zarzet b8e3a4c166 refactor(download): simplify finalization and remove the retired worker 2026-09-30 21:44:31 +07:00
zarzet c5789df87d fix(storage): retain document access for library metadata and covers 2026-09-30 21:42:53 +07:00
zarzet cda9868a1f fix(startup): keep shared backend alive across activity recreation 2026-09-30 20:58:36 +07:00
zarzet fb08110797 fix(download): verify ReplayGain tags independently of metadata embedding 2026-09-30 20:58:18 +07:00
zarzet 88508c806a perf(library): reuse bounded artwork thumbnails during scans 2026-09-30 20:57:59 +07:00
zarzet 8aa8d598d8 feat(lyrics): keep the screen awake while viewing lyrics 2026-09-30 20:21:21 +07:00
zarzet e61e54f93f fix(download): align native metadata preparation and ReplayGain support 2026-09-28 12:21:15 +07:00
zarzet e3bec31b36 fix(library): preserve indexed tracks when a full scan is incomplete 2026-09-28 12:13:17 +07:00
zarzet 4c2c356763 fix(download): detect mislabeled MP4 before native metadata writes 2026-09-28 12:13:17 +07:00
zarzet e0f5a96564 fix(player): distinguish AAudio access and decoder failures 2026-09-27 15:26:11 +07:00