fix: toolbar icons, UI improvements, upload manager enhancements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Administrator 2026-03-11 02:51:39 +01:00
parent 0bde332003
commit 2ddbc41318
3 changed files with 265 additions and 15 deletions

View File

@ -1,8 +1,10 @@
{
"hosters": {
"doodstream.com": {
"enabled": true,
"apiKey": "480618be3tgxt6xg1vkjwg"
"enabled": false,
"apiKey": "",
"username": "",
"password": ""
},
"voe.sx": {
"enabled": true,
@ -19,6 +21,117 @@
"apiKey": "83124r74v61t9dmojm4gz"
}
},
"hosterSettings": {
"doodstream.com": {
"retries": 3,
"maxSpeedKbs": 0,
"parallelCount": 2,
"restartBelowKbs": 0,
"timeIntervalSec": 0,
"maxSizeMb": 0
},
"voe.sx": {
"retries": 3,
"maxSpeedKbs": 0,
"parallelCount": 2,
"restartBelowKbs": 0,
"timeIntervalSec": 0,
"maxSizeMb": 0
},
"vidmoly.me": {
"retries": 25,
"maxSpeedKbs": 0,
"parallelCount": 2,
"restartBelowKbs": 0,
"timeIntervalSec": 1,
"maxSizeMb": 0
},
"byse.sx": {
"retries": 3,
"maxSpeedKbs": 0,
"parallelCount": 2,
"restartBelowKbs": 0,
"timeIntervalSec": 0,
"maxSizeMb": 0
}
},
"globalSettings": {
"alwaysOnTop": false,
"shutdownAfterFinish": "nothing",
"logFilePath": "",
"resumeQueueOnLaunch": true,
"parallelUploadCount": 0,
"scaleParallelUploads": true,
"removeFromQueueOnDone": false,
"pendingQueue": {
"selectedUploadHosters": [
"doodstream.com",
"voe.sx",
"vidmoly.me",
"byse.sx"
],
"selectedFiles": [
{
"path": "C:\\Users\\ploet\\Downloads\\Einfach mal die Fresse halten!!!.mp4",
"name": "Einfach mal die Fresse halten!!!.mp4",
"size": 0
}
],
"queueJobs": [
{
"id": "preview-1773193741983-c1qa7p",
"file": "C:\\Users\\ploet\\Downloads\\Einfach mal die Fresse halten!!!.mp4",
"fileName": "Einfach mal die Fresse halten!!!.mp4",
"hoster": "doodstream.com",
"status": "preview",
"bytesTotal": 0,
"error": null,
"result": null,
"maxAttempts": 0
},
{
"id": "preview-1773193741983-bvlsvn",
"file": "C:\\Users\\ploet\\Downloads\\Einfach mal die Fresse halten!!!.mp4",
"fileName": "Einfach mal die Fresse halten!!!.mp4",
"hoster": "voe.sx",
"status": "preview",
"bytesTotal": 0,
"error": null,
"result": null,
"maxAttempts": 0
},
{
"id": "preview-1773193741983-a7aixs",
"file": "C:\\Users\\ploet\\Downloads\\Einfach mal die Fresse halten!!!.mp4",
"fileName": "Einfach mal die Fresse halten!!!.mp4",
"hoster": "vidmoly.me",
"status": "preview",
"bytesTotal": 0,
"error": null,
"result": null,
"maxAttempts": 0
},
{
"id": "preview-1773193741983-39jnfg",
"file": "C:\\Users\\ploet\\Downloads\\Einfach mal die Fresse halten!!!.mp4",
"fileName": "Einfach mal die Fresse halten!!!.mp4",
"hoster": "byse.sx",
"status": "preview",
"bytesTotal": 0,
"error": null,
"result": null,
"maxAttempts": 0
}
]
},
"scramble": {
"active": false,
"prefix": "",
"suffix": "",
"chars": "both",
"length": 0
}
},
"history": [
{
"id": "batch-1771639560711",
@ -235,6 +348,79 @@
]
}
]
},
{
"id": "batch-1773173725103",
"timestamp": "2026-03-10T20:15:25.339Z",
"total": 1,
"succeeded": 1,
"failed": 0,
"files": [
{
"name": "test-e2e-upload.txt",
"size": 22,
"results": [
{
"hoster": "voe.sx",
"status": "done",
"download_url": null,
"embed_url": null,
"file_code": null
}
]
}
]
},
{
"id": "batch-1773176124038",
"timestamp": "2026-03-10T20:55:24.931Z",
"total": 1,
"succeeded": 1,
"failed": 0,
"files": [
{
"name": "Einfach mal die Fresse halten!!!.mp4",
"size": 172248,
"results": [
{
"hoster": "voe.sx",
"status": "done",
"download_url": "https://voe.sx/nlvswooic50v",
"embed_url": "https://voe.sx/e/nlvswooic50v",
"file_code": "nlvswooic50v"
}
]
}
]
},
{
"id": "batch-1773176209320",
"timestamp": "2026-03-10T20:56:59.349Z",
"total": 2,
"succeeded": 2,
"failed": 0,
"files": [
{
"name": "export_1771588307185.mov",
"size": 7330963,
"results": [
{
"hoster": "voe.sx",
"status": "done",
"download_url": "https://voe.sx/qh1jriyz5up7",
"embed_url": "https://voe.sx/e/qh1jriyz5up7",
"file_code": "qh1jriyz5up7"
},
{
"hoster": "doodstream.com",
"status": "done",
"download_url": "https://dsvplay.com/d/q5tib39woqq4",
"embed_url": "https://dsvplay.com/e/q5tib39woqq4",
"file_code": "q5tib39woqq4"
}
]
}
]
}
]
}

