Dieselbe Kennung zweimal zu vergeben war kein Fehler, sah aber so aus

Im Zuordnungsdialog stand „An error occurred while processing your
request." — englisch, ohne Grund, ohne nächsten Schritt. Dahinter steckte
der Eindeutigkeitsindex: der gewählte Film war in derselben Mediathek
schon vergeben, und die Kennung wurde trotzdem blind gesetzt.

Es ist aber gar kein Fehler. Zwei Dateien, die denselben Film meinen,
gehören zusammengelegt — genau das tut der Scan am Ende jedes Laufs, und
der Sehfortschritt wird dabei gefaltet. Die Korrektur von Hand tut es
jetzt auch, für Filme wie für Serien.

Dazu die zweite Hälfte: auch das Letzte, was durchrutscht, spricht
Deutsch. Der Fehlerbehandler am Ende der Kette gab bisher die Vorgabe von
ASP.NET aus. Jetzt bekommt jede Ausnahme einen deutschen Satz, und die
Einzelheiten gehen ins Tagesprotokoll — dorthin, wo man sie sucht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-04 21:53:20 +02:00
co-authored by Claude Opus 5
parent 0c07d4efc7
commit 5a5cf3d006
3 changed files with 120 additions and 3 deletions
@@ -354,6 +354,53 @@ public class MetadataTests
"Gesucht wird mit 2016 aus dem Dateinamen, nicht mit 2022 aus dem Treffer.");
}
/// <summary>Zwei Dateien auf denselben Film zu legen ist kein Fehler.</summary>
///
/// <remarks>
/// <b>Aus dem echten Bestand.</b> Im Zuordnungsdialog stand plötzlich „An
/// error occurred while processing your request." — englisch, ohne Grund.
/// Der gewählte Film war in derselben Mediathek schon vergeben, der
/// Eindeutigkeitsindex schlug zu, und die Ausnahme ging ungefiltert nach
/// oben.
///
/// Es ist aber gar kein Fehler: zwei Dateien, die denselben Film meinen,
/// gehören zusammengelegt — genau das tut der Scan am Ende jedes Laufs.
/// </remarks>
[Test]
public async Task Zwei_Dateien_auf_denselben_Film_werden_zusammengelegt()
{
Datei("Breaking Dawn Teil 1 (2011).mkv");
Datei("Breaking Dawn (2011).mkv");
// Beim Scan findet keiner etwas — so bleiben es zwei Einträge.
var anbieter = new VorgegebenerAnbieter { Film = null };
using var server = MitAnbieter(anbieter);
var (client, bibliothek) = await Einrichten(server, "Movies");
await Scannen(client, bibliothek);
var filme = await client.GetFromJsonAsync<Page<MovieResponse>>("/api/v1/movies");
Assert.That(filme!.Total, Is.EqualTo(2), "Zwei Dateien, zwei Einträge ohne Zuordnung.");
anbieter.Film = new MovieMetadata(50619, "Breaking Dawn – Teil 1", 2011, null, null, null)
{
Language = "de-DE",
};
var erste = await client.PutAsJsonAsync(
$"/api/v1/movies/{filme.Items[0].Id}/match", new ApplyMatchRequest(50619));
Assert.That(erste.StatusCode, Is.EqualTo(HttpStatusCode.OK));
var zweite = await client.PutAsJsonAsync(
$"/api/v1/movies/{filme.Items[1].Id}/match", new ApplyMatchRequest(50619));
Assert.That(zweite.StatusCode, Is.EqualTo(HttpStatusCode.OK),
"Die zweite Zuordnung darf nicht scheitern.");
var danach = await client.GetFromJsonAsync<Page<MovieResponse>>("/api/v1/movies");
Assert.That(danach!.Total, Is.EqualTo(1), "Ein Film.");
Assert.That(danach.Items[0].Files, Has.Count.EqualTo(2), "Mit beiden Dateien.");
}
[Test]
public async Task Ein_Film_ohne_Treffer_behaelt_seinen_Dateinamen()
{