Commit Graph
616 Commits
Author SHA1 Message Date
zarzet 99ccc8826f refactor(layering): move logic files out of screens
Search bucketing, refresh policy, folder data, history snapshot and the
selection and collapsing-header mixins hold no widgets, so they move to
controllers; the settings search catalog is pure presentation metadata and
moves to utils. Files with many importers keep a re-export in screens.
2026-10-19 00:37:42 +07:00
zarzet ce21896ff5 refactor(layering): move model files to models and fix inverted imports
library_database_models and ffmpeg_models are plain data types, so they live in
models (re-exports stay at the old paths). deleted_library_files uses providers
and download_progress uses provider state, so both move to providers, and
ffmpeg_reenrich is a service. models no longer import from services for these.
2026-10-19 00:37:42 +07:00
zarzet ab8a329d2d refactor(layering): move UI action helpers from services and utils to controllers
Batch actions, clickable metadata, playback, auth launcher, action forms and
the glass warmup drive UI flows, so they belong with the controllers. Files
with more than three importers (or an importer that must stay untouched) keep
a one-line re-export at the old path.
2026-10-19 00:37:42 +07:00
zarzet adf2047df6 refactor(utils): share the FNV-1a 32-bit hash
Add fnv1a32 in hash_utils.dart for the scan output name (UTF-8 bytes) and
qualityVariantStagingLabel (UTF-16 code units). Unit tests pin outputs
computed from the original inline code.
2026-10-19 00:15:48 +07:00
zarzet b5cf97881f refactor(android): move finalizer history into NativeFinalizerHistory.kt
Move worker request contract validation and the download history row
and JSON mapping out of NativeDownloadFinalizer into a sibling file of
extension functions. Bodies are verbatim. NATIVE_WORKER_CONTRACT_VERSION
stays on the object with its value, so its contract test is unchanged.
The history column contract test now reads buildHistoryRow from the new
file. normalizeOptional moves with the row builder, so
cleanMetadataString widens from private to internal.
2026-10-19 00:14:47 +07:00
zarzet 992e21e297 refactor(player): port tests to musicPlayerRuntime and delete the test-only wrappers
The wrappers only forwarded to musicPlayerRuntime and were referenced by one
test file. The forwarding helpers now live in that test.
2026-10-18 23:53:38 +07:00
zarzet fbed496014 refactor(history): move the history schema and row mapper into their own files
Mirror the library_schema and library_row_mapper split: HistorySchema owns
create, upgrade, index creation and backfills, HistoryRowMapper owns the
JSON/row mapping and the derived normalized and queue-sort columns. SQL text
is unchanged. Tests that read the history CREATE TABLE and index text now
read history_schema.dart.
2026-10-18 23:28:33 +07:00
zarzet 019257541b refactor(logging): rename Go-era log names to native
The log buffer polls the native backend, so isFromGo, the Go log polling
methods and their private state now use native names. Comments that still
described the backend as Go are reworded. No string literals changed.
2026-10-18 22:12:29 +07:00
zarzet e41e6ec432 test: share one FixedSettingsNotifier across tests
Replace 16 private SettingsNotifier fakes that only returned a fixed AppSettings with test/support/fixed_settings.dart. Mornye owner WIP tests and bespoke fakes are untouched.
2026-10-18 22:08:02 +07:00
zarzet 77c149eb20 test: skip the automix renderer test when ffmpeg is missing
Mirror the other ffmpeg-backed tests: skip instead of failing with a ProcessException on hosts without ffmpeg.
2026-10-18 22:08:02 +07:00
zarzet 25ad8b3c71 test: poll for cover eviction instead of asserting after one event-loop turn
Cover eviction deletes files without awaiting, so asserting right after one event-loop turn was timing dependent. Poll with a bounded timeout instead.
2026-10-18 22:08:02 +07:00
zarzet 7cef0700cc test: split models_and_utils_test by domain and isolate source contracts
The grab-bag file mixed model tests with tests that pin literal source
text across Dart, Kotlin and Swift. The contracts now live in
source_contracts_test.dart with a header explaining that they must be
updated, never deleted, when code moves. The remaining groups moved
verbatim into domain files.
2026-10-18 22:07:17 +07:00
zarzet 0539a12f99 ci: add a dart format gate and fix the one drifted test file
Format drift was unchecked in CI. Add the gate before analyze and include integration_test in the documented format commands.
2026-10-18 22:01:32 +07:00
zarzet 68c739dfa1 fix(equalizer): keep headroom and limiter choices when applying a preset
Applying a preset replaced every setting, so built-in presets silently
turned automatic headroom, the limiter and the compressor back on and
reset balance. Presets now carry only the curve, preamp, bass and treble.
The active preset is matched on the same fields, so it no longer shows as
Custom once headroom is off.
2026-10-18 20:58:36 +07:00
zarzet dbee3d56cb feat(player): search lyrics online for files without them
The empty lyrics page offers Search online, which asks the enabled lyrics
providers in their configured order. The result is shown in the player
only and never written to the file; a late result is dropped after the
track changes, and a miss says so.
2026-10-18 19:24:39 +07:00
zarzet 56ad01ec2c feat(lyrics): add lrc.red and BetterLyrics, split SpotiFLAC-Mobile Lyrics
Add two keyless providers that serve Apple Music TTML: lrc.red, matched by
recording, and BetterLyrics, which answers songs it has already cached.
TTML is read into the first-party Apple line structure, so vocal sides,
backing groups, word timing, translations and romanization share one eLRC
formatter. The XML depth guard moves to core so both readers use it.