View File

@ -25,7 +25,7 @@
<div class="upload-toolbar">
<div class="toolbar-left">
<button class="btn btn-xs btn-secondary" id="chooseHostersBtn">Ziele auswählen</button>
<span class="hoster-summary" id="hosterSummary">Keine Upload-Ziele ausgewählt</span>
<span class="hoster-summary" id="hosterSummary" style="display:none"></span>
</div>
<div class="toolbar-right">
<button class="btn btn-xs btn-primary" id="addFilesBtn">+ Dateien</button>
@ -40,15 +40,34 @@
<div class="queue-shell" id="queueShell" style="display:none">
<div class="queue-command-bar" id="queueCommandBar">
<button class="btn btn-xs btn-success" id="startUploadBtn" disabled>Start Uploading</button>
<button class="btn btn-xs btn-secondary" id="reuploadSelectedBtn">Reupload selected file</button>
<button class="btn btn-xs btn-secondary" id="abortSelectedBtn">Abort selected file</button>
<button class="btn btn-xs btn-secondary" id="finishStopBtn">Finish Uploads in Progress and Stop</button>
<button class="btn btn-xs btn-danger" id="abortAllBtn">Abort all Downloads</button>
<button class="btn btn-xs btn-secondary" id="moveTopBtn">Move to the top</button>
<button class="btn btn-xs btn-secondary" id="moveUpBtn">Move up</button>
<button class="btn btn-xs btn-secondary" id="moveDownBtn">Move down</button>
<button class="btn btn-xs btn-secondary" id="moveBottomBtn">Move to the bottom</button>
<button class="toolbar-btn" id="startUploadBtn" title="Start Uploading" disabled>
<svg width="16" height="16" viewBox="0 0 16 16"><path d="M4 2l10 6-10 6z" fill="#4caf50"/></svg>
</button>
<button class="toolbar-btn" id="reuploadSelectedBtn" title="Reupload selected file">
<svg width="16" height="16" viewBox="0 0 16 16"><path d="M8 1a7 7 0 0 0-5 2.1V1H2v4h4V4H3.7A5.5 5.5 0 1 1 2.5 8H1a7 7 0 1 0 7-7z" fill="#4caf50"/></svg>
</button>
<button class="toolbar-btn" id="abortSelectedBtn" title="Abort selected file">
<svg width="16" height="16" viewBox="0 0 16 16"><rect x="3" y="3" width="10" height="10" rx="1" fill="#e53935"/><path d="M5.5 5.5l5 5M10.5 5.5l-5 5" stroke="#fff" stroke-width="1.5" stroke-linecap="round"/></svg>
</button>
<button class="toolbar-btn" id="finishStopBtn" title="Finish Uploads in Progress and Stop">
<svg width="16" height="16" viewBox="0 0 16 16"><path d="M2 8l4 4 8-8" stroke="#4caf50" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/><rect x="11" y="9" width="5" height="5" rx="1" fill="#e53935"/></svg>
</button>
<button class="toolbar-btn toolbar-btn-danger" id="abortAllBtn" title="Abort all Downloads">
<svg width="16" height="16" viewBox="0 0 16 16"><rect x="1" y="1" width="14" height="14" rx="2" fill="#e53935"/><path d="M4.5 4.5l7 7M11.5 4.5l-7 7" stroke="#fff" stroke-width="2" stroke-linecap="round"/></svg>
</button>
<span class="toolbar-sep"></span>
<button class="toolbar-btn" id="moveTopBtn" title="Move to the top">
<svg width="16" height="16" viewBox="0 0 16 16"><rect x="4" y="1" width="8" height="2" rx="0.5" fill="#4caf50"/><path d="M8 5l-4 5h8z" fill="#4caf50"/><path d="M8 9l-4 5h8z" fill="#4caf50"/></svg>
</button>
<button class="toolbar-btn" id="moveUpBtn" title="Move up">
<svg width="16" height="16" viewBox="0 0 16 16"><path d="M8 2l-5 6h10z" fill="#4caf50"/><rect x="6" y="8" width="4" height="6" rx="0.5" fill="#4caf50"/></svg>
</button>
<button class="toolbar-btn" id="moveDownBtn" title="Move down">
<svg width="16" height="16" viewBox="0 0 16 16"><rect x="6" y="2" width="4" height="6" rx="0.5" fill="#4caf50"/><path d="M8 14l-5-6h10z" fill="#4caf50"/></svg>
</button>
<button class="toolbar-btn" id="moveBottomBtn" title="Move to the bottom">
<svg width="16" height="16" viewBox="0 0 16 16"><path d="M8 7l-4-5h8z" fill="#4caf50"/><path d="M8 11l-4-5h8z" fill="#4caf50"/><rect x="4" y="13" width="8" height="2" rx="0.5" fill="#4caf50"/></svg>
</button>
</div>
<div class="queue-container" id="queueContainer">

