Commit Graph

214 Commits

Author SHA1 Message Date
xRangerDE
5e78068169 release: 5.0.6 — streamlink stdout-Capture + CSS select+checkbox fixes
Streamlink Diagnose:
- stdout-Buffer wird jetzt zusaetzlich zu stderr gesammelt; einige
  streamlink-Builds schreiben 'error:'-Lines auf stdout statt stderr,
  was bisher zu leerem stderrTail + 'Streamlink exit code 1' ohne
  Detail-Info gefuehrt hat.
- download-part-failed Debug-Log enthaelt jetzt stderrTail UND
  stdoutTail (jeweils letzte 2000 chars), plus User-facing-Error wird
  aus beiden Streams kombiniert gesucht.

CSS:
- .form-group select: 'background: ...' Shorthand wurde durch
  'background-color: ...' ersetzt — Shorthand hatte background-image
  (Chevron-SVG), background-repeat, background-position, background-size
  aus der globalen select-Regel resettet, was zu tiled Chevrons im
  Dropdown gefuehrt hat ('Best (default) ▼▼▼▼▼▼...').
- input[type='checkbox']:checked: rotated-border-Trick durch inline-
  SVG-Checkmark ersetzt — die rotated borders renderten in mstsc/RDP-
  Sessions teilweise als Pfeile statt Haken (DPI-Skalierungs-Artefakt).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 04:04:33 +02:00
xRangerDE
e270e1ec12 release: 5.0.5 — streamlink Resilience + bessere Fehler-Diagnose
Problem: User berichtet 'streamlink exit code 1' bei VOD-Downloads ohne
sinnvolle Fehlermeldung — UI zeigt 'Retrying in 8s (unknown)...'. Root
Cause: classifyDownloadError matched die echten Twitch-Errors nicht und
nur die letzte stderr-Zeile wurde im Debug-Log gespeichert.

Fixes:
- Volle stderr-History wird gepuffert + im download-part-failed Debug-Log
  als stderrTail (letzte 2000 chars) gespeichert
- UI bekommt jetzt die echte streamlink Error-Zeile statt 'Streamlink
  Fehlercode N' (prefer 'error:'-prefixed Zeilen, dann last non-bracket
  non-INFO line)
- classifyDownloadError matcht jetzt zusaetzlich: 'no playable streams',
  'could not find any kind of stream', 'access token', 'session token',
  'signature', 'integrity token', 'subscriber only', 'sub-only',
  'not subscribed', 'http error', 'connectionerror', 'readerror'

Streamlink-Args:
- --stream-segment-attempts 5 (default 3 — mehr Retries bei flaky CDN)
- --stream-segment-timeout 20
- --stream-timeout 120
- --retry-streams 3 (retry initial stream listing)
- --retry-max 2

Damit ueberlebt der Download transiente Twitch-CDN-Hicks und der User
sieht im naechsten Fail die echte Fehlerursache in der UI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 03:56:46 +02:00
xRangerDE
261aaa362e release: 5.0.4 — VOD-Hover: CSS geometry raus, JS allein authoritativ
Probleme der 5.0.3:
- CSS .vod-storyboard-preview hatte noch aspect-ratio:16/9, top:0, left:0, right:0
- JS hat dann inset:0 + aspect-ratio:auto inline gesetzt
- Im Electron-28-Chromium kam ein Layout-Konflikt raus -> Overlay-Box-
  Dimensions wichen von Host ab -> backgroundSize-Skalierung passte nicht
  zu visible-area -> mehrere Cells gleichzeitig sichtbar (Sprite-Sheet-
  Look statt Single-Cell-Preview)

Fix 5.0.4:
- CSS-Klasse hat NUR noch Visual+Stacking (opacity, transition, border-
  radius, overflow:hidden, z-index, position:absolute, pointer-events)
- KEIN top/left/right/bottom/width/height/aspect-ratio im CSS
- JS setzt alles inline und voll explicit: top=0, left=0, width=Xpx,
  height=Ypx aus hostRect (.vod-thumb-wrap)
