Commit Graph
2479 Commits
Author SHA1 Message Date
zarzet fed88fc3a9 fix(metadata): read quality from Opus in MP4 containers 2026-09-07 12:16:01 +07:00
zarzet 81ce677149 fix(download): remove legacy HIGH quality conversion 2026-09-07 01:20:28 +07:00
zarzet e8bf40ae41 fix(download): preserve native containers before legacy quality conversion 2026-09-07 01:09:30 +07:00
zarzet 660ed9fb60 fix(download): publish converted SAF files with the final extension 2026-09-07 01:06:35 +07:00
zarzet 650af6e59d fix(download): size quality picker to its content 2026-09-07 00:50:05 +07:00
zarzet 40546f48e6 fix(download): allow dragging the quality picker to dismiss 2026-09-07 00:47:15 +07:00
zarzet 7556d64596 fix(library): retain Opus badges when bitrate is missing 2026-09-06 23:59:23 +07:00
zarzet ed51b5d6ea revert: remove download size estimates 2026-09-06 22:17:23 +07:00
zarzet 174852b056 fix(download): estimate sizes from track quality metadata 2026-09-06 22:11:37 +07:00
zarzet ba00807786 fix(download): compare size estimates at each quality tier 2026-09-06 21:55:38 +07:00
zarzet c6195bcd10 feat(download): estimate file sizes in quality picker 2026-09-06 21:40:25 +07:00
zarzet bfffb8da11 fix(replaygain): write and verify native Opus gain tags
Preserve audio and artwork while replacing conflicting Opus gain tags with R128 comments. Verify manual, download, and album writes, handle SAF failures, and refresh playback normalization after saving.
2026-09-06 21:03:57 +07:00
zarzet 0acdd6d0b0 fix(metadata): match recording IDs across inconsistent catalogs 2026-09-06 20:28:15 +07:00
zarzet 56dc9ceb0d fix(metadata): normalize artist credits and preserve recording versions 2026-09-06 19:23:06 +07:00
zarzet 7d1212f519 fix(altstore): match source bundle ID to released IPA
Set the AltStore app bundle identifier to com.zarz.spotiflacAndroid, matching the published v4.9.5 IPA and all Runner build configurations.

Fixes #554.
2026-09-06 17:51:48 +07:00
zarzet 90da359e58 fix(download): prepare fallback sessions before availability checks 2026-09-06 17:50:25 +07:00
zarzet 7920554f5c fix(metadata): preserve Opus tags during batch re-enrichment 2026-09-06 17:29:54 +07:00
zarzet 781661798b fix: restore SAF metadata fallback and preserve active transfers
Propagate filesystem errors from complete metadata reads so Android retries unreadable SAF descriptors through temporary files while accepting valid audio without tags.

Keep established segmented and chunked transfers outside the resolution allowance. Continue charging initial requests, retries, and progress callbacks, including during parallel native reads, while preserving stall cancellation.

Add metadata, transfer, and native fallback regression tests. Validated with Go tests, race detector, vet, Android tests, targeted Flutter tests, analyzer, and formatting checks.
2026-09-06 16:43:24 +07:00
zarzet 717e8967cd fix(download): preserve verification provider during fallback 2026-09-06 16:39:19 +07:00
zarzet 70a2a92558 fix: resolve backend and test analyzer diagnostics 2026-09-06 16:14:57 +07:00
zarzet 1b0c28b91a fix(download): route verification notifications to pending challenges 2026-09-06 16:03:46 +07:00
zarzet 4fc837b94c fix(extensions): preserve verification on availability errors 2026-09-06 16:03:29 +07:00
zarzet 0e71003e12 test: decouple app fixtures from extension identities 2026-09-06 16:03:11 +07:00
zarzet ead2b9c0ab chore(release): bump app version to 4.9.6 2026-09-06 15:01:21 +07:00
zarzet 4b7e731474 feat(about): show compiled short Git commit 2026-09-06 14:54:35 +07:00
zarzet 8daae638f6 fix(extensions): bound stream resolution without timing out active transfers 2026-09-06 14:44:54 +07:00
zarzet d725e11abc fix(download): preserve audio quality across provider fallback 2026-09-06 14:44:54 +07:00
zarzet 34dd2f0ae9 style(dart): apply pinned formatter to existing files
Normalize three existing formatting differences with the pinned Dart formatter. No behavior changes.
2026-09-06 14:05:10 +07:00
zarzet 1dc4e77f42 refactor(i18n): share supported language choices
Use one non-generated language catalog in setup and appearance settings. Filter supported locale codes once and retain the resulting immutable picker list.
2026-09-06 14:05:09 +07:00
zarzet 1d96521c0f fix(lyrics): align usability checks with shared fixtures
Trim after removing inline timestamps before matching speaker prefixes in Dart. Run one 21-case usability corpus through Dart, Go, and Kotlin tests.

Document the shared fixture and trigger Dart and Go CI when its resources change.
2026-09-06 14:05:09 +07:00
zarzet a89f786960 perf(ui): retain platform link lookup across rebuilds
Keep the platform lookup Future in widget state and replace it only when track identifiers change. Theme rebuilds retain loaded content without another native call.

