summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShav Kinderlehrer <[email protected]>2024-01-07 19:20:56 -0500
committerShav Kinderlehrer <[email protected]>2024-01-07 19:20:56 -0500
commit3f74421e5b33e9e284197ef8d8f5e27fc1dc2a22 (patch)
tree1e90fea659c5fc4c9b20109a871cbbcbd03c1420
parentb9b61fa7ebb2716a013aacc410abe64a08d6f471 (diff)
downloadjel-3f74421e5b33e9e284197ef8d8f5e27fc1dc2a22.tar.gz
jel-3f74421e5b33e9e284197ef8d8f5e27fc1dc2a22.zip
Add GenreView
-rw-r--r--Jel.xcodeproj/project.pbxproj4
-rw-r--r--Jel/Views/Dashboard/DashboardLibraryView.swift5
-rw-r--r--Jel/Views/Library/Item/ItemGenresView.swift64
-rw-r--r--Jel/Views/Library/Item/ItemHeaderView.swift2
-rw-r--r--Jel/Views/Library/Item/ItemInfoView.swift2
-rw-r--r--Jel/Views/Library/LibraryDetailView.swift9
6 files changed, 81 insertions, 5 deletions
diff --git a/Jel.xcodeproj/project.pbxproj b/Jel.xcodeproj/project.pbxproj
index f84170a..9846bd4 100644
--- a/Jel.xcodeproj/project.pbxproj
+++ b/Jel.xcodeproj/project.pbxproj
@@ -17,6 +17,7 @@
3D13F9692B389FA300E91913 /* ViewOffsetKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D13F9682B389FA300E91913 /* ViewOffsetKey.swift */; };
3D13F96F2B38A32500E91913 /* StickyHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D13F96E2B38A32500E91913 /* StickyHeaderView.swift */; };
3D16FC3C2B2CDFB500E6D8B3 /* DashboardLibraryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D16FC3B2B2CDFB500E6D8B3 /* DashboardLibraryView.swift */; };
+ 3D3816C92B4B5648006414D7 /* ItemGenresView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3816C82B4B5648006414D7 /* ItemGenresView.swift */; };
3D41D1F52B2C962500E58234 /* AppearancePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D41D1F42B2C962500E58234 /* AppearancePicker.swift */; };
3D41D1FA2B2CAE0000E58234 /* ItemIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D41D1F92B2CAE0000E58234 /* ItemIconView.swift */; };
3D4C15722B3CAA670035373E /* DashboardSectionTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D4C15712B3CAA670035373E /* DashboardSectionTitleView.swift */; };
@@ -85,6 +86,7 @@
3D13F9682B389FA300E91913 /* ViewOffsetKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewOffsetKey.swift; sourceTree = "<group>"; };
3D13F96E2B38A32500E91913 /* StickyHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickyHeaderView.swift; sourceTree = "<group>"; };
3D16FC3B2B2CDFB500E6D8B3 /* DashboardLibraryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardLibraryView.swift; sourceTree = "<group>"; };
+ 3D3816C82B4B5648006414D7 /* ItemGenresView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemGenresView.swift; sourceTree = "<group>"; };
3D41D1F42B2C962500E58234 /* AppearancePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearancePicker.swift; sourceTree = "<group>"; };
3D41D1F92B2CAE0000E58234 /* ItemIconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemIconView.swift; sourceTree = "<group>"; };
3D4C15712B3CAA670035373E /* DashboardSectionTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardSectionTitleView.swift; sourceTree = "<group>"; };
@@ -188,6 +190,7 @@
3D13F9602B37637500E91913 /* ItemMediaView.swift */,
3DAFA8E72B38AFED00D71AD1 /* ItemInfoView.swift */,
3D13F9642B37EC7A00E91913 /* ItemHeaderView.swift */,
+ 3D3816C82B4B5648006414D7 /* ItemGenresView.swift */,
);
path = Item;
sourceTree = "<group>";
@@ -456,6 +459,7 @@
3D1015D92B27F57400F5C29A /* AddServerView.swift in Sources */,
3DAFA8EA2B39039900D71AD1 /* JellyfinKitExtensions.swift in Sources */,
3D13F9652B37EC7A00E91913 /* ItemHeaderView.swift in Sources */,
+ 3D3816C92B4B5648006414D7 /* ItemGenresView.swift in Sources */,
3DAFA8EC2B394F9F00D71AD1 /* ViewConditionalMethod.swift in Sources */,
3D9063CB2B279A310063DD2A /* JelApp.swift in Sources */,
3D13F9692B389FA300E91913 /* ViewOffsetKey.swift in Sources */,
diff --git a/Jel/Views/Dashboard/DashboardLibraryView.swift b/Jel/Views/Dashboard/DashboardLibraryView.swift
index 2a8dee1..19f7bf3 100644
--- a/Jel/Views/Dashboard/DashboardLibraryView.swift
+++ b/Jel/Views/Dashboard/DashboardLibraryView.swift
@@ -26,7 +26,10 @@ struct DashboardLibraryView: View {
ForEach(libraries) {library in
if library.collectionType == "movies" || library.collectionType == "tvshows" {
NavigationLink {
- LibraryDetailView(library: library)
+ LibraryDetailView(library: library) {items in
+ return items
+ }
+ .navigationTitle(library.name ?? "Unknown")
} label: {
ItemIconView(item: library, height: 150)
.setAspectRatio(library.primaryImageAspectRatio)
diff --git a/Jel/Views/Library/Item/ItemGenresView.swift b/Jel/Views/Library/Item/ItemGenresView.swift
new file mode 100644
index 0000000..25b86e4
--- /dev/null
+++ b/Jel/Views/Library/Item/ItemGenresView.swift
@@ -0,0 +1,64 @@
+//
+// ItemGenresView.swift
+// Jel
+//
+// Created by zerocool on 1/7/24.
+//
+
+import SwiftUI
+import JellyfinKit
+
+struct ItemGenresView: View {
+ @EnvironmentObject var jellyfinClient: JellyfinClientController
+
+ @StateObject var authState: AuthStateController = AuthStateController.shared
+
+ var item: BaseItemDto
+ @State var library: BaseItemDto = BaseItemDto()
+
+ var body: some View {
+ VStack(alignment: .leading) {
+ Text("Genres")
+ .font(.title2)
+
+ ScrollView(.horizontal) {
+ HStack {
+ ForEach(item.genres ?? [], id: \.self) {genre in
+ NavigationLink {
+ LibraryDetailView(library: library) {items in
+ var matchingItems: [BaseItemDto] = []
+
+ for item in items {
+ if (item.genres ?? []).contains(genre) {
+ matchingItems.append(item)
+ }
+ }
+ return matchingItems
+ }
+ .navigationTitle(genre)
+ } label: {
+ Text(genre)
+ }
+ .buttonStyle(.bordered)
+ .clipShape(.capsule)
+ }
+ }
+ }
+ }
+ .onAppear {
+ Task {
+ let request = Paths.getItem(userID: authState.userId ?? "", itemID: item.parentID ?? "")
+ do {
+ let res = try await jellyfinClient.send(request)
+ library = res.value
+ } catch {
+ }
+ }
+
+ }
+ }
+}
+
+//#Preview {
+// ItemGenresView()
+//}
diff --git a/Jel/Views/Library/Item/ItemHeaderView.swift b/Jel/Views/Library/Item/ItemHeaderView.swift
index b8a708a..3b5769a 100644
--- a/Jel/Views/Library/Item/ItemHeaderView.swift
+++ b/Jel/Views/Library/Item/ItemHeaderView.swift
@@ -9,7 +9,7 @@ import SwiftUI
import JellyfinKit
struct ItemHeaderView: View {
- @State var item: BaseItemDto
+ var item: BaseItemDto
let overlayGradient = LinearGradient(gradient: Gradient(stops: [
.init(color: .clear, location: 0),
diff --git a/Jel/Views/Library/Item/ItemInfoView.swift b/Jel/Views/Library/Item/ItemInfoView.swift
index 022fa71..0e1ce11 100644
--- a/Jel/Views/Library/Item/ItemInfoView.swift
+++ b/Jel/Views/Library/Item/ItemInfoView.swift
@@ -9,7 +9,7 @@ import SwiftUI
import JellyfinKit
struct ItemInfoView: View {
- @State var item: BaseItemDto
+ var item: BaseItemDto
var body: some View {
VStack(alignment: .leading) {
diff --git a/Jel/Views/Library/LibraryDetailView.swift b/Jel/Views/Library/LibraryDetailView.swift
index ece4e74..b645a8a 100644
--- a/Jel/Views/Library/LibraryDetailView.swift
+++ b/Jel/Views/Library/LibraryDetailView.swift
@@ -13,6 +13,7 @@ struct LibraryDetailView: View {
@StateObject var authState: AuthStateController = AuthStateController.shared
@State var library: BaseItemDto
+ var filter: (_ items: [BaseItemDto]) -> [BaseItemDto]
@State var items: [BaseItemDto]? = []
@@ -71,19 +72,23 @@ struct LibraryDetailView: View {
}
}
}
- .navigationTitle(library.name ?? "Unknown")
.onAppear {
Task {
let params = Paths.GetItemsParameters(
userID: authState.userId,
parentID: library.id,
- fields: [.primaryImageAspectRatio]
+ fields: [.primaryImageAspectRatio,
+ .genres,
+ .taglines,
+ .overview,
+ .parentID]
)
let request = Paths.getItems(parameters: params)
do {
let res = try await jellyfinClient.send(request)
items = res.value.items
+ items = self.filter(items ?? [])
items?.sort(by: {$0.name?.lowercased() ?? "" < $1.name?.lowercased() ?? ""})
loading = false
} catch {