Einen Knopf je Serie ist bei fünfundneunzig kein Angebot

Es gab ihn: auf der Serienseite, das Uhrsymbol. Nur gilt er für genau
eine Serie — und nach jeder Änderung an der Erkennung will man ohnehin
alles noch einmal. Der Weg dorthin fehlte da, wo man ihn sucht: bei der
Mediathek, neben „Scannen" und „Metadaten auffrischen".

Der Lauf selbst war schon da. `NachScanAsync` macht genau das, Serien
über den Tonabgleich und Filme über das Bild — er hing bloss am Scan und
liess sich nicht von Hand anstossen. Jetzt nimmt er ein „erneut" entgegen
und ist über einen Endpunkt erreichbar. Die Antwort kommt sofort: über
einen grossen Bestand dauert das Stunden, und eine Anfrage so lange offen
zu halten hiesse, sie in ein Zeitlimit laufen zu lassen. Wie weit es ist,
steht im Protokoll von heute.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-13 21:01:11 +02:00
co-authored by Claude Opus 5
parent 1340176bf0
commit ce4da992ea
4 changed files with 79 additions and 8 deletions
+8
View File
@@ -675,6 +675,14 @@ export async function markenHolen(titelId: string): Promise<Marke[]> {
}
}
/** Sucht Vorspann und Abspann in einer ganzen Mediathek.
*
* **Antwortet sofort, arbeitet weiter.** Der Lauf liest je Folge ein Stück
* Ton; über fünfundneunzig Serien sind das Stunden. */
export const mediathekMarken = (id: string, erneut = false) =>
anfrage<void>(
`/libraries/${id}/marken${erneut ? '?erneut=true' : ''}`, { method: 'POST' });
/** Nimmt die Marken eines Films wieder weg — wenn die Erkennung danebenlag. */
export const filmmarkenVerwerfen = (filmId: string) =>
anfrage<void>(`/movies/${filmId}/marken`, { method: 'DELETE' });
+23 -2
View File
@@ -1,9 +1,10 @@
import {
bibliotheken, bibliothekAnlegen, bibliothekUmbenennen, bibliothekLoeschen, scanStarten,
mediathekMarken,
scanstand, metadatenAuffrischen, vermisste, vermisstesEntfernen, type VermissteDatei,
pruefungSetzen, mediathekZuruecksetzen, type Bibliothek,
} from '../../api';
import { esc, knopf, fehlerzeile, leer, meldung } from '../../util';
import { esc, knopf, fehlerzeile, leer, meldung, hinweisZeigen} from '../../util';
import { dialog, nachfragen } from '../../dialog';
import { abschnitt } from './teile';
@@ -222,6 +223,26 @@ export function bibliotheksbereich(
},
});
// **Je Serie einen Knopf zu drücken ist bei fünfundneunzig kein
// Angebot.** Den gibt es auf der Serienseite; hier gilt er für alles,
// was in dieser Mediathek liegt — Serien über den Tonabgleich, Filme
// über das Bild.
const marken = knopf('Vorspann und Abspann suchen', 'btn');
marken.title = 'Sucht überspringbare Abschnitte in allen Titeln dieser Mediathek.';
marken.onclick = () => nachfragen({
titel: `Vorspann und Abspann in „${aktuell.name}" suchen?`,
text: 'Der Server liest dafür von jeder Folge einmal die Tonspur und sieht '
+ 'sich bei Filmen die letzten zwanzig Minuten an. Über einen grossen '
+ 'Bestand dauert das Stunden — es läuft im Hintergrund weiter, und im '
+ 'Protokoll von heute steht, wie weit es ist. Schon durchsuchte Titel '
+ 'werden noch einmal geprüft.',
bestaetigen: 'Suchen',
tun: async () => {
await mediathekMarken(aktuell.id, true);
hinweisZeigen('Die Suche läuft. Das Protokoll von heute zeigt den Fortschritt.');
},
});
const umbenennen = knopf('Umbenennen', 'btn');
umbenennen.onclick = () => dialog({
titel: 'Mediathek umbenennen',
@@ -347,7 +368,7 @@ export function bibliotheksbereich(
// und danach nachzusehen. Der Knopf heisst „Seitenleiste bearbeiten".
const knoepfe = document.createElement('div');
knoepfe.className = 'knopfreihe';
knoepfe.append(los, auffrischen, pruefung, umbenennen, zuruecksetzen, entfernen);
knoepfe.append(los, auffrischen, marken, pruefung, umbenennen, zuruecksetzen, entfernen);
// **Nur wenn hier wirklich etwas liegt.** Ein Knopf, der nichts zu tun
// hat, ist schlechter als keiner — und die Zahl daneben sagt, worum es