Commit Graph

310 Commits

Author SHA1 Message Date
Administrator
29ab989cbe release: v2.6.5 2026-03-26 11:08:48 +01:00
Administrator
b75930cb29 refactor: unify queue start status handling 2026-03-26 11:08:01 +01:00
Administrator
ad46c48c64 release: v2.6.4 2026-03-26 11:01:53 +01:00
Administrator
f288ced84b fix: allow global start to retry failed queue items 2026-03-26 11:00:46 +01:00
Administrator
a3e956e085 release: v2.6.3 2026-03-26 10:18:23 +01:00
Administrator
8b68a7a07e fix: prevent retry jobs from getting stuck in waiting state 2026-03-26 10:17:15 +01:00
Administrator
a75aa85712 release: v2.6.2 2026-03-25 00:15:20 +01:00
Administrator
a5b07c0f73 🐛 fix: 'Ausgewählte starten' on queued jobs now force-adds to batch
Previously, clicking 'Ausgewählte starten' on 'Wartet' jobs during an
active upload just showed a toast. But the jobs might NOT actually be
in the batch (skipped during task building).

Now: ALL selected queued/error/aborted jobs are sent to addJobsToBatch.
The upload-manager has duplicate protection (checks jobAbortControllers)
so jobs already in the batch are skipped. Jobs NOT in the batch get
added and start uploading immediately.

Toast now shows exact counts: "X hinzugefügt, Y waren schon im Batch"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 00:14:53 +01:00
Administrator
ead6f97115 release: v2.6.1 2026-03-25 00:07:45 +01:00
Administrator
f642122726 🐛 fix: show feedback when 'Wartet' jobs are already in batch
- 'Ausgewählte starten' on already-queued jobs during upload now shows
  toast: "X Jobs warten bereits auf ihren Upload-Slot"
- Only error/aborted/skipped jobs are added to the running batch
  (prevents duplicate task creation for already-queued jobs)
- Toast confirms when error jobs are added to batch

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 00:07:12 +01:00
Administrator
6bd49d80b1 release: v2.6.0 2026-03-24 19:36:59 +01:00
Administrator
bf7f35d06c feat: auto-deduplicate queue against upload log on startup
When the app restarts with a restored queue, it now automatically
reads all fileuploader.log files and removes jobs that were already
successfully uploaded in a previous session.

This prevents re-uploading files that completed before a crash/close.
The dedup runs silently before the UI renders — no user action needed.

Also adds 'read-own-upload-log' IPC that reads all log variants
(base + daily logs) without file picker.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 19:36:31 +01:00
Administrator
a7b24ec363 release: v2.5.9 2026-03-24 10:02:54 +01:00
Administrator
24cb096ba9 🐛 fix: log import now permanently removes jobs from queue
buildQueuePreview() was re-creating removed jobs because they weren't
in _completedUploadKeys. Now log-imported file+hoster combos are added
to _completedUploadKeys so they stay removed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 10:02:29 +01:00
Administrator
9b493c7aab release: v2.5.8 2026-03-24 09:57:34 +01:00
Administrator
e07db0532a feat: import upload log to remove already-uploaded jobs from queue
New 'Log importieren' button in queue actions. Opens file picker for
.log/.txt files, parses the fileuploader.log format:
  date|hoster|link||filename|

Matches each log entry against queue jobs by filename+hoster (case-
insensitive). Removes matching jobs that are already uploaded,
shows toast with count.

Use case: after a crash/restart, import the log from a previous
session to skip files that were already successfully uploaded.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:57:09 +01:00
Administrator
ad9299e74c release: v2.5.7 2026-03-23 18:20:22 +01:00
Administrator
ff6f7f8612 🐛 fix: addJobs tracks promises so batch-done waits for them
Previously addJobs() was fire-and-forget — added jobs ran as orphaned
promises. When the original batch completed, batch-done fired and
uploadManager was set to null while added jobs were still running.

