Major: each streamer now has a "REC" button. When the channel is
live, click captures into the queue with an open-ended streamlink
recording until the stream ends. Output goes to
{download_path}/{streamer}/live/{streamer}_LIVE_{date}_{time}.mp4.
VODs vanish from Twitch within weeks; this closes the gap.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
VOD-card button now reads "Trim VOD" / "VOD zuschneiden" to mirror
the dialog title exactly (was "Trim" / "Zuschneiden" in 4.5.14).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Follow-up to 4.5.13: the button on each VOD card that opens the
"Trim VOD" dialog now reads "Trim" (EN) / "Zuschneiden" (DE) instead
of "Clip". Language switch now re-renders the VOD grid so labels
update live.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
User-visible: the modal opened by the per-VOD "Clip" button now reads
"Trim VOD" (EN) / "VOD zuschneiden" (DE) instead of "Trim clip" /
"Clip zuschneiden" — disambiguates from the separate Twitch Clips
feature.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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>