diff --git a/web/app/index.html b/web/app/index.html new file mode 100644 index 0000000..d78fbda --- /dev/null +++ b/web/app/index.html @@ -0,0 +1,16 @@ + + +
+ + +${esc(item.Overview ?? '')}
+${esc(adresse.replace(/api_key=[^&]*/, 'api_key=…'))}` : ''}
+ `;
+ kasten.querySelector('button')!.onclick = schliessen;
+ ebene.appendChild(kasten);
+ };
+
+ const diagnose = { text: '', url: '' };
+ v.addEventListener('error', () => {
+ const c = v.error?.code;
+ scheitern('Der Browser kann diesen Strom nicht abspielen.',
+ (c === 4 ? 'Das Format wird nicht unterstützt. ' : `Fehlercode ${c ?? '?'}. `) + diagnose.text,
+ diagnose.url);
+ });
+
+ /* ---------- Bedienung ein- und ausblenden ---------- */
+ let ausblenden: ReturnTypeDieselbe Palette wie in der App.
+ +Wie groß Plakate und Vorschaubilder erscheinen — auf der Startseite + und in den Mediatheken. Gilt nur auf diesem Gerät.
+ +Woher die Titel oben kommen. Die Auswahl wechselt alle sechs Stunden; + Titel ohne Hintergrundbild ziehen dabei ein schlechteres Los.
+Welche Reihen erscheinen und in welcher Folge. Was der Server neu + anlegt, kommt ans Ende, statt zu fehlen.
+ +Womit ein Titel beginnt. Im Player lässt sie sich jederzeit ändern.
+ +„Original“ schickt die Datei unverändert, alles andere lässt den + Server umrechnen. Die App unterscheidet WLAN und Mobilfunk — im + Browser lässt sich das nicht verlässlich feststellen, deshalb eine + Stufe.
+ +Welche Spur beim Start gewählt wird, sofern der Titel sie mitbringt.
+Die Adresse steht beim Server, der diese Seite ausliefert — nicht im + Browser.
+ +Erst sichtbar, wenn die Startseite einmal geladen war.
'; + return; + } + + // Ausgeblendete hinten dran, damit man sie wiederfindet. + const geordnet = [ + ...anordnen(bekannteReihen), + ...bekannteReihen.filter((r) => P.hiddenRows.includes(r.id)), + ]; + + ort.innerHTML = ''; + geordnet.forEach((reihe, stelle) => { + const aus = P.hiddenRows.includes(reihe.id); + const zeile = document.createElement('div'); + zeile.className = 'rowline' + (aus ? ' off' : ''); + zeile.innerHTML = ` + + + `; + + zeile.querySelector('input')!.onchange = (e) => { + const an = (e.target as HTMLInputElement).checked; + setzen('hiddenRows', an + ? P.hiddenRows.filter((id) => id !== reihe.id) + : [...P.hiddenRows, reihe.id]); + reihenListe(wurzel, neuZeichnen); + neuZeichnen(); + }; + + const schieben = (um: number): void => { + // Die aktuelle Folge festschreiben, bevor darin verschoben wird. + const ids = geordnet.map((r) => r.id); + const nach = stelle + um; + if (nach < 0 || nach >= ids.length) return; + [ids[stelle], ids[nach]] = [ids[nach]!, ids[stelle]!]; + setzen('rowOrder', ids); + reihenListe(wurzel, neuZeichnen); + neuZeichnen(); + }; + const [hoch, runter] = zeile.querySelectorAll('button'); + (hoch as HTMLElement).onclick = () => schieben(-1); + (runter as HTMLElement).onclick = () => schieben(1); + ort.appendChild(zeile); + }); +}