From d9dec33ecc4914972045bbc36b1fb93915f1a260 Mon Sep 17 00:00:00 2001 From: Administrator Date: Wed, 11 Mar 2026 00:34:17 +0100 Subject: [PATCH] feat: add account management tab with login validation New "Accounts" tab for managing hoster credentials separately from upload settings. Accounts can be added, edited, and deleted via modal dialogs. Login credentials are automatically verified on save, showing status (Bereit/Fehler) in the account list. Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- renderer/app.js | 401 ++++++++++++++++++++++++++++++++++++-------- renderer/index.html | 61 ++++++- renderer/styles.css | 65 +++++++ 4 files changed, 453 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index fb1731a..e910d82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "multi-hoster-uploader", - "version": "1.2.1", + "version": "1.3.0", "description": "Upload files to doodstream, voe, vidmoly, byse simultaneously", "main": "main.js", "scripts": { diff --git a/renderer/app.js b/renderer/app.js index 3c012b6..7d9a2a5 100644 --- a/renderer/app.js +++ b/renderer/app.js @@ -7,6 +7,8 @@ let config = { hosters: {}, hosterSettings: {}, globalSettings: {} }; let hosterSettings = {}; let uploading = false; let healthCheckRunning = false; +let accountStatuses = {}; // { 'voe.sx': { status: 'ok'|'error'|'checking'|'unchecked', message: '' } } +let editingAccountHoster = null; // null = adding, string = editing let autoHealthCheckEnabled = true; let queuePersistTimer = null; const AUTO_CHECK_PREF_KEY = 'autoHealthCheckBeforeUpload'; @@ -33,6 +35,7 @@ async function init() { renderHosterSummary(); renderHosterModal(); renderSettings(); + renderAccounts(); setupListeners(); setupDragDrop(); loadHistory(); @@ -150,9 +153,10 @@ function renderHosterModal() { list.innerHTML = available.map(item => { const checked = selectedUploadHosters.includes(item.name); const h = config.hosters[item.name] || {}; - const subtitle = item.name === 'vidmoly.me' ? 'Login hinterlegt' - : (item.name === 'voe.sx' && h.username && h.password) ? 'Login hinterlegt' - : 'API-Key hinterlegt'; + const st = accountStatuses[item.name]; + const subtitle = st && st.status === 'ok' ? 'Bereit' + : st && st.status === 'error' ? 'Login-Fehler' + : getCredentialLabel(item.name, h) + ' hinterlegt'; return `