zarzet
0de4135966
fix(ui): smooth metadata transitions and refine settings
2026-08-26 22:36:54 +07:00
zarzet
747dea886c
fix(runtime): bound resources and quarantine stalled extensions
2026-08-26 21:09:05 +07:00
zarzet
0e3fca9967
perf(downloads): stream concurrent native queue work
2026-08-26 18:37:56 +07:00
zarzet
e149ee5358
fix(storage): publish finalized SAF output once
2026-08-26 18:37:15 +07:00
zarzet
f8bd1b5931
feat(extensions): add resilient transfer runtime
2026-08-26 18:35:44 +07:00
zarzet
778f58e6e4
fix(lints): await asynchronous work in guarded blocks
2026-08-26 18:35:21 +07:00
zarzet
8f7b9ba47d
perf(metadata): coalesce Deezer enrichment requests
2026-08-26 18:31:53 +07:00
zarzet
5f8e0da148
fix(metadata): remove forced download attribution
2026-08-26 18:31:39 +07:00
zarzet
832214043d
fix(extensions): remove Block Store dependency
2026-08-26 17:00:27 +07:00
zarzet
aafddde6bb
fix(ios): handle library scan count output
v4.9.0
2026-08-25 01:24:30 +07:00
zarzet
5c4b99b6df
Merge remote-tracking branch 'origin/main'
2026-08-25 01:09:55 +07:00
zarzet
73051a5feb
fix(player): smooth timed lyrics highlighting
2026-08-23 15:06:46 +07:00
zarzet
c6437d8428
feat(library): add bit depth quality label mode
2026-08-23 11:42:47 +07:00
zarzet
aec7bf7a1b
fix(library): show complete quality labels
2026-08-23 11:36:15 +07:00
zarzet
818f1d3a10
fix(analysis): reject false low spectral cutoffs
2026-08-23 11:07:59 +07:00
zarzet
c9cf26fea6
fix(ui): align explicit badges with track titles
2026-08-23 01:13:10 +07:00
zarzet
bc58a28455
fix(metadata): avoid duplicate explicit indicator
2026-08-22 23:28:15 +07:00
zarzet
7557ffbf85
fix(metadata): preserve explicit advisory across conversions
2026-08-22 23:24:56 +07:00
zarzet
19591bdf19
feat(metadata): show explicit badges in track titles
2026-08-22 23:08:40 +07:00
zarzet
75e1cf17b8
fix(home): clear recent activity permanently
2026-08-22 22:45:06 +07:00
zarzet
b1180a70a7
fix(library): restore live folder scan progress
2026-08-22 13:43:06 +07:00
zarzet
b780aae38f
fix(library): open folder actions on row tap
2026-08-22 13:37:06 +07:00
zarzet
60624436a6
feat(library): support multiple storage folders
2026-08-22 11:15:42 +07:00
zarzet
89d39c4074
fix(metadata): show readable SAF file locations
2026-08-21 01:02:02 +07:00
zarzet
cee3d75655
chore(deps): bump locked Flutter dependencies
2026-08-19 21:24:59 +07:00
zarzet
43e44db257
chore(analyzer): exclude platform folders from analysis
2026-08-19 21:24:32 +07:00
zarzet
951f648787
fix(analysis): bound spectrogram memory for large files
2026-08-19 14:33:13 +07:00
zarzet
8e3dbf3c23
test(audio): verify tagged PCM playback compatibility
2026-08-19 14:33:03 +07:00
zarzet
ea63291db8
refactor(metadata): move cover resolution to extensions
2026-08-19 13:12:29 +07:00
zarzet
bdb10a2ae6
chore(deps): update Flutter and Go dependencies
2026-08-19 11:59:28 +07:00
zarzet
4b75555dd5
chore(release): bump version to 4.9.0
2026-08-18 23:15:11 +07:00
zarzet
4fef287a7b
feat(metadata): add download attribution to comments
2026-08-18 21:17:36 +07:00
zarzet
fd12ad2dbe
fix(metadata): preserve source release fields across providers
2026-08-18 20:57:11 +07:00
zarzet
8b231be19a
fix(download): unblock queue after verification cancel
2026-08-18 20:50:48 +07:00
zarzet
958e0db4e8
fix(download): accept matching tracks across releases
2026-08-18 20:50:39 +07:00
zarzet
6d97151ee7
fix(ui): align metadata and wrap track badges
2026-08-18 20:50:31 +07:00
zarzet
2cb5993d6e
fix(ui): update tutorial copy and library play button
2026-08-18 19:49:41 +07:00
zarzet
a7423b7f89
feat(metadata): edit release tags and render UPC barcodes
2026-08-18 19:29:12 +07:00
zarzet
290923e88f
feat(tagging): write release identity tags
2026-08-18 19:04:26 +07:00
zarzet
48883d51d4
feat(extensions): preserve provider metadata
2026-08-18 12:28:35 +07:00
zarzet
7fc27e8314
perf(library): stream scans and optimize queue queries
2026-08-18 11:03:05 +07:00
zarzet
29609b6084
refactor(extensions): prioritize configurable settings
2026-08-17 21:04:53 +07:00
zarzet
b378297a99
fix(library): preserve retained files during duplicate cleanup
2026-08-17 21:03:02 +07:00
zarzet
2e115308b7
feat(filename): add provider traceability tags
2026-08-17 20:51:27 +07:00
zarzet
efc03db308
fix(metadata): keep collaboration albums grouped
2026-08-11 20:58:27 +07:00
zarzet
5374883875
fix(download): normalize MP4 audio extension by codec ( #512 )
2026-08-11 19:07:00 +07:00
zarzet
4693e2f1d2
feat(metadata): show embedded cover resolution ( #510 )
2026-08-11 18:55:40 +07:00
zarzet
8333069b95
fix(lyrics): use normalized Genius response ( #517 )
2026-08-11 17:54:15 +07:00
Padma Dev
7e429f8373
feat(playlists): add play actions ( #506 )
2026-08-11 17:32:20 +07:00
Abelardo Ramirez
48dbe3679d
fix(download): treat a short clean EOF as resumable, not complete
...
Follow-up to #491 , which was fixed in 4.8.5 by making mid-download
resume opt-in (safe default: fail and delete the staged file, since
switching networks can route a stable URL to a different CDN object).
That fix only changes what happens on a *real* read error. It doesn't
help if a transport surfaces a mid-transfer connection drop as a plain
io.EOF instead of io.ErrUnexpectedEOF - fileDownload's copyBody loop
still breaks out and promotes the file on any clean EOF, regardless of
whether written bytes actually reached Content-Length. This app's
uTLS-based client (used for TLS-fingerprint spoofing) is exactly the
kind of custom transport where that guarantee isn't necessarily upheld.
Now a clean EOF short of a known Content-Length is routed through the
same resume-or-fail path as a real read error, so it respects the same
opt-in `resume` option: fails and cleans up the staged file by default,
or resumes via Range/If-Range when the caller explicitly requested it
and the server provided a validator.
extension_runtime_file_download_integrity_test.go adds three tests:
- fails by default even when a validator is present (matches the
opt-in policy from 4.8.5)
- resumes correctly when `resume: true` is passed
- fails and cleans up when there's no validator at all
All three fail on the pre-fix code and pass with it.
Note: fileDownloadChunked's unknown-total-size path (used for
YouTube's CDN) has an analogous but harder-to-fix ambiguity - without
a known length there's no way to distinguish a legitimately short
final chunk from a truncated one - left as a follow-up.
2026-08-11 17:29:48 +07:00