Commit Graph
421 Commits
Author SHA1 Message Date
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 253a19f17f fix(library): preserve folders during upgrades and load failures
Load configured sources before storage probes and the track index, retain visible configuration on failures, and expose loading and retry states. Wait for saved settings before legacy migration and recreate a missing source placeholder without replacing existing identities.
2026-10-02 18:34:57 +07:00
zarzet 1eea52c1c2 feat(playback): add local listening statistics and annual recap
Measure actual playback time and count plays after 30 seconds, with local SQLite aggregation for weekly, monthly and annual summaries. Add recording controls and safe clearing without affecting music or playlists.
2026-10-02 18:17:54 +07:00
zarzet 39bfda8f3d feat(library): show recent releases from favorite artists
Use installed extensions through the existing artist metadata API. Cache catalogs daily, cap concurrency, preserve previous results on provider failures and filter exact release dates into seven- and thirty-day views.
2026-10-02 18:13:39 +07:00
zarzet 575f3fc1bd fix(ios): preserve Now Playing ownership with motion artwork
Restore the non-mixing music audio session after decorative video initialization and before playback resumes. Add an artwork switch that releases or pauses video decoders and uses still covers when disabled.
2026-10-02 18:13:02 +07:00
zarzet a93e552b3e feat(library): add batch playlist and queue actions
Expose playlist, play-next and queue actions across Library search and album selections, including selected artist albums. Sort playlists, keep long selection toolbars scrollable, separate file operations in metadata menus, and show related local songs without online playback.
2026-10-02 18:11:37 +07:00
zarzet 9ea2647c39 feat(library): filter albums with missing tracks
Assess album completeness from the full local inventory, deduplicate track positions, and retain unknown status for ambiguous tags or disconnected sources. Add filters and count badges to Material and Mornye, including single-track albums and filtered search.
2026-10-02 17:03:07 +07:00
zarzet ae679214a9 fix(lyrics): preserve batch track identity and report results promptly 2026-10-02 14:54:47 +07:00
zarzet 7584daad88 fix(history): prevent maintenance from restoring orphan downloads 2026-10-02 13:58:13 +07:00
zarzet 3c62d38c34 fix(metadata): show re-enrich results above Library cards 2026-10-02 11:44:51 +07:00
zarzet 4b39716b23 fix(library): preserve SD card visibility during transient access failures 2026-10-02 11:44:44 +07:00
zarzet c1892fcd69 fix(library): include unindexed tracks in missing ReplayGain filter 2026-10-02 11:44:37 +07:00
zarzet 718e13f24e feat(library): filter tracks missing verified ReplayGain tags 2026-10-02 01:24:26 +07:00
zarzet 50f21d9c82 feat(library): pause and resume library scans
The scan progress tile offers Pause and Resume. A paused scan releases its foreground service and wake lock, shows a paused notice, and resumes from the next unscanned file.
2026-10-01 21:00:42 +07:00
zarzet a21e46e6dd perf(library): trim scan ingestion writes
Fresh staging tables hold no path keys, so the first row for an id no longer issues a delete. Removing scanned paths now runs in one transaction with a subselect instead of committing a lookup and two deletes per chunk.
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 86cf860288 refactor(library): share the track selection bar and delete action
The Library list's multi-select toolbar (FLAC upgrade, re-enrich, convert, ReplayGain add/remove, delete) becomes LibraryTrackSelectionBar, and its delete flow becomes deleteLibraryTracks. The Library list renders and behaves as before; other screens can now offer the same actions.
2026-10-01 18:46:21 +07:00
zarzet a549671c4e feat(metadata): add a primary artist tag mode
Artist Tag Mode gains "Primary artist only": downloads and re-enrichment write only the first credited artist to Artist and Album Artist, so players list one artist. The FFmpeg MP3, M4A and Vorbis embeds and the AC-4 path now honor the mode; MP3 and M4A previously ignored it.