Now: added job promises are tracked in _additionalPromises array.
startBatch drains this array after the original tasks complete,
ensuring batch-done only fires when ALL jobs (original + added) finish.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 18:19:59 +01:00
Administrator
3c84679df1 release: v2.5.6 2026-03-23 18:15:54 +01:00
Administrator
e1b03605fa feat: retry/start selected jobs while upload batch is running
Previously, 'Erneut versuchen' and 'Ausgewählte starten' did nothing
when a batch was already running (uploading=true). Failed jobs were
set to 'Wartet' but never actually uploaded because they couldn't be
added to the running batch.

New: upload-manager.addJobs() allows adding tasks to a running batch.
When a batch is active and user retries/starts jobs, they're injected
into the running batch via IPC 'add-jobs-to-batch'. The upload manager
starts processing them immediately using the existing semaphores.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 18:15:31 +01:00
Administrator
a1a3e87de8 release: v2.5.5 2026-03-23 18:09:07 +01:00
Administrator
17fbb98c13 🐛 fix: skipped jobs now show error instead of stuck 'Wartet' forever
When buildUploadTasksFromJobs skips jobs (e.g. no valid account for
a hoster), the main process now returns their IDs + reason. The
renderer marks them as 'error' with a descriptive message instead of
leaving them stuck in 'Wartet' (queued) status with no feedback.

Previously: jobs silently stayed at 'Wartet' forever if their hoster
had no configured/enabled account. User had no idea why they weren't
uploading.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 18:08:41 +01:00
Administrator
c7343175ca release: v2.5.4 2026-03-23 08:04:13 +01:00
Administrator
d538c7da4f 🐛 fix: account fallback now works for ALL files in batch, not just first
When Account A failed, only the first file got the fallback to Account B.
All subsequent files in the same batch still tried Account A (wasting
all retries), then skipped fallback because _failedAccounts already
had the key.

Now: before the retry loop, each job checks if its account is already
known-failed and immediately switches to the fallback account, avoiding
wasted retries on a known-bad account.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 08:03:44 +01:00
Administrator
f4073a7ada release: v2.5.3 2026-03-22 20:32:40 +01:00
Administrator
94c3c5e4ac 🔧 chore: let→const for never-reassigned Sets/Maps/objects
ESLint prefer-const auto-fix: 12 variables changed from let to const
where the reference is never reassigned (Maps, Sets, sort state objects).

All tools clean:
- ESLint: 0 errors, 0 warnings
- Tests: 70/70 pass
- npm audit (runtime): 0 vulnerabilities

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 20:29:34 +01:00
Administrator
39b3971bbe release: v2.5.2 2026-03-22 20:20:07 +01:00
Administrator
d02d6944d3 feat: 'Ausgewählte starten' works for failed/aborted jobs too
Previously, 'Ausgewählte starten' only picked up jobs with status
'preview' or 'queued', silently ignoring failed/aborted/skipped jobs.
Users had to click 'Erneut versuchen' separately first.

Now it resets error/aborted/skipped jobs to 'queued' and starts them
in one click — combining retry + start into a single action.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 20:19:42 +01:00
Administrator
3a890301a5 release: v2.5.1 2026-03-22 19:44:41 +01:00
Administrator
68fc064999 🐛 fix: Ctrl+A selects correct panel (queue vs recent files)
Ctrl+A now properly respects which panel the user last clicked:
- Click in queue table → Ctrl+A selects all queue jobs
- Click in recent files panel → Ctrl+A selects all recent files
- Clicking one panel clears the other panel's selection

Previously, if any recent file was ever selected, Ctrl+A would
always select recent files even when the user was working in the queue.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 19:44:15 +01:00
Administrator
f6afdad5ba release: v2.5.0 2026-03-22 16:34:35 +01:00
Administrator
d7f9cd510f feat: upload starts immediately, no blocking health check alert
Previously, the auto health check before upload would block with an
alert dialog if any hoster check failed (e.g. "byse.sx: fetch failed"),
preventing the upload from starting entirely.

