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",
"version": "3.8.3",
"version": "3.8.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "twitch-vod-manager",
"version": "3.8.3",
"version": "3.8.4",
"license": "MIT",
"dependencies": {
"axios": "^1.6.0",

View File

@ -1,6 +1,6 @@
{
"name": "twitch-vod-manager",
"version": "3.8.3",
"version": "3.8.4",
"description": "Twitch VOD Manager - Download Twitch VODs easily",
"main": "dist/main.js",
"author": "xRangerDE",

View File

@ -58,13 +58,13 @@
<span id="clipDurationDisplay" style="color: #00c853;">00:01:00</span>
</div>
<!-- Part Nummer -->
<!-- Teil Nummer -->
<div style="margin-bottom: 15px;">
<label style="display: block; margin-bottom: 8px;">Start Part-Nummer (optional, fur Fortsetzung):</label>
<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;"
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>
<!-- Dateinamen Format -->
@ -335,7 +335,7 @@
<div class="settings-card">
<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>
</div>
</div>
@ -346,7 +346,7 @@
<div class="status-dot" id="statusDot"></div>
<span id="statusText">Nicht verbunden</span>
</div>
<span id="versionText">v3.8.3</span>
<span id="versionText">v3.8.4</span>
</div>
</main>
</div>

View File

@ -8,7 +8,7 @@ import { autoUpdater } from 'electron-updater';
// ==========================================
// CONFIG & CONSTANTS
// ==========================================
const APP_VERSION = '3.8.3';
const APP_VERSION = '3.8.4';
const UPDATE_CHECK_URL = 'http://24-music.de/version.json';
// Paths
@ -1155,7 +1155,7 @@ function downloadVODPart(
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 });
resolve({ success: false, error: genericError });
});
@ -1599,10 +1599,10 @@ ipcMain.handle('download-clip', async (_, clipUrl: string) => {
if (match1) clipId = match1[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);
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);
fs.mkdirSync(folder, { recursive: true });
@ -1611,8 +1611,9 @@ ipcMain.handle('download-clip', async (_, clipUrl: string) => {
const filename = path.join(folder, `${safeTitle}.mp4`);
return new Promise((resolve) => {
const streamlinkPath = getStreamlinkPath();
const proc = spawn(streamlinkPath, [
const streamlinkCmd = getStreamlinkCommand();
const proc = spawn(streamlinkCmd.command, [
...streamlinkCmd.prefixArgs,
`https://clips.twitch.tv/${clipId}`,
'best',
'-o', filename,
@ -1623,12 +1624,12 @@ ipcMain.handle('download-clip', async (_, clipUrl: string) => {
if (code === 0 && fs.existsSync(filename)) {
resolve({ success: true, filename });
} else {
resolve({ success: false, error: 'Download failed' });
resolve({ success: false, error: `Download fehlgeschlagen (Exit-Code ${code ?? -1})` });
}
});
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 {
if (item.status === 'completed') return 'Abgeschlossen';
if (item.status === 'error') return 'Fehlgeschlagen';
if (item.status === 'downloading') return 'Lauft';
if (item.status === 'downloading') return 'Laeuft';
return 'Wartet';
}