Commit Graph

298 Commits

Author SHA1 Message Date
Administrator
f38b3d6a53 release: v2.3.2 2026-03-21 14:24:54 +01:00
Administrator
a4a2eaa736 🐛 fix: scaleParallelUploads inverted, settings lost on close, IPC leak
- scaleParallelUploads used Math.max instead of Math.min, causing MORE
  concurrent uploads instead of limiting them to the global count
- Settings debounce (350ms) was not flushed on app close — user changes
  made right before closing were lost
- onRemoteClientCount IPC listener was re-registered on every
  renderSettings() call, causing listener accumulation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 14:24:14 +01:00
Administrator
ae318d2c62 release: v2.3.1 2026-03-21 14:17:38 +01:00
Administrator
ada3b31ad1 🐛 fix: health check wait timeout, _deletedJobIds memory cleanup
- Add 30-second timeout to health check wait loop in startUpload/
  startSelectedUpload to prevent infinite spin if healthCheckRunning
  gets stuck
- Clear _deletedJobIds Set when batch completes to prevent unbounded
  memory growth over long sessions with many deletions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 14:16:59 +01:00
Administrator
ffc8fb4026 release: v2.3.0 2026-03-21 13:53:06 +01:00
Administrator
f6c9979ac5 🐛 fix: job index rebuild after restore, drop-target visibility, XSS
- Rebuild _jobIndexById after restoring queue from config on startup
  (prevented progress updates from finding restored jobs)
- Show and focus mainWindow when files are dropped on floating
  drop-target while window is minimized/hidden
- Escape status text in queue table HTML to prevent XSS from
  unexpected status values

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 13:52:22 +01:00
Administrator
b5a853b8d4 release: v2.2.9 2026-03-21 13:32:33 +01:00
Administrator
4ecf406660 🐛 fix: folder monitor re-detect deleted files, atomic sync save
- Folder monitor: clear _seenFiles entry on file unlink so re-added
  files (e.g. re-encoded) are detected again
- Sync IPC save (beforeunload): use atomic write pattern with backup
  (.bak) creation, matching the async _atomicWrite behavior

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 13:31:54 +01:00
Administrator
f6d4a7de3d release: v2.2.8 2026-03-21 13:19:46 +01:00
Administrator
27905d66de 🐛 fix: shutdown countdown ignores mode change, timer leaks
Critical: handleShutdownAfterFinish() captured shutdown mode in a
closure at scheduling time — changing mode during countdown was ignored,
causing unexpected system shutdown/restart/sleep.

Now reads shutdownMode at execution time, clears timer when mode
changes to 'nothing', clears orphaned timers before creating new ones,
and adds error handling on exec() calls.

Also: guard stats timer against double-start in upload-manager.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 13:19:07 +01:00
Administrator
af48a485e8 release: v2.2.7 2026-03-21 11:52:50 +01:00
Administrator
9600195954 🐛 fix: batch-done resilience, input validation, VOE JSON parse
- batch-done handler: appendHistory failure no longer prevents the
  upload-batch-done event from reaching the renderer (UI would get stuck)
- remote:input-event: validate x/y as finite numbers before passing
  to sendInputEvent (prevents NaN/Infinity crash)
- VOE upload server: wrap JSON.parse in try-catch with clear error
  message instead of raw stack trace

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 11:52:13 +01:00
Administrator
55eee8a42e release: v2.2.6 2026-03-21 11:46:41 +01:00
Administrator
61e458b8ea 🐛 fix: skip 0-byte files, fix drag-drop highlight flicker
- Upload manager now rejects empty files (0 bytes) with clear error
  message instead of sending useless uploads to the server
- Fix drag-drop zone highlight flickering caused by dragleave firing
  on child elements (classic browser bug, fixed with enter/leave counter)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 11:46:04 +01:00