Now the upload starts immediately regardless of health check results.
The startup account check still runs in the background on app launch.
Failed hosters will naturally retry during the actual upload via the
existing retry/fallback mechanism in upload-manager.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 16:34:12 +01:00
Administrator
7fe4a92b66 release: v2.4.4 2026-03-22 14:58:49 +01:00
Administrator
79bce36057 chore: update lockfile 2026-03-22 14:58:26 +01:00
Administrator
26fabaa5c1 🔧 chore: ESLint clean — 0 errors, 0 warnings
- Disable detect-object-injection (78 false positives from config lookups)
- Suppress 2 safe regex warnings in vidmoly HTML parser with comments
- Suppress 2 async loop condition warnings (modified between awaits)

ESLint: 0 errors, 0 warnings. Tests: 70/70 pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:58:09 +01:00
Administrator
e229df97f0 chore: additional eslint rules 2026-03-22 14:54:04 +01:00
Administrator
9a32a554e4 chore: update lockfile after eslint install 2026-03-22 14:53:49 +01:00
Administrator
c82edc8d9e 🔧 chore: add ESLint + security plugin, fix all errors
ESLint with eslint-plugin-security configured and all 6 errors fixed:
- Remove unused 'self' variable (doodstream-upload.js)
- Remove unused 'statusCode' destructure (voe-upload.js)
- Remove unused 'powerSaveBlocker' import (main.js)
- Remove dead 'setHealthCheckStatus' function (app.js)
- Add URLSearchParams to ESLint globals
- Rename unused 'mode' param to '_mode'

82 remaining warnings are all security/detect-object-injection
false positives (normal config object access patterns).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:53:26 +01:00
Administrator
f2fdeef5d1 release: v2.4.3 2026-03-22 14:50:06 +01:00
Administrator
7e0d4e0b8f chore: remove unused imports (powerSaveBlocker, statusCode) 2026-03-22 14:49:43 +01:00
Administrator
ac7ed316f3 chore: remove unused variable, update package metadata 2026-03-22 14:49:20 +01:00
Administrator
cb70b47242 ♻️ refactor: remove redundant 'X abbrechen' context menu items
'Hoster entfernen' already cancels active uploads AND removes jobs.
The separate 'doodstream.com abbrechen' etc. items were redundant
and confused users with two ways to do the same thing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:48:51 +01:00
Administrator
8803f09974 release: v2.4.2 2026-03-22 14:45:17 +01:00
Administrator
1d35f024f2 🐛 fix: re-uploading same file after deleting completed job was blocked
_completedUploadKeys tracked done uploads to prevent phantom preview
jobs when removeFromQueueOnDone auto-removes them. But when user
EXPLICITLY deleted a completed job from queue, the key remained —
silently blocking re-upload of the same file+hoster combination.

Now clears the completed key in removeJobFromIndex so deleted files
can be re-added. Safe with removeFromQueueOnDone because
syncSelectedFilesFromQueue runs before next buildQueuePreview.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:44:50 +01:00
Administrator
789d5bf555 release: v2.4.1 2026-03-22 11:11:37 +01:00
Administrator
55d6892963 test: 4 stress tests verify critical fixes (70/70 pass)
- file-not-found produces 'nicht gefunden' (not '0 Bytes')
- zero-byte file produces '0 Bytes' error
- empty batch completes immediately with zero counts
- scaleParallelUploads correctly caps per-hoster concurrency

All 70 tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 11:11:13 +01:00
Administrator
1a07b2d712 release: v2.4.0 2026-03-22 10:49:14 +01:00
Administrator
4761d6406c 🐛 fix: await clearHistory() to ensure write completes before response
clearHistory() was the only configStore write call not awaited in its
IPC handler. The renderer received 'success' before the file write
completed — closing the app immediately after could leave history intact.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 10:48:46 +01:00
Administrator
4dfe88a565 release: v2.3.9 2026-03-21 15:35:42 +01:00
Administrator
9c04426950 🐛 fix: response body double-read regression + updater JSON safety
- hosters.js apiGet(): fixed regression from v2.3.8 where res.json()
  consumed the body, making res.text() return empty on parse failure.
  Now reads as text first, then parses JSON (matching VOE fix pattern).
- updater.js fetchJson(): same fix — read text first, parse JSON,
  show actual server response in error message on failure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 15:35:18 +01:00