View File

@ -178,10 +178,55 @@ body {
.queue-command-bar {
display: flex;
flex-wrap: wrap;
gap: 6px;
padding: 8px 16px;
gap: 2px;
align-items: center;
padding: 4px 8px;
border-bottom: 1px solid var(--border);
background: linear-gradient(180deg, rgba(255,255,255,0.03), rgba(0,0,0,0.12));
background: linear-gradient(180deg, rgba(255,255,255,0.05), rgba(0,0,0,0.08));
}
.toolbar-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 26px;
padding: 3px;
border: 1px solid transparent;
border-radius: 3px;
background: transparent;
cursor: pointer;
color: var(--text-muted);
transition: all 0.15s;
}
.toolbar-btn:hover {
background: rgba(255,255,255,0.1);
border-color: rgba(255,255,255,0.15);
}
.toolbar-btn:active {
background: rgba(255,255,255,0.05);
transform: translateY(1px);
}
.toolbar-btn:disabled {
opacity: 0.35;
cursor: default;
pointer-events: none;
}
.toolbar-btn:disabled:hover {
background: transparent;
border-color: transparent;
}
.toolbar-btn svg {
display: block;
}
.toolbar-btn-danger:hover {
background: rgba(229,57,53,0.2);
border-color: rgba(229,57,53,0.3);
}
.toolbar-sep {
width: 1px;
height: 20px;
background: var(--border);
margin: 0 4px;
}
.queue-container {
flex: 1 1 0;