Administrator
0fb9d2f62b release: v2.2.5 2026-03-21 11:40:58 +01:00
Administrator
b0a2eda131 🐛 fix(remote): clean up auth timeout and client state on WebSocket error
The error handler was missing clearTimeout for the auth timeout timer
and didn't clean up authenticated client state (signaling disconnect,
destroying capture window when last client drops).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 11:40:18 +01:00
Administrator
389be8f0fc release: v2.2.4 2026-03-21 11:21:46 +01:00
Administrator
6d3b2d3a86 🐛 fix: upload button stuck, abort handling, filename escaping
- Upload button no longer gets permanently stuck if startUpload()
  throws after health check (try-catch with uploading=false reset)
- Wait for running health check instead of silently blocking upload
- Add abort signal check in VOE/Vidmoly upload generators
- Escape filenames with quotes/backslashes in multipart form headers
  (all 4 uploaders: doodstream, voe, vidmoly, byse)
- Validate backup import structure before overwriting config

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 11:21:09 +01:00
Administrator
d601bd7986 release: v2.2.3 2026-03-21 10:20:43 +01:00
Administrator
7ba2c63d51 🐛 fix: config race conditions, quit safety, update data loss
- Config write serialization via _writeQueue prevents concurrent
  read-modify-write races between settings/queue/history saves
- Cancel active uploads on app quit (prevents zombie processes)
- Persist queue before update install (prevents queue loss)
- Sync IPC save in beforeunload (guarantees save before close)
- Fix double configStore.load() call
- Guard against status regression in handleProgress (done→uploading)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 10:20:07 +01:00
Administrator
9ea9212637 release: v2.2.2 2026-03-21 09:03:48 +01:00
Administrator
a64ebd1587 feat(queue): add "Hoster entfernen" submenu to context menu
Right-click on queue now shows a "Hoster entfernen ▸" submenu listing
all hosters with job count (e.g. "Vidmoly (3)"). Clicking removes all
jobs for that hoster, cancels active uploads, and saves immediately.

Also fixes submenu viewport flip measurement (was reading offsetWidth
on display:none elements).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 09:03:13 +01:00
Administrator
ccfb7c18ba release: v2.2.1 2026-03-21 08:46:57 +01:00
Administrator
176cadc2dd 🐛 fix(queue): deleted jobs reappear after restart
Three root causes fixed:
- handleProgress() re-created deleted jobs from stale progress callbacks
- Queue save was debounced (10s during uploads), deletion lost on app close
- Delete was blocked during active uploads (removed !uploading guard)

Now: deletions save immediately, deleted IDs are tracked to prevent
re-creation, and active uploads are cancelled when their jobs are deleted.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 08:46:19 +01:00
Administrator
5569c690a1 release: v2.2.0 2026-03-20 16:11:41 +01:00
Administrator
beba96c21b feat(doodstream): add OTP input support for web login
When Doodstream requires 2FA, the account modal now dynamically
shows an OTP input field so the user can enter the code from
their email and complete the login without restarting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:09:33 +01:00
Administrator
8f077868cc fix: account for invisible DWM frame borders in click mapping
Windows 10/11 getBounds() includes ~7px invisible resize borders that
are not included in the window capture, causing click offset.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 09:00:18 +01:00
Administrator
f19d883a69 fix: native resolution capture + correct click offset for title bar
- Remove restrictive resolution constraints, capture at native res
- Account for window frame/title bar when mapping click coordinates
  (capture includes title bar but sendInputEvent is content-relative)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 08:55:46 +01:00
