release: 4.5.27 disable-ads + queue context menu + cleanup
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1f2b5e583c
commit
092932d8d5
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "twitch-vod-manager",
|
"name": "twitch-vod-manager",
|
||||||
"version": "4.5.26",
|
"version": "4.5.27",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "twitch-vod-manager",
|
"name": "twitch-vod-manager",
|
||||||
"version": "4.5.26",
|
"version": "4.5.27",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.6.0",
|
"axios": "^1.6.0",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "twitch-vod-manager",
|
"name": "twitch-vod-manager",
|
||||||
"version": "4.5.26",
|
"version": "4.5.27",
|
||||||
"description": "Twitch VOD Manager - Download Twitch VODs easily",
|
"description": "Twitch VOD Manager - Download Twitch VODs easily",
|
||||||
"main": "dist/main.js",
|
"main": "dist/main.js",
|
||||||
"author": "xRangerDE",
|
"author": "xRangerDE",
|
||||||
|
|||||||
@ -521,6 +521,10 @@
|
|||||||
<input type="checkbox" id="notifyEachCompletionToggle">
|
<input type="checkbox" id="notifyEachCompletionToggle">
|
||||||
<span id="notifyEachCompletionLabel">Benachrichtigung bei jedem fertigen Download</span>
|
<span id="notifyEachCompletionLabel">Benachrichtigung bei jedem fertigen Download</span>
|
||||||
</label>
|
</label>
|
||||||
|
<label style="display:flex; align-items:center; gap:8px; margin-top: 8px;">
|
||||||
|
<input type="checkbox" id="streamlinkDisableAdsToggle" checked>
|
||||||
|
<span id="streamlinkDisableAdsLabel">Twitch-Ads beim Download ueberspringen</span>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label id="metadataCacheMinutesLabel">Metadata-Cache (Minuten)</label>
|
<label id="metadataCacheMinutesLabel">Metadata-Cache (Minuten)</label>
|
||||||
|
|||||||
1
src/renderer-globals.d.ts
vendored
1
src/renderer-globals.d.ts
vendored
@ -20,6 +20,7 @@ interface AppConfig {
|
|||||||
downloaded_vod_ids?: string[];
|
downloaded_vod_ids?: string[];
|
||||||
streamlink_quality?: string;
|
streamlink_quality?: string;
|
||||||
notify_on_each_completion?: boolean;
|
notify_on_each_completion?: boolean;
|
||||||
|
streamlink_disable_ads?: boolean;
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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.',
|
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',
|
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.',
|
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',
|
streamlinkQualityLabel: 'Stream-Qualitaet',
|
||||||
streamlinkQualityHint: 'Streamlink versucht erst diese Qualitaet; falls das VOD sie nicht anbietet, faellt es auf "best" zurueck.',
|
streamlinkQualityHint: 'Streamlink versucht erst diese Qualitaet; falls das VOD sie nicht anbietet, faellt es auf "best" zurueck.',
|
||||||
streamlinkQualityBest: 'Best (Standard)',
|
streamlinkQualityBest: 'Best (Standard)',
|
||||||
|
|||||||
@ -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.',
|
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',
|
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.',
|
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',
|
streamlinkQualityLabel: 'Stream quality',
|
||||||
streamlinkQualityHint: 'Streamlink will try this quality first; if the VOD does not offer it, falls back to "best".',
|
streamlinkQualityHint: 'Streamlink will try this quality first; if the VOD does not offer it, falls back to "best".',
|
||||||
streamlinkQualityBest: 'Best (default)',
|
streamlinkQualityBest: 'Best (default)',
|
||||||
|
|||||||
@ -388,6 +388,7 @@ function collectDownloadSettingsPayload(): Partial<AppConfig> {
|
|||||||
persist_queue_on_restart: byId<HTMLInputElement>('persistQueueToggle').checked,
|
persist_queue_on_restart: byId<HTMLInputElement>('persistQueueToggle').checked,
|
||||||
auto_resume_queue_on_startup: byId<HTMLInputElement>('autoResumeQueueToggle').checked,
|
auto_resume_queue_on_startup: byId<HTMLInputElement>('autoResumeQueueToggle').checked,
|
||||||
notify_on_each_completion: byId<HTMLInputElement>('notifyEachCompletionToggle').checked,
|
notify_on_each_completion: byId<HTMLInputElement>('notifyEachCompletionToggle').checked,
|
||||||
|
streamlink_disable_ads: byId<HTMLInputElement>('streamlinkDisableAdsToggle').checked,
|
||||||
streamlink_quality: byId<HTMLSelectElement>('streamlinkQuality').value,
|
streamlink_quality: byId<HTMLSelectElement>('streamlinkQuality').value,
|
||||||
metadata_cache_minutes: parseInt(byId<HTMLInputElement>('metadataCacheMinutes').value, 10) || 10
|
metadata_cache_minutes: parseInt(byId<HTMLInputElement>('metadataCacheMinutes').value, 10) || 10
|
||||||
};
|
};
|
||||||
@ -433,6 +434,7 @@ function getSettingsFingerprint(payload: Partial<AppConfig>): string {
|
|||||||
effective.persist_queue_on_restart !== false,
|
effective.persist_queue_on_restart !== false,
|
||||||
effective.auto_resume_queue_on_startup === true,
|
effective.auto_resume_queue_on_startup === true,
|
||||||
effective.notify_on_each_completion === true,
|
effective.notify_on_each_completion === true,
|
||||||
|
effective.streamlink_disable_ads !== false,
|
||||||
effective.streamlink_quality ?? 'best',
|
effective.streamlink_quality ?? 'best',
|
||||||
effective.metadata_cache_minutes ?? 10,
|
effective.metadata_cache_minutes ?? 10,
|
||||||
effective.filename_template_vod ?? '{title}.mp4',
|
effective.filename_template_vod ?? '{title}.mp4',
|
||||||
@ -453,6 +455,7 @@ function syncSettingsFormFromConfig(): void {
|
|||||||
byId<HTMLInputElement>('persistQueueToggle').checked = (config.persist_queue_on_restart as boolean) !== false;
|
byId<HTMLInputElement>('persistQueueToggle').checked = (config.persist_queue_on_restart as boolean) !== false;
|
||||||
byId<HTMLInputElement>('autoResumeQueueToggle').checked = (config.auto_resume_queue_on_startup as boolean) === true;
|
byId<HTMLInputElement>('autoResumeQueueToggle').checked = (config.auto_resume_queue_on_startup as boolean) === true;
|
||||||
byId<HTMLInputElement>('notifyEachCompletionToggle').checked = (config.notify_on_each_completion as boolean) === true;
|
byId<HTMLInputElement>('notifyEachCompletionToggle').checked = (config.notify_on_each_completion as boolean) === true;
|
||||||
|
byId<HTMLInputElement>('streamlinkDisableAdsToggle').checked = (config.streamlink_disable_ads as boolean) !== false;
|
||||||
byId<HTMLSelectElement>('streamlinkQuality').value = (config.streamlink_quality as string) || 'best';
|
byId<HTMLSelectElement>('streamlinkQuality').value = (config.streamlink_quality as string) || 'best';
|
||||||
byId<HTMLInputElement>('metadataCacheMinutes').value = String((config.metadata_cache_minutes as number) || 10);
|
byId<HTMLInputElement>('metadataCacheMinutes').value = String((config.metadata_cache_minutes as number) || 10);
|
||||||
byId<HTMLInputElement>('vodFilenameTemplate').value = (config.filename_template_vod as string) || '{title}.mp4';
|
byId<HTMLInputElement>('vodFilenameTemplate').value = (config.filename_template_vod as string) || '{title}.mp4';
|
||||||
@ -567,6 +570,7 @@ function initSettingsAutoSave(): void {
|
|||||||
'persistQueueToggle',
|
'persistQueueToggle',
|
||||||
'autoResumeQueueToggle',
|
'autoResumeQueueToggle',
|
||||||
'notifyEachCompletionToggle',
|
'notifyEachCompletionToggle',
|
||||||
|
'streamlinkDisableAdsToggle',
|
||||||
'streamlinkQuality'
|
'streamlinkQuality'
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
|
|||||||
@ -120,6 +120,9 @@ function applyLanguageToStaticUI(): void {
|
|||||||
setText('notifyEachCompletionLabel', UI_TEXT.static.notifyEachCompletionLabel);
|
setText('notifyEachCompletionLabel', UI_TEXT.static.notifyEachCompletionLabel);
|
||||||
setTitle('notifyEachCompletionLabel', UI_TEXT.static.notifyEachCompletionHint);
|
setTitle('notifyEachCompletionLabel', UI_TEXT.static.notifyEachCompletionHint);
|
||||||
setTitle('notifyEachCompletionToggle', 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);
|
setText('streamlinkQualityLabel', UI_TEXT.static.streamlinkQualityLabel);
|
||||||
setTitle('streamlinkQualityLabel', UI_TEXT.static.streamlinkQualityHint);
|
setTitle('streamlinkQualityLabel', UI_TEXT.static.streamlinkQualityHint);
|
||||||
setTitle('streamlinkQuality', UI_TEXT.static.streamlinkQualityHint);
|
setTitle('streamlinkQuality', UI_TEXT.static.streamlinkQualityHint);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user