Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ffcbac6
refactor: extract browser audio utilities
hi-ogawa Jul 12, 2026
519d69b
Merge origin/main into audio-utils
hi-ogawa Jul 12, 2026
57ca019
refactor: manage audio decoding with react query
hi-ogawa Jul 12, 2026
8255c76
feat: show mutation errors as toasts
hi-ogawa Jul 12, 2026
19620db
refactor: rename audio worker client
hi-ogawa Jul 12, 2026
2c2bc0e
nit todo
hi-ogawa Jul 12, 2026
779d36b
nit todo
hi-ogawa Jul 12, 2026
1614a2b
Merge remote audio-utils changes
hi-ogawa Jul 12, 2026
5d98d7b
refactor: extract current time hook
hi-ogawa Jul 12, 2026
8d71e3f
refactor: keep progress ticker in panel
hi-ogawa Jul 12, 2026
3fef1e4
refactor: run separation as mutation
hi-ogawa Jul 12, 2026
c3f3162
refactor: inline output cleanup
hi-ogawa Jul 12, 2026
c17001f
nit
hi-ogawa Jul 12, 2026
96acf87
refactor: inline output state type
hi-ogawa Jul 12, 2026
a0f61a8
refactor: keep outputs in mutation result
hi-ogawa Jul 12, 2026
3543149
refactor: remove unreachable app cleanup
hi-ogawa Jul 12, 2026
84e8751
refactor: use mutation settlement cleanup
hi-ogawa Jul 12, 2026
1d722d6
refactor: remove unused worker cancellation
hi-ogawa Jul 12, 2026
f64a828
refactor: require worker progress callback
hi-ogawa Jul 12, 2026
47ae385
refactor: fold audio selection into mutation
hi-ogawa Jul 12, 2026
4c5ccc4
refactor: derive decoded audio from mutation
hi-ogawa Jul 12, 2026
244152a
refactor: derive status from mutations
hi-ogawa Jul 12, 2026
b70423e
nit
hi-ogawa Jul 12, 2026
ed029ce
refactor: colocate output URL cleanup
hi-ogawa Jul 12, 2026
f896f2e
refactor: inline latest mutation check
hi-ogawa Jul 12, 2026
992cb87
fix: capitalize audio status text
hi-ogawa Jul 12, 2026
77cc3d1
fix: colocate async status messages
hi-ogawa Jul 12, 2026
fb7fd4a
refactor: clarify async state names
hi-ogawa Jul 12, 2026
9fb8d36
refactor: derive model readiness from source
hi-ogawa Jul 12, 2026
5e30567
refactor: unify output selection preference
hi-ogawa Jul 12, 2026
451d579
refactor: align two-stems preference name
hi-ogawa Jul 12, 2026
e019f51
nit
hi-ogawa Jul 12, 2026
879aecf
refactor: inline selected model files
hi-ogawa Jul 12, 2026
1071bb9
refactor: colocate wav encoder with audio
hi-ogawa Jul 12, 2026
e4be3fb
refactor: share audio sample rate
hi-ogawa Jul 12, 2026
98b230b
nit
hi-ogawa Jul 12, 2026
0211043
fix: start progress bar at zero
hi-ogawa Jul 12, 2026
40d798e
test: update persisted preference fixture
hi-ogawa Jul 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions packages/app/e2e/preferences.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@ import { expect, test } from "@playwright/test";
test("restores and updates configuration preferences", async ({ page }) => {
await page.addInitScript(() => {
localStorage.setItem(
"demucs-onnx:main:v1",
"demucs-onnx:main:v2",
JSON.stringify({
model: "htdemucs_ft",
outputMode: "two-stems",
targetStem: "bass",
twoStems: "bass",
method: "minus",
shifts: 3,
}),
Expand All @@ -32,7 +31,7 @@ test("restores and updates configuration preferences", async ({ page }) => {
);
await expect
.poll(() =>
page.evaluate(() => localStorage.getItem("demucs-onnx:main:v1")),
page.evaluate(() => localStorage.getItem("demucs-onnx:main:v2")),
)
.toContain('"outputMode":"four-stems"');
.toContain('"twoStems":null');
});
7 changes: 1 addition & 6 deletions packages/app/e2e/separate.spec.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
import { existsSync } from "node:fs";
import { resolve } from "node:path";
// Flow e2e: upload -> decode -> separate -> stems rendered with players + downloads.
// Exercises the whole client pipeline (decodeAudioData, wasm core, onnxruntime-web);
// numeric parity vs the native CLI is covered by the CLI-side comparisons, not here.
//
// Requires models in data/onnx-lean (see README.md for the regeneration chain).
import { test, expect } from "@playwright/test";

const MODELS_DIR = resolve(import.meta.dirname, "../../../data/onnx-lean");
Expand All @@ -23,7 +18,7 @@ test("separates a clip fully client-side", async ({ page }) => {
page.getByTestId("model-file-slot").getByText("Ready"),
).toHaveCount(2);
await page.setInputFiles("#file", FIXTURE);
await expect(page.locator("#status")).toContainText("decoded: 2.00s");
await expect(page.locator("#audio-status")).toContainText("Decoded: 2.00s");

await page.click("#run");
await expect(
Expand Down
2 changes: 2 additions & 0 deletions packages/app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@
"test-e2e": "playwright test"
},
"dependencies": {
"@tanstack/react-query": "^5.101.2",
"lucide-react": "^0.562.0",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"sonner": "^2.0.7",
"zod": "^4.4.3"
},
"devDependencies": {
Expand Down
Loading
Loading