Commit Graph
4 Commits
Author SHA1 Message Date
vicrodh acfded5a7e fix(account-migration): reuse an orphan "(migrated)" copy instead of creating a second one
plan() matched same-name twins but never looked for the copy name, so a
run interrupted between create_playlist and the ledger save produced a
duplicate copy on the next run.

cc
2026-09-13 03:36:50 -06:00
vicrodh ee66a21457 fix(migration): stop importing mixtapes and collections until ids remap
Mixtape/collection items reference playlist and album ids that change during an
account import, so copying mixtape_collections / mixtape_collection_items
verbatim left garbage rows pointing at ids that no longer exist. Drop them from
both copy paths (fast and remapped) and drop the collection view-state JSON,
with a note on how to re-enable once the importer remaps ids (import elements
first, note the new ids, then import + update the collections). Elements
(playlists, local albums) still import.

cc
2026-09-10 16:11:44 -06:00
vicrodh 472706f84e fix(settings): harden migration and accessibility
Apply interface scaling through Qt at startup, complete keyboard navigation, move account migration into setup and progress modals, and defer Subsonic sync while the server scans.

cx
2026-09-02 14:33:08 -06:00
vicrodh 800255ac58 feat(account-migration): snapshot, plan, apply and local-profile copy
A frontend-agnostic crate for moving a Qobuz account's favorites and
playlists into another account, additively (contract
qbz-nix-docs/specs/2026-09-02-account-migration-contract.md §9):

- snapshot: capture the signed-in account (five favorite kinds with
  favorited_at, owned playlists with track ids in order, followed
  playlists) into users/<uid>/account_migration/snapshot-*.json; the same
  capture is the target's live state at migration time.
- plan: the pure delta against the target and the ledger. Same-name
  playlists holding nothing foreign are the same playlist and get the
  missing tracks appended; anything foreign means a different playlist and
  a " (migrated)" copy. Favorites are written oldest first so the target's
  own stamps keep the chronology.
- apply: one favorite per call with pacing and bounded retries, 50-track
  chunks, subscriptions re-followed; every success lands in the ledger
  before the next write, so a run resumes and a second run adds nothing.
- local: copy the old profile directory row by row (library folders and
  scanned tracks on the fast path, playlist folders, settings keyed by
  qobuz_playlist_id remapped through the ledger, pinned items, orders,
  preferences, blacklist; media servers, scrobblers and listening history
  behind options). Never the favorites cache, the subscription clock, the
  session or the purchases.

The writes are the ones the app already issues when a user hearts or
creates a playlist; nothing touches subscriptions, purchases or account
data.

cc
2026-09-02 08:24:01 -06:00