SpotiFLAC-Mobile Lyrics becomes its own provider instead of a fallback
inside Apple Music. New defaults are Apple Music, lrc.red, SpotiFLAC-Mobile
Lyrics, LyricsPlus and LRCLIB. Migration 13 moves untouched defaults to the
new list and keeps the former fallback right after Apple Music in custom
orders. Replace the dead LyricsPlus Workers mirror.
2026-10-18 19:24:31 +07:00
zarzet 2ede99bef8 fix(player): restore the lighter full-screen cover scrim
Shade the app bar lightly and ease it out so white icons stay legible
without darkening the top of the cover.
2026-10-18 12:41:28 +07:00
zarzet 7c0b275f9f feat(onboarding): introduce the 5.2 release tour 2026-10-18 04:09:16 +07:00
zarzet 66d480dbdc fix(storage): retain legacy Android cipher migration support 2026-10-18 04:09:16 +07:00
zarzet 080df889d0 fix(library): recover missing local album artwork from audio 2026-10-18 04:09:15 +07:00
zarzet 759079517c fix(library): restore bit depth as the default quality badge 2026-10-18 03:11:54 +07:00
zarzet 4cee16e9e8 feat(home): localize greetings and address profile names 2026-10-18 03:11:44 +07:00
zarzet 1a6dc7366e feat(home): expose extension country settings and isolate regional caches 2026-10-18 03:11:33 +07:00
zarzet 2455cabced fix(haptics): analyze document audio across skips and AutoMix 2026-10-18 03:11:20 +07:00
zarzet f426b2d1f0 fix(player): report Android output failures without skipping tracks 2026-10-18 03:11:20 +07:00
zarzet 2782b1f7f2 feat(lyrics): refresh quote sharing and load lyrics on demand 2026-10-18 03:10:53 +07:00
zarzet bfd180909c refactor(explore): centralize persistent cache storage 2026-10-18 00:47:21 +07:00
zarzet 1b66bc469d perf(history): suppress unchanged membership notifications 2026-10-18 00:47:21 +07:00
zarzet 579ffae9c3 refactor(downloads): centralize failed session accounting 2026-10-18 00:47:21 +07:00
zarzet 1456d36a98 refactor(downloads): update queue items and indexes together 2026-10-18 00:47:21 +07:00
zarzet 4ab4e87c32 perf(history): reuse unchanged download lookup indexes 2026-10-18 00:46:53 +07:00
zarzet dea131778c refactor(playback): share lost route pause transitions 2026-10-18 00:46:53 +07:00
zarzet bbeca05a7a perf(releases): narrow weekly release provider dependencies 2026-10-18 00:46:52 +07:00
zarzet afab47ae4d perf(lyrics): cache timed lyric segment geometry 2026-10-18 00:46:52 +07:00
zarzet ad9b2b2ea5 refactor(extensions): share priority settings links 2026-10-18 00:46:52 +07:00
zarzet 12119530a7 refactor(library): share selection action grid layout 2026-10-18 00:46:52 +07:00
zarzet 50368012c0 refactor(settings): share selectable bottom sheet options 2026-10-18 00:46:51 +07:00
zarzet 08bc422634 perf(player): cache adjacent track titles during swipes 2026-10-18 00:46:51 +07:00
zarzet 181900a23a test(library): share re-enrichment settings fixtures 2026-10-18 00:46:10 +07:00
zarzet a396bcf08b refactor(metadata): reuse the platform tag mapper 2026-10-18 00:46:09 +07:00
zarzet 05a5613332 feat(player): add configurable full-screen cover art
Offer default and full-screen artwork in Material and Mornye, retaining landscape layouts and full-screen Mornye motion artwork. Keep the Material header readable over bright covers and normalize invalid saved styles without resetting other settings.

Validation: 144 related Flutter tests, flutter analyze, generated settings, formatter and diff checks.
2026-10-17 22:27:06 +07:00
zarzet 3d11169f21 fix(network): request Android 17 local network access before NAS connections 2026-10-17 16:18:41 +07:00
zarzet 6debfccba2 fix(theme): retain dominant cover colors in player backgrounds 2026-10-17 16:18:39 +07:00
zarzet 161a216bea fix(automix): align effect handoffs and render sufficient source audio 2026-10-17 16:18:38 +07:00
zarzet 11c6cf9915 feat(player): synchronize music haptics with local playback 2026-10-17 16:18:37 +07:00
zarzet 78a5e078cd feat(lyrics): share lyric cards and refine timed vocal transitions 2026-10-17 16:18:35 +07:00
zarzet 40f65d3a4d feat(player): show audio source processing and output details 2026-10-17 16:18:32 +07:00
zarzet ecf594aac2 feat(equalizer): add multiband EQ and per-player native audio processing 2026-10-17 16:18:30 +07:00
zarzet 21fd51d62c feat(autoplay): enable personalization by default and confirm learning resets 2026-10-17 16:18:26 +07:00
zarzet befcd2adec feat(a11y): label controls and improve settings contrast and targets 2026-10-17 16:18:25 +07:00