diff --git a/Model/ThumbnailsModel.swift b/Model/ThumbnailsModel.swift index 8421db49..52e5c0ac 100644 --- a/Model/ThumbnailsModel.swift +++ b/Model/ThumbnailsModel.swift @@ -1,3 +1,4 @@ +import Defaults import Foundation final class ThumbnailsModel: ObservableObject { @@ -16,9 +17,7 @@ final class ThumbnailsModel: ObservableObject { } func best(_ video: Video) -> URL? { - let qualities = [Thumbnail.Quality.maxresdefault, .medium, .default] - - for quality in qualities { + for quality in availableQualitites { let url = video.thumbnailURL(quality: quality) if !isUnloadable(url) { return url @@ -27,4 +26,15 @@ final class ThumbnailsModel: ObservableObject { return nil } + + private var availableQualitites: [Thumbnail.Quality] { + switch Defaults[.thumbnailsQuality] { + case .highest: + return [.maxresdefault, .medium, .default] + case .medium: + return [.medium, .default] + case .low: + return [.default] + } + } } diff --git a/Shared/Defaults.swift b/Shared/Defaults.swift index 5b5b66a6..8246eb97 100644 --- a/Shared/Defaults.swift +++ b/Shared/Defaults.swift @@ -51,6 +51,7 @@ extension Defaults.Keys { static let channelOnThumbnail = Key("channelOnThumbnail", default: true) static let timeOnThumbnail = Key("timeOnThumbnail", default: true) static let roundedThumbnails = Key("roundedThumbnails", default: true) + static let thumbnailsQuality = Key("thumbnailsQuality", default: .highest) static let activeBackend = Key("activeBackend", default: .mpv) static let quality = Key("quality", default: .best) @@ -218,3 +219,7 @@ enum PlayerDetailsPageButtonLabelStyle: String, CaseIterable, Defaults.Serializa self == .iconAndText } } + +enum ThumbnailsQuality: String, CaseIterable, Defaults.Serializable { + case highest, medium, low +} diff --git a/Shared/Settings/BrowsingSettings.swift b/Shared/Settings/BrowsingSettings.swift index 3586a924..eaee7aad 100644 --- a/Shared/Settings/BrowsingSettings.swift +++ b/Shared/Settings/BrowsingSettings.swift @@ -9,6 +9,7 @@ struct BrowsingSettings: View { #if os(iOS) @Default(.lockPortraitWhenBrowsing) private var lockPortraitWhenBrowsing #endif + @Default(.thumbnailsQuality) private var thumbnailsQuality @Default(.channelOnThumbnail) private var channelOnThumbnail @Default(.timeOnThumbnail) private var timeOnThumbnail @Default(.visibleSections) private var visibleSections @@ -65,6 +66,7 @@ struct BrowsingSettings: View { private var thumbnailsSettings: some View { Section(header: SettingsHeader(text: "Thumbnails")) { + thumbnailsQualityPicker #if !os(tvOS) Toggle("Round corners", isOn: $roundedThumbnails) #endif @@ -73,6 +75,21 @@ struct BrowsingSettings: View { } } + private var thumbnailsQualityPicker: some View { + Picker("Quality", selection: $thumbnailsQuality) { + ForEach(ThumbnailsQuality.allCases, id: \.self) { quality in + Text(quality.rawValue.capitalized + " quality").tag(quality) + } + } + .labelsHidden() + + #if os(iOS) + .pickerStyle(.automatic) + #elseif os(tvOS) + .pickerStyle(.inline) + #endif + } + private var visibleSectionsSettings: some View { Section(header: SettingsHeader(text: "Sections")) { #if os(macOS)