diff --git a/JellyfinPlayer/EpisodeItemView.swift b/JellyfinPlayer/EpisodeItemView.swift index 25a89310..2c204b8b 100644 --- a/JellyfinPlayer/EpisodeItemView.swift +++ b/JellyfinPlayer/EpisodeItemView.swift @@ -377,7 +377,7 @@ struct EpisodeItemView: View { } else { GeometryReader { geometry in ZStack() { - WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.ParentBackdropItemId)/Images/Backdrop?maxWidth=750&quality=90&tag=\(fullItem.Backdrop)")!) + WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.ParentBackdropItemId)/Images/Backdrop?maxWidth=\(String(Int(geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing)))&quality=80&tag=\(fullItem.Backdrop)")!) .resizable() // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size .placeholder { Image(uiImage: UIImage(blurHash: (fullItem.BackdropBlurHash == "" ? "W$H.4}D%bdo#a#xbtpxVW?W?jXWsXVt7Rjf5axWqxbWXnhada{s-" : fullItem.BackdropBlurHash), size: CGSize(width: 32, height: 32))!) @@ -389,6 +389,7 @@ struct EpisodeItemView: View { .aspectRatio(contentMode: .fill) .frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing, height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom) .edgesIgnoringSafeArea(.all) + .blur(radius:2) HStack() { VStack() { WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.SeriesId ?? "")/Images/Primary?maxWidth=250&quality=90&tag=\(fullItem.Poster)")!) @@ -529,7 +530,7 @@ struct EpisodeItemView: View { } Spacer().frame(width: 10) } - Spacer().frame(width: UIDevice.current.userInterfaceIdiom == .pad ? 16 : 55) + Spacer().frame(width: 55) } } }.padding(.top, -3) diff --git a/JellyfinPlayer/LibraryView.swift b/JellyfinPlayer/LibraryView.swift index bdb9d473..a57a3f5f 100644 --- a/JellyfinPlayer/LibraryView.swift +++ b/JellyfinPlayer/LibraryView.swift @@ -20,7 +20,7 @@ struct LibraryView: View { @State private var isLoading: Bool = true; @State private var viewDidLoad: Bool = false; - @State private var filterString: String = "&SortBy=SortName&SortOrder=Descending"; + @State private var filterString: String = "&SortBy=SortName&SortOrder=Ascending"; @State private var showFiltersPopover: Bool = false; @State private var showSearchPopover: Bool = false; @State private var extraParam: String = ""; @@ -261,6 +261,27 @@ struct LibraryView: View { } } Spacer().frame(height: 16) + if(totalItemCount > itemsPerPage) { + HStack() { + Spacer() + if(firstItemIndex != 0) { + Button { + previousPage() + } label: { + Image(systemName: "chevron.left").font(.system(size: 30)) + } + } + if(lastItemIndex != totalItemCount) { + Button { + nextPage() + } label: { + Image(systemName: "chevron.right").font(.system(size: 30)) + } + } + Spacer() + } + } + Spacer().frame(height: 16) } .gesture( DragGesture().onChanged { value in diff --git a/JellyfinPlayer/MovieItemView.swift b/JellyfinPlayer/MovieItemView.swift index 7f752525..8642325e 100644 --- a/JellyfinPlayer/MovieItemView.swift +++ b/JellyfinPlayer/MovieItemView.swift @@ -425,7 +425,7 @@ struct MovieItemView: View { } else { GeometryReader { geometry in ZStack() { - WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.Id)/Images/Backdrop?maxWidth=750&quality=90&tag=\(fullItem.Backdrop)")!) + WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.Id)/Images/Backdrop?maxWidth=\(String(Int(geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing)))&quality=80&tag=\(fullItem.Backdrop)")!) .resizable() // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size .placeholder { Image(uiImage: UIImage(blurHash: (fullItem.BackdropBlurHash == "" ? "W$H.4}D%bdo#a#xbtpxVW?W?jXWsXVt7Rjf5axWqxbWXnhada{s-" : fullItem.BackdropBlurHash), size: CGSize(width: 16, height: 16))!) @@ -437,6 +437,7 @@ struct MovieItemView: View { .aspectRatio(contentMode: .fill) .frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing, height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom) .edgesIgnoringSafeArea(.all) + .blur(radius:2) HStack() { VStack() { WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.Id)/Images/Primary?maxWidth=250&quality=90&tag=\(fullItem.Poster)")!) @@ -576,7 +577,7 @@ struct MovieItemView: View { } Spacer().frame(width: 10) } - Spacer().frame(width: UIDevice.current.userInterfaceIdiom == .pad ? 16 : 55) + Spacer().frame(width: 55) } } }.padding(.top, -3).padding(.trailing, UIDevice.current.userInterfaceIdiom == .pad ? -55 : 0) diff --git a/JellyfinPlayer/SeasonItemView.swift b/JellyfinPlayer/SeasonItemView.swift index c25e10d7..0f449b09 100644 --- a/JellyfinPlayer/SeasonItemView.swift +++ b/JellyfinPlayer/SeasonItemView.swift @@ -333,7 +333,7 @@ struct SeasonItemView: View { } else { GeometryReader { geometry in ZStack { - WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.SeriesId ?? "")/Images/Backdrop?maxWidth=750&quality=80&tag=\(item.SeasonImage ?? "")")!) + WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.SeriesId ?? "")/Images/Backdrop?maxWidth=\(String(Int(geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing)))&quality=80&tag=\(item.SeasonImage ?? "")")!) .resizable() // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size .placeholder { Image(uiImage: UIImage(blurHash: item @@ -352,6 +352,7 @@ struct SeasonItemView: View { .frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing, height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom) .edgesIgnoringSafeArea(.all) + .blur(radius:2) HStack { VStack(alignment: .leading) { WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(fullItem.Id)/Images/Primary?maxWidth=250&quality=90&tag=\(fullItem.Poster)")!) @@ -382,9 +383,11 @@ struct SeasonItemView: View { .fixedSize(horizontal: false, vertical: true).padding(.leading, 16) .padding(.trailing, 16) } - Text(fullItem.Overview).font(.footnote).padding(.top, 3) - .fixedSize(horizontal: false, vertical: true).padding(.bottom, 3).padding(.leading, 16) - .padding(.trailing, 16) + if(fullItem.Overview != "") { + Text(fullItem.Overview).font(.footnote).padding(.top, 3) + .fixedSize(horizontal: false, vertical: true).padding(.bottom, 3).padding(.leading, 16) + .padding(.trailing, 16) + } ForEach(episodes, id: \.Id) { episode in NavigationLink(destination: ItemView(item: episode.ResumeItem ?? ResumeItem())) { HStack { @@ -473,7 +476,7 @@ struct SeasonItemView: View { } Spacer().frame(height: 125) }.frame(maxHeight: .infinity) - }.padding(.trailing, UIDevice.current.userInterfaceIdiom == .pad ? 16 : 55).padding(.top, -16) + }.padding(.trailing, UIDevice.current.userInterfaceIdiom == .pad ? 16 : 55) }.padding(.top, 16).padding(.leading, UIDevice.current.userInterfaceIdiom == .pad ? 16 : 0) } }