using Flaro.Core.Metadata; using Flaro.Metadata; namespace Flaro.Api; /// Was eine Quelle auf Nachfrage geantwortet hat. /// /// „tmdb", „fanart" oder „omdb". /// Ob überhaupt ein Zugang hinterlegt ist. /// Ob die Probe etwas Brauchbares ergeben hat. /// Ein Satz, der sagt, was herauskam. public sealed record Quellenbefund(string Source, bool Configured, bool Ok, string Detail); /// Fragt die Quellen einmal und sagt, was zurückkam. /// /// /// /// Der Anlass. Nach dem Eintragen eines Schlüssels stand in der /// Oberfläche „Hinterlegt" — und das war alles. Ob er stimmt, ob der Dienst /// antwortet und ob zu einem Film überhaupt etwas zu holen ist, liess sich /// nicht feststellen; man trug ein, frischte die Metadaten über /// achthundert Titel auf und sah danach nach, ob sich etwas geändert hatte. /// /// /// Mit einem bekannten Film, nicht mit einem aus der Mediathek. „The /// Matrix" hat bei allen drei Quellen Einträge; ein Film aus dem eigenen /// Bestand könnte schlicht unbekannt sein, und dann wüsste man wieder /// nicht, ob es am Schlüssel liegt oder am Film. /// /// public sealed class Quellenprobe( TmdbClient tmdb, FanartClient fanart, OmdbClient omdb, RottenTomatoesClient tomaten, ITmdbSettingsSource spracheVon) { /// „The Matrix" — bei allen Quellen vorhanden. private const int ProbeTmdbId = 603; private const string ProbeImdbId = "tt0133093"; private const string ProbeTitel = "The Matrix"; private const int ProbeJahr = 1999; public async Task> LaufenAsync(CancellationToken ct = default) => [ await TmdbProbe(ct), await FanartProbe(ct), await OmdbProbe(ct), await TomatenProbe(ct), ]; private async Task TmdbProbe(CancellationToken ct) { if (!await tmdb.IsConfiguredAsync(ct)) return new("tmdb", false, false, "Kein Zugang hinterlegt."); var film = await tmdb.FindMovieAsync("The Matrix", 1999, ct); return film is null ? new("tmdb", true, false, "Der Dienst hat nicht geantwortet oder den Zugang abgelehnt.") : new("tmdb", true, true, $"Erreichbar — Probeabruf ergab {film.Title} ({film.Year})."); } private async Task FanartProbe(CancellationToken ct) { if (!await fanart.EingerichtetAsync(ct)) return new("fanart", false, false, "Kein Schlüssel hinterlegt — die Quelle ist aus."); var bilder = await fanart.FilmbilderAsync(ProbeTmdbId, ct); var plakate = bilder.Where(b => b.Kind == "poster").ToList(); if (plakate.Count == 0) { return new("fanart", true, false, "Erreicht, aber nichts bekommen. Stimmt der Schlüssel?"); } // **Die Zahl in der eingestellten Sprache ist die eigentliche // Auskunft.** „42 Plakate" sagt nur, dass etwas kam; „davon 3 // deutsche" sagt, ob die Quelle den Zweck erfüllt, für den sie da ist. var sprache = (await spracheVon.GetAsync(ct)).Language.Split('-')[0]; var passend = plakate.Count(b => string.Equals(b.Language, sprache, StringComparison.OrdinalIgnoreCase)); return new("fanart", true, true, $"Erreichbar — {plakate.Count} Plakate zu The Matrix, davon {passend} in {sprache}."); } private async Task OmdbProbe(CancellationToken ct) { if (!await omdb.EingerichtetAsync(ct)) return new("omdb", false, false, "Kein Schlüssel hinterlegt — die Quelle ist aus."); var wertungen = await omdb.HolenAsync( new Wertungsfrage(ProbeImdbId, ProbeTitel, ProbeJahr), ct); if (wertungen.Count == 0) { return new("omdb", true, false, "Erreicht, aber nichts bekommen. Stimmt der Schlüssel, " + "oder ist das Tageskontingent aufgebraucht?"); } return new("omdb", true, true, $"Erreichbar — zu The Matrix: {Aufzaehlung(wertungen)}."); } /// Die Seite von Rotten Tomatoes, falls das Lesen erlaubt wurde. /// /// /// Hier ist die Probe mehr als eine Höflichkeit. Bei den anderen /// beantwortet sie die Frage, ob ein Schlüssel stimmt; hier beantwortet /// sie die Frage, ob das Auslesen überhaupt noch geht. Wird die Seite /// umgebaut oder der Zugriff gesperrt, merkt man es genau hier — und /// sonst nirgends. /// private async Task TomatenProbe(CancellationToken ct) { if (!await tomaten.EingerichtetAsync(ct)) return new("rottenTomatoes", false, false, "Ausgeschaltet."); var wertungen = await tomaten.HolenAsync( new Wertungsfrage(ProbeImdbId, ProbeTitel, ProbeJahr), ct); if (wertungen.Count == 0) { return new("rottenTomatoes", true, false, "Nichts bekommen. Entweder ist der Zugriff gesperrt, " + "oder die Seite ist umgebaut worden."); } return new("rottenTomatoes", true, true, $"Erreichbar — zu The Matrix: {Aufzaehlung(wertungen)}."); } private static string Aufzaehlung(IEnumerable wertungen) => string.Join(", ", wertungen.Select(w => $"{Kurz(w.Quelle)} {w.Anzeige}")); private static string Kurz(string quelle) => quelle switch { "imdb" => "IMDb", "rottenTomatoes" => "RT Kritik", "rottenTomatoesAudience" => "RT Publikum", "metacritic" => "MC", _ => quelle, }; }