Jeder Titel war seine eigene Dublette, und das seit Monaten

„Metadaten auffrischen" hat an allem, was schon zugeordnet war, schlicht
nichts getan. Die Dublettenprüfung schlägt jeden Titel nach, der eine
TMDB-Kennung hat — beim Auffrischen also auch den gerade bearbeiteten.
Ohne Vergleich auf Gleichheit fand sich jeder als "Dublette seiner
selbst", wurde übersprungen und nie fortgeschrieben. Titel, Beschreibung
und Bilder blieben für immer so, wie sie beim allerersten Lauf
hereinkamen.

In der Oberfläche sah das aus, als wirke die Spracheinstellung nicht —
und genau so wurde es gemeldet. Gemessen, Ende zu Ende:

  Serversprache en-US:  101 Dalmatians  ·  The Lion King
  Serversprache de-DE:  101 Dalmatiner  ·  Der König der Löwen

Damit das nie wieder unbemerkt bleibt, weiss der Server jetzt, in welcher
Sprache er die Titel hat: eine Spalte MetadataLanguage, gesetzt beim
Anreichern, und in der Verwaltung eine Zeile mit der Verteilung. Weicht
etwas ab, frischt ein Knopf genau diese Titel auf — nicht den ganzen
Bestand, und ohne das Dateisystem noch einmal abzulaufen.

Dazu zwei Dinge, die ohne das nicht gingen: ein Titel lässt sich von Hand
setzen und wird dabei festgeschrieben wie ein Plakat, mit einem Weg
zurück. Und ein Titel, der auf Freigabe wartet, trägt jetzt dasselbe
Dreipunktemenü wie eine Kachel — Bilder, Zuordnung, Titel. Ausgerechnet
dort fehlte es, obwohl das der Eintrag ist, den man vor der Freigabe
geradeziehen will.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-04 20:49:06 +02:00
co-authored by Claude Opus 5
parent ce38da1376
commit d2fbaad871
19 changed files with 1582 additions and 28 deletions
@@ -142,6 +142,32 @@ public sealed class Movie : Flaro.Core.Metadata.IBebildert
public bool BackdropPinned { get; set; }
public bool LogoPinned { get; set; }
/// <summary>Der Titel, wie ihn jemand von Hand gesetzt hat.</summary>
///
/// <remarks>
/// Aus demselben Grund wie <see cref="PosterPinned"/>: ohne diesen Merker
/// überschreibt das nächste Auffrischen die Korrektur, und man tippt sie
/// nach jedem Lauf neu.
/// </remarks>
public bool TitlePinned { get; set; }
/// <summary>In welcher Sprache die Angaben geholt wurden.</summary>
///
/// <remarks>
/// <para>
/// <b>Weil der Server es sonst selbst nicht weiss.</b> „Alles ist noch auf
/// Englisch, obwohl der Server auf Deutsch steht" liess sich nicht
/// beantworten, sondern nur bestreiten: nirgends stand, in welcher Sprache
/// ein Titel eigentlich vorliegt. Mit dieser Spalte wird aus der Frage
/// eine Zahl — und aus „frisch mal auf" ein Knopf, der genau die
/// abweichenden anfasst statt aller viertausend.
/// </para>
/// <para>
/// <c>null</c> heisst: vor dieser Änderung geholt, Sprache unbekannt.
/// </para>
/// </remarks>
public string? MetadataLanguage { get; set; }
/// <summary>Der Titel in der Sprache des Originals.</summary>
///
/// <remarks>
@@ -279,6 +305,32 @@ public sealed class Series : Flaro.Core.Metadata.IBebildert
public bool BackdropPinned { get; set; }
public bool LogoPinned { get; set; }
/// <summary>Der Titel, wie ihn jemand von Hand gesetzt hat.</summary>
///
/// <remarks>
/// Aus demselben Grund wie <see cref="PosterPinned"/>: ohne diesen Merker
/// überschreibt das nächste Auffrischen die Korrektur, und man tippt sie
/// nach jedem Lauf neu.
/// </remarks>
public bool TitlePinned { get; set; }
/// <summary>In welcher Sprache die Angaben geholt wurden.</summary>
///
/// <remarks>
/// <para>
/// <b>Weil der Server es sonst selbst nicht weiss.</b> „Alles ist noch auf
/// Englisch, obwohl der Server auf Deutsch steht" liess sich nicht
/// beantworten, sondern nur bestreiten: nirgends stand, in welcher Sprache
/// ein Titel eigentlich vorliegt. Mit dieser Spalte wird aus der Frage
/// eine Zahl — und aus „frisch mal auf" ein Knopf, der genau die
/// abweichenden anfasst statt aller viertausend.
/// </para>
/// <para>
/// <c>null</c> heisst: vor dieser Änderung geholt, Sprache unbekannt.
/// </para>
/// </remarks>
public string? MetadataLanguage { get; set; }
/// <summary>Der Titel in der Sprache des Originals.</summary>
///
/// <remarks>
@@ -362,6 +414,9 @@ public sealed class Episode
/// <summary>Das Standbild der Folge.</summary>
public string? StillImage { get; set; }
/// <summary>In welcher Sprache die Angaben geholt wurden — siehe <see cref="Movie.MetadataLanguage"/>.</summary>
public string? MetadataLanguage { get; set; }
/// <summary>Ab wann diese Folge für alle sichtbar ist — siehe <see cref="Movie.PublishAt"/>.</summary>
///
/// <remarks>
@@ -56,7 +56,18 @@ public sealed record MovieMetadata(
RemoteImage? Logo = null,
/// <summary>Der Titel in der Sprache des Originals.</summary>
string? OriginalTitle = null);
string? OriginalTitle = null,
/// <summary>In welcher Sprache diese Angaben geholt wurden.</summary>
///
/// <remarks>
/// <b>Damit der Server es hinterher noch weiss.</b> Die Sprache steht in
/// den Einstellungen und ändert sich; was einmal geholt wurde, trägt sie
/// danach nirgends. „Alles ist noch auf Englisch, obwohl Deutsch
/// eingestellt ist" liess sich deshalb nicht beantworten, sondern nur
/// bestreiten. Die Quelle weiss es — also gibt sie es mit.
/// </remarks>
string? Language = null);
public sealed record SeriesMetadata(
int ProviderId, string Title, int? Year, string? Overview,
@@ -80,9 +91,21 @@ public sealed record SeriesMetadata(
RemoteImage? Logo = null,
/// <summary>Der Titel in der Sprache des Originals.</summary>
string? OriginalTitle = null);
string? OriginalTitle = null,
public sealed record EpisodeMetadata(string? Title, string? Overview, RemoteImage? Still);
/// <summary>In welcher Sprache diese Angaben geholt wurden.</summary>
///
/// <remarks>
/// <b>Damit der Server es hinterher noch weiss.</b> Die Sprache steht in
/// den Einstellungen und ändert sich; was einmal geholt wurde, trägt sie
/// danach nirgends. „Alles ist noch auf Englisch, obwohl Deutsch
/// eingestellt ist" liess sich deshalb nicht beantworten, sondern nur
/// bestreiten. Die Quelle weiss es — also gibt sie es mit.
/// </remarks>
string? Language = null);
public sealed record EpisodeMetadata(
string? Title, string? Overview, RemoteImage? Still, string? Language = null);
/// <summary>Woher Titel, Beschreibungen und Bilder kommen.</summary>
///