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
Zarz Eleutherius
505c87eda7
New translations app_en.arb (Indonesian)
...
[ci skip]
2026-08-21 22:59:09 +07:00
Zarz Eleutherius
b3c3e2d756
New translations app_en.arb (Indonesian)
...
[ci skip]
2026-08-21 21:13:23 +07:00
Zarz Eleutherius
a0557cb31d
New translations app_en.arb (Indonesian)
...
[ci skip]
2026-08-21 18:52:31 +07:00
zarzet
89d39c4074
fix(metadata): show readable SAF file locations
2026-08-21 01:02:02 +07:00
Zarz Eleutherius
ce7302082c
New translations app_en.arb (Italian)
...
[ci skip]
2026-08-20 21:35:50 +07:00
Zarz Eleutherius
706ddbf083
New translations app_en.arb (Italian)
...
[ci skip]
2026-08-20 19:35:28 +07:00
Zarz Eleutherius
8d525b1da6
New translations app_en.arb (Spanish)
...
[ci skip]
2026-08-20 19:35:26 +07:00
Zarz Eleutherius
dbe60d7644
New translations app_en.arb (Italian)
...
[ci skip]
2026-08-20 18:15:45 +07:00
Zarz Eleutherius
f572259c7d
New translations app_en.arb (Italian)
...
[ci skip]
2026-08-20 07:05:19 +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
Zarz Eleutherius
a218a7e118
New translations app_en.arb (Spanish)
...
[ci skip]
2026-08-18 09:35:31 +07:00
Zarz Eleutherius
a8a3db1ca9
New translations app_en.arb (Spanish)
...
[ci skip]
2026-08-18 08:35:01 +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
Zarz Eleutherius
eed3a4ad10
New translations app_en.arb (Ukrainian)
...
[ci skip]
2026-08-17 05:15:23 +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