Commit Graph
100 Commits
Author SHA1 Message Date
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