using Flaro.Core.Delivery; using Flaro.Core.Playback; using Flaro.Data; using Microsoft.EntityFrameworkCore; namespace Flaro.Api; /// Holt die Wiedergabe-Einstellungen aus der Datenbank. /// /// /// Dasselbe Muster wie : je Anfrage /// einmal gelesen und dann gemerkt. Eine Fortschrittsmeldung kommt alle zehn /// Sekunden und von jedem Gerät; dreimal dieselbe Zeile je Meldung zu lesen /// wäre Arbeit für nichts. /// /// Serverweit, nicht je Nutzer. Der Transcoder gehört der Maschine — /// es gibt eine CPU und eine Entscheidung. Die beiden Schwellen könnten je /// Nutzer gelten; sie tun es nicht, weil zwei Wahrheiten darüber, was /// „angefangen" heisst, mehr kosten als sie einbringen. /// public sealed class Wiedergabeeinstellungen(FlaroContext db) { public const string FortsetzenAbName = "wiedergabe.fortsetzen.abSekunden"; public const string GesehenAnteilName = "wiedergabe.gesehen.anteil"; public const string TranscoderName = "wiedergabe.transcoder.stufe"; private Wiedergaberegeln? _regeln; private Kodierstufe? _stufe; /// Wann ein Titel angefangen ist und wann er gesehen ist. public async Task RegelnAsync(CancellationToken ct = default) { if (_regeln is { } fertig) return fertig; await LesenAsync(ct); return _regeln!.Value; } /// Wie der Transcoder zwischen Bild und Tempo abwägt. public async Task StufeAsync(CancellationToken ct = default) { if (_stufe is { } fertig) return fertig; await LesenAsync(ct); return _stufe!.Value; } private async Task LesenAsync(CancellationToken ct) { var zeilen = await db.Settings .AsNoTracking() .Where(s => s.Key == FortsetzenAbName || s.Key == GesehenAnteilName || s.Key == TranscoderName) .ToDictionaryAsync(s => s.Key, s => s.Value, ct); _regeln = Lesen(zeilen.GetValueOrDefault(FortsetzenAbName), zeilen.GetValueOrDefault(GesehenAnteilName)); _stufe = Kodierstufen.Lesen(zeilen.GetValueOrDefault(TranscoderName)); } /// Macht aus zwei gespeicherten Zeichenketten geprüfte Regeln. /// /// /// Ohne Ortsangabe gerechnet — mit : in der /// Datenbank steht ein Punkt, und auf einem Server mit deutscher /// Spracheinstellung läse ein Komma-Parser aus „0.9" eine Neun. /// public static Wiedergaberegeln Lesen(string? abSekunden, string? anteil) { var regeln = Wiedergaberegeln.Vorgabe; if (double.TryParse(abSekunden, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var sekunden)) regeln = regeln with { FortsetzenAb = TimeSpan.FromSeconds(sekunden) }; if (double.TryParse(anteil, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var wert)) regeln = regeln with { GesehenAnteil = wert }; return regeln.Geprueft(); } }