Replaces the v1 shape rather than accepting both. `anneal_sec` and the top-level `sample_fps` are deleted, not zeroed; `extraction` and `cut` blocks arrive; `scenes` become objects carrying belief and route, so a window records how far to trust it instead of being a bare float pair. `TruthSchema.IsSupported` is the single gate and is applied on all four read paths — sidecar, managed store load, managed PUT, and converted manifest. Previously only the controller checked, so the version the plugin claimed to require and the one it would actually parse were free to drift. Rejections name the file and the version found, so an item that looks empty is distinguishable from one that was refused. `ManifestConverter` carries belief, route and both provenance blocks through: dropping them would silently downgrade every fetched manifest against a locally extracted one. TRACES: JR-002, JR-003 | SR-003
54 lines
2.1 KiB
C#
54 lines
2.1 KiB
C#
using System.Text.Json.Serialization;
|
|
|
|
namespace Jellyfin.Plugin.JRay.Models;
|
|
|
|
/// <summary>
|
|
/// Extraction provenance for a <see cref="TruthFile"/> (SPEC.md §1, JR-002).
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// These fields moved here from the top level in the SR-003 bump so that the
|
|
/// truth file and the Jmanifest's <c>extraction</c> block have the same shape.
|
|
/// They differed for no reason, and two nearly-identical shapes are what makes a
|
|
/// converter quietly drop a field.
|
|
/// <para>
|
|
/// <b>There is no <c>anneal_sec</c>.</b> It was withdrawn rather than retained
|
|
/// as a vestigial zero: presence now follows track extent, so a track survives
|
|
/// its own gaps and there is nothing to anneal (extraction AR-012/AR-013). A
|
|
/// field naming a mechanism the pipeline no longer has is actively misleading,
|
|
/// and would outlive everyone who remembers why it reads zero.
|
|
/// </para>
|
|
/// </remarks>
|
|
// TRACES: JR-002 | SR-003
|
|
public class TruthExtraction
|
|
{
|
|
/// <summary>Gets or sets the sampling rate used during extraction.</summary>
|
|
[JsonPropertyName("sample_fps")]
|
|
public double? SampleFps { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the re-acquisition timeout that shapes window extent, in
|
|
/// seconds. Successor to the withdrawn <c>anneal_sec</c>.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// This is what a consumer needs in order to interpret a window: it bounds
|
|
/// how long an actor could be unseen without the window being closed.
|
|
/// </remarks>
|
|
[JsonPropertyName("extinction_sec")]
|
|
public double? ExtinctionSec { get; set; }
|
|
|
|
/// <summary>Gets or sets the producing pipeline's version string.</summary>
|
|
[JsonPropertyName("pipeline_version")]
|
|
public string? PipelineVersion { get; set; }
|
|
|
|
/// <summary>Gets or sets how many references the gallery held.</summary>
|
|
[JsonPropertyName("gallery_size")]
|
|
public int? GallerySize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets <c>global</c> or <c>limited</c> — the strongest single
|
|
/// quality signal when two manifests compete for one cut.
|
|
/// </summary>
|
|
[JsonPropertyName("gallery_scope")]
|
|
public string? GalleryScope { get; set; }
|
|
}
|