Die Kachel zeigte auf die Folge und wollte zur Serie

„Nächste Folge" führte ins Leere, und es lag weder am Scan noch am
Auffrischen: die Kachel trug die Folgenkennung und öffnete damit eine
Serienseite — die es unter dieser Kennung nie gibt. Heraus kam ausgerechnet
dort „Diese Serie gibt es nicht mehr", wo man gerade weiterschauen wollte.
Der Server kannte die Serie an beiden Stellen und schickte sie nur nicht mit.

Wohin die Kachel führt und was sie misst, ist jetzt getrennt. Beides auf
dieselbe Kennung zu legen wäre der nächste Fehler gewesen: „Als gesehen
markieren" hätte die ganze Serie abgehakt statt der einen Folge, die man zur
Hälfte gesehen hat.

Dazu Streichen wie im Dateimanager: gedrückt halten und darüberfahren wählt
aus, rückwärts über Gewähltes nimmt wieder weg. Ein kurzer Klick bleibt, was
er war. Abgetastet wird die Strecke zwischen zwei Zeigerereignissen, nicht
nur deren Endpunkte — gemessen: ein Zug über vier Kacheln erwischte sonst die
erste und die letzte. Plakate lassen sich nicht mehr durch die Gegend
schleppen.

„Abwählen" ist ein Kreuz geworden; als vierter Knopf neben drei Aktionen sah
es aus, als täte es etwas mit den Titeln.

In der kleinen Leiste lag das Vorschaubild über dem Fortschrittsstrich und
verdeckte ihn rechts. Und ein Klick genau darauf tat nichts, obwohl das die
Stelle ist, auf die man zeigt — jetzt holt auch das Bild den Film zurück.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-05 21:48:00 +02:00
co-authored by Claude Opus 5
parent 7df9fa6c01
commit c46063637f
8 changed files with 350 additions and 16 deletions
+32 -5
View File
@@ -11,7 +11,14 @@ import { titeldialog } from './titel';
/** Was eine Kachel zeigt — unabhängig davon, woher sie kommt. */
export type Kachel = {
/** Wohin der Klick führt — bei einer Folge die Serie, zu der sie gehört. */
id: string;
/** Welche Kennung den Sehstand trägt. Fehlt sie, ist es `id`.
*
* **Nur dort verschieden, wo die Kachel woandershin führt als sie misst:**
* eine Folge aus „Weiterschauen" öffnet die Serie, abgehakt wird aber die
* Folge. */
standId?: string;
art: 'filme' | 'serien';
/** Die obere, fette Zeile. Bei einer Folge die Serie. */
titel: string;
@@ -43,10 +50,25 @@ export const alsKachel = (e: Film | Serie): Kachel => ({
freigabe: e.publishAt,
});
/** Eine Kachel aus „Weiterschauen" — bei Folgen dreizeilig, wie bei Plex. */
/** Eine Kachel aus „Weiterschauen" oder „Nächste Folge" — bei Folgen
* dreizeilig, wie bei Plex.
*
* **Die Kachel führt zur Serie, der Sehstand bleibt bei der Folge.**
*
* Hier stand die Folgenkennung, und die Kachel öffnete damit eine Serienseite
* — die es unter dieser Kennung nie gibt. Heraus kam „Diese Serie gibt es
* nicht mehr", ausgerechnet unter „Nächste Folge", wo man gerade
* weiterschauen wollte. Eine eigene Seite je Folge gibt es nicht; die Staffeln
* stehen auf der Serienseite, und dorthin gehört der Klick.
*
* **Beides auf dieselbe Kennung zu legen wäre der nächste Fehler gewesen:**
* „Als gesehen markieren" hätte dann die ganze Serie abgehakt statt der
* einen Folge, die man gerade zur Hälfte gesehen hat.
*/
export const angefangenAlsKachel = (e: Angefangen): Kachel => e.kind === 'episode'
? {
id: e.id, art: 'serien',
id: e.seriesId ?? e.id, art: 'serien',
standId: e.id,
titel: e.title,
zweite: e.subTitle,
dritte: `S${e.season} · F${e.episode}`,
@@ -116,6 +138,10 @@ export function kachel(k: Kachel, oeffnen: (art: 'filme' | 'serien', id: string)
bild.src = adresse;
bild.alt = '';
bild.loading = 'lazy';
// **Kein Ziehen des Bildes.** Browser machen aus jedem Bild von sich aus
// ein Ziehgut; wer über die Kacheln streicht, um mehrere auszuwählen,
// schleppte sonst ein halbdurchsichtiges Plakat hinter sich her.
bild.draggable = false;
// Erst einblenden, wenn es da ist — sonst blitzt der Platzhalter durch.
bild.onload = () => rahmen.classList.add('geladen');
rahmen.appendChild(bild);
@@ -259,7 +285,7 @@ function kachelpunkte(
// **Die Antwort des Servers gilt, nicht die Annahme hier.** Bei einer
// Serie zieht das Häkchen alle Folgen mit; was dabei herauskommt,
// weiss nur der Server.
k.stand = await gesehen(k.id, !istGesehen);
k.stand = await gesehen(k.standId ?? k.id, !istGesehen);
// **Die Kachel spiegelt den neuen Zustand selbst.** Die Liste neu zu
// laden verlöre Bildlauf und Filter — für einen Haken.
k.offen = istGesehen ? (k.gesamt ?? k.offen) : 0;
@@ -271,7 +297,7 @@ function kachelpunkte(
icon: 'stern',
tun: async () => {
const neuerWert = !k.stand?.favourite;
k.stand = await favorit(k.id, neuerWert);
k.stand = await favorit(k.standId ?? k.id, neuerWert);
},
},
];
@@ -282,7 +308,7 @@ function kachelpunkte(
punkte.push({
text: 'Aus Weiterschauen nehmen',
tun: async () => {
await weglegen(k.id);
await weglegen(k.standId ?? k.id);
if (k.stand) k.stand.dismissed = true;
knopf.querySelector('.fortschritt')?.remove();
},
@@ -361,6 +387,7 @@ async function kachelAuffrischen(k: Kachel, knopf: HTMLElement): Promise<void> {
const bild = document.createElement('img');
bild.src = adresse;
bild.alt = '';
bild.draggable = false;
bild.onload = () => plakat.classList.add('geladen');
plakat.prepend(bild);
}