Manual metadata edits, lyrics embedding and format conversion keep existing or typed credits joined instead of dropping names. The picker scrolls so three options fit on small and landscape screens. Closes #618.
2026-10-01 16:12:58 +07:00
zarzet cef57af562 fix(library): offer re-enrichment for downloaded selections 2026-10-01 00:16:25 +07:00
zarzet eed56d4cbb feat(album): replace selection sharing with metadata re-enrichment 2026-09-30 23:51:54 +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 3a63918e1f refactor(flutter): remove unreachable state and widget APIs 2026-09-30 21:44:16 +07:00
zarzet b3f7f59e2e refactor(library): remove unused history lookups and replacement paths 2026-09-30 21:43:54 +07:00
zarzet 2538cdffe1 fix(metadata): preserve the selected recording during download enrichment 2026-09-30 20:58:18 +07:00
zarzet 6c22a91498 fix(library): preserve partial scans and ignore stale completion events 2026-09-30 20:57:48 +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 b15bb2673c fix(library): index native completions and refresh background downloads 2026-09-28 12:13:17 +07:00
zarzet e3bec31b36 fix(library): preserve indexed tracks when a full scan is incomplete 2026-09-28 12:13:17 +07:00
zarzet fb13b87561 fix(metadata): resolve album artist consistently across separate downloads 2026-09-28 11:45:10 +07:00
zarzet e0f5a96564 fix(player): distinguish AAudio access and decoder failures 2026-09-27 15:26:11 +07:00
zarzet d92bcf7716 feat(player): add AAudio hi-res, WavPack DSD and DAC volume 2026-09-27 15:26:11 +07:00
zarzet 608675a255 feat(player): add direct USB audio and DSD transport 2026-09-27 15:26:10 +07:00
zarzet 4e464b5b6b feat(player): add verified USB bit-perfect PCM output 2026-09-27 12:22:42 +07:00
zarzet 5f0463a7a4 feat(player): continue playback with Library autoplay 2026-09-27 11:53:40 +07:00
zarzet fa4a03c754 fix(player): retain duration probing after queue edits during loading 2026-09-27 00:42:53 +07:00
zarzet bf7dd5b1c4 feat(player): swipe track headers and remove individual queue entries 2026-09-27 00:35:55 +07:00
zarzet 8199e4dbba fix(player): keep shuffle order stable and restore the original queue 2026-09-27 00:27:26 +07:00
zarzet 3f111b5ea6 fix(player): serialize source changes during rapid track selection 2026-09-27 00:15:38 +07:00
zarzet 369afa550b feat(library): search songs albums artists and playlists by relevance 2026-09-27 00:00:01 +07:00
zarzet 6b17f06a5b fix(updater): revalidate releases instead of hiding updates in cache 2026-09-26 15:02:46 +07:00
zarzet 0f5439e22a fix(metadata): restore cover artwork autofill 2026-09-26 11:45:45 +07:00
zarzet 5259c86365 feat(player): add Mornye media notification controls
Sync notification favorites with Library, add Mornye transport icons and an output action on legacy Android, and expose the iOS favorite command. Preserve playback position when controls refresh.

Vendor audio_service 0.18.19 with a small Android patch for custom notification actions. Modern Android keeps its system output switcher and transport layout.
2026-09-26 03:07:38 +07:00
zarzet 728d179d69 refactor(discord): remove rich presence and bundled SDK
Remove the presence setting, platform bridge, SDK archive, and SDK preparation from local and CI builds. Reject leftover Discord native libraries in release APK audits.
2026-09-26 03:07:04 +07:00
zarzet 3be9f40380 fix: adapt Hi-Res analysis card to Mornye and clarify results 2026-09-25 19:57:46 +07:00
zarzet 2ab4aaa8dc fix(ui): allow landscape only in the full player
Keep application pages in portrait and let player sheets inherit rotation from the full player. Restore portrait on navigation, replacement, removal, and completed dismissal; discard stale minimization geometry when the screen rotates on close.

Validated with 12 Flutter tests and targeted analysis. iOS simulator build confirms portrait startup from a landscape device. Platform orientation restrictions still apply on large Android displays and multitasking iPads.
2026-09-25 18:05:40 +07:00
zarzet 9d530cea9e feat(metadata): remove ReplayGain from individual and selected tracks 2026-09-25 17:12:21 +07:00
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