- Sanity-Guards fuer width/height<=0 und cellWidth/cellHeight<=0
- scaleX und scaleY weiter unabhaengig fuer korrekte Cell-Box-Fuellung

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 14:53:00 +02:00
xRangerDE
a5a1d8c067 release: 5.0.3 — VOD hover overlay fuellt jetzt das gesamte Thumbnail-Wrap
Wechsel von explicit width/height auf inset:0 (top/right/bottom/left:0,
width/height:auto, aspect-ratio:auto override des CSS-Legacy 16/9). Damit
fuellt das Overlay garantiert das gesamte .vod-thumb-wrap — kein leerer
Streifen mehr am oberen oder unteren Rand der Hover-Vorschau, egal ob
Twitch Storyboard-Cell-Aspect oder Subpixel-Rendering minimal abweicht.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 14:44:39 +02:00
xRangerDE
11e2f957e6 release: 5.0.2 — VOD hover follow-ups
Fix 1: scaleX und scaleY werden jetzt unabhaengig berechnet. Twitch
Storyboard-Cells haben nicht zwingend 16:9; eine einheitliche scale-Variable
fuehrte zu Subpixel-Leakage am oberen oder unteren Rand mit Inhalt aus der
Nachbarzelle. Mit getrennter Achsen-Skalierung fuellt eine Cell die Overlay-
Box exakt.

Fix 2: Bulk-Select-Checkbox und Downloaded-Badge werden waehrend des Hover-
Previews ausgeblendet (vorher nur die Duration-Badge). Mein vorheriger Move
des Overlays in .vod-thumb-wrap hatte die Z-Order so geaendert, dass diese
Elemente jetzt sichtbar drueber lagen.

219 unit tests + e2e gruen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 14:40:34 +02:00
xRangerDE
44daa65fe6 release: 5.0.1 — fix VOD hover preview + merge-group progress bar
Bug 1 — VOD-Hover Storyboard zeigte am unteren Rand einen statischen Streifen vom Original-Thumbnail (Subpixel-Mismatch + Aspect-Ratio-Konflikt). Fix: Overlay haengt jetzt an .vod-thumb-wrap statt .vod-card, mit explizitem width+height aus dem Thumbnail-BoundingRect — keine CSS-aspect-ratio-Interferenz mehr.

Bug 2 — Merge-Group Download zeigte einen eingefrorenen Progress-Bar bei Multi-Part-VODs (Part X/Y). Root Cause: der weighted-progress Wrapper clamped progress=-1 (HLS unknown-total 1s-Tick) auf 0, was overallProgress auf priorWeight fix-nagelte. Bar oszillierte zwischen indeterminate-animation und einem fixen ~10% Wert. Fix: lastVodProgress persistiert zwischen Path-A-Ticks und Path-B-Streamlink-%-Lines, sodass der Bar smooth waehrend einer Part hochzaehlt.

210 unit tests + e2e:release gruen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 14:30:21 +02:00
xRangerDE
c2b9b5759a release: 5.1.0-alpha.2 — Command Palette Streamer-Suche
Pillar 5 (UI Power) erweitert: Ctrl+K matched jetzt auch Streamer-Namen
(tippe Name oder @login → springt direkt zum Streamer im VODs-Tab).
Plus .gitignore-Hygiene.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 01:25:39 +02:00
xRangerDE
d7d0fafe5c release: 5.1.0-alpha.1 - top-clips-crawler + command palette
Pillar 7 (Auto-Discovery) gets the Helix top-clips-crawler module (9 tests).
Pillar 5 (UI Power) gets its first visible component: Command Palette via
Ctrl+K with 6 tab-jump commands.

219 unit tests + e2e:release gruen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 00:05:20 +02:00
xRangerDE
595269d9f5 release: 5.1.0-alpha.0 - integrity-check + archive-files-store + format-helpers
Continuation post-5.0.0. Adds three more domain/infra modules + 46 tests
(210 total). Touched pillars:

- Pillar 1 (Live-Rec): integrity-check ffprobe parser + verdict
- Pillar 6 (Smart-Resume / Archive): archive-files-store CRUD + summary
- Pillar 4 (Architecture-Split): format-helpers extraction (4 more pure
  functions out of main.ts: sanitizeFilenamePart, formatTwitchDurationFromSeconds,
  formatDateWithPattern, getMergeGroupPhaseText)

main.ts continues to shrink (now ~7160 LoC from 7485 start). Renderer-side
work (Pillar 5 UI Power) + recorder integration (Plan 04b) + OAuth IPC
wiring (needs Twitch Client ID from user) still ahead.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 23:57:35 +02:00
xRangerDE
5b1c68a122 release: 5.0.0 — vitest + SQLite + OAuth storage/flow + Smart-Resume foundation
Major bump. v5.0.0-GA umfasst:

