Repository navigation
fix(library): oldest first like the Queue, and Queue remove only stops the extraction (#772) - #819
Merged
Merged
Conversation
library-order: the Library and the phone list songs newest first, while the Queue runs them oldest first. queue-remove and test_queue_remove: removing a song from the Queue cancels it, which deletes its files, so it leaves the Library and never reaches the Trash. All fail on big-release.
…s the extraction
Library order: the desktop Library (every folder and Favorites) and the phone list songs oldest first by when they were added (createdAt), with the id as a fixed tie-break. The order no longer depends on how a folder was stored, so existing libraries show oldest first too.
Queue remove: the button now sends the new POST /api/jobs/{id}/stop instead of /cancel. The job settles as "stopped" with its files kept, out of the Trash, so the Library shows it with Extract, which runs it again. A waiting job just leaves the queue; a running one has its process terminated through the existing cancel path. A link with no audio yet keeps its link and Extract downloads it again. A stopped run's partial separation folder is now removed when it settles. Library delete and the job panel's Cancel are unchanged.
The button's title and label say it stops extracting and keeps the song, in all ten tables, and the Guide explains it (help.queueStop). queue-progress now stubs /stop, and acceptance E5 expects "stopped".
Closes #772
thcp
marked this pull request as ready for review
October 20, 2026 00:10
This was referenced Oct 22, 2026
thcp
added a commit
that referenced
this pull request
Oct 22, 2026
…g-release (#836) Closes #835 ## What changed - **PR to `main`, push to `main`, release:** full suite, as before. - **PR to any other base:** smoke + changed specs + mapped specs. A hub module (former `full` source entries: `main.js`, `state.js`, `mixer.js`, `catalog.js`, `index.html`, `app/api/jobs.py`, `stems.py`, `app/core/**`, ...) or an unmapped file under `static/` or `app/` now adds a fixed **core set** (17 specs) instead of everything. `uv.lock` and `pyproject.toml` add core too. - **Full suite on a non-main PR** only for a change to how the suite runs: `playwright.config.mjs`, `tests/e2e/helpers*`, `serve.sh`, `seed.py`, `package*.json`, the three e2e workflows, the selector, `spec-map.json`, or unmapped code under `tests/e2e/`. - **New `e2e-full.yml`:** full suite on every push to `big-release`, nightly (04:17 UTC) on `big-release`, and `workflow_dispatch` with a `ref` input. - **New reusable `e2e.yml`** (`workflow_call`, inputs `mode`, `base-ref`, `checkout-ref`) holds the steps once. Same pinned SHAs, `permissions: {}`, no secrets. - **Concurrency:** a new push to a PR cancels that PR's older e2e run. Pushes, releases, nightly and manual runs are never cancelled. `timeout-minutes: 30` per shard. ## What did not change - Application code, specs, `uv.lock`, package files. Three shards, `--pass-with-no-tests`. - Check names gain a prefix: `frontend-e2e / frontend-e2e (1)` to `(3)`. A reusable workflow always prefixes the caller job. No branch protection or ruleset requires these names today (checked). ## Real diffs, before and after | Diff | Files | Before | After | |---|---|---|---| | #806 (queue.js, catalog.js) | 5 | FULL 105 | 30 (core), includes queue-progress | | #820 | 7 | FULL 105 | 59 (core) | | #821 | 2 | 47 | 47 | | #823 | 8 | 5 | 5 | | #828 (uv.lock) | 4 | 5 | 22 (core) | | #819, #830, #831 | 7 to 19 | FULL 105 | FULL 105 (edit `spec-map.json`) | | #829 | 19 | FULL 105 | FULL 105 (edits `helpers.mjs`) | | #822 | 33 | FULL 105 | FULL 105 (edits `seed.py`) | | `main...big-release` | 331 | FULL | FULL (PR to main) | `npx playwright test --list <selected>` matches the selector exactly for #806 (30 files, 200 tests) and #820 (59 files, 465 tests). Full suite: 724 tests in 105 files. Core + smoke alone: 159 tests in 22 files. ## Trade-off A non-main PR can pass while a spec outside its core and mapped sets breaks. The push to `big-release` run catches it on the merge commit, minutes later. ## Limits - **The nightly schedule only starts once `e2e-full.yml` reaches `main`.** GitHub runs scheduled workflows from the default branch, and the job checks out `big-release` explicitly for that reason. - Neither concurrency nor the timeout helps a hosted runner GitHub never assigns (queue time does not count toward the timeout). Fix by hand: re-run the job, or `gh run cancel <id>` then `gh run rerun <id> --failed`. - This PR changes `ci.yml`, so its own CI runs the full suite. Expected.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #772
What changed
createdAt), with the id as a fixed tie-break. Same order as the Queue. No new sort toggle.POST /api/jobs/{id}/stopinstead of/cancel. The job settles asstoppedwith its files kept and is not trashed, so the Library shows it with Extract (the state a song restored from the Trash has). Extract runs it again./stopvalidates the id (JOB_ID_RE, 404job not found), and leaves a finished job untouched.stoppedwith its link, because Extract on a link always downloads it again, so nothing is lost and no new state is needed.help.queueStop.queue-progressstubs/stop; acceptance E5 expectsstopped;spec-map.jsonmaps the two new specs.What did not change
/cancel.trash-queue, from [Bug]: Stemdeck extraction / queue chokes "hangs" #748).Tests
tests/test_queue_remove.py,tests/e2e/library-order.spec.mjs,tests/e2e/queue-remove.spec.mjs,tests/js/library-order.test.mjs. All failed on big-release (first commit) and pass now.artist-discogs:265,karaoke:94, threetrash-restoreCtrl+click tests, and a flakyfooter-time:48.