import Defaults import Foundation extension Defaults.Keys { static let kavinPipedInstanceID = "kavin-piped" static let instances = Key<[Instance]>("instances", default: [ .init( app: .piped, id: kavinPipedInstanceID, name: "Kavin", apiURL: "https://pipedapi.kavin.rocks", frontendURL: "https://piped.kavin.rocks" ) ]) static let accounts = Key<[Account]>("accounts", default: []) static let lastAccountID = Key("lastAccountID") static let lastInstanceID = Key("lastInstanceID") static let lastUsedPlaylistID = Key("lastPlaylistID") static let sponsorBlockInstance = Key("sponsorBlockInstance", default: "https://sponsor.ajay.app") static let sponsorBlockCategories = Key>("sponsorBlockCategories", default: Set(SponsorBlockAPI.categories)) static let favorites = Key<[FavoriteItem]>("favorites", default: [ .init(section: .trending("US", "default")), .init(section: .channel("UC-lHJZR3Gqxm24_Vd_AJ5Yw", "PewDiePie")), .init(section: .searchQuery("Apple Pie Recipes", "", "", "")) ]) static let channelOnThumbnail = Key("channelOnThumbnail", default: true) static let timeOnThumbnail = Key("timeOnThumbnail", default: true) static let quality = Key("quality", default: .best) static let playerSidebar = Key("playerSidebar", default: PlayerSidebarSetting.defaultValue) static let playerInstanceID = Key("playerInstance") static let showKeywords = Key("showKeywords", default: false) static let commentsInstanceID = Key("commentsInstance", default: kavinPipedInstanceID) static let recentlyOpened = Key<[RecentItem]>("recentlyOpened", default: []) static let queue = Key<[PlayerQueueItem]>("queue", default: []) static let history = Key<[PlayerQueueItem]>("history", default: []) static let lastPlayed = Key("lastPlayed") static let saveHistory = Key("saveHistory", default: true) static let saveRecents = Key("saveRecents", default: true) static let trendingCategory = Key("trendingCategory", default: .default) static let trendingCountry = Key("trendingCountry", default: .us) static let visibleSections = Key>("visibleSections", default: [.favorites, .subscriptions, .trending, .playlists]) } enum ResolutionSetting: String, CaseIterable, Defaults.Serializable { case best, hd720p, sd480p, sd360p, sd240p, sd144p var value: Stream.Resolution { switch self { case .best: return .hd720p default: return Stream.Resolution(rawValue: rawValue)! } } var description: String { switch self { case .best: return "Best available" default: return value.name } } } enum PlayerSidebarSetting: String, CaseIterable, Defaults.Serializable { case always, whenFits, never static var defaultValue: Self { #if os(macOS) .always #else .whenFits #endif } } enum VisibleSection: String, CaseIterable, Comparable, Defaults.Serializable { case favorites, subscriptions, popular, trending, playlists static func from(_ string: String) -> VisibleSection { allCases.first { $0.rawValue == string }! } var title: String { rawValue.localizedCapitalized } var tabSelection: TabSelection { switch self { case .favorites: return TabSelection.favorites case .subscriptions: return TabSelection.subscriptions case .popular: return TabSelection.popular case .trending: return TabSelection.trending case .playlists: return TabSelection.playlists } } private var sortOrder: Int { switch self { case .favorites: return 0 case .subscriptions: return 1 case .popular: return 2 case .trending: return 3 case .playlists: return 4 } } static func < (lhs: Self, rhs: Self) -> Bool { lhs.sortOrder < rhs.sortOrder } }