Jeder Scan hätte jede Tonspur noch einmal gelesen
Gemerkt wurde nur, was gefunden wurde. Eine Staffel ohne Abspann — es gibt genug davon — sah damit bei jedem Scan aus wie eine, in der noch niemand nachgesehen hat, und wurde wieder abgetastet: jede Tonspur jeder Folge noch einmal von der Platte, für immer, ohne Ertrag. Bei sechstausend Folgen ist das kein Schönheitsfehler. Jetzt steht auch „gesucht und nichts gefunden" in der Datenbank, je Staffel und Art. Ausgelöst wird ein zweiter Lauf von der Folgenzahl: kommt eine Folge dazu, gibt es etwas Neues zu vergleichen, sonst nicht. Ein Zeitstempel allein täte das nicht — eine Staffel, die sich nie ändert, hat nie einen Grund für einen zweiten Lauf. Dazu der Knopf, der ausdrücklich doch noch einmal rechnet: die Uhr auf der Serienseite sucht ab jetzt immer neu. Von selbst läuft die Suche nach jedem Scan und überspringt dort das Abgesuchte; wer hier drückt, will genau das Gegenteil. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9bcdd239d7
commit
8112c15d4d
@@ -155,9 +155,11 @@ public sealed class Markenerkennung(
|
||||
(f, d) => new { f.Id, f.SeasonNumber, f.EpisodeNumber, d.Path, d.Duration })
|
||||
.ToListAsync(ct);
|
||||
|
||||
var vorhanden = await db.Marken.AsNoTracking()
|
||||
.Where(m => folgen.Select(f => f.Id).Contains(m.EpisodeId))
|
||||
.Select(m => new { m.EpisodeId, m.Art })
|
||||
// **Was schon einmal gesucht wurde, und mit wie vielen Folgen.**
|
||||
// Nicht „was gefunden wurde": eine Staffel ohne Abspann sähe sonst
|
||||
// bei jedem Scan aus wie eine, in der noch niemand nachgesehen hat.
|
||||
var gesucht = await db.Markensuchen.AsNoTracking()
|
||||
.Where(x => x.SeriesId == serieId)
|
||||
.ToListAsync(ct);
|
||||
|
||||
var gefunden = 0;
|
||||
@@ -172,8 +174,9 @@ public sealed class Markenerkennung(
|
||||
// aus demselben Abdruck. Das ist nicht nur richtig, sondern
|
||||
// billiger als zweimal lesen.
|
||||
var fehlt = new[] { Markenart.Intro, Markenart.Abspann }
|
||||
.Where(art => erneut || !geordnet.All(f =>
|
||||
vorhanden.Any(v => v.EpisodeId == f.Id && v.Art == art)))
|
||||
.Where(art => erneut || gesucht.FirstOrDefault(
|
||||
x => x.Staffel == staffel.Key && x.Art == art) is not { } lauf
|
||||
|| lauf.Folgen != geordnet.Count)
|
||||
.ToList();
|
||||
if (fehlt.Count == 0) continue;
|
||||
|
||||
@@ -206,6 +209,11 @@ public sealed class Markenerkennung(
|
||||
var treffer = Tonabgleich.ReiheAbgleichen(
|
||||
abdruecke, Tonabdruckleser.SekundenJeAbdruck);
|
||||
|
||||
// **Vermerken, dass gesucht wurde — vor dem Ergebnis.**
|
||||
// Auch ein Lauf ohne Fund ist ein Lauf; ihn nicht zu
|
||||
// vermerken hiesse, ihn beim nächsten Scan zu wiederholen.
|
||||
await VermerkenAsync(db, serieId, staffel.Key, art, geordnet.Count, ct);
|
||||
|
||||
foreach (var (folgenId, stelle) in treffer)
|
||||
{
|
||||
if (stelle.Bis - stelle.Von > Hoechstlaenge) continue;
|
||||
@@ -222,7 +230,9 @@ public sealed class Markenerkennung(
|
||||
}
|
||||
}
|
||||
|
||||
if (gefunden > 0) await db.SaveChangesAsync(ct);
|
||||
// Immer speichern: auch ein Lauf ohne Fund hinterlässt Vermerke,
|
||||
// und genau die verhindern den nächsten vergeblichen Lauf.
|
||||
await db.SaveChangesAsync(ct);
|
||||
log.LogInformation("Markenerkennung für {Serie}: {Anzahl} Marken.", serieId, gefunden);
|
||||
}
|
||||
|
||||
@@ -243,6 +253,30 @@ public sealed class Markenerkennung(
|
||||
return art == Markenart.Intro ? (0, fenster) : (werte - fenster, fenster);
|
||||
}
|
||||
|
||||
/// <summary>Hält fest, dass in dieser Staffel gesucht wurde.</summary>
|
||||
private async Task VermerkenAsync(
|
||||
FlaroContext db, Guid serieId, int staffel, Markenart art, int folgen, CancellationToken ct)
|
||||
{
|
||||
var alt = await db.Markensuchen
|
||||
.FirstOrDefaultAsync(x => x.SeriesId == serieId && x.Staffel == staffel && x.Art == art, ct);
|
||||
|
||||
if (alt is not null)
|
||||
{
|
||||
alt.Folgen = folgen;
|
||||
alt.GelaufenAm = clock.GetUtcNow();
|
||||
return;
|
||||
}
|
||||
|
||||
db.Markensuchen.Add(new Markensuche
|
||||
{
|
||||
SeriesId = serieId,
|
||||
Staffel = staffel,
|
||||
Art = art,
|
||||
Folgen = folgen,
|
||||
GelaufenAm = clock.GetUtcNow(),
|
||||
});
|
||||
}
|
||||
|
||||
private async Task<bool> SchreibenAsync(
|
||||
FlaroContext db, Guid folgenId, Markenart art, double von, double bis, CancellationToken ct)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user