Drei Zahlen standen als Konstante im Quelltext und bestimmten, wie sich der Server anfühlt. Jetzt stehen sie in der Verwaltung, unter „Wiedergabe". **Weiterschauen ab.** Gemessen: `BelongsInContinueWatching` verlangte nur `Position.Ticks > 0` — ein Tick genügte. Wer im Aufmacher eine Sekunde hineinschaute, fand den Titel danach in „Fortsetzen". Jetzt gibt es eine Untergrenze, voreingestellt auf 1½ Minuten. Was sich dabei **nicht** ändert: die Stelle wird weiter gemerkt. Das ist der Unterschied zu Jellyfin, um dessentwillen es diesen Server gibt — die Schwelle entscheidet, ob der Titel in der Reihe steht, nicht ob man ihn wiederfindet. Nachgemessen: nach dem Umstellen ist „Heat" aus der Reihe verschwunden und steht weiterhin bei Sekunde 1. **Gesehen ab.** War 90 % als `const`, ist jetzt 85/90/95. **Umkodieren.** `-preset veryfast -crf 21` und VAAPI `-qp 23` waren fest verdrahtet, ohne Einstellung und ohne Umgebungsvariable. Drei Stufen: Qualität (medium/19, qp 21), Ausgewogen (wie bisher), Tempo (ultrafast/23, qp 26). Mit dem Warnsatz daneben, und der ist ernst gemeint: was in Echtzeit laufen muss, darf nicht langsamer rechnen als es abspielt. **Und das Vorhandene wird neu bewertet.** `InProgress` ist eine gespeicherte Spalte — die Bruchrechnung lässt sich nicht nach SQL übersetzen. Eine neue Schwelle wirkte sonst nur auf künftige Meldungen. Der Endpunkt läuft deshalb einmal in Stapeln durch und meldet zurück, wie viele Zeilen das umgeworfen hat: „Übernommen — 2 Einträge wurden neu bewertet." Ohne diesen Satz änderte sich die Startseite scheinbar von selbst. `ProgressRule` bleibt ein reiner Typ: die Regeln kommen als Wert herein. Nebenbei zieht der doppelte `zeile()`-Bauer nach `teile.ts` — er stand zweimal wortgleich da. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
48 lines
2.1 KiB
C#
48 lines
2.1 KiB
C#
namespace Flaro.Core.Playback;
|
|
|
|
/// <summary>Wann ein Titel angefangen ist und wann er als gesehen gilt.</summary>
|
|
///
|
|
/// <remarks>
|
|
/// <para>
|
|
/// <b>Zwei Zahlen, die niemand raten kann.</b> Wie lange man hineinschauen
|
|
/// muss, damit es zählt, und ab welchem Anteil ein Film durch ist — das hängt
|
|
/// davon ab, wie jemand schaut, nicht davon, was technisch richtig wäre. Beide
|
|
/// standen als Konstante im Quelltext; jetzt stehen sie in den Einstellungen.
|
|
/// </para>
|
|
/// <para>
|
|
/// <b>Als Wert, nicht als Abfrage.</b> <see cref="ProgressRule"/> bleibt damit
|
|
/// ein reiner Typ: er rechnet, er liest nichts. Prüfbar ohne Datenbank, und
|
|
/// derselbe Satz Regeln gilt für eine Meldung und für die Neubewertung aller
|
|
/// vorhandenen Zeilen.
|
|
/// </para>
|
|
/// </remarks>
|
|
///
|
|
/// <param name="FortsetzenAb">
|
|
/// Wie weit man gekommen sein muss, damit ein Titel in „Weiterschauen" steht.
|
|
/// <see cref="TimeSpan.Zero"/> heisst: jede angefangene Sekunde zählt.
|
|
/// </param>
|
|
/// <param name="GesehenAnteil">Ab welchem Anteil der Laufzeit ein Titel gesehen ist.</param>
|
|
public readonly record struct Wiedergaberegeln(TimeSpan FortsetzenAb, double GesehenAnteil)
|
|
{
|
|
/// <summary>Was gilt, solange niemand etwas anderes eingestellt hat.</summary>
|
|
///
|
|
/// <remarks>
|
|
/// <b>Neunzig Sekunden, nicht null.</b> Ohne Untergrenze genügte ein
|
|
/// einziger Tick: wer im Aufmacher eine Sekunde hineinschaute, fand den
|
|
/// Titel danach in „Weiterschauen" wieder. Eineinhalb Minuten sind lang
|
|
/// genug, dass niemand aus Versehen hineinfällt, und kurz genug, dass eine
|
|
/// abgebrochene Folge noch zählt.
|
|
/// </remarks>
|
|
public static readonly Wiedergaberegeln Vorgabe = new(TimeSpan.FromSeconds(90), 0.90);
|
|
|
|
/// <summary>Dieselben Regeln mit geprüften Werten.</summary>
|
|
///
|
|
/// <remarks>
|
|
/// Was aus der Datenbank kommt, hat dort irgendwann jemand hineingeschrieben.
|
|
/// Ein Anteil von 0 hiesse „alles ist gesehen", einer von 2 „nichts".
|
|
/// </remarks>
|
|
public Wiedergaberegeln Geprueft() => new(
|
|
FortsetzenAb < TimeSpan.Zero ? TimeSpan.Zero : FortsetzenAb,
|
|
Math.Clamp(GesehenAnteil, 0.5, 1.0));
|
|
}
|