Foundation
- vitest test infrastructure
- 11 neue Module in src/main/{infra,domain}/
- main.ts: -198 LoC pure helpers extracted
- 164 unit tests + full e2e:release suite gruen

Persistence (Pillar 3 — done)
- better-sqlite3 mit WAL + 5s busy_timeout
- schema v5 (9 tables: schema_meta, config_kv, queue_items, downloaded_vods,
  streamers, archive_files, migrations_applied, oauth_accounts, chunk_index)
- Idempotenter JSON to SQLite Migrator (shadow-write, .v4-backup)
- Long-lived DB-Handle Singleton mit shutdown-close

Auth (Pillar 2 — scaffold done)
- SecureStorage (Electron safeStorage + Memory-Impl)
- token-store CRUD auf oauth_accounts (encrypted)
- PKCE pair + state generator
- Loopback HTTP server (127.0.0.1, ephemeral port)
- Twitch OAuth 2.1 Authorization Code Flow + PKCE module
- IPC wiring + Client ID config + Renderer button kommen in 5.1.x

Smart-Resume (Pillar 6 — foundation done)
- chunk_index table
- sha1 buffer + streaming file hash helpers
- chunk-index-store CRUD
- Integration in den Live-Recorder kommt in 5.1.x

Post-5.0 Roadmap
- Plan 04b: Resume in Recorder
- Plan 05: Live-Rec Polish + Sub-only (braucht Twitch Client ID)
- Plan 06: UI Power (virtual list, mini-player, command palette)
- Plan 07-09: Architektur-Split (Pillar 4 Rest)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 23:48:02 +02:00
xRangerDE
bf16a49cff release: 5.0.0-alpha.3 - Smart-Resume foundation (chunk-hash + index)
Plan 04 abgeschlossen.
- schema-v5.ts: chunk_index table (item_id, chunk_seq, sha1_hex, bytes)
- src/main/infra/chunk-hash.ts: sha1 buffer + streaming file
- src/main/domain/chunk-index-store.ts: CRUD + dedupe lookup
- 143 unit tests (vorher 126, +17 fuer schema + hash + store)
- npm run test:e2e:release gruen

Integration mit dem live Recorder folgt in Plan 04b. Plan 04 ist rein
additiv; kein bestehender Recorder-Code wurde modifiziert.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 22:20:49 +02:00
xRangerDE
baede7cd84 release: 5.0.0-alpha.2 - OAuth foundation (storage layer)
Plan 03 abgeschlossen.
- schema-v5.ts: oauth_accounts table (provider, twitch_user_id, encrypted_*_token, ...)
- src/main/infra/secure-storage.ts: SecureStorage interface + Memory + Electron impls
- src/main/domain/token-store.ts: provider-agnostic CRUD on oauth_accounts
- 126 unit tests (vorher 106, +20 fuer schema + secure-storage + token-store)
- npm run test:e2e:release gruen

