From 092932d8d5bf792e751a79c6c01b90520d2a1806 Mon Sep 17 00:00:00 2001 From: xRangerDE Date: Sun, 10 May 2026 20:09:34 +0200 Subject: [PATCH] release: 4.5.27 disable-ads + queue context menu + cleanup Co-Authored-By: Claude Opus 4.7 (1M context) --- package-lock.json | 4 ++-- package.json | 2 +- src/index.html | 4 ++++ src/renderer-globals.d.ts | 1 + src/renderer-locale-de.ts | 2 ++ src/renderer-locale-en.ts | 2 ++ src/renderer-settings.ts | 4 ++++ src/renderer-texts.ts | 3 +++ 8 files changed, 19 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4503c7e..6ed914c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "twitch-vod-manager", - "version": "4.5.26", + "version": "4.5.27", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "twitch-vod-manager", - "version": "4.5.26", + "version": "4.5.27", "license": "MIT", "dependencies": { "axios": "^1.6.0", diff --git a/package.json b/package.json index 11492b4..1b2c1b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "twitch-vod-manager", - "version": "4.5.26", + "version": "4.5.27", "description": "Twitch VOD Manager - Download Twitch VODs easily", "main": "dist/main.js", "author": "xRangerDE", diff --git a/src/index.html b/src/index.html index 2f2cac6..a1d8060 100644 --- a/src/index.html +++ b/src/index.html @@ -521,6 +521,10 @@ Benachrichtigung bei jedem fertigen Download +
diff --git a/src/renderer-globals.d.ts b/src/renderer-globals.d.ts index 23e1bd3..e23e54d 100644 --- a/src/renderer-globals.d.ts +++ b/src/renderer-globals.d.ts @@ -20,6 +20,7 @@ interface AppConfig { downloaded_vod_ids?: string[]; streamlink_quality?: string; notify_on_each_completion?: boolean; + streamlink_disable_ads?: boolean; [key: string]: unknown; } diff --git a/src/renderer-locale-de.ts b/src/renderer-locale-de.ts index 936d8d6..6360d72 100644 --- a/src/renderer-locale-de.ts +++ b/src/renderer-locale-de.ts @@ -71,6 +71,8 @@ const UI_TEXT_DE = { autoResumeQueueHint: 'Wenn aktiv und die gespeicherte Queue noch ausstehende Eintraege hat, starten Downloads ~5 Sekunden nach dem Fensteroeffnen. Deaktivieren = Start-Klick noetig.', notifyEachCompletionLabel: 'Benachrichtigung bei jedem fertigen Download', notifyEachCompletionHint: 'Standardmaessig aus — bei langen Queues wuerde das System-Notifications-Panel sonst zugespammt. Die Queue-End-Zusammenfassung erscheint trotzdem.', + streamlinkDisableAdsLabel: 'Twitch-Ads beim Download ueberspringen', + streamlinkDisableAdsHint: 'Gibt --twitch-disable-ads an streamlink weiter, damit Mid-Roll-Ads nicht ins VOD eingebettet werden. Empfohlen aktiv lassen.', streamlinkQualityLabel: 'Stream-Qualitaet', streamlinkQualityHint: 'Streamlink versucht erst diese Qualitaet; falls das VOD sie nicht anbietet, faellt es auf "best" zurueck.', streamlinkQualityBest: 'Best (Standard)', diff --git a/src/renderer-locale-en.ts b/src/renderer-locale-en.ts index e5288cc..fd47a7d 100644 --- a/src/renderer-locale-en.ts +++ b/src/renderer-locale-en.ts @@ -71,6 +71,8 @@ const UI_TEXT_EN = { autoResumeQueueHint: 'When enabled and the persisted queue has pending entries, downloads kick off ~5 seconds after the window opens. Disable to require an explicit Start click.', notifyEachCompletionLabel: 'Notify on every completed download', notifyEachCompletionHint: 'Off by default — long queues would otherwise spam the OS notifications panel. The end-of-queue summary notification fires either way.', + streamlinkDisableAdsLabel: 'Skip Twitch ads while downloading', + streamlinkDisableAdsHint: 'Passes --twitch-disable-ads to streamlink so mid-roll ads do not get embedded into the VOD output. Recommended on.', streamlinkQualityLabel: 'Stream quality', streamlinkQualityHint: 'Streamlink will try this quality first; if the VOD does not offer it, falls back to "best".', streamlinkQualityBest: 'Best (default)', diff --git a/src/renderer-settings.ts b/src/renderer-settings.ts index a188ebc..e64b4d3 100644 --- a/src/renderer-settings.ts +++ b/src/renderer-settings.ts @@ -388,6 +388,7 @@ function collectDownloadSettingsPayload(): Partial { persist_queue_on_restart: byId('persistQueueToggle').checked, auto_resume_queue_on_startup: byId('autoResumeQueueToggle').checked, notify_on_each_completion: byId('notifyEachCompletionToggle').checked, + streamlink_disable_ads: byId('streamlinkDisableAdsToggle').checked, streamlink_quality: byId('streamlinkQuality').value, metadata_cache_minutes: parseInt(byId('metadataCacheMinutes').value, 10) || 10 }; @@ -433,6 +434,7 @@ function getSettingsFingerprint(payload: Partial): string { effective.persist_queue_on_restart !== false, effective.auto_resume_queue_on_startup === true, effective.notify_on_each_completion === true, + effective.streamlink_disable_ads !== false, effective.streamlink_quality ?? 'best', effective.metadata_cache_minutes ?? 10, effective.filename_template_vod ?? '{title}.mp4', @@ -453,6 +455,7 @@ function syncSettingsFormFromConfig(): void { byId('persistQueueToggle').checked = (config.persist_queue_on_restart as boolean) !== false; byId('autoResumeQueueToggle').checked = (config.auto_resume_queue_on_startup as boolean) === true; byId('notifyEachCompletionToggle').checked = (config.notify_on_each_completion as boolean) === true; + byId('streamlinkDisableAdsToggle').checked = (config.streamlink_disable_ads as boolean) !== false; byId('streamlinkQuality').value = (config.streamlink_quality as string) || 'best'; byId('metadataCacheMinutes').value = String((config.metadata_cache_minutes as number) || 10); byId('vodFilenameTemplate').value = (config.filename_template_vod as string) || '{title}.mp4'; @@ -567,6 +570,7 @@ function initSettingsAutoSave(): void { 'persistQueueToggle', 'autoResumeQueueToggle', 'notifyEachCompletionToggle', + 'streamlinkDisableAdsToggle', 'streamlinkQuality' ] as const; diff --git a/src/renderer-texts.ts b/src/renderer-texts.ts index a11e989..d0cf864 100644 --- a/src/renderer-texts.ts +++ b/src/renderer-texts.ts @@ -120,6 +120,9 @@ function applyLanguageToStaticUI(): void { setText('notifyEachCompletionLabel', UI_TEXT.static.notifyEachCompletionLabel); setTitle('notifyEachCompletionLabel', UI_TEXT.static.notifyEachCompletionHint); setTitle('notifyEachCompletionToggle', UI_TEXT.static.notifyEachCompletionHint); + setText('streamlinkDisableAdsLabel', UI_TEXT.static.streamlinkDisableAdsLabel); + setTitle('streamlinkDisableAdsLabel', UI_TEXT.static.streamlinkDisableAdsHint); + setTitle('streamlinkDisableAdsToggle', UI_TEXT.static.streamlinkDisableAdsHint); setText('streamlinkQualityLabel', UI_TEXT.static.streamlinkQualityLabel); setTitle('streamlinkQualityLabel', UI_TEXT.static.streamlinkQualityHint); setTitle('streamlinkQuality', UI_TEXT.static.streamlinkQualityHint);