diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift index 3564c841..13ae8c13 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift @@ -236,6 +236,7 @@ public extension BaseItemDto { case boxset = "BoxSet" case collectionFolder = "CollectionFolder" case folder = "Folder" + case liveTV = "LiveTV" case unknown @@ -247,6 +248,21 @@ public extension BaseItemDto { return true } } + + public init?(rawValue: String) { + let lowerCase = rawValue.lowercased() + switch lowerCase { + case "movie": self = .movie + case "season": self = .season + case "episode": self = .episode + case "series": self = .series + case "boxset": self = .boxset + case "collectionfolder": self = .collectionFolder + case "folder": self = .folder + case "livetv": self = .liveTV + default: self = .unknown + } + } } var itemType: ItemType { @@ -258,7 +274,7 @@ public extension BaseItemDto { func portraitHeaderViewURL(maxWidth: Int) -> URL { switch itemType { - case .movie, .season, .series, .boxset, .collectionFolder, .folder: + case .movie, .season, .series, .boxset, .collectionFolder, .folder, .liveTV: return getPrimaryImage(maxWidth: maxWidth) case .episode: return getSeriesPrimaryImage(maxWidth: maxWidth) diff --git a/Swiftfin tvOS/Views/LibraryListView.swift b/Swiftfin tvOS/Views/LibraryListView.swift index 4760e74e..d6cd299e 100644 --- a/Swiftfin tvOS/Views/LibraryListView.swift +++ b/Swiftfin tvOS/Views/LibraryListView.swift @@ -8,7 +8,9 @@ import Defaults import Foundation +import Stinsen import SwiftUI +import JellyfinAPI struct LibraryListView: View { @EnvironmentObject @@ -20,8 +22,14 @@ struct LibraryListView: View { @Default(.Experimental.liveTVAlphaEnabled) var liveTVAlphaEnabled - - let supportedCollectionTypes = ["movies", "tvshows", "boxsets", "livetv", "other"] + + var supportedCollectionTypes: [BaseItemDto.ItemType] { + if liveTVAlphaEnabled { + return [.movie, .season, .series, .liveTV, .boxset, .unknown] + } else { + return [.movie, .season, .series, .boxset, .unknown] + } + } var body: some View { ScrollView { @@ -29,60 +37,39 @@ struct LibraryListView: View { if !viewModel.isLoading { ForEach(viewModel.libraries.filter { [self] library in - let collectionType = library.collectionType ?? "other" - return self.supportedCollectionTypes.contains(collectionType) + let collectionType = library.collectionType ?? "other" + let itemType = BaseItemDto.ItemType(rawValue: collectionType) ?? .unknown + return self.supportedCollectionTypes.contains(itemType) }, id: \.id) { library in - if library.collectionType == "livetv" { - if liveTVAlphaEnabled { - Button { - self.mainCoordinator.root(\.liveTV) - } - label: { - ZStack { - HStack { - Spacer() - VStack { - Text(library.name ?? "") - .foregroundColor(.white) - .font(.title2) - .fontWeight(.semibold) - } - Spacer() - }.padding(32) - } - .frame(minWidth: 100, maxWidth: .infinity) - .frame(height: 100) - } - .cornerRadius(10) - .shadow(radius: 5) - .padding(.bottom, 5) - } - } else { - Button { - self.libraryListRouter.route(to: \.library, - (viewModel: LibraryViewModel(parentID: library.id), title: library.name ?? "")) - } - label: { - ZStack { - HStack { - Spacer() - VStack { - Text(library.name ?? "") - .foregroundColor(.white) - .font(.title2) - .fontWeight(.semibold) - } - Spacer() - }.padding(32) - } - .frame(minWidth: 100, maxWidth: .infinity) - .frame(height: 100) - } - .cornerRadius(10) - .shadow(radius: 5) - .padding(.bottom, 5) - } - } + Button { + let itemType = BaseItemDto.ItemType(rawValue: library.collectionType ?? "other") ?? .unknown + if itemType == .liveTV { + self.mainCoordinator.root(\.liveTV) + } else { + self.libraryListRouter.route(to: \.library, + (viewModel: LibraryViewModel(parentID: library.id), title: library.name ?? "")) + } + } + label: { + ZStack { + HStack { + Spacer() + VStack { + Text(library.name ?? "") + .foregroundColor(.white) + .font(.title2) + .fontWeight(.semibold) + } + Spacer() + }.padding(32) + } + .frame(minWidth: 100, maxWidth: .infinity) + .frame(height: 100) + } + .cornerRadius(10) + .shadow(radius: 5) + .padding(.bottom, 5) + } } else { ProgressView() } diff --git a/Swiftfin/Views/LibraryListView.swift b/Swiftfin/Views/LibraryListView.swift index 3f686477..48c4553a 100644 --- a/Swiftfin/Views/LibraryListView.swift +++ b/Swiftfin/Views/LibraryListView.swift @@ -10,6 +10,7 @@ import Defaults import Foundation import Stinsen import SwiftUI +import JellyfinAPI struct LibraryListView: View { @EnvironmentObject @@ -20,11 +21,11 @@ struct LibraryListView: View { @Default(.Experimental.liveTVAlphaEnabled) var liveTVAlphaEnabled - var supportedCollectionTypes: [String] { + var supportedCollectionTypes: [BaseItemDto.ItemType] { if liveTVAlphaEnabled { - return ["movies", "tvshows", "livetv", "boxsets", "other"] + return [.movie, .season, .series, .liveTV, .boxset, .unknown] } else { - return ["movies", "tvshows", "boxsets", "other"] + return [.movie, .season, .series, .boxset, .unknown] } } @@ -56,10 +57,12 @@ struct LibraryListView: View { if !viewModel.isLoading { ForEach(viewModel.libraries.filter { [self] library in let collectionType = library.collectionType ?? "other" - return self.supportedCollectionTypes.contains(collectionType) + let itemType = BaseItemDto.ItemType(rawValue: collectionType) ?? .unknown + return self.supportedCollectionTypes.contains(itemType) }, id: \.id) { library in Button { - if library.collectionType == "livetv" { + let itemType = BaseItemDto.ItemType(rawValue: library.collectionType ?? "other") ?? .unknown + if itemType == .liveTV { libraryListRouter.route(to: \.liveTV) } else { libraryListRouter.route(to: \.library,