0fac1e6a5a
- Reusable stream: GetOrCreateReusableStreamAsync, cached via LayoutStore, bound at broadcast insert - Health monitoring: GetStreamHealthAsync polls liveStreams.status, report-by-exception banner - Go-live order: ensure stream → create broadcast → then start pump (URL must exist first) - Full broadcast form scoped (TASK 5 items 6-7) in TASKS.md + ai.md - TASK 23 trimmed to technical scope, TASK 26 added (marcom/launch kit) - Confidential files: MONETIZATION.md + MARCOM.md (gitignored, not committed) - .gitignore updated for confidential business files - HANDOFF.md updated with session state and next steps
35 lines
1.3 KiB
C#
35 lines
1.3 KiB
C#
namespace ytLive.Models;
|
|
|
|
public class YouTubeChannel
|
|
{
|
|
public string ChannelId { get; set; } = string.Empty;
|
|
public string DisplayName { get; set; } = string.Empty;
|
|
public string ProfileImageUrl { get; set; } = string.Empty;
|
|
public string AccessToken { get; set; } = string.Empty;
|
|
public string RefreshToken { get; set; } = string.Empty;
|
|
public DateTime TokenExpiry { get; set; }
|
|
}
|
|
|
|
/// <summary>The channel's reusable live stream (TASK 5): created once, cached,
|
|
/// rebound to every broadcast. The RTMP URL the encoder pushes to is the
|
|
/// ingestion address + "/" + stream name.</summary>
|
|
public record ReusableStream(string Id, string IngestionAddress, string StreamName)
|
|
{
|
|
public string RtmpUrl => $"{IngestionAddress}/{StreamName}";
|
|
}
|
|
|
|
public class ChatMessage
|
|
{
|
|
public string Id { get; init; } = Guid.NewGuid().ToString();
|
|
public string AuthorName { get; set; } = string.Empty;
|
|
public string AuthorChannelId { get; set; } = string.Empty;
|
|
public string AuthorImageUrl { get; set; } = string.Empty;
|
|
public string Message { get; set; } = string.Empty;
|
|
public DateTime Timestamp { get; set; }
|
|
public bool IsSuperChat { get; set; }
|
|
public double SuperChatAmount { get; set; }
|
|
public string? SuperChatCurrency { get; set; }
|
|
public bool IsMember { get; set; }
|
|
public string? MembershipLevel { get; set; }
|
|
}
|