Skip to content

Trashing a song mid-extraction stops it, imports stay in the background, and a clear message for read-only portable installs - #752

Merged
thcp merged 2 commits into
next-releasefrom
fix/746-749
Oct 4, 2026
Merged

thcp merged 2 commits into
next-releasefrom
fix/746-749

Conversation

@thcp

@thcp thcp commented Oct 3, 2026

Copy link
Copy Markdown
Collaborator

Fixes for the three reports from @wastedbits after 0.19.1, plus two smaller bugs found along the way.

What works now

Deleting a song while it extracts (#748)

  • Moving a song to the Trash while it is queued or extracting now stops it, and the queue goes straight on to the next song. This happens on the server, so the phone's swipe to delete gets it too.
  • The song's files stay on disk, the same rule finished tracks in the Trash already follow: only emptying the Trash deletes anything.
  • Restore brings it back to the library marked Stopped. It does not go back in the queue on its own. An Extract button on the row runs it again when you choose.
  • After a restart a stopped song stays stopped. The "Paused, Start" row from the report no longer appears.
  • A cancel now reaches the analyze stage, which used to run to the end regardless.
  • Queue rows use the same trash icon as library rows.

Now Playing card during an import (#747)

  • An import never takes over the Now Playing card. Progress shows on the library row and in the queue.
  • When the first import finishes and nothing is open, it opens by itself, the same as clicking it in the library.

Portable install in Program Files (#746)

  • A portable StemDeck in a folder it cannot write to now says so at startup, names the folder, and suggests a writable place such as C:\StemDeck. It no longer fails part way with "Access is denied".
  • It does not ask for administrator rights. An elevated window cannot accept drag and drop from Explorer, and every launch would prompt.

Found along the way

Not in this PR

#749 (stem folders left after deleting songs) is waiting on the reporter. Files are removed when the Trash is emptied, so that one may be expected behaviour rather than a bug.

Testing

  • pytest: 2471 passed. ruff, ruff format and bandit are clean.
  • Playwright: 441 passed, including new tests for the stopped and Extract flow, a stale Processing row after a restart, and imports staying in the background.
  • Rust: cargo fmt, cargo clippy --tests -D warnings and cargo test (131 passed) on Windows, and clippy on Linux through WSL.
  • An end-to-end run against a real backend doing real separation, driven with Playwright, passed all 22 checks: trash mid-extraction, the queue moving on, restore, a server restart, Extract to completion, and emptying the Trash.
  • Not seen yet: the [Bug]: Errors due to folder permission #746 dialog on a real Program Files install, and a macOS build. CI covers macOS.

Closes #746
Closes #747
Closes #748
Closes #750
Closes #751

Thales added 2 commits October 3, 2026 16:14
…t write its folder (#746)

A portable zip extracted under Program Files is not writable without admin.
Setup, the CUDA torch swap and the updater all write inside the install, so
it failed part way with "failed to write migration flag: Access is denied".

At startup, a portable package that cannot write its own folder now shows a
native error dialog naming the folder and where to move it, then exits.
Elevation is not offered: an elevated window cannot receive drag and drop
from Explorer, and every launch would prompt. The writability probe only
runs for a portable package, so no other install gets a file written into
its root at startup.

Closes #746
…r take the studio (#747, #748)

#748: deleting a song from the library while it was extracting moved it to
the Trash and left the job running, hidden. A stuck one held the queue with
no way out, and after a restart it came back as a Paused row.

- Trashing a queued or running job now stops it on the server, so the phone
  gets it too. It settles as the new "stopped" status with its files kept:
  only emptying the Trash deletes files, the rule finished tracks follow.
- Restore brings it back to the library as Stopped. It does not queue it.
  An Extract button on the row (POST /api/jobs/{id}/extract) runs it again.
- A stopped job is saved to registry.json and survives a restart in the
  Trash. A trashed job interrupted by a restart is stopped, never resumed.
- Cancel now reaches the analyze stage: its ffmpeg is registered and it
  checks for cancel between steps.
- A cancel or trash that lost the race to a finishing job no longer leaves
  its flags set, which made later vocal splits cancel themselves at once.
- A cancelled job's folder is removed with the same retry delete_job uses.
- On load, a library row still saying Processing asks the server where the
  job stands.
- Queue rows use the library's trash icon.

#747: an import with nothing open put its name and "Extracting" on the Now
Playing card. Imports now always run in the background, and the first to
finish opens by itself only if the studio is still empty and nothing,
including a Sync again import, holds it.

Closes #747
Closes #748
Closes #750
Closes #751
@thcp
thcp merged commit eb37d7d into next-release Oct 4, 2026
@thcp thcp mentioned this pull request Oct 4, 2026
thcp added a commit that referenced this pull request Oct 4, 2026
…nd, and a clear message for read-only portable installs (#752)

fix(desktop): stop with a clear message when a portable install cannot write its folder (#746)

A portable zip extracted under Program Files is not writable without admin.
Setup, the CUDA torch swap and the updater all write inside the install, so
it failed part way with "failed to write migration flag: Access is denied".

At startup, a portable package that cannot write its own folder now shows a
native error dialog naming the folder and where to move it, then exits.
Elevation is not offered: an elevated window cannot receive drag and drop
from Explorer, and every launch would prompt. The writability probe only
runs for a portable package, so no other install gets a file written into
its root at startup.

Closes #746


fix(queue): trashing a song mid-extraction stops it, and imports never take the studio (#747, #748)

#748: deleting a song from the library while it was extracting moved it to
the Trash and left the job running, hidden. A stuck one held the queue with
no way out, and after a restart it came back as a Paused row.

- Trashing a queued or running job now stops it on the server, so the phone
  gets it too. It settles as the new "stopped" status with its files kept:
  only emptying the Trash deletes files, the rule finished tracks follow.
- Restore brings it back to the library as Stopped. It does not queue it.
  An Extract button on the row (POST /api/jobs/{id}/extract) runs it again.
- A stopped job is saved to registry.json and survives a restart in the
  Trash. A trashed job interrupted by a restart is stopped, never resumed.
- Cancel now reaches the analyze stage: its ffmpeg is registered and it
  checks for cancel between steps.
- A cancel or trash that lost the race to a finishing job no longer leaves
  its flags set, which made later vocal splits cancel themselves at once.
- A cancelled job's folder is removed with the same retry delete_job uses.
- On load, a library row still saying Processing asks the server where the
  job stands.
- Queue rows use the library's trash icon.

#747: an import with nothing open put its name and "Extracting" on the Now
Playing card. Imports now always run in the background, and the first to
finish opens by itself only if the studio is still empty and nothing,
including a Sync again import, holds it.

Closes #747
Closes #748
Closes #750
Closes #751
@thcp
thcp deleted the fix/746-749 branch October 5, 2026 08:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant