User-visible: Trim-Clip dialog now exposes the {date}_Part{part_padded}
naming pattern (e.g. 08.05.2026_Part07.mp4) as a radio preset, matching
the global VOD-parts template.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- public-API fallback retries on transient HTTP/network errors so a
single TCP RST does not produce an empty VOD list
- new VOD list sort dropdown with persisted key (newest, oldest,
most viewed, longest, shortest)
- shutdownCleanup() consolidates window-all-closed and before-quit
into one idempotent helper so future exit-time cleanup lands once
See docs/IMPROVEMENT_LOG.md (Cycle 4, 2026-05-03) for the dated
rationale and regression run.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- download-clip: sanitize broadcaster name + title, ensure unique
filename, post-download size + integrity check, track in
activeClipProcesses so window-close cleans up
- VOD list: persistent filter input with Ctrl+F focus, Esc clear,
match counter (DE + EN strings)
- currentProcess split into currentEditorProcess (cutter/merger/
splitter only) so cancel-download no longer accidentally kills a
separate video cut
See docs/IMPROVEMENT_LOG.md (Cycle 3, 2026-05-03) for the dated
rationale and regression run.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- scripts/release_gitea.mjs: --skip-build flag and auto-skip when
artifacts for the version already exist on disk
- playwright in devDependencies; test:e2e* scripts call node directly
- loadConfig isPlainObject shape check + loadQueue sanitizes every
entry incl. customClip/mergeGroup; stale status="downloading" is
demoted to "pending" so the queue can actually be resumed
See docs/IMPROVEMENT_LOG.md (Cycle 2, 2026-05-03) for the dated
rationale and regression run.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two release-pipeline fixes that previously forced manual workarounds.
- scripts/release_gitea.mjs no longer unconditionally runs npm run dist:win.
New --skip-build flag, plus auto-skip when all 3 required artifacts
(Setup-<v>.exe, Setup-<v>.exe.blockmap, latest.yml) already exist for
the requested version. The previous behaviour re-ran the entire test
suite + electron-builder on every release attempt — unusable when the
test path was broken.
- playwright ^1.59.1 added to devDependencies. test:e2e / test:e2e:guide
/ test:e2e:full now invoke node scripts/smoke-test*.js directly instead
of "npm exec --yes --package=playwright -- node ...", which failed with
MODULE_NOT_FOUND when npm exec could not resolve playwright on the fly.
No browser binaries needed — the smoke tests drive Electron via
_electron, not a browser.
All test paths verified after the change: test:e2e, test:e2e:guide,
test:e2e:full, test:merge-split, test:e2e:update-logic — all pass with
the simplified scripts.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Stability + UX cycle.
- saveConfig and writeQueueToDisk now use openSync+writeSync+fsyncSync+
closeSync+renameSync via writeFileAtomicSync. Survives power loss
between write and rename (used to leave the renamed file empty and
silently reset config / queue on next launch).
- Per-item claimedFilenames map fixes the parallel-download race where
one item finishing wiped sibling claims and let a third item collide
on the same output path.
- Renderer queue lookup by [data-id] (no more index drift), active tab
persisted in localStorage, Escape closes the topmost open modal,
Ctrl/Cmd+1..5 jumps tabs.
See docs/IMPROVEMENT_LOG.md for the dated rationale and regression run.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>