Skip to content

Release 0.20.0 - #759

Merged
thcp merged 3 commits into
mainfrom
next-release
Oct 4, 2026
Merged

thcp merged 3 commits into
mainfrom
next-release

Conversation

@thcp

@thcp thcp commented Oct 4, 2026

Copy link
Copy Markdown
Collaborator

Brings next-release into main for 0.20.0.

Merge with a merge commit, so the commits keep their Closes lines.

Closes #746
Closes #747
Closes #748
Closes #749
Closes #750
Closes #751
Closes #755
Closes #757

thcp added 3 commits October 4, 2026 12:53
…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
…the Trash icon (#756)

feat(trash): hold a row for a second to restore it, pick several, and a count on the icon

Restoring from the Trash used to mean dragging one row at a time onto the
Library button, which nothing on screen explained, and a click on a
trashed row opened it in the studio as if it were not trashed.

Hovering a Trash row now turns its second line into "Hold left click for
1 second to restore". A click selects a row, Ctrl+click adds or removes
one, Shift+click takes a range. Holding the mouse button, or Enter, for a
second restores the row, or the whole selection when the row is part of
it; letting go early does nothing. Every row the hold will restore fills
while it is held.
Dragging onto Library still restores, the selection too. Restore never
queues a song again (#748).

The Trash icon carries the same count badge as the Queue, and its label
says how many songs are in it, so a full Trash is visible from anywhere.

Closes #749
Closes #755
feat(help): Guide in the rail makes the studio explain itself

Nothing in the studio said what its controls do, and a new user has to
press things to find out, which can start an extraction or delete a song.

Guide, in the rail below Trash, turns help mode on, and a pill at the
bottom says so. Pointing at a control, focusing it, or clicking it
outlines it and shows a box beside it with the control's own label and
what it does, in plain words. Nothing else is marked, so the screen
stays calm. While help mode is on, presses are taken by it, so
exploring never acts on the studio. Esc or Guide again turns it off.

The box covers the top bar, the rail, the song list, every lane control
(naming its instrument), the song facts, the waveforms and the bottom
bar. Settings lists every option, tab by tab, in one line each. Texts
are help.* keys in all ten languages.

Closes #757


fix(help): head a lane's M, S, + and K boxes with what they do

In help mode the box over a lane's M button was headed "M", and S, +
and the K box the same: the heading took the visible text first, and
for these it is one character. Someone who does not know what M means
learned nothing from the heading.

A visible text of one or two characters now gives way to the button's
full label ("Mute Drums", "Transpose Drums up one semitone"). The K box
has no label of its own, so it gets one: "Key of Drums", in all ten
languages.

Refs #757
Comment thread tests/test_jobs_trash.py
@thcp
thcp merged commit 309e595 into main Oct 4, 2026
15 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant