Ein Klick, der nichts tat, und niemand sagte warum

Eine Serienkachel kannte der Server als Titel nicht: „als gesehen markieren"
lief in eine 404, und weil das Kontextmenü die Ablehnung verschluckte, geschah
sichtbar gar nichts. Dasselbe beim Favoriten. UserItemState bekommt eine
Serienkennung, das Häkchen zieht alle Folgen mit, und was wirft, erscheint als
Meldung statt in der Browserkonsole.

Dazu eine Mehrfachauswahl in der Mediathek — gesehen, ungesehen, Metadaten
neu holen für das Gewählte, in einer Anfrage statt in zweihundert. Ein neues
Plakat steht sofort auf der Kachel, und ein Titel, den es nicht mehr gibt,
endet nicht mehr in einer Sackgasse.

Gemessen: ein POST auf /refresh ohne Rumpf antwortete nach der Erweiterung mit
404 — also genau der Aufruf „alles auffrischen", den es länger gibt als die
Auswahl. Der Rumpf wird jetzt von Hand gelesen, und beide Formen stehen in
einer Prüfung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-05 18:28:33 +02:00
co-authored by Claude Opus 5
parent c854c4a09a
commit 557708b769
21 changed files with 2085 additions and 78 deletions
+21 -2
View File
@@ -56,6 +56,8 @@ export type Serie = {
id: string; title: string; year: number | null; overview: string | null;
posterImage: string | null; backdropImage: string | null;
episodeCount: number; seasons: number[]; unwatchedCount: number;
/** Favorit, Bewertung, Häkchen — zur Serie als Ganzem, neben `unwatchedCount`. */
state: Stand | null;
logoImage: string | null;
runtimeMinutes: number | null;
rating: number | null;
@@ -468,6 +470,19 @@ export const gesehen = (id: string, wert: boolean) =>
method: 'PUT', body: JSON.stringify({ watched: wert }),
});
/** Was aus einer Sammelmarkierung geworden ist. */
export type Sammelergebnis = { changed: number; unknown: string[] };
/** Viele auf einmal abhaken.
*
* **Eine Anfrage, nicht zweihundert.** Bei einer Mediathek mit 455 Titeln
* wären Einzelanfragen ein Sturm, bei dem mittendrin etwas scheitert und
* niemand weiss, was durchging. */
export const gesehenSammel = (ids: string[], wert: boolean) =>
anfrage<Sammelergebnis>('/items/watched', {
method: 'PUT', body: JSON.stringify({ ids, watched: wert }),
});
/** Aus „Weiterschauen" nehmen, ohne zu behaupten, man habe es gesehen. */
export const weglegen = (id: string) =>
anfrage<Stand>(`/items/${id}/dismiss`, { method: 'POST' });
@@ -490,8 +505,12 @@ export const genresVon = (id: string) => anfrage<string[]>(`/libraries/${id}/gen
export const empfehlungen = (take = 20) =>
anfrage<Seite<Film>>(`/home/suggestions${abfrage({ take })}`);
export const metadatenAuffrischen = (id: string) =>
anfrage<void>(`/libraries/${id}/refresh`, { method: 'POST' });
/** Metadaten neu holen — für die ganze Mediathek oder nur für eine Auswahl. */
export const metadatenAuffrischen = (id: string, ids?: string[]) =>
anfrage<void>(`/libraries/${id}/refresh`, {
method: 'POST',
body: ids && ids.length > 0 ? JSON.stringify({ ids }) : undefined,
});
/** Eine laufende Wiedergabe — nur für Administratoren sichtbar. */
export type Wiedergabe = {