„Wartet" für immer, obwohl der Server längst fertig war

Der Eintrag ging nach einer 202 zurück auf „wartet" und rief danach
`resume`. Das nimmt aber nur auf, was **angehalten oder gescheitert**
ist — ein wartender lief in die Schutzklausel und kam nie wieder heraus.
Im Protokoll packte ffmpeg um, in der App stand „wartet", und dazwischen
lag nichts.

Jetzt wird die Warteschlange abgearbeitet statt ein einzelner Eintrag
aufgenommen; „wartet" steht darin.

Dazu zwei Dinge, um die du gebeten hast:

**Das Protokoll liest sich wie eine Kommandozeile.** Älteste Zeile oben,
neueste unten, die Ansicht steht am Ende. Mitgeschoben wird nur, wenn man
unten steht — wer hochgescrollt hat, liest etwas, und ihn bei jeder neuen
Zeile ans Ende zu reissen wäre, als nähme man ihm die Seite aus der Hand.

**Ein Tipp auf eine Kachel führt auf die Detailseite**, am Telefon wie am
iPad wie am Mac. Nur in „Weiterschauen" spielt er ab: dort steht der
Titel, *weil* man ihn angefangen hat. Vorher war es umgekehrt, mit dem
Argument „wer eine Kachel antippt, weiss schon, was er sehen will". Im
Gebrauch stimmte das nicht — wer nachsehen wollte, wie viele Staffeln
eine Serie hat, bekam den Film. Ein Umweg von einem Schritt ist
ärgerlich; eine Wiedergabe, die man nicht wollte, ist schlimmer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-11 20:56:39 +02:00
co-authored by Claude Opus 5
parent ce5dc66047
commit 0a394b9b3b
5 changed files with 53 additions and 33 deletions
+18 -5
View File
@@ -10,9 +10,14 @@ import { abschnitt } from './teile';
* was gerade schiefgeht, brauchte drei Handgriffe für eine Antwort, die auf
* der ersten Seite hätte stehen können.
*
* **Jetzt steht es sofort da und läuft mit.** Neueste Zeile oben, damit man
* zum Mitlesen nicht scrollen muss; die älteren Tage stehen darunter als
* Kacheln zum Herunterladen.
* **Jetzt steht es sofort da und läuft mit.** Wie eine Kommandozeile:
* älteste Zeile oben, neueste unten, und die Ansicht steht am Ende. Das ist
* die Richtung, in der ein Logbuch gelesen wird — man sieht, was zuletzt
* geschah, und scrollt nach oben, um zu sehen, was davor war.
*
* **Nur mitgeschoben, wenn man unten steht.** Wer hochgescrollt hat, liest
* etwas; ihn bei jeder neuen Zeile ans Ende zu reissen wäre, als würde man
* ihm die Seite aus der Hand nehmen.
*/
/** Wie viele Zeilen anfangs geholt werden. */
@@ -30,10 +35,13 @@ export function protokollbereich(): HTMLElement {
liste.innerHTML = '<div class="spinner"></div>';
bereich.appendChild(liste);
// **Über der Liste, nicht darunter.** „Weiter zurück" holt ältere Zeilen,
// und die erscheinen oben — ein Knopf dafür am unteren Ende zeigte in die
// falsche Richtung.
const mehr = document.createElement('button');
mehr.className = 'btn hidden';
mehr.textContent = 'Weiter zurück';
bereich.appendChild(mehr);
bereich.insertBefore(mehr, liste);
const archiv = document.createElement('div');
archiv.className = 'protokolltage';
@@ -90,7 +98,11 @@ export function protokollbereich(): HTMLElement {
}
function zeichnen(roh: string): void {
const zeilenListe = roh.split('\n').filter(z => z.trim().length > 0).reverse();
const zeilenListe = roh.split('\n').filter(z => z.trim().length > 0);
// **Vor dem Neuzeichnen merken, ob man unten stand.** Danach ist die
// Höhe eine andere, und die Frage liesse sich nicht mehr beantworten.
const amEnde = liste.scrollHeight - liste.scrollTop - liste.clientHeight < 40;
liste.innerHTML = '';
if (zeilenListe.length === 0) {
@@ -99,6 +111,7 @@ export function protokollbereich(): HTMLElement {
}
zeilenListe.forEach(z => liste.appendChild(protokollzeile(z)));
if (amEnde) liste.scrollTop = liste.scrollHeight;
}
async function tageLaden(): Promise<void> {