Switch to paginated libraryview
This commit is contained in:
parent
51dd404680
commit
efeb1c142e
|
@ -462,7 +462,7 @@
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 17;
|
CURRENT_PROJECT_VERSION = 18;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer/Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer/Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = 9R8RREG67J;
|
DEVELOPMENT_TEAM = 9R8RREG67J;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
|
@ -491,7 +491,7 @@
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 17;
|
CURRENT_PROJECT_VERSION = 18;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer/Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer/Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = 9R8RREG67J;
|
DEVELOPMENT_TEAM = 9R8RREG67J;
|
||||||
|
|
|
@ -138,7 +138,7 @@ class PreferenceUIHostingController: UIHostingController<AnyView> {
|
||||||
public var _orientations: UIInterfaceOrientationMask = .allButUpsideDown {
|
public var _orientations: UIInterfaceOrientationMask = .allButUpsideDown {
|
||||||
didSet {
|
didSet {
|
||||||
UIViewController.attemptRotationToDeviceOrientation();
|
UIViewController.attemptRotationToDeviceOrientation();
|
||||||
if(_orientations == .landscapeRight) {
|
if(_orientations == .landscape) {
|
||||||
let value = UIInterfaceOrientation.landscapeRight.rawValue;
|
let value = UIInterfaceOrientation.landscapeRight.rawValue;
|
||||||
UIDevice.current.setValue(value, forKey: "orientation")
|
UIDevice.current.setValue(value, forKey: "orientation")
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,7 +180,6 @@ struct ContinueWatchingView: View {
|
||||||
EmptyView()
|
EmptyView()
|
||||||
}
|
}
|
||||||
}.onAppear(perform: onAppear)
|
}.onAppear(perform: onAppear)
|
||||||
.frame(height: 215)
|
|
||||||
.padding(.bottom, 10)
|
.padding(.bottom, 10)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>$(MARKETING_VERSION)</string>
|
<string>$(MARKETING_VERSION)</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>17</string>
|
<string>18</string>
|
||||||
<key>DTXApplicationID</key>
|
<key>DTXApplicationID</key>
|
||||||
<string>8c1f6941-ec78-480c-b589-b41aca29a52e</string>
|
<string>8c1f6941-ec78-480c-b589-b41aca29a52e</string>
|
||||||
<key>DTXBeaconURL</key>
|
<key>DTXBeaconURL</key>
|
||||||
|
|
|
@ -28,6 +28,12 @@ struct LibraryView: View {
|
||||||
@State private var url: String = "";
|
@State private var url: String = "";
|
||||||
@State private var closeSearch: Bool = false;
|
@State private var closeSearch: Bool = false;
|
||||||
|
|
||||||
|
private var itemsPerPage: Int = 100;
|
||||||
|
|
||||||
|
@State private var firstItemIndex: Int = 0;
|
||||||
|
@State private var lastItemIndex: Int = 0;
|
||||||
|
@State private var totalItemCount: Int = 0;
|
||||||
|
|
||||||
init(prefill: String?, names: [String: String], libraries: [String]) {
|
init(prefill: String?, names: [String: String], libraries: [String]) {
|
||||||
_prefill_id = State(wrappedValue: prefill ?? "")
|
_prefill_id = State(wrappedValue: prefill ?? "")
|
||||||
_library_names = State(wrappedValue: names)
|
_library_names = State(wrappedValue: names)
|
||||||
|
@ -72,9 +78,9 @@ struct LibraryView: View {
|
||||||
recalcTracks()
|
recalcTracks()
|
||||||
_isLoading.wrappedValue = true;
|
_isLoading.wrappedValue = true;
|
||||||
if(_extraParam.wrappedValue == "") {
|
if(_extraParam.wrappedValue == "") {
|
||||||
_url.wrappedValue = "/Users/\(globalData.user?.user_id ?? "")/Items?&Recursive=true&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo&ImageTypeLimit=1&EnableImageTypes=Primary%2CBackdrop%2CThumb%2CBanner&IncludeItemTypes=Movie,Series\(selected_library_id == "favorites" ? "&Filters=IsFavorite" : "&ParentId=" + selected_library_id)\(filterString)"
|
_url.wrappedValue = "/Users/\(globalData.user?.user_id ?? "")/Items?Limit=\(lastItemIndex - firstItemIndex)&StartIndex=\(firstItemIndex)&Recursive=true&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo&ImageTypeLimit=1&EnableImageTypes=Primary%2CBackdrop%2CThumb%2CBanner&IncludeItemTypes=Movie,Series\(selected_library_id == "favorites" ? "&Filters=IsFavorite" : "&ParentId=" + selected_library_id)\(filterString)"
|
||||||
} else {
|
} else {
|
||||||
_url.wrappedValue = "/Users/\(globalData.user?.user_id ?? "")/Items?&Recursive=true&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo&ImageTypeLimit=1&EnableImageTypes=Primary%2CBackdrop%2CThumb%2CBanner&IncludeItemTypes=Movie,Series\(filterString)\(extraParam)"
|
_url.wrappedValue = "/Users/\(globalData.user?.user_id ?? "")/Items?Limit=\(lastItemIndex - firstItemIndex)&StartIndex=\(firstItemIndex)&Recursive=true&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo&ImageTypeLimit=1&EnableImageTypes=Primary%2CBackdrop%2CThumb%2CBanner&IncludeItemTypes=Movie,Series\(filterString)\(extraParam)"
|
||||||
}
|
}
|
||||||
|
|
||||||
let request = RestRequest(method: .get, url: (globalData.server?.baseURI ?? "") + _url.wrappedValue)
|
let request = RestRequest(method: .get, url: (globalData.server?.baseURI ?? "") + _url.wrappedValue)
|
||||||
|
@ -88,6 +94,7 @@ struct LibraryView: View {
|
||||||
let body = response.body
|
let body = response.body
|
||||||
do {
|
do {
|
||||||
let json = try JSON(data: body)
|
let json = try JSON(data: body)
|
||||||
|
_totalItemCount.wrappedValue = json["TotalRecordCount"].int ?? 0;
|
||||||
for (_,item):(String, JSON) in json["Items"] {
|
for (_,item):(String, JSON) in json["Items"] {
|
||||||
// Do something you want
|
// Do something you want
|
||||||
let itemObj = ResumeItem()
|
let itemObj = ResumeItem()
|
||||||
|
@ -121,7 +128,6 @@ struct LibraryView: View {
|
||||||
itemObj.SeriesName = item["SeriesName"].string ?? nil
|
itemObj.SeriesName = item["SeriesName"].string ?? nil
|
||||||
}
|
}
|
||||||
itemObj.Watched = item["UserData"]["Played"].bool ?? false
|
itemObj.Watched = item["UserData"]["Played"].bool ?? false
|
||||||
|
|
||||||
_items.wrappedValue.append(itemObj)
|
_items.wrappedValue.append(itemObj)
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
@ -141,10 +147,38 @@ struct LibraryView: View {
|
||||||
_selected_library_id.wrappedValue = _prefill_id.wrappedValue;
|
_selected_library_id.wrappedValue = _prefill_id.wrappedValue;
|
||||||
}
|
}
|
||||||
if(_items.wrappedValue.count == 0) {
|
if(_items.wrappedValue.count == 0) {
|
||||||
|
_firstItemIndex.wrappedValue = 0;
|
||||||
|
_lastItemIndex.wrappedValue = itemsPerPage;
|
||||||
loadItems()
|
loadItems()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func nextPage() {
|
||||||
|
_firstItemIndex.wrappedValue = _lastItemIndex.wrappedValue;
|
||||||
|
_lastItemIndex.wrappedValue = _firstItemIndex.wrappedValue + itemsPerPage;
|
||||||
|
|
||||||
|
if(_lastItemIndex.wrappedValue > _totalItemCount.wrappedValue) {
|
||||||
|
_firstItemIndex.wrappedValue = _totalItemCount.wrappedValue - itemsPerPage;
|
||||||
|
_lastItemIndex.wrappedValue = _totalItemCount.wrappedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_items.wrappedValue = [];
|
||||||
|
loadItems()
|
||||||
|
}
|
||||||
|
|
||||||
|
func previousPage() {
|
||||||
|
_lastItemIndex.wrappedValue = _firstItemIndex.wrappedValue;
|
||||||
|
_firstItemIndex.wrappedValue = _lastItemIndex.wrappedValue - itemsPerPage;
|
||||||
|
|
||||||
|
if(_firstItemIndex.wrappedValue < 0) {
|
||||||
|
_firstItemIndex.wrappedValue = 0;
|
||||||
|
_lastItemIndex.wrappedValue = itemsPerPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
_items.wrappedValue = [];
|
||||||
|
loadItems()
|
||||||
|
}
|
||||||
|
|
||||||
@Environment(\.verticalSizeClass) var verticalSizeClass: UserInterfaceSizeClass?
|
@Environment(\.verticalSizeClass) var verticalSizeClass: UserInterfaceSizeClass?
|
||||||
@Environment(\.horizontalSizeClass) var horizontalSizeClass: UserInterfaceSizeClass?
|
@Environment(\.horizontalSizeClass) var horizontalSizeClass: UserInterfaceSizeClass?
|
||||||
|
|
||||||
|
@ -177,7 +211,7 @@ struct LibraryView: View {
|
||||||
WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(item.Id)/Images/\(item.ImageType)?maxWidth=150&quality=80&tag=\(item.Image)"))
|
WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(item.Id)/Images/\(item.ImageType)?maxWidth=150&quality=80&tag=\(item.Image)"))
|
||||||
.resizable()
|
.resizable()
|
||||||
.placeholder {
|
.placeholder {
|
||||||
Image(uiImage: UIImage(blurHash: (item.BlurHash == "" ? "W$H.4}D%bdo#a#xbtpxVW?W?jXWsXVt7Rjf5axWqxbWXnhada{s-" : item.BlurHash), size: CGSize(width: 6, height: 6))!)
|
Image(uiImage: UIImage(blurHash: (item.BlurHash == "" ? "W$H.4}D%bdo#a#xbtpxVW?W?jXWsXVt7Rjf5axWqxbWXnhada{s-" : item.BlurHash), size: CGSize(width: 16, height: 16))!)
|
||||||
.resizable()
|
.resizable()
|
||||||
.frame(width: 100, height: 150)
|
.frame(width: 100, height: 150)
|
||||||
.cornerRadius(10)
|
.cornerRadius(10)
|
||||||
|
@ -188,7 +222,7 @@ struct LibraryView: View {
|
||||||
WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(item.Id)/Images/\(item.ImageType)?maxWidth=150&quality=80&tag=\(item.Image)"))
|
WebImage(url: URL(string: "\(globalData.server?.baseURI ?? "")/Items/\(item.Id)/Images/\(item.ImageType)?maxWidth=150&quality=80&tag=\(item.Image)"))
|
||||||
.resizable()
|
.resizable()
|
||||||
.placeholder {
|
.placeholder {
|
||||||
Image(uiImage: UIImage(blurHash: (item.BlurHash == "" ? "W$H.4}D%bdo#a#xbtpxVW?W?jXWsXVt7Rjf5axWqxbWXnhada{s-" : item.BlurHash), size: CGSize(width: 6, height: 6))!)
|
Image(uiImage: UIImage(blurHash: (item.BlurHash == "" ? "W$H.4}D%bdo#a#xbtpxVW?W?jXWsXVt7Rjf5axWqxbWXnhada{s-" : item.BlurHash), size: CGSize(width: 16, height: 16))!)
|
||||||
.resizable()
|
.resizable()
|
||||||
.frame(width: 100, height: 150)
|
.frame(width: 100, height: 150)
|
||||||
.cornerRadius(10)
|
.cornerRadius(10)
|
||||||
|
@ -228,6 +262,15 @@ struct LibraryView: View {
|
||||||
}
|
}
|
||||||
Spacer().frame(height: 16)
|
Spacer().frame(height: 16)
|
||||||
}
|
}
|
||||||
|
.gesture(
|
||||||
|
DragGesture().onChanged { value in
|
||||||
|
if value.translation.height > 0 {
|
||||||
|
print("Scroll down")
|
||||||
|
} else {
|
||||||
|
print("Scroll up")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
.onChange(of: isPortrait) { _ in
|
.onChange(of: isPortrait) { _ in
|
||||||
recalcTracks()
|
recalcTracks()
|
||||||
}
|
}
|
||||||
|
@ -242,6 +285,20 @@ struct LibraryView: View {
|
||||||
.navigationTitle(extraParam == "" ? (library_names[prefill_id] ?? "Library") : title)
|
.navigationTitle(extraParam == "" ? (library_names[prefill_id] ?? "Library") : title)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
ToolbarItemGroup(placement: .navigationBarTrailing) {
|
ToolbarItemGroup(placement: .navigationBarTrailing) {
|
||||||
|
if(firstItemIndex != 0) {
|
||||||
|
Button {
|
||||||
|
previousPage()
|
||||||
|
} label: {
|
||||||
|
Image(systemName: "chevron.left")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(lastItemIndex != totalItemCount) {
|
||||||
|
Button {
|
||||||
|
nextPage()
|
||||||
|
} label: {
|
||||||
|
Image(systemName: "chevron.right")
|
||||||
|
}
|
||||||
|
}
|
||||||
NavigationLink(destination: LibrarySearchView(url: url, close: $closeSearch), isActive: $closeSearch) {
|
NavigationLink(destination: LibrarySearchView(url: url, close: $closeSearch), isActive: $closeSearch) {
|
||||||
Image(systemName: "magnifyingglass")
|
Image(systemName: "magnifyingglass")
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@ struct NextUpView: View {
|
||||||
.frame(width: 100)
|
.frame(width: 100)
|
||||||
Spacer().frame(width:12)
|
Spacer().frame(width:12)
|
||||||
}
|
}
|
||||||
Spacer().frame(width: 13.6)
|
Spacer().frame(width: 10)
|
||||||
}
|
}
|
||||||
Spacer().frame(width:18)
|
Spacer().frame(width:18)
|
||||||
}
|
}
|
||||||
|
|
|
@ -489,6 +489,7 @@ struct VideoPlayerView: View {
|
||||||
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
|
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
|
||||||
.onAppear(perform: startStream)
|
.onAppear(perform: startStream)
|
||||||
.navigationBarHidden(true)
|
.navigationBarHidden(true)
|
||||||
|
.overrideViewPreference(.dark)
|
||||||
.navigationBarBackButtonHidden(true)
|
.navigationBarBackButtonHidden(true)
|
||||||
.edgesIgnoringSafeArea(.all)
|
.edgesIgnoringSafeArea(.all)
|
||||||
.introspectTabBarController { (UITabBarController) in
|
.introspectTabBarController { (UITabBarController) in
|
||||||
|
|
Loading…
Reference in New Issue