diff --git a/Shared/Coordinators/MainCoordinator/iOSMainCoordinator.swift b/Shared/Coordinators/MainCoordinator/iOSMainCoordinator.swift index 7e47fa65..79330528 100644 --- a/Shared/Coordinators/MainCoordinator/iOSMainCoordinator.swift +++ b/Shared/Coordinators/MainCoordinator/iOSMainCoordinator.swift @@ -61,13 +61,13 @@ final class MainCoordinator: NavigationCoordinatable { @objc func didLogIn() { - LogManager.shared.log.info("Received `didSignIn` from SwiftfinNotificationCenter.") + LogManager.log.info("Received `didSignIn` from SwiftfinNotificationCenter.") root(\.mainTab) } @objc func didLogOut() { - LogManager.shared.log.info("Received `didSignOut` from SwiftfinNotificationCenter.") + LogManager.log.info("Received `didSignOut` from SwiftfinNotificationCenter.") root(\.serverList) } diff --git a/Shared/Coordinators/MainCoordinator/tvOSMainCoordinator.swift b/Shared/Coordinators/MainCoordinator/tvOSMainCoordinator.swift index 632b7790..b09bcfda 100644 --- a/Shared/Coordinators/MainCoordinator/tvOSMainCoordinator.swift +++ b/Shared/Coordinators/MainCoordinator/tvOSMainCoordinator.swift @@ -47,13 +47,13 @@ final class MainCoordinator: NavigationCoordinatable { @objc func didLogIn() { - LogManager.shared.log.info("Received `didSignIn` from NSNotificationCenter.") + LogManager.log.info("Received `didSignIn` from NSNotificationCenter.") root(\.mainTab) } @objc func didLogOut() { - LogManager.shared.log.info("Received `didSignOut` from NSNotificationCenter.") + LogManager.log.info("Received `didSignOut` from NSNotificationCenter.") root(\.serverList) } diff --git a/Shared/Errors/NetworkError.swift b/Shared/Errors/NetworkError.swift index b6cf2c73..0930e90a 100644 --- a/Shared/Errors/NetworkError.swift +++ b/Shared/Errors/NetworkError.swift @@ -44,19 +44,19 @@ enum NetworkError: Error { switch logConstructor.level { case .trace: - logFunction = LogManager.shared.log.trace + logFunction = LogManager.log.trace case .debug: - logFunction = LogManager.shared.log.debug + logFunction = LogManager.log.debug case .information: - logFunction = LogManager.shared.log.info + logFunction = LogManager.log.info case .warning: - logFunction = LogManager.shared.log.warning + logFunction = LogManager.log.warning case .error: - logFunction = LogManager.shared.log.error + logFunction = LogManager.log.error case .critical: - logFunction = LogManager.shared.log.critical + logFunction = LogManager.log.critical case ._none: - logFunction = LogManager.shared.log.debug + logFunction = LogManager.log.debug } logFunction(logConstructor.message, logConstructor.tag, logConstructor.function, logConstructor.file, logConstructor.line) diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift index c658e9e1..6a8ec3bc 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift @@ -14,7 +14,7 @@ import UIKit extension BaseItemDto { func createVideoPlayerViewModel() -> AnyPublisher<[VideoPlayerViewModel], Error> { - LogManager.shared.log.debug("Creating video player view model for item: \(id ?? "")") + LogManager.log.debug("Creating video player view model for item: \(id ?? "")") let builder = DeviceProfileBuilder() // TODO: fix bitrate settings diff --git a/Shared/ServerDiscovery/ServerDiscovery.swift b/Shared/ServerDiscovery/ServerDiscovery.swift index 81f6de75..2ee6122b 100644 --- a/Shared/ServerDiscovery/ServerDiscovery.swift +++ b/Shared/ServerDiscovery/ServerDiscovery.swift @@ -59,7 +59,7 @@ public class ServerDiscovery { func receiveHandler(_ ipAddress: String, _ port: Int, _ data: Data) { do { let response = try JSONDecoder().decode(ServerLookupResponse.self, from: data) - LogManager.shared.log.debug("Received JellyfinServer from \"\(response.name)\"", tag: "ServerDiscovery") + LogManager.log.debug("Received JellyfinServer from \"\(response.name)\"", tag: "ServerDiscovery") completion(response) } catch { completion(nil) @@ -68,7 +68,7 @@ public class ServerDiscovery { self.broadcastConn.handler = receiveHandler do { try broadcastConn.sendBroadcast("Who is JellyfinServer?") - LogManager.shared.log.debug("Discovery broadcast sent", tag: "ServerDiscovery") + LogManager.log.debug("Discovery broadcast sent", tag: "ServerDiscovery") } catch { print(error) } diff --git a/Shared/Singleton/LogManager.swift b/Shared/Singleton/LogManager.swift index de1af46b..205fd686 100644 --- a/Shared/Singleton/LogManager.swift +++ b/Shared/Singleton/LogManager.swift @@ -10,39 +10,44 @@ import Foundation import Puppy class LogManager { - static let shared = LogManager() - let log = Puppy() + + static let log = Puppy() + + static func setup() { + + let logsDirectory = getDocumentsDirectory().appendingPathComponent("logs", isDirectory: true) + + do { + try FileManager.default.createDirectory(atPath: logsDirectory.path, + withIntermediateDirectories: true, + attributes: nil) + } catch { + // logs directory already created + } + + let logFileURL = logsDirectory.appendingPathComponent("swiftfin_log.log") + + let fileRotationLogger = try! FileRotationLogger("org.jellyfin.swiftfin.logger.file-rotation", + fileURL: logFileURL) + fileRotationLogger.suffixExtension = .numbering + fileRotationLogger.maxFileSize = 10 * 1024 + fileRotationLogger.maxArchivedFilesCount = 5 + fileRotationLogger.format = LogFormatter() + + let consoleLogger = ConsoleLogger("org.jellyfin.swiftfin.logger.console") + consoleLogger.format = LogFormatter() + + log.add(fileRotationLogger, withLevel: .debug) + log.add(consoleLogger, withLevel: .debug) + } + + private static func getDocumentsDirectory() -> URL { + // find all possible documents directories for this user + let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) - init() { - let console = ConsoleLogger("com.swiftfin.ConsoleLogger") - let fileURL = self.getDocumentsDirectory().appendingPathComponent("logs.txt") - let FM = FileManager() - _ = try? FM.removeItem(at: fileURL) - - do { - let file = try FileLogger("com.swiftfin", fileURL: fileURL) - file.format = LogFormatter() - log.add(file, withLevel: .debug) - } catch let err { - log.error("Couldn't initialize file logger.") - print(err) - } - console.format = LogFormatter() - log.add(console, withLevel: .debug) - log.info("Logger initialized.") - } - - func logFileURL() -> URL { - self.getDocumentsDirectory().appendingPathComponent("logs.txt") - } - - func getDocumentsDirectory() -> URL { - // find all possible documents directories for this user - let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) - - // just send back the first one, which ought to be the only one - return paths[0] - } + // just send back the first one, which ought to be the only one + return paths[0] + } } class LogFormatter: LogFormattable { diff --git a/Shared/ViewModels/ConnectToServerViewModel.swift b/Shared/ViewModels/ConnectToServerViewModel.swift index 426b5a37..be928f17 100644 --- a/Shared/ViewModels/ConnectToServerViewModel.swift +++ b/Shared/ViewModels/ConnectToServerViewModel.swift @@ -55,7 +55,7 @@ final class ConnectToServerViewModel: ViewModel { let trimmedURI = uri.trimmingCharacters(in: .whitespaces) - LogManager.shared.log.debug("Attempting to connect to server at \"\(trimmedURI)\"", tag: "connectToServer") + LogManager.log.debug("Attempting to connect to server at \"\(trimmedURI)\"", tag: "connectToServer") SessionManager.main.connectToServer(with: trimmedURI) .trackActivity(loading) .sink(receiveCompletion: { completion in @@ -103,7 +103,7 @@ final class ConnectToServerViewModel: ViewModel { } } }, receiveValue: { server in - LogManager.shared.log.debug("Connected to server at \"\(uri)\"", tag: "connectToServer") + LogManager.log.debug("Connected to server at \"\(uri)\"", tag: "connectToServer") self.router?.route(to: \.userSignIn, server) }) .store(in: &cancellables) diff --git a/Shared/ViewModels/HomeViewModel.swift b/Shared/ViewModels/HomeViewModel.swift index 9df68555..fdff81f2 100644 --- a/Shared/ViewModels/HomeViewModel.swift +++ b/Shared/ViewModels/HomeViewModel.swift @@ -64,7 +64,7 @@ final class HomeViewModel: ViewModel { @objc func refresh() { - LogManager.shared.log.debug("Refresh called.") + LogManager.log.debug("Refresh called.") refreshLibrariesLatest() refreshLatestAddedItems() @@ -90,7 +90,7 @@ final class HomeViewModel: ViewModel { var newLibraries: [BaseItemDto] = [] response.items!.forEach { item in - LogManager.shared.log + LogManager.log .debug("Retrieved user view: \(item.id!) (\(item.name ?? "nil")) with type \(item.collectionType ?? "nil")") if item.collectionType == "movies" || item.collectionType == "tvshows" { newLibraries.append(item) @@ -148,7 +148,7 @@ final class HomeViewModel: ViewModel { self.handleAPIRequestError(completion: completion) } } receiveValue: { items in - LogManager.shared.log.debug("Retrieved \(String(items.count)) resume items") + LogManager.log.debug("Retrieved \(String(items.count)) resume items") self.latestAddedItems = items } @@ -179,7 +179,7 @@ final class HomeViewModel: ViewModel { self.handleAPIRequestError(completion: completion) } }, receiveValue: { response in - LogManager.shared.log.debug("Retrieved \(String(response.items!.count)) resume items") + LogManager.log.debug("Retrieved \(String(response.items!.count)) resume items") self.resumeItems = response.items ?? [] }) @@ -224,7 +224,7 @@ final class HomeViewModel: ViewModel { self.handleAPIRequestError(completion: completion) } }, receiveValue: { response in - LogManager.shared.log.debug("Retrieved \(String(response.items!.count)) nextup items") + LogManager.log.debug("Retrieved \(String(response.items!.count)) nextup items") self.nextUpItems = response.items ?? [] }) diff --git a/Shared/ViewModels/ItemViewModel/SeasonItemViewModel.swift b/Shared/ViewModels/ItemViewModel/SeasonItemViewModel.swift index ac2f09bc..7e7a1dca 100644 --- a/Shared/ViewModels/ItemViewModel/SeasonItemViewModel.swift +++ b/Shared/ViewModels/ItemViewModel/SeasonItemViewModel.swift @@ -47,7 +47,7 @@ final class SeasonItemViewModel: ItemViewModel, EpisodesRowManager { } // private func requestEpisodes() { -// LogManager.shared.log +// LogManager.log // .debug("Getting episodes in season \(item.id!) (\(item.name!)) of show \(item.seriesId!) (\(item.seriesName!))") // TvShowsAPI.getEpisodes(seriesId: item.seriesId ?? "", userId: SessionManager.main.currentLogin.user.id, // fields: [.primaryImageAspectRatio, .seriesPrimaryImage, .seasonUserData, .overview, .genres, .people], @@ -57,7 +57,7 @@ final class SeasonItemViewModel: ItemViewModel, EpisodesRowManager { // self?.handleAPIRequestError(completion: completion) // }, receiveValue: { [weak self] response in // self?.episodes = response.items ?? [] -// LogManager.shared.log.debug("Retrieved \(String(self?.episodes.count ?? 0)) episodes") +// LogManager.log.debug("Retrieved \(String(self?.episodes.count ?? 0)) episodes") // // self?.setNextUpInSeason() // }) diff --git a/Shared/ViewModels/ItemViewModel/SeriesItemViewModel.swift b/Shared/ViewModels/ItemViewModel/SeriesItemViewModel.swift index 05dfb4e8..55ac91ea 100644 --- a/Shared/ViewModels/ItemViewModel/SeriesItemViewModel.swift +++ b/Shared/ViewModels/ItemViewModel/SeriesItemViewModel.swift @@ -43,7 +43,7 @@ final class SeriesItemViewModel: ItemViewModel { private func getNextUp() { - LogManager.shared.log.debug("Getting next up for show \(self.item.id!) (\(self.item.name!))") + LogManager.log.debug("Getting next up for show \(self.item.id!) (\(self.item.name!))") TvShowsAPI.getNextUp(userId: SessionManager.main.currentLogin.user.id, fields: [.primaryImageAspectRatio, .seriesPrimaryImage, .seasonUserData, .overview, .genres, .people], seriesId: self.item.id!, @@ -78,7 +78,7 @@ final class SeriesItemViewModel: ItemViewModel { } private func requestSeasons() { - LogManager.shared.log.debug("Getting seasons of show \(self.item.id!) (\(self.item.name!))") + LogManager.log.debug("Getting seasons of show \(self.item.id!) (\(self.item.name!))") TvShowsAPI.getSeasons(seriesId: item.id ?? "", userId: SessionManager.main.currentLogin.user.id, fields: [.primaryImageAspectRatio, .seriesPrimaryImage, .seasonUserData, .overview, .genres, .people], isMissing: Defaults[.shouldShowMissingSeasons] ? nil : false, @@ -88,7 +88,7 @@ final class SeriesItemViewModel: ItemViewModel { self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in self?.seasons = response.items ?? [] - LogManager.shared.log.debug("Retrieved \(String(self?.seasons.count ?? 0)) seasons") + LogManager.log.debug("Retrieved \(String(self?.seasons.count ?? 0)) seasons") }) .store(in: &cancellables) } diff --git a/Shared/ViewModels/LatestMediaViewModel.swift b/Shared/ViewModels/LatestMediaViewModel.swift index aac3cbf1..85012299 100644 --- a/Shared/ViewModels/LatestMediaViewModel.swift +++ b/Shared/ViewModels/LatestMediaViewModel.swift @@ -25,7 +25,7 @@ final class LatestMediaViewModel: ViewModel { } func requestLatestMedia() { - LogManager.shared.log.debug("Requesting latest media for user id \(SessionManager.main.currentLogin.user.id)") + LogManager.log.debug("Requesting latest media for user id \(SessionManager.main.currentLogin.user.id)") UserLibraryAPI.getLatestMedia(userId: SessionManager.main.currentLogin.user.id, parentId: library.id ?? "", fields: [ @@ -43,7 +43,7 @@ final class LatestMediaViewModel: ViewModel { self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in self?.items = response - LogManager.shared.log.debug("Retrieved \(String(self?.items.count ?? 0)) items") + LogManager.log.debug("Retrieved \(String(self?.items.count ?? 0)) items") }) .store(in: &cancellables) } diff --git a/Shared/ViewModels/LiveTVChannelsViewModel.swift b/Shared/ViewModels/LiveTVChannelsViewModel.swift index f2f61acd..c609e7b0 100644 --- a/Shared/ViewModels/LiveTVChannelsViewModel.swift +++ b/Shared/ViewModels/LiveTVChannelsViewModel.swift @@ -68,7 +68,7 @@ final class LiveTVChannelsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] _ in - LogManager.shared.log.debug("Received Guide Info") + LogManager.log.debug("Received Guide Info") guard let self = self else { return } self.getChannels() }) @@ -86,7 +86,7 @@ final class LiveTVChannelsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(response.items?.count ?? 0) Channels") + LogManager.log.debug("Received \(response.items?.count ?? 0) Channels") guard let self = self else { return } self.channels = response.items ?? [] self.getPrograms() @@ -97,7 +97,7 @@ final class LiveTVChannelsViewModel: ViewModel { private func getPrograms() { // http://192.168.1.50:8096/LiveTv/Programs guard !channels.isEmpty else { - LogManager.shared.log.debug("Cannot get programs, channels list empty. ") + LogManager.log.debug("Cannot get programs, channels list empty. ") return } let channelIds = channels.compactMap(\.id) @@ -121,7 +121,7 @@ final class LiveTVChannelsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(response.items?.count ?? 0) Programs") + LogManager.log.debug("Received \(response.items?.count ?? 0) Programs") guard let self = self else { return } self.programs = response.items ?? [] self.channelPrograms = self.processChannelPrograms() @@ -173,7 +173,7 @@ final class LiveTVChannelsViewModel: ViewModel { } timer = Timer(fire: nextMinute, interval: 60 * 10, repeats: true) { [weak self] _ in guard let self = self else { return } - LogManager.shared.log.debug("LiveTVChannels schedule check...") + LogManager.log.debug("LiveTVChannels schedule check...") DispatchQueue.global(qos: .background).async { let newChanPrgs = self.processChannelPrograms() DispatchQueue.main.async { diff --git a/Shared/ViewModels/LiveTVProgramsViewModel.swift b/Shared/ViewModels/LiveTVProgramsViewModel.swift index f3ea55df..99c5e8e9 100644 --- a/Shared/ViewModels/LiveTVProgramsViewModel.swift +++ b/Shared/ViewModels/LiveTVProgramsViewModel.swift @@ -47,7 +47,7 @@ final class LiveTVProgramsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(response.items?.count ?? 0) Channels") + LogManager.log.debug("Received \(response.items?.count ?? 0) Channels") guard let self = self else { return } if let chans = response.items { for chan in chans { @@ -78,7 +78,7 @@ final class LiveTVProgramsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(String(response.items?.count ?? 0)) Recommended Programs") + LogManager.log.debug("Received \(String(response.items?.count ?? 0)) Recommended Programs") guard let self = self else { return } self.recommendedItems = response.items ?? [] }) @@ -103,7 +103,7 @@ final class LiveTVProgramsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(String(response.items?.count ?? 0)) Series Items") + LogManager.log.debug("Received \(String(response.items?.count ?? 0)) Series Items") guard let self = self else { return } self.seriesItems = response.items ?? [] }) @@ -128,7 +128,7 @@ final class LiveTVProgramsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(String(response.items?.count ?? 0)) Movie Items") + LogManager.log.debug("Received \(String(response.items?.count ?? 0)) Movie Items") guard let self = self else { return } self.movieItems = response.items ?? [] }) @@ -149,7 +149,7 @@ final class LiveTVProgramsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(String(response.items?.count ?? 0)) Sports Items") + LogManager.log.debug("Received \(String(response.items?.count ?? 0)) Sports Items") guard let self = self else { return } self.sportsItems = response.items ?? [] }) @@ -170,7 +170,7 @@ final class LiveTVProgramsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(String(response.items?.count ?? 0)) Kids Items") + LogManager.log.debug("Received \(String(response.items?.count ?? 0)) Kids Items") guard let self = self else { return } self.kidsItems = response.items ?? [] }) @@ -191,7 +191,7 @@ final class LiveTVProgramsViewModel: ViewModel { .sink(receiveCompletion: { [weak self] completion in self?.handleAPIRequestError(completion: completion) }, receiveValue: { [weak self] response in - LogManager.shared.log.debug("Received \(String(response.items?.count ?? 0)) News Items") + LogManager.log.debug("Received \(String(response.items?.count ?? 0)) News Items") guard let self = self else { return } self.newsItems = response.items ?? [] }) diff --git a/Shared/ViewModels/SettingsViewModel.swift b/Shared/ViewModels/SettingsViewModel.swift index 92a6d6bd..a88a23ca 100644 --- a/Shared/ViewModels/SettingsViewModel.swift +++ b/Shared/ViewModels/SettingsViewModel.swift @@ -31,10 +31,10 @@ final class SettingsViewModel: ObservableObject { do { self.bitrates = try JSONDecoder().decode([Bitrates].self, from: jsonData) } catch { - LogManager.shared.log.error("Error converting processed JSON into Swift compatible schema.") + LogManager.log.error("Error converting processed JSON into Swift compatible schema.") } } catch { - LogManager.shared.log.error("Error processing JSON file `bitrates.json`") + LogManager.log.error("Error processing JSON file `bitrates.json`") } // Track languages diff --git a/Shared/ViewModels/UserSignInViewModel.swift b/Shared/ViewModels/UserSignInViewModel.swift index fbe5d501..de1d1445 100644 --- a/Shared/ViewModels/UserSignInViewModel.swift +++ b/Shared/ViewModels/UserSignInViewModel.swift @@ -30,8 +30,8 @@ final class UserSignInViewModel: ViewModel { } func login(username: String, password: String) { - LogManager.shared.log.debug("Attempting to login to server at \"\(server.currentURI)\"", tag: "login") - LogManager.shared.log.debug("username: \(username), password: \(password)", tag: "login") + LogManager.log.debug("Attempting to login to server at \"\(server.currentURI)\"", tag: "login") + LogManager.log.debug("username: \(username), password: \(password)", tag: "login") SessionManager.main.loginUser(server: server, username: username, password: password) .trackActivity(loading) diff --git a/Shared/ViewModels/VideoPlayerViewModel/VideoPlayerViewModel.swift b/Shared/ViewModels/VideoPlayerViewModel/VideoPlayerViewModel.swift index 6ce29063..06840613 100644 --- a/Shared/ViewModels/VideoPlayerViewModel/VideoPlayerViewModel.swift +++ b/Shared/ViewModels/VideoPlayerViewModel/VideoPlayerViewModel.swift @@ -472,7 +472,7 @@ extension VideoPlayerViewModel { .sink { completion in self.handleAPIRequestError(completion: completion) } receiveValue: { _ in - LogManager.shared.log.debug("Start report sent for item: \(self.item.id ?? "No ID")") + LogManager.log.debug("Start report sent for item: \(self.item.id ?? "No ID")") } .store(in: &cancellables) } @@ -508,7 +508,7 @@ extension VideoPlayerViewModel { .sink { completion in self.handleAPIRequestError(completion: completion) } receiveValue: { _ in - LogManager.shared.log.debug("Pause report sent for item: \(self.item.id ?? "No ID")") + LogManager.log.debug("Pause report sent for item: \(self.item.id ?? "No ID")") } .store(in: &cancellables) } @@ -553,7 +553,7 @@ extension VideoPlayerViewModel { .sink { completion in self.handleAPIRequestError(completion: completion) } receiveValue: { _ in - LogManager.shared.log.debug("Playback progress sent for item: \(self.item.id ?? "No ID")") + LogManager.log.debug("Playback progress sent for item: \(self.item.id ?? "No ID")") } .store(in: &cancellables) @@ -580,7 +580,7 @@ extension VideoPlayerViewModel { .sink { completion in self.handleAPIRequestError(completion: completion) } receiveValue: { _ in - LogManager.shared.log.debug("Stop report sent for item: \(self.item.id ?? "No ID")") + LogManager.log.debug("Stop report sent for item: \(self.item.id ?? "No ID")") SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didSendStopReport, object: self.item.id) } diff --git a/Shared/ViewModels/ViewModel.swift b/Shared/ViewModels/ViewModel.swift index 8531106e..6e7d5b5f 100644 --- a/Shared/ViewModels/ViewModel.swift +++ b/Shared/ViewModels/ViewModel.swift @@ -43,16 +43,16 @@ class ViewModel: ObservableObject { case .error(-1, _, _, _): networkError = .URLError(response: errorResponse, displayMessage: displayMessage, logConstructor: logConstructor) // Use the errorResponse description for debugging, rather than the user-facing friendly description which may not be implemented - LogManager.shared.log + LogManager.log .error("Request failed: URL request failed with error \(networkError.errorMessage.code): \(errorResponse.localizedDescription)") case .error(-2, _, _, _): networkError = .HTTPURLError(response: errorResponse, displayMessage: displayMessage, logConstructor: logConstructor) - LogManager.shared.log + LogManager.log .error("Request failed: HTTP URL request failed with description: \(errorResponse.localizedDescription)") default: networkError = .JellyfinError(response: errorResponse, displayMessage: displayMessage, logConstructor: logConstructor) // Able to use user-facing friendly description here since just HTTP status codes - LogManager.shared.log + LogManager.log .error("Request failed: \(networkError.errorMessage.code) - \(networkError.errorMessage.title): \(networkError.errorMessage.logConstructor.message)\n\(error.localizedDescription)") } @@ -67,7 +67,7 @@ class ViewModel: ObservableObject { displayMessage: swiftfinError.errorDescription ?? "", logConstructor: logConstructor) self.errorMessage = errorMessage - LogManager.shared.log.error("Request failed: \(swiftfinError.errorDescription ?? "")") + LogManager.log.error("Request failed: \(swiftfinError.errorDescription ?? "")") default: let genericErrorMessage = ErrorMessage(code: ErrorMessage.noShowErrorCode, @@ -75,7 +75,7 @@ class ViewModel: ObservableObject { displayMessage: error.localizedDescription, logConstructor: logConstructor) self.errorMessage = genericErrorMessage - LogManager.shared.log.error("Request failed: Generic error - \(error.localizedDescription)") + LogManager.log.error("Request failed: Generic error - \(error.localizedDescription)") } } } diff --git a/Swiftfin tvOS/Views/ItemView/CinematicItemView/CinematicItemViewTopRow.swift b/Swiftfin tvOS/Views/ItemView/CinematicItemView/CinematicItemViewTopRow.swift index f3c3da8f..38099a00 100644 --- a/Swiftfin tvOS/Views/ItemView/CinematicItemView/CinematicItemViewTopRow.swift +++ b/Swiftfin tvOS/Views/ItemView/CinematicItemView/CinematicItemViewTopRow.swift @@ -62,7 +62,7 @@ struct CinematicItemViewTopRow: View { if let selectedVideoPlayerViewModel = viewModel.selectedVideoPlayerViewModel { itemRouter.route(to: \.videoPlayer, selectedVideoPlayerViewModel) } else { - LogManager.shared.log.error("Attempted to play item but no playback information available") + LogManager.log.error("Attempted to play item but no playback information available") } } label: { HStack(spacing: 15) { @@ -85,7 +85,7 @@ struct CinematicItemViewTopRow: View { selectedVideoPlayerViewModel.injectCustomValues(startFromBeginning: true) itemRouter.route(to: \.videoPlayer, selectedVideoPlayerViewModel) } else { - LogManager.shared.log.error("Attempted to play item but no playback information available") + LogManager.log.error("Attempted to play item but no playback information available") } } label: { Label(L10n.playFromBeginning, systemImage: "gobackward") diff --git a/Swiftfin tvOS/Views/VideoPlayer/VLCPlayerViewController.swift b/Swiftfin tvOS/Views/VideoPlayer/VLCPlayerViewController.swift index 1ba5b04a..e3883b9d 100644 --- a/Swiftfin tvOS/Views/VideoPlayer/VLCPlayerViewController.swift +++ b/Swiftfin tvOS/Views/VideoPlayer/VLCPlayerViewController.swift @@ -463,11 +463,11 @@ extension VLCPlayerViewController { viewModel = newViewModel if viewModel.streamType == .direct { - LogManager.shared.log.debug("Player set up with direct play stream for item: \(viewModel.item.id ?? "--")") + LogManager.log.debug("Player set up with direct play stream for item: \(viewModel.item.id ?? "--")") } else if viewModel.streamType == .transcode && Defaults[.Experimental.forceDirectPlay] { - LogManager.shared.log.debug("Player set up with forced direct stream for item: \(viewModel.item.id ?? "--")") + LogManager.log.debug("Player set up with forced direct stream for item: \(viewModel.item.id ?? "--")") } else { - LogManager.shared.log.debug("Player set up with transcoded stream for item: \(viewModel.item.id ?? "--")") + LogManager.log.debug("Player set up with transcoded stream for item: \(viewModel.item.id ?? "--")") } } diff --git a/Swiftfin.xcodeproj/project.pbxproj b/Swiftfin.xcodeproj/project.pbxproj index 1037861e..8f66867a 100644 --- a/Swiftfin.xcodeproj/project.pbxproj +++ b/Swiftfin.xcodeproj/project.pbxproj @@ -54,12 +54,9 @@ 535870AA2669D8AE00D05A09 /* BlurHashDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5389277B263CC3DB0035E14B /* BlurHashDecode.swift */; }; 535870AD2669D8DD00D05A09 /* Typings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535870AC2669D8DD00D05A09 /* Typings.swift */; }; 535BAE9F2649E569005FA86D /* ItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535BAE9E2649E569005FA86D /* ItemView.swift */; }; - 53649AAD269CFAEA00A2D8B7 /* Puppy in Frameworks */ = {isa = PBXBuildFile; productRef = 53649AAC269CFAEA00A2D8B7 /* Puppy */; }; - 53649AAF269CFAF600A2D8B7 /* Puppy in Frameworks */ = {isa = PBXBuildFile; productRef = 53649AAE269CFAF600A2D8B7 /* Puppy */; }; 53649AB1269CFB1900A2D8B7 /* LogManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53649AB0269CFB1900A2D8B7 /* LogManager.swift */; }; 53649AB2269D019100A2D8B7 /* LogManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53649AB0269CFB1900A2D8B7 /* LogManager.swift */; }; 53649AB3269D3F5B00A2D8B7 /* LogManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53649AB0269CFB1900A2D8B7 /* LogManager.swift */; }; - 53649AB5269D423A00A2D8B7 /* Puppy in Frameworks */ = {isa = PBXBuildFile; productRef = 53649AB4269D423A00A2D8B7 /* Puppy */; }; 5364F455266CA0DC0026ECBA /* BaseItemPersonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5364F454266CA0DC0026ECBA /* BaseItemPersonExtensions.swift */; }; 5364F456266CA0DC0026ECBA /* BaseItemPersonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5364F454266CA0DC0026ECBA /* BaseItemPersonExtensions.swift */; }; 536D3D74267BA8170004248C /* BackgroundManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536D3D73267BA8170004248C /* BackgroundManager.swift */; }; @@ -287,6 +284,9 @@ E131691726C583BC0074BFEE /* LogConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E131691626C583BC0074BFEE /* LogConstructor.swift */; }; E131691826C583BC0074BFEE /* LogConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E131691626C583BC0074BFEE /* LogConstructor.swift */; }; E131691926C583BC0074BFEE /* LogConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E131691626C583BC0074BFEE /* LogConstructor.swift */; }; + E1347DB2279E3C6200BC6161 /* Puppy in Frameworks */ = {isa = PBXBuildFile; productRef = E1347DB1279E3C6200BC6161 /* Puppy */; }; + E1347DB4279E3C9E00BC6161 /* Puppy in Frameworks */ = {isa = PBXBuildFile; productRef = E1347DB3279E3C9E00BC6161 /* Puppy */; }; + E1347DB6279E3CA500BC6161 /* Puppy in Frameworks */ = {isa = PBXBuildFile; productRef = E1347DB5279E3CA500BC6161 /* Puppy */; }; E1361DA7278FA7A300BEC523 /* NukeUI in Frameworks */ = {isa = PBXBuildFile; productRef = E1361DA6278FA7A300BEC523 /* NukeUI */; }; E1384944278036C70024FB48 /* VLCPlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1384943278036C70024FB48 /* VLCPlayerViewController.swift */; }; E13849452780370B0024FB48 /* PlaybackSpeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C812B4277A8E5D00918266 /* PlaybackSpeed.swift */; }; @@ -805,7 +805,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 53649AAF269CFAF600A2D8B7 /* Puppy in Frameworks */, E11D83AF278FA998006E9776 /* NukeUI in Frameworks */, E1218C9E271A2CD600EA0737 /* CombineExt in Frameworks */, E1002B6B2793E36600E47059 /* Algorithms in Frameworks */, @@ -818,6 +817,7 @@ E1AE8E7E2789136D00FBDDAA /* Nuke in Frameworks */, E178857D278037FD0094FBCF /* JellyfinAPI in Frameworks */, E12186DE2718F1C50010884C /* Defaults in Frameworks */, + E1347DB6279E3CA500BC6161 /* Puppy in Frameworks */, 53ABFDED26799D7700886593 /* ActivityIndicator in Frameworks */, 9EA03141D129DC2763660E29 /* Pods_Swiftfin_tvOS.framework in Frameworks */, ); @@ -829,7 +829,6 @@ files = ( E13DD3D327168E65009D4DAF /* Defaults in Frameworks */, E1361DA7278FA7A300BEC523 /* NukeUI in Frameworks */, - 53649AAD269CFAEA00A2D8B7 /* Puppy in Frameworks */, E1002B682793CFBA00E47059 /* Algorithms in Frameworks */, E10EAA4D277BB716000269ED /* Sliders in Frameworks */, 62C29E9C26D0FE4200C1D2E7 /* Stinsen in Frameworks */, @@ -840,6 +839,7 @@ E1AE8E7C2789135A00FBDDAA /* Nuke in Frameworks */, 625CB57A2678C4A400530A6E /* ActivityIndicator in Frameworks */, E1B6DCE8271A23780015B715 /* CombineExt in Frameworks */, + E1347DB2279E3C6200BC6161 /* Puppy in Frameworks */, E10EAA45277BB646000269ED /* JellyfinAPI in Frameworks */, EEAF6CD6B3433126DEBC7E87 /* Pods_Swiftfin_iOS.framework in Frameworks */, ); @@ -849,11 +849,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + E1347DB4279E3C9E00BC6161 /* Puppy in Frameworks */, E1D7E5A827892566009D0EF7 /* Nuke in Frameworks */, 628B95242670CABD0091AF3B /* SwiftUI.framework in Frameworks */, 531ABF6C2671F5CC00C0FE20 /* WidgetKit.framework in Frameworks */, E13DD3DD27175CE3009D4DAF /* Defaults in Frameworks */, - 53649AB5269D423A00A2D8B7 /* Puppy in Frameworks */, 536D3D7D267BD5F90004248C /* ActivityIndicator in Frameworks */, E13DD3CF27164E1F009D4DAF /* CoreStore in Frameworks */, E10EAA47277BB670000269ED /* JellyfinAPI in Frameworks */, @@ -1757,7 +1757,6 @@ 535870902669D7A800D05A09 /* Introspect */, 53ABFDEC26799D7700886593 /* ActivityIndicator */, 536D3D83267BEA550004248C /* ParallaxView */, - 53649AAE269CFAF600A2D8B7 /* Puppy */, 6220D0C826D63F3700B8E046 /* Stinsen */, E13DD3CC27164CA7009D4DAF /* CoreStore */, E12186DD2718F1C50010884C /* Defaults */, @@ -1767,6 +1766,7 @@ E1AE8E7D2789136D00FBDDAA /* Nuke */, E11D83AE278FA998006E9776 /* NukeUI */, E1002B6A2793E36600E47059 /* Algorithms */, + E1347DB5279E3CA500BC6161 /* Puppy */, ); productName = "JellyfinPlayer tvOS"; productReference = 535870602669D21600D05A09 /* Swiftfin tvOS.app */; @@ -1795,7 +1795,6 @@ packageProductDependencies = ( 53352570265EA0A0006CCA86 /* Introspect */, 625CB5792678C4A400530A6E /* ActivityIndicator */, - 53649AAC269CFAEA00A2D8B7 /* Puppy */, 62C29E9B26D0FE4200C1D2E7 /* Stinsen */, E13DD3C52716499E009D4DAF /* CoreStore */, E13DD3D227168E65009D4DAF /* Defaults */, @@ -1807,6 +1806,7 @@ E1AE8E7B2789135A00FBDDAA /* Nuke */, E1361DA6278FA7A300BEC523 /* NukeUI */, E1002B672793CFBA00E47059 /* Algorithms */, + E1347DB1279E3C6200BC6161 /* Puppy */, ); productName = JellyfinPlayer; productReference = 5377CBF1263B596A003A4E83 /* Swiftfin iOS.app */; @@ -1828,11 +1828,11 @@ name = "Swiftfin Widget"; packageProductDependencies = ( 536D3D7C267BD5F90004248C /* ActivityIndicator */, - 53649AB4269D423A00A2D8B7 /* Puppy */, E13DD3CE27164E1F009D4DAF /* CoreStore */, E13DD3DC27175CE3009D4DAF /* Defaults */, E10EAA46277BB670000269ED /* JellyfinAPI */, E1D7E5A727892566009D0EF7 /* Nuke */, + E1347DB3279E3C9E00BC6161 /* Puppy */, ); productName = WidgetExtensionExtension; productReference = 628B95202670CABD0091AF3B /* Swiftfin Widget.appex */; @@ -1889,7 +1889,6 @@ 5335256F265EA0A0006CCA86 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */, 625CB5782678C4A400530A6E /* XCRemoteSwiftPackageReference "ActivityIndicator" */, 536D3D82267BEA550004248C /* XCRemoteSwiftPackageReference "ParallaxView" */, - 53649AAB269CFAEA00A2D8B7 /* XCRemoteSwiftPackageReference "Puppy" */, 62C29E9A26D0FE4100C1D2E7 /* XCRemoteSwiftPackageReference "stinsen" */, E13DD3C42716499E009D4DAF /* XCRemoteSwiftPackageReference "CoreStore" */, E13DD3D127168E65009D4DAF /* XCRemoteSwiftPackageReference "Defaults" */, @@ -1901,6 +1900,7 @@ E1AE8E7A2789135A00FBDDAA /* XCRemoteSwiftPackageReference "Nuke" */, E1361DA5278FA7A300BEC523 /* XCRemoteSwiftPackageReference "NukeUI" */, E1002B662793CFBA00E47059 /* XCRemoteSwiftPackageReference "swift-algorithms" */, + E1347DB0279E3C6200BC6161 /* XCRemoteSwiftPackageReference "Puppy" */, ); productRefGroup = 5377CBF2263B596A003A4E83 /* Products */; projectDirPath = ""; @@ -2865,7 +2865,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 70; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = TY84JMYEFE; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; EXCLUDED_ARCHS = ""; @@ -2902,7 +2902,7 @@ CURRENT_PROJECT_VERSION = 70; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = TY84JMYEFE; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; EXCLUDED_ARCHS = ""; @@ -2933,7 +2933,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 70; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = TY84JMYEFE; INFOPLIST_FILE = WidgetExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -2960,7 +2960,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 70; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = TY84JMYEFE; INFOPLIST_FILE = WidgetExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -3028,14 +3028,6 @@ minimumVersion = 0.1.3; }; }; - 53649AAB269CFAEA00A2D8B7 /* XCRemoteSwiftPackageReference "Puppy" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/sushichop/Puppy"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.2.0; - }; - }; 536D3D82267BEA550004248C /* XCRemoteSwiftPackageReference "ParallaxView" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/PGSSoft/ParallaxView"; @@ -3100,6 +3092,14 @@ minimumVersion = 1.0.0; }; }; + E1347DB0279E3C6200BC6161 /* XCRemoteSwiftPackageReference "Puppy" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/LePips/Puppy"; + requirement = { + branch = main; + kind = branch; + }; + }; E1361DA5278FA7A300BEC523 /* XCRemoteSwiftPackageReference "NukeUI" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/kean/NukeUI"; @@ -3153,21 +3153,6 @@ package = 5335256F265EA0A0006CCA86 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */; productName = Introspect; }; - 53649AAC269CFAEA00A2D8B7 /* Puppy */ = { - isa = XCSwiftPackageProductDependency; - package = 53649AAB269CFAEA00A2D8B7 /* XCRemoteSwiftPackageReference "Puppy" */; - productName = Puppy; - }; - 53649AAE269CFAF600A2D8B7 /* Puppy */ = { - isa = XCSwiftPackageProductDependency; - package = 53649AAB269CFAEA00A2D8B7 /* XCRemoteSwiftPackageReference "Puppy" */; - productName = Puppy; - }; - 53649AB4269D423A00A2D8B7 /* Puppy */ = { - isa = XCSwiftPackageProductDependency; - package = 53649AAB269CFAEA00A2D8B7 /* XCRemoteSwiftPackageReference "Puppy" */; - productName = Puppy; - }; 536D3D7C267BD5F90004248C /* ActivityIndicator */ = { isa = XCSwiftPackageProductDependency; package = 625CB5782678C4A400530A6E /* XCRemoteSwiftPackageReference "ActivityIndicator" */; @@ -3238,6 +3223,21 @@ package = E1267D42271A212C003C492E /* XCRemoteSwiftPackageReference "CombineExt" */; productName = CombineExt; }; + E1347DB1279E3C6200BC6161 /* Puppy */ = { + isa = XCSwiftPackageProductDependency; + package = E1347DB0279E3C6200BC6161 /* XCRemoteSwiftPackageReference "Puppy" */; + productName = Puppy; + }; + E1347DB3279E3C9E00BC6161 /* Puppy */ = { + isa = XCSwiftPackageProductDependency; + package = E1347DB0279E3C6200BC6161 /* XCRemoteSwiftPackageReference "Puppy" */; + productName = Puppy; + }; + E1347DB5279E3CA500BC6161 /* Puppy */ = { + isa = XCSwiftPackageProductDependency; + package = E1347DB0279E3C6200BC6161 /* XCRemoteSwiftPackageReference "Puppy" */; + productName = Puppy; + }; E1361DA6278FA7A300BEC523 /* NukeUI */ = { isa = XCSwiftPackageProductDependency; package = E1361DA5278FA7A300BEC523 /* XCRemoteSwiftPackageReference "NukeUI" */; diff --git a/Swiftfin.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Swiftfin.xcworkspace/xcshareddata/swiftpm/Package.resolved index 74055c43..f63dcf8e 100644 --- a/Swiftfin.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Swiftfin.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -93,11 +93,11 @@ }, { "package": "Puppy", - "repositoryURL": "https://github.com/sushichop/Puppy", + "repositoryURL": "https://github.com/LePips/Puppy", "state": { - "branch": null, - "revision": "95ce04b0e778b8d7c351876bc98bbf68328dfc9b", - "version": "0.3.1" + "branch": "main", + "revision": "c34356e8e3879bb39656edd1b11622497ef6f290", + "version": null } }, { diff --git a/Swiftfin/App/AppDelegate.swift b/Swiftfin/App/AppDelegate.swift index aacfa0b9..1d72db97 100644 --- a/Swiftfin/App/AppDelegate.swift +++ b/Swiftfin/App/AppDelegate.swift @@ -19,6 +19,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { // Lazily initialize datastack _ = SwiftfinStore.dataStack + LogManager.setup() let audioSession = AVAudioSession.sharedInstance() do { diff --git a/Swiftfin/Info.plist b/Swiftfin/Info.plist index dc65aac2..8948aa04 100644 --- a/Swiftfin/Info.plist +++ b/Swiftfin/Info.plist @@ -2,6 +2,10 @@ + LSSupportsOpeningDocumentsInPlace + + UIFileSharingEnabled + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName diff --git a/Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift b/Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift index 8ef58c0e..ade9fced 100644 --- a/Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift +++ b/Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift @@ -58,7 +58,7 @@ struct ItemLandscapeMainView: View { selectedVideoPlayerViewModel.injectCustomValues(startFromBeginning: true) itemRouter.route(to: \.videoPlayer, selectedVideoPlayerViewModel) } else { - LogManager.shared.log.error("Attempted to play item but no playback information available") + LogManager.log.error("Attempted to play item but no playback information available") } } label: { Label(L10n.playFromBeginning, systemImage: "gobackward") diff --git a/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift b/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift index db91e1c6..d8c9bd55 100644 --- a/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift +++ b/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift @@ -117,7 +117,7 @@ struct PortraitHeaderOverlayView: View { if let selectedVideoPlayerViewModel = viewModel.selectedVideoPlayerViewModel { itemRouter.route(to: \.videoPlayer, selectedVideoPlayerViewModel) } else { - LogManager.shared.log.error("Attempted to play item but no playback information available") + LogManager.log.error("Attempted to play item but no playback information available") } } label: { HStack { @@ -141,7 +141,7 @@ struct PortraitHeaderOverlayView: View { selectedVideoPlayerViewModel.injectCustomValues(startFromBeginning: true) itemRouter.route(to: \.videoPlayer, selectedVideoPlayerViewModel) } else { - LogManager.shared.log.error("Attempted to play item but no playback information available") + LogManager.log.error("Attempted to play item but no playback information available") } } label: { Label(L10n.playFromBeginning, systemImage: "gobackward") diff --git a/Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift b/Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift index e46f8f78..9c2fe8ed 100644 --- a/Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift +++ b/Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift @@ -423,11 +423,11 @@ extension VLCPlayerViewController { viewModel = newViewModel if viewModel.streamType == .direct { - LogManager.shared.log.debug("Player set up with direct play stream for item: \(viewModel.item.id ?? "--")") + LogManager.log.debug("Player set up with direct play stream for item: \(viewModel.item.id ?? "--")") } else if viewModel.streamType == .transcode && Defaults[.Experimental.forceDirectPlay] { - LogManager.shared.log.debug("Player set up with forced direct stream for item: \(viewModel.item.id ?? "--")") + LogManager.log.debug("Player set up with forced direct stream for item: \(viewModel.item.id ?? "--")") } else { - LogManager.shared.log.debug("Player set up with transcoded stream for item: \(viewModel.item.id ?? "--")") + LogManager.log.debug("Player set up with transcoded stream for item: \(viewModel.item.id ?? "--")") } }