Hi guys, here's the 2.5 update for ByeTunes. This one adds full Deezer support and real parallel downloads for way faster queues, plus a brand new Smart Playlists feature with custom cover art. On top of that, a bunch of reliability fixes across downloads, backups, and repair tools — including a crash fix for the download queue.
Quick recommendation: for the best speed and match accuracy while searching, set Deezer as your Search Provider. And to keep full Apple Music compatibility (animated artwork, richer info), keep Apple Music as your Metadata Source.
Deezer — full provider support
- Deezer is now a full first-class search source alongside Apple Music/iTunes, with its own tab ("Search or paste a Deezer link")
- Paste a Deezer track/album/artist/playlist link and it resolves directly — same one-tap flow Apple Music/Spotify links already had
- Deezer artist pages now show real top tracks + full discography (up to 100 each), not just a flat track list
- Deezer search results paginate ("load more"), merged into the same song/album results as other providers
- "Find on Deezer" added alongside "Find on Spotify" as an in-app browser shortcut for failed downloads
Download Engine — real concurrency & speed
- Downloads used to run one at a time through a single sequential task; now use a real worker-pool so multiple tracks download in parallel
- Concurrency is format-aware: 3 simultaneous downloads for lossy formats, capped to 2 for lossless (FLAC/ALAC), since lossless generation is much more expensive on the backend
- Added a start-pacer that spaces out when new downloads begin (wider gap for lossless) on top of the concurrency cap — bursts of simultaneous requests were triggering backend 429/500 errors even within the concurrency limit
- Fixed the download engine getting silently recreated from scratch whenever the Download tab's view was torn down (older iOS layout) — was orphaning in-flight downloads and losing queue state; now backed by a shared instance that survives it
- Aggregate download speed now tracked and shown live across all active downloads
Background Downloads
- Fixed isAppActive defaulting to true on a silent background relaunch, which routed transfers through the short-lived foreground path instead of the durable background session (caused FLAC→MP3 downgrades and stalls)
- Fixed the candidate fallback loop not checking cancellation, which let a cancelled foreground download silently complete via the MP3 fallback instead of aborting
- Completed-but-unclaimed background download results now persist to disk so a killed/relaunched app recovers them instead of re-downloading
- Finished tracks now persist their own .done state so a relaunch mid-queue doesn't drop them from Queue Details
- Added a genuine background-processing task (registered at launch) so metadata fetching can run even when the app isn't open, instead of only opportunistically while active
- Each backend candidate now uses its own requested format for its file-extension fallback instead of a hardcoded "flac" default
- Plain-language failure messages in the download queue instead of raw HTTP/backend error bodies
- Fixed link.deezer.com short links not resolving
- Fixed a crash: removing a failed download could resurrect it (and crash on the second removal) because a stray background-session completion callback fired after removal and wrote the state back. Removal now properly cancels the underlying background task too.
Smart Playlists
- Create playlists by rule: Genre, Artist, Decade, Format, or Explicit Rating
- Multi-select across all rule types with combined naming (e.g. "Rock, Pop" or "1990s, 2000s")
- Live match counts, search within Genre/Artist lists, lossless-format badges
- Artist grouping splits collab credits ("A & B") into separate artists, matching the on-device Artists tab
- "Refresh Smart Playlist" — remembers its rule and can re-sync to catch newly matching songs
Playlists
- New naming screen matches Apple Music: photo picker, large title field, X/checkmark controls — used for manual and smart playlist creation alike
- Custom playlist cover photos: pick a photo, it's auto-cropped to a square and uploaded using the same on-device artwork system Apple Music itself uses; persists across relaunch
- In-playlist rename
- Playlist restore now lists which specific tracks failed to match instead of just a count
On-Device Library
- Select/Select All controls pinned so they stay visible while scrolling
- Select/Select All/Add to Playlist/Add to Album/Export restricted to the Songs tab; Playlists tab gets Select/Select All/Export/Delete
- Removed redundant header title/count and Export Folder picker from non-Songs tabs
- Audio Quality Analysis (new): tapping a song shows a verdict flagging mislabeled files (e.g. an MP3 renamed .flac), suspiciously over-compressed "lossless" files, and low-bitrate lossy files
- On-device album metadata editing
- In-place device audio file replacement
- Content Rating redesigned from a cramped segmented control to a compact menu row, with a new "No Rating" option
- Fixed the explicit/clean rating editor: a binary toggle could only ever write explicit/none, silently flipping "clean" tracks to explicit
Reliability Fixes
- Injection failures no longer silently drop songs from the queue — unconfirmed songs are put back
- Repair operations (artwork fix, database doctor, alphabetical order) use per-operation cancellation tokens instead of one shared flag, so cancelling one can no longer kill an unrelated one
- Background metadata fetch no longer double-imports a song if the process is killed mid-drain
- Artwork upload failures during metadata edits are now reported instead of silently swallowed
- A failed database integrity check now aborts the library merge instead of writing on top of a known-corrupt database
- Fixed the large-batch injection safeguard checking the wrong count
- Fixed byetunes://download deep links opening the wrong tab on iOS 16–18
- Fixed a Live Activity race that could resurrect it right after ending; orphaned Live Activities from a killed session now clean up on cold launch
- Removed dead Tidal/Qobuz code and a broken last-resort Spotify mapping fallback
Backup & Restore
- Merged Light/Full Backup toggle and "Export Full Library" into two direct-action rows; Full Backup always bundles per-playlist files
Settings
- Store Region picker upgraded from a simple inline row to a full searchable, alphabetically-grouped screen with flags
- About/Credits moved to its own section, separate from actionable controls
- Added "Keep Local Metadata" to skip the fetch pipeline for imported local files