Commit Graph
2079 Commits
Author SHA1 Message Date
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
zarzet 42c266eafc fix(extensions): enforce minAppVersion and requiredRuntimeFeatures on load
Both manifest gates were parsed but only checked by the Store UI, so
manual .sflx installs and directory loads of incompatible extensions
failed cryptically at runtime despite SIGNED_SESSION_GUIDE promising a
clear refusal. validateExtensionLoad now rejects them on every install
path, and ensureRuntimeReady re-checks so a gated package cannot be
enabled anyway. Unknown runtime features and too-new feature contract
versions fail with explicit messages; an empty app version (tests)
skips the version gate.
2026-07-26 19:14:29 +07:00
zarzet 74615a60b5 refactor: consolidate lyrics builders, cancel registries, and priority plumbing 2026-07-26 19:08:22 +07:00
zarzet 8d077ae2da feat(player): add repeat off/all/one modes
The internal player handles setRepeatMode: repeat-one replays the
current track, repeat-all wraps the queue (and keeps a single-track
shuffle queue alive). The mode is broadcast in playback state,
persisted with the playback session, and toggleable from the Now
Playing transport row and the up-next sheet; a small shuffle toggle
joins the transport row for symmetry.
2026-07-26 19:00:50 +07:00
zarzet 11fb4365a2 feat(queue): offer one-tap retry when connectivity returns
The connectivity listener now stays alive while network-failed items
remain and, on reconnect, shows a debounced snackbar counting them
with a Retry action wired to retryAllFailed scoped to network
failures. Also regenerates localizations for the recent feature
strings.
2026-07-26 19:00:49 +07:00
zarzet 424ca5d77e feat(ux): unify added-to-queue snackbars and add fetch retry
Every single-track enqueue now shows the shared added-to-queue
snackbar with a View action into Library (six call sites through one
helper). URL fetch failures in Home and via share intent gain a Retry
action; unrecognized-URL errors deliberately keep none since retrying
is deterministic.
2026-07-26 19:00:31 +07:00
zarzet 69830f6d46 refactor(go): consolidate duplicated track maps, selectors, and small helpers 2026-07-26 18:57:44 +07:00
zarzet cb8064a317 refactor(dart): consolidate duplicated lookup, filename, and search-provider helpers 2026-07-26 18:52:26 +07:00
zarzet a21d5bcb33 feat(library): ISRC duplicate detection beyond FLAC with review sheet
The download-time ISRC index now also parses mp3, m4a, ogg, and opus
tags through the existing native readers instead of skipping everything
but .flac. Library settings gain a Review duplicates sheet that groups
history and local-library rows sharing an ISRC via SQL over the
attached databases (no filesystem walk, SAF-safe), shows quality
badges, and offers keep-best and per-copy delete with confirmation.
2026-07-26 18:49:58 +07:00
zarzet 50c8f0e454 refactor(ffmpeg): remove dead conversion cluster and speculative decryption fields 2026-07-26 18:44:08 +07:00
zarzet 97758908ca refactor(library): drop unwired DB pagination providers 2026-07-26 18:44:06 +07:00
zarzet 04a71d0211 refactor: remove orphaned bridge, database, and queue helpers 2026-07-26 18:43:53 +07:00
zarzet d4f0b84615 feat(track): add Open on... platform links sheet
Track options gain an Open on... entry listing every streaming platform
song.link resolves for the track, served by a new generic
GetTrackPlatformLinks with its own memory cache beside the availability
cache (same request budget). The sheet is data-driven from the platform
map so the app core stays service-agnostic. Completes the bridge
wrappers already landed in 901fa34d; also carries the en strings for
the duplicate review sheet landing next.
2026-07-26 18:42:41 +07:00
zarzet 901fa34d80 refactor(bridge): remove dead cross-layer platform bridge methods 2026-07-26 18:32:40 +07:00
zarzet d38a368f63 chore(about): credit blackgold8282 (Korean) and BrandQc (French) as translators 2026-07-26 18:12:40 +07:00
zarzet 984beb92e8 feat(l10n): merge Crowdin updates, enable Korean at 98%
Merge origin/l10n_main (PR #428) with a per-key three-way resolution:
Crowdin values win only where main did not change the key since the
last sync, so the unused-key removal, store->repo wording sweep, and
ICU plural fixes survive. Korean is restored at 98% completion and
mapped again in crowdin.yml and both language pickers; ar/hi/nl/zh-CN/
zh-TW stay dropped (37% and below).
2026-07-26 18:12:25 +07:00
zarzet 5ca04a8534 docs(extensions): document the .sflx package suffix 2026-07-26 17:58:37 +07:00
zarzet b31f20d2bb perf(assets): instance GoogleSansFlex to the wght axis only
The app never sets FontVariation, so only the wght axis Flutter maps
from FontWeight is reachable; pin opsz/wdth/GRAD/ROND/slnt at their
defaults with fontTools varLib.instancer. Rendering is unchanged and
the asset shrinks from 4.0MB to 271KB. Glyph set and cmap are
untouched.
2026-07-26 17:58:35 +07:00
zarzet d67510fb36 chore(altstore): describe extension-based providers instead of Amazon 2026-07-26 17:58:33 +07:00
zarzet d3ab52d65d chore(l10n): unmap dropped locales from Crowdin, add uk to setup picker
Follow-up to the arb removal: unmap ar/hi/ko/nl/zh-CN/zh-TW in
crowdin.yml so crowdin pull does not recreate them, trim the dead
entries from both language pickers, and add the missing uk entry to
the setup-screen picker.
2026-07-26 17:58:31 +07:00
zarzet 3f576562ef feat(library): M3U8 playlist import and export
The playlist import picker now also accepts .m3u/.m3u8; EXTINF entries
feed the same Deezer enrichment pipeline as CSV. Collection screens
(wishlist, loved, playlists) gain an export action that resolves each
track to its local file, writes SAF entries relative to the download
tree root so external players and DAP copies resolve them, skips
tracks without a file, and shares the .m3u8 via the system sheet.
2026-07-26 17:58:12 +07:00
zarzet c497449549 feat(library): M3U8 playlist import and export
The playlist import picker now also accepts .m3u/.m3u8; EXTINF entries
feed the same Deezer enrichment pipeline as CSV. Collection screens
(wishlist, loved, playlists) gain an export action that resolves each
track to its local file, writes SAF entries relative to the download
tree root so external players and DAP copies resolve them, skips
tracks without a file, and shares the .m3u8 via the system sheet.
2026-07-26 17:56:38 +07:00
zarzet 54dcdb92dd feat(player): restore playback session after process death
Queue, current index, position, and shuffle flag are snapshotted to a
new app_state playback_session table on pause, track change, and queue
mutation (never on position ticks). On launch the session is restored
paused into the mini player; the first play seeks to the saved
position. Plain file paths that no longer exist are dropped, an
explicit stop or mini-player dismiss clears the snapshot, and the
installation-restore guard wipes it alongside the download queue.
2026-07-26 17:45:50 +07:00
zarzet c9470ef751 feat(queue): add download-next action on queued items
Queued rows get a skip-next button that reinserts the item ahead of all
other queued items, so the next free slot picks it up. During an active
native worker run the current batch keeps its order; the new order
applies from the next run.
2026-07-26 17:39:28 +07:00
zarzet 48f01ba146 fix(extensions): isolate invalid registry checksums 2026-07-26 12:29:28 +07:00
zarzet 5f5186a23e fix(reenrich): preserve release identity in batch actions 2026-07-26 12:28:00 +07:00
zarzet b93ebc1e8d docs(extensions): document file download recovery options 2026-07-26 12:26:15 +07:00
zarzet c4abbf8743 fix(verification): recover signed-session bootstrap failures 2026-07-26 11:09:18 +07:00
Zarz Eleutherius 9b35c6dc42 New translations app_en.arb (Korean)
[ci skip]
2026-07-26 05:38:10 +07:00
Zarz Eleutherius 1c95109b7b New translations app_en.arb (Korean)
[ci skip]
2026-07-26 04:15:24 +07:00
zarzet 08d648cfa8 fix(reenrich): allow correcting stale release metadata 2026-07-26 01:28:25 +07:00
zarzet 40dd9bb68f fix(download): avoid unsafe automatic range resume 2026-07-26 01:28:09 +07:00
zarzet aa0eecb27e docs(extensions): add current development guide 2026-07-26 01:15:48 +07:00
zarzet b956c57652 refactor(ios): isolate and test extension callbacks 2026-07-26 01:15:22 +07:00
zarzet fbe0674b04 test(go): close output handle before cleanup 2026-07-26 01:14:58 +07:00
zarzet 1705fb2a81 feat(extensions): verify decentralized package integrity 2026-07-26 01:14:35 +07:00
zarzet a5f2760023 refactor(android): extract native finalization policies 2026-07-26 01:14:14 +07:00
zarzet 20081b14bd refactor(dart): extract queue search and media policies 2026-07-26 01:13:52 +07:00
Zarz Eleutherius d4c38b7550 New translations app_en.arb (Korean)
[ci skip]
2026-07-25 18:41:06 +07:00
Zarz Eleutherius c681b891eb New translations app_en.arb (Korean)
[ci skip]
2026-07-25 17:44:57 +07:00
Zarz Eleutherius c19477a4f4 New translations app_en.arb (Korean)
[ci skip]
2026-07-25 16:41:28 +07:00
zarzet 1cfda41ef2 feat(audio): use VHQ settings for SoXR resampling 2026-07-25 15:58:42 +07:00
zarzet 19787ed461 fix(config): refresh announcements and remote content 2026-07-25 15:43:25 +07:00
Zarz Eleutherius a7069a8f91 New translations app_en.arb (Korean)
[ci skip]
2026-07-25 15:34:01 +07:00
Zarz Eleutherius bb127d1cc2 New translations app_en.arb (French)
[ci skip]
2026-07-25 14:00:34 +07:00
Zarz Eleutherius 927ca6e4ca New translations app_en.arb (Korean)
[ci skip]
2026-07-25 14:00:32 +07:00
Zarz Eleutherius 66cf998fb2 New translations app_en.arb (Korean)
[ci skip]
2026-07-25 12:55:14 +07:00
zarzet 555f0e8117 fix(ci): download pinned Gradle for native tests 2026-07-25 10:28:26 +07:00
zarzet cbd8fd0342 style(go): apply Go 1.26 formatting 2026-07-25 10:20:03 +07:00