„Schon durchsucht" und „hat eine Marke" sind zwei verschiedene Dinge
Genau dazwischen fehlte die Unterscheidung. Ein Film, bei dem die Suche einmal nichts fand, trägt einen Vermerk und keine Marke — und war damit für jeden weiteren Lauf erledigt, obwohl er der interessanteste Fall ist. Es gab nur alles oder nichts, und der Knopf bei der Mediathek schickte immer „alles": 453 Filme mal zwanzig Minuten Schlüsselbilder, auch für die vierhundert, bei denen längst etwas stand. Aus `bool erneut` wird `Markenumfang` mit drei Werten. `Neue` ist, was der Scan tut, und ändert sich nicht. `Luecken` nimmt sich vor, wo keine Marke steht — gleich ob dort schon einmal gesucht wurde. `Alles` ist der alte Holzhammer. Bei der Mediathek jetzt zwei Knöpfe, weil es zwei Fragen sind: „Fehlende Marken suchen" ist die alltägliche, „Alles neu durchsuchen" die seltene und teure, und deren Rückfrage nennt die Zahl der Titel. Auf der Detailseite bleibt es bei einem Knopf mit „alles" — wer ihn bei genau diesem Titel drückt, ist mit genau diesem Titel unzufrieden. Bei einer Serie wird eine Staffel ganz gelesen, sobald einer ihrer Folgen etwas fehlt. Billiger ginge es nur, indem man die Lücke gar nicht erst angeht, und genau dafür drückt jemand den Knopf. Vier Prüfungen am Endpunkt, die messen, ob der Lauf den Film anfasst: `Neue` überspringt den Durchsuchten, `Luecken` nimmt ihn sich vor, `Alles` sowieso, und ein Film mit Marke bleibt bei `Luecken` in Ruhe. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f2752e6c05
commit
f79ecf2757
@@ -296,4 +296,109 @@ public class MarkenTests
|
||||
"der Vermerk bleibt, sonst legte der nächste Scan dieselbe Marke wieder an");
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>Wie weit ein Lauf greift — drei Umfänge, drei Antworten.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// <b>„Schon durchsucht" und „hat eine Marke" sind zwei verschiedene
|
||||
/// Dinge.</b> Ein Film, bei dem die Suche einmal nichts fand, trägt
|
||||
/// einen Vermerk und keine Marke — und war damit für jeden weiteren
|
||||
/// Lauf erledigt, obwohl er der interessanteste Fall ist.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// Geprüft wird am Vermerk: fasst der Lauf den Film an, schreibt er
|
||||
/// <c>GelaufenAm</c> neu. Das ist die einzige Spur, die auch ohne
|
||||
/// ffmpeg und ohne echten Abspann entsteht.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
[TestCase("Neue", false, TestName = "Neue überspringt, was schon durchsucht ist")]
|
||||
[TestCase("Luecken", true, TestName = "Luecken nimmt sich den Film ohne Marke vor")]
|
||||
[TestCase("Alles", true, TestName = "Alles nimmt sich alles vor")]
|
||||
public async Task Der_Umfang_entscheidet_bei_einem_Film_ohne_Marke(
|
||||
string umfang, bool erwartetAngefasst)
|
||||
{
|
||||
Datei("Matrix (1999)/Matrix (1999).mkv");
|
||||
|
||||
using var server = new FlaroServer();
|
||||
var client = await Eingelesen(server, "Movies");
|
||||
var filme = await client.GetFromJsonAsync<Page<MovieResponse>>("/api/v1/movies");
|
||||
var film = filme!.Items[0].Id;
|
||||
|
||||
// Gesucht wurde schon, gefunden nichts: Vermerk ja, Marke nein.
|
||||
var vorher = new DateTimeOffset(2020, 1, 1, 0, 0, 0, TimeSpan.Zero);
|
||||
await server.InDerDatenbank(async db =>
|
||||
{
|
||||
// **Ohne Laufzeit kommt der Lauf nicht bis zum Vermerk.** Die
|
||||
// Prüfdatei ist leer; die Laufzeit steht sonst aus ffprobe.
|
||||
var datei = await db.MediaFiles.FirstAsync(d => d.MovieId == film);
|
||||
datei.Duration = TimeSpan.FromMinutes(120);
|
||||
|
||||
db.Markensuchen.Add(new Markensuche
|
||||
{
|
||||
MovieId = film, Art = Markenart.Abspann, Folgen = 1, GelaufenAm = vorher,
|
||||
});
|
||||
await db.SaveChangesAsync();
|
||||
});
|
||||
|
||||
(await client.PostAsync($"/api/v1/movies/{film}/marken?umfang={umfang}", null))
|
||||
.EnsureSuccessStatusCode();
|
||||
|
||||
var gelaufen = vorher;
|
||||
for (var versuch = 0; versuch < 40; versuch++)
|
||||
{
|
||||
await server.InDerDatenbank(async db =>
|
||||
gelaufen = await db.Markensuchen.AsNoTracking()
|
||||
.Where(x => x.MovieId == film).Select(x => x.GelaufenAm).FirstAsync());
|
||||
if (gelaufen != vorher) break;
|
||||
await Task.Delay(50);
|
||||
}
|
||||
|
||||
Assert.That(gelaufen != vorher, Is.EqualTo(erwartetAngefasst),
|
||||
erwartetAngefasst
|
||||
? "dieser Umfang muss den Film noch einmal anfassen"
|
||||
: "dieser Umfang muss ihn überspringen");
|
||||
}
|
||||
|
||||
/// <summary>Ein Film mit Marke bleibt bei „nur Lücken" unangetastet.</summary>
|
||||
[Test]
|
||||
public async Task Luecken_laesst_einen_Film_mit_Marke_in_Ruhe()
|
||||
{
|
||||
Datei("Matrix (1999)/Matrix (1999).mkv");
|
||||
|
||||
using var server = new FlaroServer();
|
||||
var client = await Eingelesen(server, "Movies");
|
||||
var filme = await client.GetFromJsonAsync<Page<MovieResponse>>("/api/v1/movies");
|
||||
var film = filme!.Items[0].Id;
|
||||
|
||||
var vorher = new DateTimeOffset(2020, 1, 1, 0, 0, 0, TimeSpan.Zero);
|
||||
await server.InDerDatenbank(async db =>
|
||||
{
|
||||
var datei = await db.MediaFiles.FirstAsync(d => d.MovieId == film);
|
||||
datei.Duration = TimeSpan.FromMinutes(120);
|
||||
|
||||
db.Marken.Add(new Marke
|
||||
{
|
||||
MovieId = film, Art = Markenart.Abspann,
|
||||
VonSekunden = 6900, BisSekunden = 7200, ErkanntAm = vorher,
|
||||
});
|
||||
db.Markensuchen.Add(new Markensuche
|
||||
{
|
||||
MovieId = film, Art = Markenart.Abspann, Folgen = 1, GelaufenAm = vorher,
|
||||
});
|
||||
await db.SaveChangesAsync();
|
||||
});
|
||||
|
||||
(await client.PostAsync($"/api/v1/movies/{film}/marken?umfang=Luecken", null))
|
||||
.EnsureSuccessStatusCode();
|
||||
await Task.Delay(400);
|
||||
|
||||
var gelaufen = DateTimeOffset.MinValue;
|
||||
await server.InDerDatenbank(async db =>
|
||||
gelaufen = await db.Markensuchen.AsNoTracking()
|
||||
.Where(x => x.MovieId == film).Select(x => x.GelaufenAm).FirstAsync());
|
||||
|
||||
Assert.That(gelaufen, Is.EqualTo(vorher),
|
||||
"wo schon eine Marke steht, ist nichts zu füllen");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user