namespace ytLive.Models; /// YPP eligibility thresholds as versioned, date-aware DATA — never /// constants (ai.md "Journey tracker"). Tier 1 (fan funding) is time-invariant; /// Tier 2 (ad revenue) doubles its long-form-hours and Shorts-view bars for NEW /// applicants after 2027-02-01. Hardcoding the pre-2027 numbers would show the /// wrong ETA once the doubling lands, so callers resolve the active Tier 2 /// threshold through . public static class YppThresholds { public sealed record TierThreshold(string Name, long Subscribers, long WatchHours, long ShortsViews); /// The date the Tier-2 ad-revenue bars double for new applicants. public static readonly DateTime Tier2DoublingDate = new(2027, 2, 1); /// Fan-funding tier (before the full ad/YouTube Premium revenue tier). public static TierThreshold Tier1 { get; } = new("Fan funding", 500, 3_000, 3_000_000); /// The Tier-2 bar for a given point in time — 4,000h / 10M Shorts /// before the doubling date, 8,000h / 20M Shorts on or after it. public static TierThreshold Tier2For(DateTime when) => when >= Tier2DoublingDate ? new TierThreshold("Ad revenue", 1_000, 8_000, 20_000_000) : new TierThreshold("Ad revenue", 1_000, 4_000, 10_000_000); /// The currently-active Tier-2 threshold (resolved against today). public static TierThreshold Tier2Now => Tier2For(DateTime.UtcNow); /// Valid public long-form uploads required in the trailing 90 days /// to keep each tier route eligible. public const int UploadsRequiredPer90Days = 3; }