diff --git a/web/app/src/api.ts b/web/app/src/api.ts index 2acd93f..ffc3a1d 100644 --- a/web/app/src/api.ts +++ b/web/app/src/api.ts @@ -207,7 +207,29 @@ async function anfrage(pfad: string, opts: RequestInit = {}): Promise { throw new ApiFehler(antwort.status, text); } - return antwort.status === 204 ? (undefined as T) : antwort.json(); + // **Nicht jede erfolgreiche Antwort hat einen Körper.** + // + // Vorher galt das nur für 204. Der Scan antwortet aber mit 202 Accepted und + // ohne Inhalt — er läuft im Hintergrund weiter, da gibt es noch nichts zu + // melden. `JSON.parse` lief dann auf eine leere Zeichenkette, und in der + // Verwaltung stand bei jedem Scanstart „unexpected end of data": eine + // Fehlermeldung für etwas, das tadellos funktioniert hatte. + // + // Geprüft wird der Inhalt, nicht der Status. Eine Liste von Status-Codes + // wäre wieder eine, die beim nächsten Endpunkt unvollständig ist. + if (antwort.status === 204 || antwort.status === 205) return undefined as T; + + const laenge = antwort.headers.get('Content-Length'); + const art = antwort.headers.get('Content-Type') ?? ''; + if (laenge === '0' || !art.includes('json')) { + // Ohne `Content-Length` — etwa bei Chunked-Übertragung — entscheidet der + // Text selbst. + const text = await antwort.text(); + if (text.trim().length === 0) return undefined as T; + return JSON.parse(text) as T; + } + + return antwort.json(); } /* ---------- Bilder ---------- */ diff --git a/web/app/src/views/admin.ts b/web/app/src/views/admin.ts index 6f01327..1416f89 100644 --- a/web/app/src/views/admin.ts +++ b/web/app/src/views/admin.ts @@ -872,8 +872,9 @@ function serverbereich(geaendert: () => void): HTMLElement { liste.appendChild(zeile( 'Metadaten', - stand.usingProjectKey ? `Mitgelieferter TMDB-Zugang · ${stand.language}` - : stand.hasApiKey ? `Eigener TMDB-Zugang · ${stand.language}` + // Ohne die Sprache: die steht eine Zeile tiefer und gehört dort hin. + stand.usingProjectKey ? 'Mitgelieferter TMDB-Zugang' + : stand.hasApiKey ? 'Eigener TMDB-Zugang' : 'Kein Zugang hinterlegt', stand.usingProjectKey ? 'Ein eigener Zugang löst den mitgelieferten ab.'