using MediaBrowser.Model.Plugins; namespace Jellyfin.Plugin.Vanguard.Configuration; /// Plugin settings (edited on the plugin's config page). public class PluginConfiguration : BasePluginConfiguration { // --- Discord ------------------------------------------------------------------------- public string DiscordBotToken { get; set; } = string.Empty; public string DiscordGuildId { get; set; } = string.Empty; // --- Discord feed (new stream / new clip notices) --------------------------------------- /// Channel to post notices in (same guild). Empty = feed off. public string NotifyChannelId { get; set; } = string.Empty; public bool NotifyNewStreams { get; set; } = true; public bool NotifyNewClips { get; set; } = true; /// Public Jellyfin URL used in links, e.g. https://watch.example.com public string PublicUrl { get; set; } = string.Empty; /// Library names that count as streams / clips (case-insensitive substring match on the library name or path). public string StreamsLibraryHint { get; set; } = "stream"; public string ClipsLibraryHint { get; set; } = "clip"; // --- Playback policy (no hardware encoder on this box) -------------------------------------- /// Set direct-play-only on all users automatically (new SSO users included). Turn off when the server can transcode. public bool EnforceDirectPlayOnly { get; set; } = true; public bool EnforceOnAdminsToo { get; set; } = false; // --- Authentik (streamer username -> Discord user id via the OAuth source connection) -- public string AuthentikUrl { get; set; } = "https://auth.example.com"; public string AuthentikApiToken { get; set; } = string.Empty; // --- Time / seasons --------------------------------------------------------------------- public string TimeZoneId { get; set; } = "America/New_York"; /// Hour (0-23) at which the "broadcast day" rolls over. 4 = a 01:00 clip belongs to the previous evening. public int BroadcastDayRolloverHour { get; set; } = 4; /// Season name overrides: "202611=Winter Scrims Block", one per line. public string SeasonNameOverrides { get; set; } = string.Empty; /// Prefer the overlapping Discord scheduled event's name as the episode title; fallback is the dock title (folder name). public bool EpisodeTitleFromEvent { get; set; } = true; /// /// Folder name -> identity, one per line: "techy=123456789012345678" (Discord user id) or /// "techy=authentik:someuser" (Authentik username). Folders not listed are looked up in Authentik /// by username = folder name. /// public string FolderIdentityMap { get; set; } = string.Empty; /// Hours of slack when matching a recording to a Discord scheduled event (before start / after end). public double EventMatchSlackHours { get; set; } = 1.0; }