// // LibraryView.swift // JellyfinPlayer // // Created by Aiden Vigue on 5/1/21. // import SwiftUI import SwiftyRequest import SwiftyJSON import ExyteGrid import SDWebImageSwiftUI struct LibraryView: View { @Environment(\.managedObjectContext) private var viewContext @EnvironmentObject var globalData: GlobalData @State private var prefill_id: String = ""; @State private var library_names: [String: String] = [:] @State private var library_ids: [String] = [] @State private var selected_library_id: String = ""; @State private var isLoading: Bool = true; @State private var startIndex: Int = 0; @State private var endIndex: Int = 60; @State private var totalItems: Int = 0; @State private var viewDidLoad: Bool = false; @State private var filterString: String = "&SortBy=SortName&SortOrder=Descending"; @State private var showFiltersPopover: Bool = false; @State private var showSearchPopover: Bool = false; @State private var extraParam: String = ""; @State private var title: String = ""; @State private var url: String = ""; @State private var closeSearch: Bool = false; init(prefill: String?, names: [String: String], libraries: [String]) { _prefill_id = State(wrappedValue: prefill ?? "") _library_names = State(wrappedValue: names) _library_ids = State(wrappedValue: libraries) } init(prefill: String?, names: [String: String], libraries: [String], filter: String) { _prefill_id = State(wrappedValue: prefill ?? "") _library_names = State(wrappedValue: names) _library_ids = State(wrappedValue: libraries) _filterString = State(wrappedValue: filter); } init(filter: String, extraParams: String, title: String) { _prefill_id = State(wrappedValue: "erwt"); _filterString = State(wrappedValue: filter); _extraParam = State(wrappedValue: extraParams); _title = State(wrappedValue: title) } init(extraParams: String, title: String) { _prefill_id = State(wrappedValue: "erwt"); _extraParam = State(wrappedValue: extraParams); _title = State(wrappedValue: title) } @State var items: [ResumeItem] = [] func listOnAppear() { if(_viewDidLoad.wrappedValue == false) { //print("running VDL") _viewDidLoad.wrappedValue = true; _library_ids.wrappedValue.append("favorites") _library_names.wrappedValue["favorites"] = "Favorites" _library_ids.wrappedValue.append("genres") _library_names.wrappedValue["genres"] = "Genres - WIP" } } func loadItems() { recalcTracks() _isLoading.wrappedValue = true; if(_extraParam.wrappedValue == "") { _url.wrappedValue = "/Users/\(globalData.user?.user_id ?? "")/Items?Limit=\(endIndex)&StartIndex=\(startIndex)&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 { _url.wrappedValue = "/Users/\(globalData.user?.user_id ?? "")/Items?Limit=\(endIndex)&StartIndex=\(startIndex)&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) request.headerParameters["X-Emby-Authorization"] = globalData.authHeader request.contentType = "application/json" request.acceptType = "application/json" request.responseData() { (result: Result, RestError>) in switch result { case .success(let response): let body = response.body do { let json = try JSON(data: body) _totalItems.wrappedValue = json["TotalRecordCount"].int ?? 0; for (_,item):(String, JSON) in json["Items"] { // Do something you want let itemObj = ResumeItem() itemObj.Type = item["Type"].string ?? "" if(itemObj.Type == "Series") { itemObj.ItemBadge = item["UserData"]["UnplayedItemCount"].int ?? 0 itemObj.Image = item["ImageTags"]["Primary"].string ?? "" itemObj.ImageType = "Primary" itemObj.BlurHash = item["ImageBlurHashes"]["Primary"][itemObj.Image].string ?? "" itemObj.Name = item["Name"].string ?? "" itemObj.Type = item["Type"].string ?? "" itemObj.IndexNumber = nil itemObj.Id = item["Id"].string ?? "" itemObj.ParentIndexNumber = nil itemObj.SeasonId = nil itemObj.SeriesId = nil itemObj.SeriesName = nil itemObj.ProductionYear = item["ProductionYear"].int ?? 0 } else { itemObj.ProductionYear = item["ProductionYear"].int ?? 0 itemObj.Image = item["ImageTags"]["Primary"].string ?? "" itemObj.ImageType = "Primary" itemObj.BlurHash = item["ImageBlurHashes"]["Primary"][itemObj.Image].string ?? "" itemObj.Name = item["Name"].string ?? "" itemObj.Type = item["Type"].string ?? "" itemObj.IndexNumber = item["IndexNumber"].int ?? nil itemObj.Id = item["Id"].string ?? "" itemObj.ParentIndexNumber = item["ParentIndexNumber"].int ?? nil itemObj.SeasonId = item["SeasonId"].string ?? nil itemObj.SeriesId = item["SeriesId"].string ?? nil itemObj.SeriesName = item["SeriesName"].string ?? nil } itemObj.Watched = item["UserData"]["Played"].bool ?? false _items.wrappedValue.append(itemObj) } } catch { } break case .failure(let error): debugPrint(error) break } _isLoading.wrappedValue = false; } } func onAppear() { if(_prefill_id.wrappedValue != "") { _selected_library_id.wrappedValue = _prefill_id.wrappedValue; } if(_items.wrappedValue.count == 0) { loadItems() } } @Environment(\.verticalSizeClass) var verticalSizeClass: UserInterfaceSizeClass? @Environment(\.horizontalSizeClass) var horizontalSizeClass: UserInterfaceSizeClass? var isPortrait: Bool { let result = verticalSizeClass == .regular && horizontalSizeClass == .compact return result } func recalcTracks() { let trkCnt: Int = Int(floor(UIScreen.main.bounds.size.width / 125)); _tracks.wrappedValue = [] for _ in (0..