Twitch OAuth Flow itself (Authorization Code + PKCE via system browser
or embedded BrowserWindow) is deferred to Plan 03b — goal.md proposed
Device Code Flow which Twitch does not support.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 22:14:39 +02:00
xRangerDE
16e0bfa059 release: 5.0.0-alpha.1 - SQLite migrator (shadow write, JSON stays master)
Plan 02 abgeschlossen.
- better-sqlite3 + @types installiert
- src/main/infra/{db.ts, schema-v5.ts} - DbHandle wrapper + schema v5 (7 tables + 6 indices)
- src/main/domain/migrator.ts - JSON to SQLite (idempotent, fail-soft, .v4-backup)
- main.ts: lazy-require Aufruf im app.whenReady
- 106 unit tests (vorher 91, +15 fuer db + migrator)
- npm run test:e2e:release gruen

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 22:06:38 +02:00
xRangerDE
02c3b3df5b build: add better-sqlite3 + @types
Native binding verified loadable via node -e require smoke.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 22:01:29 +02:00
xRangerDE
b649cf36f2 release: 5.0.0-alpha.0 — foundation: vitest + 5 pure modules extracted
Plan 01 abgeschlossen. main.ts: 7485 → 7287 LoC (-198).
5 neue Module + 91 Unit-Tests:
  src/main/infra/fs-atomic.ts
  src/main/infra/duration.ts
  src/main/domain/update-version-utils.ts
  src/main/domain/i18n-backend.ts
  src/main/domain/config-normalize.ts

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 21:50:25 +02:00
xRangerDE
d97f75d0f7 build: add vitest devDep
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 21:39:19 +02:00
xRangerDE
0e81a47e9e release: 4.6.155 aria-live on clipStatus + viewer-modal status fields
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 12:17:04 +02:00
xRangerDE
86d68466f9 release: 4.6.154 aria-live on 3 more refresh-result status messages
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 12:11:27 +02:00
xRangerDE
2d109077a0 release: 4.6.153 cleanupReport role=status + aria-live
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 12:06:58 +02:00
xRangerDE
29315091c6 release: 4.6.152 aria-label on add-streamer input
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 12:01:31 +02:00
xRangerDE
fce353d529 release: 4.6.151 aria-label on the 3 filter/search inputs
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:57:31 +02:00
xRangerDE
6c56c4e908 release: 4.6.150 remove redundant .filter-input:hover
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:46:35 +02:00
xRangerDE
ce3b876006 release: 4.6.149 applyTemplatePreset triggers save
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:40:41 +02:00
xRangerDE
65c9d06dfa release: 4.6.148 localize 2 hardcoded English img alt texts
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:33:45 +02:00
xRangerDE
3d40160b5c release: 4.6.147 remove unused .app-toast.error CSS rule
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:28:17 +02:00
xRangerDE
8f0f7d5d84 release: 4.6.146 wire statsIntro + drop statsScannedAtNever
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:19:33 +02:00
xRangerDE
6d28aa1972 release: 4.6.145 remove unused cutterDropHint locale key
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:14:10 +02:00
xRangerDE
b73593fc9a release: 4.6.144 .btn-secondary:disabled parity rule
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:07:07 +02:00
xRangerDE
1b70743a0e release: 4.6.143 .btn:disabled visual cue
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 11:03:34 +02:00
xRangerDE
c1943b421b release: 4.6.142 global hover state on all text inputs / textarea / select
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:57:32 +02:00
xRangerDE
e4db7abc87 release: 4.6.141 .filter-input hover state
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:52:42 +02:00
xRangerDE
2851d5b8d6 release: 4.6.140 .select-compact hover + drop redundant inline margin
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:48:17 +02:00
xRangerDE
7ef6459c8a release: 4.6.139 .form-row.search-bar + .select-compact.size-md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:43:56 +02:00
xRangerDE
1faa6e35cf release: 4.6.138 finish renderer-updates is-hidden migration
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:38:24 +02:00
xRangerDE
561a1568f0 release: 4.6.137 update banner uses .show + updateProgress uses .is-hidden
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:33:16 +02:00
xRangerDE
ad8f32f8b8 release: 4.6.136 streamerProfileHeader is-hidden + skeleton class owns flex
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:26:24 +02:00
xRangerDE
539b1c13a0 release: 4.6.135 streamer filter + bulk-remove use .is-hidden
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:20:43 +02:00
xRangerDE
01913c193d release: 4.6.134 .is-hidden utility class
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:16:36 +02:00
xRangerDE
bbb65f0cfd release: 4.6.133 .cutter-info + .timeline-container .shown modifiers
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:10:47 +02:00
xRangerDE
5e383a6e12 release: 4.6.132 .clip-template-wrap.shown modifier
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:04:42 +02:00
xRangerDE
19555ce872 release: 4.6.131 .clip-modal-duration-value.invalid modifier
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:00:03 +02:00
xRangerDE
45dfd4f6fd release: 4.6.130 .chat-viewer-user default accent color
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:54:54 +02:00
xRangerDE
e951c6a852 release: 4.6.129 .event-viewer-empty CSS class
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:50:30 +02:00
xRangerDE
2d1d48599a release: 4.6.128 dedupe formatBytes — shared between stats + archive
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:45:22 +02:00
xRangerDE
a62080cb44 release: 4.6.127 dedupe applyHtml/escapeHtml across 3 renderer modules
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:39:56 +02:00
xRangerDE
9fd14371a2 release: 4.6.126 .queue-details.expanded modifier
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:31:56 +02:00
xRangerDE
af11cdda10 release: 4.6.125 .section-title.compact modifier
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:26:47 +02:00
xRangerDE
137bab63a0 release: 4.6.124 vod-card skeleton line variants
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:22:27 +02:00
xRangerDE
7cb2358a54 release: 4.6.123 streamer-profile-skel-block variants
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:17:36 +02:00
xRangerDE
a809676731 release: 4.6.122 .queue-output-row + .queue-output-label
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 09:13:12 +02:00