Byse rejects uploads with status like "not enough disk space on your account" when the account's storage is exhausted. The parser was flagging every non-OK status as err.fileRejected=true, and the upload- manager classifier additionally matched the generic "lehnte Datei ab" prefix as file-rejected. Result: rotation was skipped on a full account and every subsequent file failed on the same dead account. - hosters.js: byse parser now distinguishes account-level phrases (disk space / storage / quota / insufficient / account full) and sets err.accountError=true for those. File-specific failures (Duplicate, wrong format, size) keep err.fileRejected=true. - upload-manager.js: _isFileRejectedError no longer matches the generic "lehnte Datei ab" prefix and short-circuits when err.accountError is true. _shouldSkipRetryOnAccountError honors the flag and has added regex patterns as a safety net. - Tests: 5 new unit tests covering disk-space/account-level/duplicate and the accountError-wins-over-fileRejected precedence.
2.0 KiB
Lessons
2026-04-21 — DOM-Doppelrender bei Bulk-State-Changes
Symptom: User klickt auf "Erneut versuchen" mit 500+ Jobs → App hängt sekundenlang.
Root cause: retrySelectedJobs() ruft renderQueueTable + updateQueueActionButtons + updateStatusBar auf, startSelectedUpload() ruft direkt danach genau dieselben Funktionen nochmal auf.
Regel: Wenn ein Click-Handler await anotherHandler() aufruft und der innere Handler seinen eigenen kompletten Render-Zyklus hat, NIEMALS noch einen davor. Einmal ist genug — der folgende innere Render sieht die frischen State-Mutationen ohnehin.
Wie anwenden: Vor jeder await fn()-Folge in einem Handler prüfen: macht fn schon renderQueueTable()? Wenn ja, äußere Render-Calls löschen.
2026-04-21 — Error-Klassifikation: fileRejected vs accountError
Symptom: Voller Byse-Account wurde nicht rotiert — skip-rotation-file-rejected geloggt für jede Datei.
Root cause: Generisches Match auf Prefix-String ("lehnte Datei ab") klassifizierte ALLE Byse-Errors als file-level, inklusive Account-voll-Meldungen.
Regel: Hoster-Parser setzen den spezifischen Flag (fileRejected ODER accountError), nicht beide nie. Classifier matcht konkrete Phrasen (Duplicate, Not video format, …), niemals generische Wrapper-Strings die für mehrere Fehlerarten benutzt werden.
Wie anwenden:
- Bei neuen Hostern: per-status-Klassifikation bereits im Parser, nicht erst im Upload-Manager.
- Classifier-Regexes auf Rejection-Kernphrasen, nicht auf UI-Prefix.
- Defensive:
accountError === truegewinnt immer gegenfileRejected— Account-Rotation ist weniger schlimm als endlose Fails auf einem toten Account.
2026-04-21 — Keine fake Build-ETAs
Symptom: User wartet 5+ min auf Tauri-Build den ich mit "1-2min" angekündigt habe.
Regel: Tauri-Release-Builds brauchen real 3-6 min (Rust + NSIS + MSI). Keine Zeitangabe oder ehrlich "kann 3-6min dauern" schreiben.
Wie anwenden: Wenn User nach Status fragt: sofort tail des Logs + ls des Bundle-Ordners zitieren, nicht raten.