From 3ee33461d34e47895df7e75f35965354175384af Mon Sep 17 00:00:00 2001 From: PangMo5 Date: Fri, 25 Jun 2021 17:02:24 +0900 Subject: [PATCH] add Defaults package replaced UserDefaults.default with Defaults add prefer language settings --- .../VideoPlayerViewController.swift | 4 +- JellyfinPlayer.xcodeproj/project.pbxproj | 55 ++++++++++++---- .../xcshareddata/swiftpm/Package.resolved | 9 +++ JellyfinPlayer/JellyfinPlayer.entitlements | 4 +- JellyfinPlayer/PersistenceController.swift | 2 +- JellyfinPlayer/SettingsView.swift | 62 +++++++++++-------- JellyfinPlayer/VideoPlayer.swift | 5 +- Shared/Extensions/DefaultsExtension.swift | 19 ++++++ Shared/Singleton/SessionManager.swift | 6 +- Shared/ViewModels/SettingsViewModel.swift | 7 +++ Shared/ViewModels/SplashViewModel.swift | 9 +-- WidgetExtension/WidgetExtension.entitlements | 4 +- 12 files changed, 126 insertions(+), 60 deletions(-) create mode 100644 Shared/Extensions/DefaultsExtension.swift diff --git a/JellyfinPlayer tvOS/VideoPlayer/VideoPlayerViewController.swift b/JellyfinPlayer tvOS/VideoPlayer/VideoPlayerViewController.swift index afe48934..74e9262d 100644 --- a/JellyfinPlayer tvOS/VideoPlayer/VideoPlayerViewController.swift +++ b/JellyfinPlayer tvOS/VideoPlayer/VideoPlayerViewController.swift @@ -12,6 +12,7 @@ import TVVLCKit import MediaPlayer import JellyfinAPI import Combine +import Defaults protocol VideoPlayerSettingsDelegate: AnyObject { func selectNew(audioTrack id: Int32) @@ -149,8 +150,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate, func fetchVideo() { // Fetch max bitrate from UserDefaults depending on current connection mode - let defaults = UserDefaults.standard - let maxBitrate = defaults.integer(forKey: "InNetworkBandwidth") + let maxBitrate = Defaults[.inNetworkBandwidth] // Build a device profile let builder = DeviceProfileBuilder() diff --git a/JellyfinPlayer.xcodeproj/project.pbxproj b/JellyfinPlayer.xcodeproj/project.pbxproj index 0b493e32..3963e0f1 100644 --- a/JellyfinPlayer.xcodeproj/project.pbxproj +++ b/JellyfinPlayer.xcodeproj/project.pbxproj @@ -133,6 +133,10 @@ 628B95382670CDAB0091AF3B /* Model.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 5377CBFF263B596B003A4E83 /* Model.xcdatamodeld */; }; 628B953A2670CE250091AF3B /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 628B95392670CE250091AF3B /* KeychainSwift */; }; 628B953C2670D2430091AF3B /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338922660107500A81A2A /* StringExtensions.swift */; }; + 62CB3F462685BAF7003D0A6F /* Defaults in Frameworks */ = {isa = PBXBuildFile; productRef = 62CB3F452685BAF7003D0A6F /* Defaults */; }; + 62CB3F482685BB3B003D0A6F /* Defaults in Frameworks */ = {isa = PBXBuildFile; productRef = 62CB3F472685BB3B003D0A6F /* Defaults */; }; + 62CB3F4B2685BB77003D0A6F /* DefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62CB3F4A2685BB77003D0A6F /* DefaultsExtension.swift */; }; + 62CB3F4C2685BB77003D0A6F /* DefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62CB3F4A2685BB77003D0A6F /* DefaultsExtension.swift */; }; 62E632DA267D2BC40063E547 /* LatestMediaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E632D9267D2BC40063E547 /* LatestMediaViewModel.swift */; }; 62E632DC267D2E130063E547 /* LibrarySearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E632DB267D2E130063E547 /* LibrarySearchViewModel.swift */; }; 62E632DD267D2E130063E547 /* LibrarySearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E632DB267D2E130063E547 /* LibrarySearchViewModel.swift */; }; @@ -304,6 +308,7 @@ 628B952A2670CABE0091AF3B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 628B95362670CB800091AF3B /* JellyfinWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JellyfinWidget.swift; sourceTree = ""; }; 628B953B2670D1FC0091AF3B /* WidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WidgetExtension.entitlements; sourceTree = ""; }; + 62CB3F4A2685BB77003D0A6F /* DefaultsExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsExtension.swift; sourceTree = ""; }; 62E632D9267D2BC40063E547 /* LatestMediaViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LatestMediaViewModel.swift; sourceTree = ""; }; 62E632DB267D2E130063E547 /* LibrarySearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrarySearchViewModel.swift; sourceTree = ""; }; 62E632DF267D30CA0063E547 /* LibraryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryViewModel.swift; sourceTree = ""; }; @@ -331,6 +336,7 @@ 53EC6E1E267E80AC006DD26A /* Pods_JellyfinPlayer_tvOS.framework in Frameworks */, 53A431BF266B0FFE0016769F /* JellyfinAPI in Frameworks */, 535870912669D7A800D05A09 /* Introspect in Frameworks */, + 62CB3F482685BB3B003D0A6F /* Defaults in Frameworks */, 5358708D2669D7A800D05A09 /* KeychainSwift in Frameworks */, 536D3D84267BEA550004248C /* ParallaxView in Frameworks */, 53ABFDDC267972BF00886593 /* TVServices.framework in Frameworks */, @@ -343,6 +349,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 62CB3F462685BAF7003D0A6F /* Defaults in Frameworks */, 5338F757263B7E2E0014BF09 /* KeychainSwift in Frameworks */, 53EC6E25267EB10F006DD26A /* SwiftyJSON in Frameworks */, 53EC6E21267E80B1006DD26A /* Pods_JellyfinPlayer_iOS.framework in Frameworks */, @@ -591,6 +598,7 @@ 6267B3D526710B8900A7371D /* CollectionExtensions.swift */, 6267B3D92671138200A7371D /* ImageExtensions.swift */, 62EC353326766B03000E9F2D /* DeviceRotationViewModifier.swift */, + 62CB3F4A2685BB77003D0A6F /* DefaultsExtension.swift */, ); path = Extensions; sourceTree = ""; @@ -662,6 +670,7 @@ 53A431BE266B0FFE0016769F /* JellyfinAPI */, 53ABFDEC26799D7700886593 /* ActivityIndicator */, 536D3D83267BEA550004248C /* ParallaxView */, + 62CB3F472685BB3B003D0A6F /* Defaults */, ); productName = "JellyfinPlayer tvOS"; productReference = 535870602669D21600D05A09 /* JellyfinPlayer tvOS.app */; @@ -693,6 +702,7 @@ 53A431BC266B0FF20016769F /* JellyfinAPI */, 625CB5792678C4A400530A6E /* ActivityIndicator */, 53EC6E24267EB10F006DD26A /* SwiftyJSON */, + 62CB3F452685BAF7003D0A6F /* Defaults */, ); productName = JellyfinPlayer; productReference = 5377CBF1263B596A003A4E83 /* JellyfinPlayer iOS.app */; @@ -761,6 +771,7 @@ 625CB5782678C4A400530A6E /* XCRemoteSwiftPackageReference "ActivityIndicator" */, 536D3D82267BEA550004248C /* XCRemoteSwiftPackageReference "ParallaxView" */, 53EC6E23267EB10F006DD26A /* XCRemoteSwiftPackageReference "SwiftyJSON" */, + 62CB3F442685BAF7003D0A6F /* XCRemoteSwiftPackageReference "Defaults" */, ); productRefGroup = 5377CBF2263B596A003A4E83 /* Products */; projectDirPath = ""; @@ -944,6 +955,7 @@ 091B5A8D268315D400D78B61 /* ServerDiscovery.swift in Sources */, 53ABFDE7267974EF00886593 /* ConnectToServerViewModel.swift in Sources */, 53ABFDEE26799DCD00886593 /* ImageView.swift in Sources */, + 62CB3F4C2685BB77003D0A6F /* DefaultsExtension.swift in Sources */, 62E632E4267D3BA60063E547 /* MovieItemViewModel.swift in Sources */, 5358706C2669D21700D05A09 /* PersistenceController.swift in Sources */, 535870AA2669D8AE00D05A09 /* BlurHashDecode.swift in Sources */, @@ -982,6 +994,7 @@ 6225FCCB2663841E00E067F6 /* ParallaxHeader.swift in Sources */, 625CB5772678C34300530A6E /* ConnectToServerViewModel.swift in Sources */, 536D3D78267BD5C30004248C /* ViewModel.swift in Sources */, + 62CB3F4B2685BB77003D0A6F /* DefaultsExtension.swift in Sources */, 53DE4BD02670961400739748 /* EpisodeItemView.swift in Sources */, 53F8377D265FF67C00F456B3 /* VideoPlayerSettingsView.swift in Sources */, 53192D5D265AA78A008A4215 /* DeviceProfileBuilder.swift in Sources */, @@ -1068,7 +1081,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 54; DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer tvOS/Preview Content\""; - DEVELOPMENT_TEAM = 9R8RREG67J; + DEVELOPMENT_TEAM = 4BHXT8RHFR; ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "JellyfinPlayer tvOS/Info.plist"; @@ -1077,7 +1090,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = me.vigue.jellyfin; + PRODUCT_BUNDLE_IDENTIFIER = dev.kwangmin.swiftfin; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; SWIFT_VERSION = 5.0; @@ -1096,7 +1109,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 54; DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer tvOS/Preview Content\""; - DEVELOPMENT_TEAM = 9R8RREG67J; + DEVELOPMENT_TEAM = 4BHXT8RHFR; ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "JellyfinPlayer tvOS/Info.plist"; @@ -1105,7 +1118,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = me.vigue.jellyfin; + PRODUCT_BUNDLE_IDENTIFIER = dev.kwangmin.swiftfin; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; SWIFT_VERSION = 5.0; @@ -1245,7 +1258,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 54; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = 9R8RREG67J; + DEVELOPMENT_TEAM = 4BHXT8RHFR; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; EXCLUDED_ARCHS = ""; @@ -1257,7 +1270,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = me.vigue.jellyfin; + PRODUCT_BUNDLE_IDENTIFIER = dev.pangmo5.swiftfin; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTS_MACCATALYST = NO; @@ -1280,7 +1293,7 @@ CURRENT_PROJECT_VERSION = 54; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = 9R8RREG67J; + DEVELOPMENT_TEAM = 4BHXT8RHFR; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; EXCLUDED_ARCHS = ""; @@ -1292,7 +1305,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = me.vigue.jellyfin; + PRODUCT_BUNDLE_IDENTIFIER = dev.pangmo5.swiftfin; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTS_MACCATALYST = NO; @@ -1310,7 +1323,7 @@ CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 54; - DEVELOPMENT_TEAM = 9R8RREG67J; + DEVELOPMENT_TEAM = 4BHXT8RHFR; INFOPLIST_FILE = WidgetExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( @@ -1319,7 +1332,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = me.vigue.jellyfin.widget; + PRODUCT_BUNDLE_IDENTIFIER = dev.pangmo5.swiftfin.Widget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; @@ -1335,7 +1348,7 @@ CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 54; - DEVELOPMENT_TEAM = 9R8RREG67J; + DEVELOPMENT_TEAM = 4BHXT8RHFR; INFOPLIST_FILE = WidgetExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( @@ -1344,7 +1357,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0.0; - PRODUCT_BUNDLE_IDENTIFIER = me.vigue.jellyfin.widget; + PRODUCT_BUNDLE_IDENTIFIER = dev.pangmo5.swiftfin.Widget; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; @@ -1450,6 +1463,14 @@ minimumVersion = 1.1.0; }; }; + 62CB3F442685BAF7003D0A6F /* XCRemoteSwiftPackageReference "Defaults" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/sindresorhus/Defaults"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.0.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -1533,6 +1554,16 @@ package = 5338F755263B7E2E0014BF09 /* XCRemoteSwiftPackageReference "keychain-swift" */; productName = KeychainSwift; }; + 62CB3F452685BAF7003D0A6F /* Defaults */ = { + isa = XCSwiftPackageProductDependency; + package = 62CB3F442685BAF7003D0A6F /* XCRemoteSwiftPackageReference "Defaults" */; + productName = Defaults; + }; + 62CB3F472685BB3B003D0A6F /* Defaults */ = { + isa = XCSwiftPackageProductDependency; + package = 62CB3F442685BAF7003D0A6F /* XCRemoteSwiftPackageReference "Defaults" */; + productName = Defaults; + }; /* End XCSwiftPackageProductDependency section */ /* Begin XCVersionGroup section */ diff --git a/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved b/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved index f56b4837..f98581b0 100644 --- a/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/JellyfinPlayer.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -19,6 +19,15 @@ "version": "0.6.0" } }, + { + "package": "Defaults", + "repositoryURL": "https://github.com/sindresorhus/Defaults", + "state": { + "branch": null, + "revision": "63d93f97ad545c8bceb125a8a36175ea705f7cf5", + "version": "5.0.0" + } + }, { "package": "Gifu", "repositoryURL": "https://github.com/kaishin/Gifu", diff --git a/JellyfinPlayer/JellyfinPlayer.entitlements b/JellyfinPlayer/JellyfinPlayer.entitlements index b6b038ce..58751d05 100644 --- a/JellyfinPlayer/JellyfinPlayer.entitlements +++ b/JellyfinPlayer/JellyfinPlayer.entitlements @@ -8,13 +8,13 @@ com.apple.security.application-groups - group.me.vigue.jellyfin.mobileclient + group.dev.pangmo5.swiftfin com.apple.security.network.client keychain-access-groups - $(AppIdentifierPrefix)me.vigue.jellyfin.sharedKeychain + $(AppIdentifierPrefix)dev.pangmo5.swiftfin.sharedKeychain diff --git a/JellyfinPlayer/PersistenceController.swift b/JellyfinPlayer/PersistenceController.swift index 5e7b23ae..3dc74491 100644 --- a/JellyfinPlayer/PersistenceController.swift +++ b/JellyfinPlayer/PersistenceController.swift @@ -30,7 +30,7 @@ struct PersistenceController { init(inMemory: Bool = false) { container = NSPersistentCloudKitContainer(name: "Model") container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.me.vigue.jellyfin.mobileclient")!.appendingPathComponent("\(container.name).sqlite"))] + .containerURL(forSecurityApplicationGroupIdentifier: "group.dev.pangmo5.swiftfin")!.appendingPathComponent("\(container.name).sqlite"))] if inMemory { container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null") diff --git a/JellyfinPlayer/SettingsView.swift b/JellyfinPlayer/SettingsView.swift index 333bd721..c8c4fc1d 100644 --- a/JellyfinPlayer/SettingsView.swift +++ b/JellyfinPlayer/SettingsView.swift @@ -7,28 +7,30 @@ import CoreData import SwiftUI +import Defaults struct SettingsView: View { @Environment(\.managedObjectContext) private var viewContext - + @ObservedObject var viewModel: SettingsViewModel - + @Binding var close: Bool - @State private var inNetworkStreamBitrate: Int = 40_000_000 - @State private var outOfNetworkStreamBitrate: Int = 40_000_000 - @State private var autoSelectSubtitles: Bool = false - @State private var autoSelectSubtitlesLangcode: String = "none" + @Default(.inNetworkBandwidth) + var inNetworkStreamBitrate + @Default(.outOfNetworkBandwidth) + var outOfNetworkStreamBitrate + @Default(.isAutoSelectSubtitles) + var isAutoSelectSubtitles + @Default(.autoSelectSubtitlesLangCode) + var autoSelectSubtitlesLangcode + @Default(.autoSelectAudioLangCode) + var autoSelectAudioLangcode @State private var username: String = "" - + func onAppear() { - let defaults = UserDefaults.standard username = SessionManager.current.user.username ?? "" - inNetworkStreamBitrate = defaults.integer(forKey: "InNetworkBandwidth") - outOfNetworkStreamBitrate = defaults.integer(forKey: "OutOfNetworkBandwidth") - autoSelectSubtitles = defaults.bool(forKey: "AutoSelectSubtitles") - autoSelectSubtitlesLangcode = defaults.string(forKey: "AutoSelectSubtitlesLangcode") ?? "" } - + var body: some View { NavigationView { Form { @@ -37,29 +39,35 @@ struct SettingsView: View { ForEach(self.viewModel.bitrates, id: \.self) { bitrate in Text(bitrate.name).tag(bitrate.value) } - }.onChange(of: inNetworkStreamBitrate) { _ in - let defaults = UserDefaults.standard - defaults.setValue(_inNetworkStreamBitrate.wrappedValue, forKey: "InNetworkBandwidth") } - + Picker("Default remote quality", selection: $outOfNetworkStreamBitrate) { ForEach(self.viewModel.bitrates, id: \.self) { bitrate in Text(bitrate.name).tag(bitrate.value) } - }.onChange(of: outOfNetworkStreamBitrate) { _ in - let defaults = UserDefaults.standard - defaults.setValue(_outOfNetworkStreamBitrate.wrappedValue, forKey: "OutOfNetworkBandwidth") } } - + Section(header: Text("Accessibility")) { - Toggle("Automatically show subtitles", isOn: $autoSelectSubtitles).onChange(of: autoSelectSubtitles, perform: { _ in - let defaults = UserDefaults.standard - defaults.setValue(autoSelectSubtitles, forKey: "AutoSelectSubtitles") - }) - Picker("Language preferences", selection: $autoSelectSubtitlesLangcode) {} + Toggle("Automatically show subtitles", isOn: $isAutoSelectSubtitles) + Picker("Subtitles Language preferences", selection: $autoSelectSubtitlesLangcode) { + Text("Auto") + .tag("Auto") + ForEach(viewModel.isoLanguageCodesPair, id: \.1) { + Text($0.0) + .tag($0.1) + } + } + Picker("Audio Language preferences", selection: $autoSelectAudioLangcode) { + Text("Auto") + .tag("Auto") + ForEach(viewModel.isoLanguageCodesPair, id: \.1) { + Text($0.0) + .tag($0.1) + } + } } - + Section { HStack { Text("Signed in as \(username)").foregroundColor(.primary) diff --git a/JellyfinPlayer/VideoPlayer.swift b/JellyfinPlayer/VideoPlayer.swift index 24035f9d..f324b8a2 100644 --- a/JellyfinPlayer/VideoPlayer.swift +++ b/JellyfinPlayer/VideoPlayer.swift @@ -12,7 +12,7 @@ import MediaPlayer import Combine import GoogleCast import SwiftyJSON - +import Defaults enum PlayerDestination { case remote @@ -417,8 +417,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe mediaPlayer.drawable = videoContentView // Fetch max bitrate from UserDefaults depending on current connection mode - let defaults = UserDefaults.standard - let maxBitrate = defaults.integer(forKey: "InNetworkBandwidth") + let maxBitrate = Defaults[.inNetworkBandwidth] // Build a device profile let builder = DeviceProfileBuilder() diff --git a/Shared/Extensions/DefaultsExtension.swift b/Shared/Extensions/DefaultsExtension.swift new file mode 100644 index 00000000..ba24206d --- /dev/null +++ b/Shared/Extensions/DefaultsExtension.swift @@ -0,0 +1,19 @@ +// + /* + * SwiftFin is subject to the terms of the Mozilla Public + * License, v2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright 2021 Aiden Vigue & Jellyfin Contributors + */ + +import Foundation +import Defaults + +extension Defaults.Keys { + static let inNetworkBandwidth = Key("InNetworkBandwidth", default: 40_000_000) + static let outOfNetworkBandwidth = Key("OutOfNetworkBandwidth", default: 40_000_000) + static let isAutoSelectSubtitles = Key("isAutoSelectSubtitles", default: false) + static let autoSelectSubtitlesLangCode = Key("AutoSelectSubtitlesLangCode", default: "Auto") + static let autoSelectAudioLangCode = Key("AutoSelectAudioLangCode", default: "Auto") +} diff --git a/Shared/Singleton/SessionManager.swift b/Shared/Singleton/SessionManager.swift index f0f27de8..6e559752 100644 --- a/Shared/Singleton/SessionManager.swift +++ b/Shared/Singleton/SessionManager.swift @@ -81,7 +81,7 @@ final class SessionManager { fileprivate func getAuthToken(userID: String) -> String? { let keychain = KeychainSwift() - keychain.accessGroup = "9R8RREG67J.me.vigue.jellyfin.sharedKeychain" + keychain.accessGroup = "4BHXT8RHFR.dev.pangmo5.swiftfin.sharedKeychain" return keychain.get("AccessToken_\(userID)") } @@ -134,7 +134,7 @@ final class SessionManager { _ = try? PersistenceController.shared.container.viewContext.save() let keychain = KeychainSwift() - keychain.accessGroup = "9R8RREG67J.me.vigue.jellyfin.sharedKeychain" + keychain.accessGroup = "4BHXT8RHFR.dev.pangmo5.swiftfin.sharedKeychain" keychain.set(accessToken!, forKey: "AccessToken_\(user.user_id!)") generateAuthHeader(with: accessToken) @@ -151,7 +151,7 @@ final class SessionManager { nc.post(name: Notification.Name("didSignOut"), object: nil) let keychain = KeychainSwift() - keychain.accessGroup = "9R8RREG67J.me.vigue.jellyfin.sharedKeychain" + keychain.accessGroup = "4BHXT8RHFR.dev.pangmo5.swiftfin.sharedKeychain" keychain.delete("AccessToken_\(user?.user_id ?? "")") generateAuthHeader(with: nil) diff --git a/Shared/ViewModels/SettingsViewModel.swift b/Shared/ViewModels/SettingsViewModel.swift index cf3fe59a..8885b541 100644 --- a/Shared/ViewModels/SettingsViewModel.swift +++ b/Shared/ViewModels/SettingsViewModel.swift @@ -24,7 +24,9 @@ struct Bitrates: Codable, Hashable { } final class SettingsViewModel: ObservableObject { + let currentLocale = Locale.current var bitrates: [Bitrates] = [] + var isoLanguageCodesPair = [(name: String, isoCode: String)]() init() { let url = Bundle.main.url(forResource: "bitrates", withExtension: "json")! @@ -39,5 +41,10 @@ final class SettingsViewModel: ObservableObject { } catch { print(error) } + + isoLanguageCodesPair = Locale.isoLanguageCodes.compactMap { + guard let name = currentLocale.localizedString(forLanguageCode: $0) else { return nil } + return (name, $0) + } } } diff --git a/Shared/ViewModels/SplashViewModel.swift b/Shared/ViewModels/SplashViewModel.swift index 28da5de6..7450f9de 100644 --- a/Shared/ViewModels/SplashViewModel.swift +++ b/Shared/ViewModels/SplashViewModel.swift @@ -10,6 +10,7 @@ import Foundation import Combine import Nuke +import Defaults #if !os(tvOS) import WidgetKit @@ -30,14 +31,6 @@ final class SplashViewModel: ViewModel { WidgetCenter.shared.reloadAllTimelines() #endif - let defaults = UserDefaults.standard - if defaults.integer(forKey: "InNetworkBandwidth") == 0 { - defaults.setValue(40_000_000, forKey: "InNetworkBandwidth") - } - if defaults.integer(forKey: "OutOfNetworkBandwidth") == 0 { - defaults.setValue(40_000_000, forKey: "OutOfNetworkBandwidth") - } - let nc = NotificationCenter.default nc.addObserver(self, selector: #selector(didLogIn), name: Notification.Name("didSignIn"), object: nil) nc.addObserver(self, selector: #selector(didLogOut), name: Notification.Name("didSignOut"), object: nil) diff --git a/WidgetExtension/WidgetExtension.entitlements b/WidgetExtension/WidgetExtension.entitlements index b164e1cb..b1737b11 100644 --- a/WidgetExtension/WidgetExtension.entitlements +++ b/WidgetExtension/WidgetExtension.entitlements @@ -4,11 +4,11 @@ com.apple.security.application-groups - group.me.vigue.jellyfin.mobileclient + group.dev.pangmo5.swiftfin keychain-access-groups - $(AppIdentifierPrefix)me.vigue.jellyfin.sharedKeychain + $(AppIdentifierPrefix)dev.pangmo5.swiftfin.sharedKeychain