Add widget regressions for theme and identifier changes.
2026-09-06 14:04:05 +07:00
zarzet 4a4de098c8 ci(ios): reuse backend build script without duplicate framework setup
Build the XCFramework through scripts/build_ios.sh and use the framework configuration already committed in the Xcode project. Remove duplicate registration and its dedicated Ruby dependency setup.

Verified an unsigned release archive and one Gobackend reference, link entry, and embedded framework.
2026-09-06 14:04:05 +07:00
zarzet 67440925eb perf(ui): retain track history lookup snapshots
Share the retained history lookup snapshot across albums, playlists, artists, home search results, and library folders. Reuse derived lookups until the track list is replaced.

Test reuse with 4,000 items and invalidation after replacement, sorting, and filtering.
2026-09-06 14:04:05 +07:00
zarzet 09c31d9dba refactor(batch): share local track actions and phase settings
Use shared coordinators for queueing FLAC replacements and batch metadata enrichment from album and queue screens. Keep selection lifecycle handling in each screen and synchronize a settings snapshot once per phase.

Cover cancellation, partial failure, screen disposal, and settings changes between preview and apply.
2026-09-06 14:04:05 +07:00
zarzet 7c12f548d7 fix(library): bound playlist picker SQL parameters
Deduplicate requested track keys and aggregate match counts in batches of 500 parameters. Use scalar preview lookups instead of expanding another playlist ID list.

Cover large selections, duplicate keys, empty selections, and cover selection in regression tests.
2026-09-06 14:04:05 +07:00
zarzet 3d35058b02 fix(playback): retain ReplayGain for SAF descriptor leases
Carry the original display name through playback leases to format-aware metadata reads. Cache successful normalization results by source identity, bound the cache, and retry transient read failures.

Add regressions for descriptor hints, album gain fallback, and failed-read retries.
2026-09-06 14:04:04 +07:00
zarzet b32bdbc291 perf(metadata): read complete SAF tags through descriptors
Add complete metadata reads with a display-name hint in Go and both native bridges. Read seekable SAF descriptors directly and use temporary copies only when direct reading fails.

Add format parity tests for MP3, FLAC, M4A, and WAV plus a Dart bridge hint regression.
2026-09-06 14:04:04 +07:00
zarzet df8f4f5d7b fix(android): scope SAF read failures to each descriptor
Remove the activity-wide descriptor failure flag and centralize direct-read/fallback handling. A pipe, revoked URI, or malformed file no longer disables direct metadata reads for subsequent files.

Test fallback isolation, descriptor cleanup, and a successful direct read after a failure.
2026-09-06 14:04:04 +07:00
zarzet 4a7908cf4f perf(mp3): share bounded ID3 metadata and cover reads
Parse tags and artwork with one bounded frame walker and use a combined MP3 scan on cold cover caches. Skip artwork for tag-only reads and skip further pictures after finding a usable cover. Preserve earlier fields when trailing frames are malformed.

Cover ID3 versions, extended headers, unsynchronization, malformed data, and large artwork with byte-read assertions.
2026-09-06 14:04:04 +07:00
zarzet 39dc17f9de refactor(ffmpeg): remove unused live DASH subsystem
Remove the unreachable live streaming and DASH manifest call graph, its state, result model, enum, and exclusive imports. Remove the uncalled availability probe while retaining active file conversion and decryption paths.
2026-09-06 14:03:49 +07:00
zarzet 857d146c55 fix(ios): isolate download progress subscriptions
Give every subscription its own cursor, payload, and worker queue so an old blocked waiter cannot advance a replacement listener. Serialize lifecycle handling and guard cancellation.

Add a restart regression with an injected waiter; verified with Thread Sanitizer.
2026-09-06 14:03:49 +07:00
zarzet 49c3c66f15 fix(metadata): preserve Track fields during enrichment
Apply resolved metadata with copyWith and retain the existing field precedence. Keep UPC, preview URLs, and source-only fields when enrichment updates other tags.

Extract the pure merge helpers and add regression tests for field preservation.
2026-09-06 14:03:49 +07:00
zarzet 099e211f5a fix(conversion): reserve FLAC outputs without overwriting files
Reuse the conversion output lifecycle for M4A conversion and native FLAC suffix correction. Reserve destination names atomically, reject empty output, and clean partial files while preserving the input on failure.

Add regressions for existing outputs, concurrent conversions, staging, and cleanup.
2026-09-06 14:03:49 +07:00
zarzet 62ef538690 perf(library): page missing-file cleanup with safe SAF batch checks 2026-09-06 02:34:49 +07:00
zarzet 90d3a5e3de perf(extensions): clone only the requested storage value 2026-09-06 02:34:49 +07:00
zarzet ffe088f831 perf(artwork): batch and throttle cached preview validation 2026-09-06 02:34:49 +07:00
zarzet ab21de45c1 perf(library): reuse collection lookups across selection rebuilds 2026-09-06 02:34:49 +07:00
zarzet 7b87a8ee15 perf(search): decode large extension results off the UI isolate 2026-09-06 02:34:49 +07:00
zarzet 856139f908 fix(search): let latest live queries supersede cancelled requests 2026-09-06 02:34:49 +07:00
zarzet d95d070565 perf(library): stream normalized scan timestamp snapshots 2026-09-06 02:34:49 +07:00