zarzet
04a8700a65
fix(player): restore playback position reliably
2026-07-29 21:03:11 +07:00
zarzet
43a8d08851
fix(download): make picker drag dismissal natural
2026-07-29 19:59:09 +07:00
zarzet
6f94aae0cc
test(ui): cover search and player action consistency
2026-07-29 19:31:27 +07:00
zarzet
d4bed9c643
feat(player): polish actions and synced lyrics
2026-07-29 19:29:59 +07:00
zarzet
24b9d7ba80
fix(player): preserve audio quality across track changes
2026-07-29 19:29:19 +07:00
zarzet
cc93c5020d
feat(settings): polish search and navigation layout
2026-07-29 19:27:30 +07:00
zarzet
af28bbd492
chore(release): bump version to 4.8.5
2026-07-29 19:27:07 +07:00
zarzet
1458b74d5b
test(ui): cover shared design system contracts
2026-07-29 17:13:50 +07:00
zarzet
6e60f33fd0
feat(settings): add searchable settings index
2026-07-29 17:13:33 +07:00
zarzet
4ee7558bca
feat(collections): unify selection-aware screens
2026-07-29 17:13:21 +07:00
zarzet
78670a6ea3
feat(l10n): localize settings search
2026-07-29 17:13:01 +07:00
zarzet
7230dd3df8
refactor(ui): standardize error and empty states
2026-07-29 17:12:46 +07:00
zarzet
eed48a5fec
fix(a11y): improve compact control readability
2026-07-29 17:12:30 +07:00
zarzet
1443be6a4f
feat(details): add adaptive cover palettes
2026-07-29 17:12:15 +07:00
zarzet
dc4c75363c
refactor(extensions): share extension rows
2026-07-29 17:11:51 +07:00
zarzet
309777cc71
refactor(settings): unify settings components
2026-07-29 17:11:34 +07:00
zarzet
d765320f10
refactor(selection): share bottom bar behavior
2026-07-29 17:11:21 +07:00
zarzet
40034d184f
refactor(library): unify track cards
2026-07-29 17:10:57 +07:00
zarzet
dbdbf0ca41
refactor(ui): standardize modal sheets
2026-07-29 17:10:42 +07:00
zarzet
fa0c7b20b5
refactor(ui): unify sliver page headers
2026-07-29 17:10:24 +07:00
zarzet
c6f7b22e43
feat(theme): add shared design tokens
2026-07-29 17:10:07 +07:00
zarzet
834a8dde89
chore(repo): improve contributor experience
2026-07-29 14:16:10 +07:00
zarzet
1e973d5ecb
style(dart): apply repository formatting
2026-07-29 14:14:42 +07:00
zarzet
5b45ef80bf
fix(android): stop forcing display mode at startup
2026-07-29 13:48:41 +07:00
zarzet
e7fbaf7b75
fix(download): suffix only colliding quality variants
2026-07-29 02:43:35 +07:00
zarzet
1f55523b64
fix(metadata): fetch maximum cover for online autofill
2026-07-29 02:42:57 +07:00
zarzet
452d9a76cb
fix(metadata): verify maximum cover candidates
2026-07-29 02:42:46 +07:00
zarzet
8dcf7fa998
fix(storage): recover from unwritable download folders
2026-07-29 02:03:09 +07:00
zarzet
662558e3e6
fix(ui): sanitize user-facing errors
2026-07-29 01:43:04 +07:00
zarzet
b1c18b95e7
fix(analysis): detect effective spectral cutoff
2026-07-28 21:15:06 +07:00
zarzet
1bf61884cd
chore(deps): update FFmpeg and notifications
2026-07-28 20:52:57 +07:00
zarzet
d7710e2a38
chore(release): bump version to 4.8.1
2026-07-28 20:23:46 +07:00
zarzet
b2e4548204
fix(library): retain history during active downloads
2026-07-28 18:12:55 +07:00
zarzet
7eb0ed2fdb
fix(metadata): dismiss autofill preview and surface feedback
2026-07-28 17:39:58 +07:00
zarzet
1390376f09
fix(album): overlay selection bar above navbar
2026-07-28 17:25:14 +07:00
zarzet
650c360eb9
fix(metadata): align source picker with edit sheet
2026-07-28 17:15:27 +07:00
zarzet
d1db2cdcc5
fix(analysis): isolate metrics from active downloads
2026-07-28 16:04:44 +07:00
zarzet
6c89a1e177
feat(album): batch download selected tracks
2026-07-28 15:48:45 +07:00
zarzet
fb538e9517
feat(metadata): choose extension for online autofill
2026-07-28 15:18:10 +07:00
zarzet
209eb5f10e
fix(download): always alert for verification pauses
2026-07-28 14:21:42 +07:00
zarzet
385afe290a
fix(download): reject mismatched provider tracks
2026-07-28 14:15:44 +07:00
zarzet
b4f239c692
fix(download): honor explicitly selected provider
2026-07-28 14:11:14 +07:00
zarzet
7bf6f32802
fix(extensions): serialize verification callbacks
2026-07-28 14:09:06 +07:00
zarzet
6368d1feee
fix(library): retain cached rows across refresh
2026-07-28 12:51:50 +07:00
zarzet
7f277f7a88
fix(library): backfill local audio bitrates
2026-07-28 12:51:28 +07:00
zarzet
4c33f112ad
fix(library): keep rows visible during refresh
2026-07-28 01:50:54 +07:00
zarzet
80d9d87870
perf(metadata): avoid SAF copies during quality probes
2026-07-28 01:50:41 +07:00
zarzet
26570792a9
fix(library): persist lossless bitrate metadata
2026-07-28 00:50:20 +07:00
zarzet
ad08b95c0f
perf(android): skip unused download widget work
2026-07-28 00:50:00 +07:00
zarzet
454ef53977
feat(library): add quality label display modes
2026-07-27 17:25:39 +07:00
zarzet
e4cd52f29f
feat(library): highlight high-bitrate quality badges
2026-07-27 16:58:58 +07:00
zarzet
af6ca12e85
fix(download): swap local track variant actions
2026-07-27 14:31:39 +07:00
zarzet
9b4a960324
fix(home): keep search visible during provider changes
2026-07-27 14:24:57 +07:00
zarzet
1cdf4b4547
fix(library): retain records when deletion fails
2026-07-27 14:24:39 +07:00
zarzet
73846c40ca
fix(download): complete quality variants reliably
2026-07-27 14:22:24 +07:00
zarzet
856e2cbb9e
fix(audio): wait for complete analyzer metrics
2026-07-27 14:19:52 +07:00
zarzet
3b901461f6
feat(library): show a trailing fade on the filter chips row
...
Extend ScrollEdgeFade with a horizontal axis and wrap the All/Albums/
Singles/Playlists chips so a right-edge fade signals the row scrolls
when chips overflow the screen.
2026-07-27 02:34:13 +07:00
zarzet
ef3e019a3a
feat(library): playlists filter view and configurable default view
...
Add a fourth Playlists chip/page to the Library filter pager, rendered
as an album-style grid of playlist cells (search filters by name, page
provider short-circuits since playlists come from libraryCollections).
Add a defaultLibraryView setting (last used / all / albums / singles /
playlists) in Library settings, applied on startup and whenever the
shell switches back to the Library tab.
2026-07-27 02:12:35 +07:00
zarzet
eaafeef1bb
fix(library): keep track count readable next to filter actions
...
Share one count header row: count text keeps its intrinsic width and the
Filters/Create playlist buttons scale down on narrow widths instead of
truncating the count to an ellipsis.
2026-07-27 01:50:49 +07:00
zarzet
50375b751e
feat(player): animate track changes and open queue with a swipe up
...
Crossfade+scale the artwork and fade+slide title/artist on track change.
Make the player page non-scrollable and route vertical gestures instead:
swipe up on the content or bottom tab strip opens the queue sheet, swipe
down still forwards to the route's drag-to-dismiss.
2026-07-27 01:50:47 +07:00
zarzet
2a1c9e0904
fix(store): center add-repository state and keep submit button above keyboard
...
Use SliverFillRemaining(hasScrollBody: false) so the page scrolls as one
unit when the keyboard opens, pad for the nav bar so the form is centered
in the visible area, and set scrollPadding so focusing the URL field also
reveals the Add Repository button.
2026-07-27 01:50:33 +07:00
zarzet
0278fad278
feat(tutorial): fit pages on short viewports and fix page indicator visibility
...
Scale vertical gaps and icon by viewport height so pages fit with little
or no scrolling, add ScrollEdgeFade as a scroll cue when they still
overflow, and use onSurfaceVariant for inactive page dots (the previous
surfaceContainerHighest was invisible on AMOLED black).
2026-07-27 01:50:31 +07:00
zarzet
efe703d60d
feat(setup): make language list scrollability obvious and center step content
...
Add ScrollEdgeFade (bottom gradient while more content remains) plus an
always-visible scrollbar on the language list, and bias step centering
upward by the header height so content sits at the optical screen center.
2026-07-27 01:50:17 +07:00
zarzet
55be8fc827
fix(download): restore fast SQL-only duplicate check so huge playlists queue again
2026-07-27 01:43:56 +07:00
zarzet
c42a1be76c
feat(tablet): cap wide-layout margins at 80dp so content uses the screen
2026-07-27 01:39:22 +07:00
zarzet
ac56e76b62
feat(appearance): manual toggle to force backdrop blur on lower device tiers
2026-07-27 01:39:16 +07:00
zarzet
9da3607932
feat(queue): long-press menu with move up/down for queued items
2026-07-27 01:24:14 +07:00
zarzet
e8a3fc58c7
feat(metadata): show average bitrate for lossless files in the track screen
2026-07-27 01:20:38 +07:00
zarzet
52b1147275
feat(library): add missing-ISRC metadata filter
2026-07-27 01:15:51 +07:00
zarzet
8fe2662c0a
fix(queue): keep cancelled downloads retryable across every cancel path and app restarts
2026-07-27 01:13:23 +07:00
zarzet
23f18ab276
fix(queue): give completion-bridge cells swipe navigation into the library list
2026-07-27 01:08:32 +07:00
zarzet
c9b1898cc0
refactor(metadata): split cover cache, display helpers, and options menu into part files
2026-07-27 00:39:44 +07:00
zarzet
e8290a5eb0
refactor(extensions): split manifest models and provider-priority logic into part files
2026-07-27 00:34:55 +07:00
zarzet
d0dca1a101
refactor(library): split row models and queue union SQL into part files
2026-07-27 00:32:42 +07:00
zarzet
5ee7f733cf
refactor(analysis): split models, info card, and spectrogram into part files
2026-07-27 00:30:25 +07:00
zarzet
6424647472
refactor(android): split replaygain journal, snapshots, and network policy out of DownloadService
2026-07-27 00:28:12 +07:00
zarzet
4539b3fd67
refactor(android): split media, ffmpeg, and SAF publish helpers out of NativeDownloadFinalizer
2026-07-27 00:25:34 +07:00
zarzet
bd2bd85c9e
refactor(go): split per-format scanners and incremental scan out of library_scan.go
2026-07-27 00:21:04 +07:00
zarzet
1b861f9ae8
refactor(go): split result/overlay helpers and output builders out of extension_fallback.go
2026-07-27 00:20:04 +07:00
zarzet
8a95f684d2
refactor(go): split deezer models, cache upkeep, and browse endpoints out of deezer.go
2026-07-27 00:18:45 +07:00
zarzet
358154c39e
refactor(go): split lyrics provider config, LRC codec, and search matching out of lyrics.go
2026-07-27 00:16:18 +07:00
zarzet
bfd44738e2
refactor(queue): fold duplicated final-embed blocks into one helper
2026-07-27 00:09:50 +07:00
zarzet
0b053d59b1
refactor(queue): decompose single-item god-method into _DownloadRun pipeline class
2026-07-27 00:06:35 +07:00
zarzet
21bc31e0b6
refactor(queue): move single-item download pipeline into a part file
2026-07-26 23:45:22 +07:00
zarzet
ac90e7f517
refactor(android): split SAF scan and URI IO helpers out of MainActivity
2026-07-26 23:30:26 +07:00
zarzet
4ab6388e18
chore(analysis): enable unreachable_from_main lint
2026-07-26 23:19:36 +07:00
zarzet
5412037ac8
refactor(artist): split section builders and dialogs into a part file
2026-07-26 23:10:18 +07:00
zarzet
ea172ba17b
refactor(go): split package validation and VM lifecycle out of extension_manager.go
2026-07-26 23:05:30 +07:00
zarzet
b81bd5e8aa
refactor(history): split models and startup maintenance into part files
2026-07-26 22:56:57 +07:00
zarzet
00d03de2b1
refactor(home): split explore, recent, import, and search-results into part files
2026-07-26 22:51:55 +07:00
zarzet
49bfefb750
refactor(queue): split progress, verification, and connectivity into part files
2026-07-26 22:47:15 +07:00
zarzet
9dc44ecd88
refactor(go): split Ogg parsing and cover-art extraction out of audio_metadata.go
2026-07-26 22:39:58 +07:00
zarzet
2dbf8f6f9b
refactor(go): split M4A/MP4 tagging out of metadata.go
2026-07-26 22:38:08 +07:00
zarzet
2ce793d68f
perf(ui): scope scan rebuilds, aspect-bound MediaQuery, lazy duplicate list
2026-07-26 22:25:07 +07:00
zarzet
cbee637501
perf(history): coalesce index bumps and batch per-row exists lookups
2026-07-26 22:25:04 +07:00
zarzet
1cda88cafc
perf(metadata): cache MusicBrainz ISRC lookups in the finalize path
2026-07-26 22:15:04 +07:00
zarzet
6fcfb67af2
perf(go): cut redundant signed-session writes, progress-callback churn, tombstone growth
2026-07-26 22:14:58 +07:00
zarzet
183744c41e
feat(android): home-screen download queue widget
...
A RemoteViews widget (no new dependencies) shows the active track,
artist, queue count, and a coarse progress bar, with tap-to-open.
DownloadService pushes updates only on discrete events — track or
status changes and 25% progress steps, never per byte — matching the
battery discipline; the last state persists so launcher refreshes
render after process death. Colors use Material You system tokens on
API 31+ with static light/dark fallbacks below.
2026-07-26 19:21:58 +07:00
zarzet
97b87472fe
feat(metadata): manual MusicBrainz lookup in the tag editor
...
The Go MusicBrainz genre and album-artist ISRC lookups only ran
automatically at download time. The tag editor's auto-fill section
gains a Fetch from MusicBrainz button that bridges both exports in one
channel call (sparing the 1 req/s budget) and fills the fields as
editable suggestions; nothing is written until Save.
2026-07-26 19:21:32 +07:00
zarzet
fa7ef84b39
fix(extensions): anchor URL handler patterns to the host
...
MatchesURL treated patterns as substrings of the whole URL, so
"spotify.com" matched any URL embedding it in a query parameter and a
hostile query string could route a link to the wrong handler. Patterns
now anchor to the URL host (exact domain or subdomain, optional path
prefix); "scheme:" patterns anchor to the URI front. With several
matching handlers, FindURLHandler now breaks the tie via the user's
metadata provider priority instead of Go's random map order.
2026-07-26 19:14:31 +07:00