Administrator
b4211a7d50 fix: use getMediaSourceId() for exact window capture
Instead of enumerating all sources and matching by title (which falls
back to full screen capture), use BrowserWindow.getMediaSourceId() to
get the exact media source ID for the app window.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 08:52:22 +01:00
Administrator
c9d038d588 debug: send capture errors back via signaling channel
If getCaptureStream fails, send error back through WebSocket so it
appears in proxy logs for diagnosis.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 08:49:07 +01:00
Administrator
82b597506b debug: add IPC logging from capture window to main process
Capture window logs now forwarded to main process via IPC to diagnose
why video tracks are missing from the WebRTC answer SDP.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 08:46:18 +01:00
Administrator
6b47181572 fix: serialize WebRTC objects before IPC transfer
RTCSessionDescription and RTCIceCandidate objects lose their properties
when sent through Electron's contextBridge IPC. Convert to plain objects
with explicit property extraction before sending.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 08:40:57 +01:00
Administrator
d8a2ec6443 fix: robust capture source detection + diagnostic logging
- desktopCapturer now searches window+screen types with fallbacks
- Partial title match and screen fallback if exact match fails
- Error messages sent back from capture window via IPC
- Detailed logging for capture source selection

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 08:38:41 +01:00
Administrator
efcaa760df fix: buffer WebRTC signaling messages until capture window is ready
The capture window creation is async but the browser's WebRTC offer
arrives immediately after auth. Messages were silently dropped during
window initialization, preventing video stream from establishing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 07:39:20 +01:00
Administrator
e19c36b1fb release: v2.1.1 2026-03-12 07:26:50 +01:00
Administrator
a5c5041ec8 fix: add STUN server for WebRTC NAT traversal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 07:26:28 +01:00
Administrator
7b9362756d release: v2.1.0 2026-03-12 07:20:07 +01:00
Administrator
ad9b866afe chore: add ws dependency for remote control
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 07:19:38 +01:00
Administrator
f13bf7f5bc feat(remote): add Fernsteuerung settings panel with token management and status display
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 06:58:29 +01:00
Administrator
d1513a58b3 feat(remote): wire up remote server, capture window, and IPC handlers in main process
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 06:56:47 +01:00
Administrator
90bb298dbe feat(remote): add remote control bridge methods to preload 2026-03-12 06:56:09 +01:00
Administrator
9fa047b399 feat(remote): add WebSocket server with auth, signaling relay, and rate limiting
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 06:54:51 +01:00
Administrator
c2932a1577 feat(remote): add remote control defaults to config store
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 06:54:46 +01:00
Administrator
92e94b1e8a feat: add remote-capture preload and HTML for WebRTC screen sharing
Adds the hidden BrowserWindow assets for remote desktop streaming:
- lib/remote-capture-preload.js: IPC bridge for desktopCapturer source ID,
  WebRTC signaling relay, input event forwarding, and client count tracking
- lib/remote-capture.html: WebRTC logic handling multiple concurrent clients
  via RTCPeerConnection, stream capture via getUserMedia with desktop source ID,
  and DataChannel input forwarding

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 06:54:07 +01:00
Administrator
23dd010a95 release: v2.0.6
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 06:02:46 +01:00
Administrator
0c945e21b8 fix: prevent double-click race condition in upload start
Move `uploading = true` guard to immediately after the check in both
startUpload() and startSelectedUpload(), before any async calls.
Previously the flag was set after await executeHealthCheck(), allowing
a fast double-click to bypass the guard and start duplicate batches.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 06:02:30 +01:00
Administrator
6233b192ab release: v2.0.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 05:40:35 +01:00
Administrator
fecf773caf fix: prevent duplicate queue entries after removeFromQueueOnDone
- Track completed uploads in _completedUploadKeys Set so buildQueuePreview
  won't re-create jobs for files already uploaded this session
- Deduplicate queue on restore: when loading pendingQueue, keep only the
  job with the best status per file+hoster pair (removes existing dupes)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 05:40:25 +01:00
Administrator
68e05503f6 release: v2.0.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 05:25:33 +01:00
Administrator
3d8979797c fix: queue table not updating during uploads (virtual scrolling bug)
The in-place update path for virtual scrolling would silently skip the
full DOM rebuild when row IDs didn't match due to sort order changes.
The break statement only exited the for-loop but return still fired,
preventing any update. Now tracks allMatch flag and falls through to
innerHTML rebuild when needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 05:25:22 +01:00