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();
}
}