Germanize queue/download wording and clip errors (v3.8.4)

Align visible queue and clip messages to German terminology, remove remaining mixed English labels, and reuse resilient streamlink command resolution for clip downloads to keep behavior consistent across environments.
This commit is contained in:
xRangerDE 2026-02-13 13:00:27 +01:00
parent e91a397a5c
commit 00249bcbed
5 changed files with 17 additions and 16 deletions

View File

@ -1,12 +1,12 @@
{ {
"name": "twitch-vod-manager", "name": "twitch-vod-manager",
"version": "3.8.3", "version": "3.8.4",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "twitch-vod-manager", "name": "twitch-vod-manager",
"version": "3.8.3", "version": "3.8.4",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"axios": "^1.6.0", "axios": "^1.6.0",

View File

@ -1,6 +1,6 @@
{ {
"name": "twitch-vod-manager", "name": "twitch-vod-manager",
"version": "3.8.3", "version": "3.8.4",
"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",

View File

@ -58,13 +58,13 @@
<span id="clipDurationDisplay" style="color: #00c853;">00:01:00</span> <span id="clipDurationDisplay" style="color: #00c853;">00:01:00</span>
</div> </div>
<!-- Part Nummer --> <!-- Teil Nummer -->
<div style="margin-bottom: 15px;"> <div style="margin-bottom: 15px;">
<label style="display: block; margin-bottom: 8px;">Start Part-Nummer (optional, fur Fortsetzung):</label> <label style="display: block; margin-bottom: 8px;">Start Part-Nummer (optional, fur Fortsetzung):</label>
<input type="text" id="clipStartPart" placeholder="z.B. 42" <input type="text" id="clipStartPart" placeholder="z.B. 42"
style="width: 100px; background: #333; border: 1px solid #444; border-radius: 4px; padding: 8px 12px; color: white;" style="width: 100px; background: #333; border: 1px solid #444; border-radius: 4px; padding: 8px 12px; color: white;"
oninput="updateFilenameExamples()"> oninput="updateFilenameExamples()">
<div style="color: #888; font-size: 12px; margin-top: 5px;">Leer lassen = Part 1</div> <div style="color: #888; font-size: 12px; margin-top: 5px;">Leer lassen = Teil 1</div>
</div> </div>
<!-- Dateinamen Format --> <!-- Dateinamen Format -->
@ -335,7 +335,7 @@
<div class="settings-card"> <div class="settings-card">
<h3>Updates</h3> <h3>Updates</h3>
<p id="versionInfo" style="margin-bottom: 10px; color: var(--text-secondary);">Version: v3.8.3</p> <p id="versionInfo" style="margin-bottom: 10px; color: var(--text-secondary);">Version: v3.8.4</p>
<button class="btn-secondary" onclick="checkUpdate()">Nach Updates suchen</button> <button class="btn-secondary" onclick="checkUpdate()">Nach Updates suchen</button>
</div> </div>
</div> </div>
@ -346,7 +346,7 @@
<div class="status-dot" id="statusDot"></div> <div class="status-dot" id="statusDot"></div>
<span id="statusText">Nicht verbunden</span> <span id="statusText">Nicht verbunden</span>
</div> </div>
<span id="versionText">v3.8.3</span> <span id="versionText">v3.8.4</span>
</div> </div>
</main> </main>
</div> </div>

View File

@ -8,7 +8,7 @@ import { autoUpdater } from 'electron-updater';
// ========================================== // ==========================================
// CONFIG & CONSTANTS // CONFIG & CONSTANTS
// ========================================== // ==========================================
const APP_VERSION = '3.8.3'; const APP_VERSION = '3.8.4';
const UPDATE_CHECK_URL = 'http://24-music.de/version.json'; const UPDATE_CHECK_URL = 'http://24-music.de/version.json';
// Paths // Paths
@ -1155,7 +1155,7 @@ function downloadVODPart(
return; return;
} }
const genericError = lastErrorLine || `Streamlink Exit-Code ${code ?? -1}`; const genericError = lastErrorLine || `Streamlink Fehlercode ${code ?? -1}`;
appendDebugLog('download-part-failed', { itemId, filename, code, error: genericError }); appendDebugLog('download-part-failed', { itemId, filename, code, error: genericError });
resolve({ success: false, error: genericError }); resolve({ success: false, error: genericError });
}); });
@ -1599,10 +1599,10 @@ ipcMain.handle('download-clip', async (_, clipUrl: string) => {
if (match1) clipId = match1[1]; if (match1) clipId = match1[1];
else if (match2) clipId = match2[1]; else if (match2) clipId = match2[1];
else return { success: false, error: 'Invalid clip URL' }; else return { success: false, error: 'Ungueltige Clip-URL' };
const clipInfo = await getClipInfo(clipId); const clipInfo = await getClipInfo(clipId);
if (!clipInfo) return { success: false, error: 'Clip not found' }; if (!clipInfo) return { success: false, error: 'Clip nicht gefunden' };
const folder = path.join(config.download_path, 'Clips', clipInfo.broadcaster_name); const folder = path.join(config.download_path, 'Clips', clipInfo.broadcaster_name);
fs.mkdirSync(folder, { recursive: true }); fs.mkdirSync(folder, { recursive: true });
@ -1611,8 +1611,9 @@ ipcMain.handle('download-clip', async (_, clipUrl: string) => {
const filename = path.join(folder, `${safeTitle}.mp4`); const filename = path.join(folder, `${safeTitle}.mp4`);
return new Promise((resolve) => { return new Promise((resolve) => {
const streamlinkPath = getStreamlinkPath(); const streamlinkCmd = getStreamlinkCommand();
const proc = spawn(streamlinkPath, [ const proc = spawn(streamlinkCmd.command, [
...streamlinkCmd.prefixArgs,
`https://clips.twitch.tv/${clipId}`, `https://clips.twitch.tv/${clipId}`,
'best', 'best',
'-o', filename, '-o', filename,
@ -1623,12 +1624,12 @@ ipcMain.handle('download-clip', async (_, clipUrl: string) => {
if (code === 0 && fs.existsSync(filename)) { if (code === 0 && fs.existsSync(filename)) {
resolve({ success: true, filename }); resolve({ success: true, filename });
} else { } else {
resolve({ success: false, error: 'Download failed' }); resolve({ success: false, error: `Download fehlgeschlagen (Exit-Code ${code ?? -1})` });
} }
}); });
proc.on('error', () => { proc.on('error', () => {
resolve({ success: false, error: 'Streamlink not found' }); resolve({ success: false, error: 'Streamlink nicht gefunden' });
}); });
}); });
}); });

View File

@ -22,7 +22,7 @@ async function clearCompleted(): Promise<void> {
function getQueueStatusLabel(item: QueueItem): string { function getQueueStatusLabel(item: QueueItem): string {
if (item.status === 'completed') return 'Abgeschlossen'; if (item.status === 'completed') return 'Abgeschlossen';
if (item.status === 'error') return 'Fehlgeschlagen'; if (item.status === 'error') return 'Fehlgeschlagen';
if (item.status === 'downloading') return 'Lauft'; if (item.status === 'downloading') return 'Laeuft';
return 'Wartet'; return 'Wartet';
} }