namespace ytLive.Models;
public enum StreamStatus
{
Offline,
Connecting,
Streaming,
Error
}
public class StreamConfig
{
public string Title { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string StreamKey { get; set; } = string.Empty;
public string IngestUrl { get; set; } = "rtmp://a.rtmp.youtube.com/live2";
public bool IsLowLatency { get; set; } = true;
public int TargetBitrate { get; set; } = 6000;
public int TargetFps { get; set; } = 60;
public string Resolution { get; set; } = "1920x1080";
}
public class StreamHealth
{
public StreamStatus Status { get; set; }
public double CurrentBitrate { get; set; }
public int DroppedFrames { get; set; }
public double FPS { get; set; }
public TimeSpan StreamDuration { get; set; }
public string? LastError { get; set; }
/// The encoder the probe actually chose ("h264_nvenc", "libopenh264", …). Filled once the
/// encoder starts, and the key the rate history is filed under — evidence about NVENC says nothing
/// about QSV on another machine.
public string? VideoEncoder { get; set; }
// YouTube-specific (liveStreams.status)
public string? HealthStatus { get; set; } // "good", "ok", "bad", "noData"
public string? HealthMessage { get; set; }
// Report-by-exception (TASK 5 item 3): configurationIssues[] — the banner
// surfaces only warning/error entries.
public List ConfigurationIssues { get; } = new();
}
public enum StreamIssueSeverity
{
Info,
Warning,
Error
}
public class StreamConfigurationIssue
{
public StreamIssueSeverity Severity { get; set; }
public string? Type { get; set; }
}