IMDb, Rotten Tomatoes und Metacritic neben der TMDB-Wertung
IMDbs eigene Schnittstelle kostet Geld, Rotten Tomatoes vergibt Zugänge nur an Partner, Letterboxd hat gar keine offene. OMDb liefert alle drei in einer Antwort, über die IMDb-Kennung, die ohnehin schon an jedem Film steht. **Eine Tabelle und kein Feld je Quelle.** `Movie.Rating` ist ein Skalar ohne Quellenangabe, und das war richtig, solange es eine Quelle gab. Für drei weitere wären es drei Spalten — und bei der vierten wieder eine Migration. Jetzt ist jede Quelle eine Zeile, je Titel und Quelle eine, mit eindeutigem Index darauf: ein zweiter Lauf schreibt um statt anzuhäufen. **Zwei Werte je Bewertung, und beide gebraucht.** Der normierte Wert zum Vergleichen und Sortieren, die Anzeige zum Hinschreiben. Rotten Tomatoes in „8,7 von 10" umzurechnen wäre eine Lüge über die Quelle — dort steht 87 %, und genau so kennt man es. **Wieder keine zweite Metadatenquelle.** `IBewertungsquelle` liefert Bewertungen, sonst nichts. Bei Titel und Beschreibung wären zwei Anbieter zwei Wahrheiten; bei einer Bewertung ist jede Quelle eine eigene Zahl, und da sind mehrere kein Widerspruch, sondern der Sinn der Sache. **Ohne Kennung wird nicht gefragt.** OMDb kennt nur den Weg über die IMDb-Kennung; nach einem Titel zu suchen hiesse, denselben Zuordnungsfehler ein zweites Mal zu riskieren. Und auf Unbekanntes antwortet OMDb mit 200 und `Response: "False"` — das als Treffer durchzulassen legte eine leere Bewertung ab, die danach als „keine Wertung" dastünde. Angezeigt wird mit Kürzel statt Stern: vier gleich aussehende Zahlen nebeneinander sagen nicht, woher sie kommen. Kein Logo — die Marken von IMDb und Rotten Tomatoes mitzuliefern hiesse, fremde Zeichen auszuliefern. Kein mitgelieferter Schlüssel, aus demselben Grund wie bei fanart.tv: OMDb begrenzt auf tausend Abrufe am Tag je Schlüssel. Einzutragen unter Einstellungen → Übersicht → Metadaten. 740 Tests grün, davon acht neue. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
97edb49564
commit
af2b844d65
@@ -64,3 +64,36 @@ public sealed class Credit
|
||||
/// </remarks>
|
||||
public int Order { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>Eine Bewertung von anderswo — IMDb, Rotten Tomatoes, Metacritic.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// <b>Eine Tabelle und kein Feld je Quelle.</b> <c>Movie.Rating</c> ist ein
|
||||
/// Skalar ohne Quellenangabe, und das war richtig, solange es eine Quelle
|
||||
/// gab. Für drei weitere wären es drei Spalten — und bei der vierten wieder
|
||||
/// eine Migration. So ist jede Quelle eine Zeile.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <b>Zwei Werte, und beide gebraucht.</b> <see cref="Wert"/> ist auf 0 bis
|
||||
/// 10 gebracht, damit sich Quellen vergleichen und sortieren lassen;
|
||||
/// <see cref="Anzeige"/> ist, was dastehen soll. Rotten Tomatoes in „8,7 von
|
||||
/// 10" umzurechnen wäre eine Lüge über die Quelle — dort steht 87 %, und
|
||||
/// genau das kennt man von dort.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
public sealed class Fremdbewertung
|
||||
{
|
||||
public Guid Id { get; init; } = Guid.CreateVersion7();
|
||||
public Guid? MovieId { get; init; }
|
||||
public Guid? SeriesId { get; init; }
|
||||
|
||||
/// <summary>„imdb", „rottenTomatoes" oder „metacritic".</summary>
|
||||
public required string Quelle { get; set; }
|
||||
|
||||
/// <summary>Auf 0 bis 10 gebracht — zum Vergleichen, nicht zum Anzeigen.</summary>
|
||||
public double Wert { get; set; }
|
||||
|
||||
/// <summary>Was dastehen soll: „7,4", „87 %", „62".</summary>
|
||||
public required string Anzeige { get; set; }
|
||||
}
|
||||
|
||||
@@ -280,6 +280,30 @@ public interface IBildquelle
|
||||
Task<IReadOnlyList<Bildkandidat>> FilmbilderAsync(int tmdbId, CancellationToken ct = default);
|
||||
}
|
||||
|
||||
/// <summary>Eine Bewertung von anderswo.</summary>
|
||||
///
|
||||
/// <param name="Quelle">„imdb", „rottenTomatoes", „metacritic".</param>
|
||||
/// <param name="Wert">Auf 0 bis 10 gebracht — zum Vergleichen.</param>
|
||||
/// <param name="Anzeige">Was dastehen soll: „7,4", „87 %", „62".</param>
|
||||
public sealed record Fremdwertung(string Quelle, double Wert, string Anzeige);
|
||||
|
||||
/// <summary>Eine Quelle, die nur Bewertungen liefert.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <b>Wieder nicht <see cref="IMetadataProvider"/>.</b> Aus demselben Grund
|
||||
/// wie bei <see cref="IBildquelle"/>: dessen Methoden liefern ganze
|
||||
/// Titelangaben, und zwei Anbieter für Titel und Beschreibung wären zwei
|
||||
/// Wahrheiten. Eine Bewertung dagegen ist je Quelle eine eigene Zahl — da
|
||||
/// sind mehrere Quellen kein Widerspruch, sondern der Sinn der Sache.
|
||||
/// </remarks>
|
||||
public interface IBewertungsquelle
|
||||
{
|
||||
Task<bool> EingerichtetAsync(CancellationToken ct = default);
|
||||
|
||||
/// <summary>Alle Bewertungen zu einer IMDb-Kennung.</summary>
|
||||
Task<IReadOnlyList<Fremdwertung>> HolenAsync(string imdbId, CancellationToken ct = default);
|
||||
}
|
||||
|
||||
/// <summary>Wie Bilder nach Sprache geordnet werden.</summary>
|
||||
///
|
||||
/// <remarks>
|
||||
|
||||
Reference in New Issue
Block a user