/* SwiftFin is subject to the terms of the Mozilla Public * License, v2.0. If a copy of the MPL was not distributed with this * file, you can obtain one at https://mozilla.org/MPL/2.0/. * * Copyright 2021 Aiden Vigue & Jellyfin Contributors */ import Foundation import JellyfinAPI import UIKit //001fC^ = dark grey plain blurhash extension BaseItemDto { //MARK: Images func getSeriesBackdropImageBlurHash() -> String { let rawImgURL = self.getSeriesBackdropImage(baseURL: "", maxWidth: 1).absoluteString; let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]; return self.imageBlurHashes?.backdrop?[imgTag] ?? "001fC^"; } func getSeriesPrimaryImageBlurHash() -> String { let rawImgURL = self.getSeriesPrimaryImage(baseURL: "", maxWidth: 1).absoluteString; let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]; return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^"; } func getPrimaryImageBlurHash() -> String { let rawImgURL = self.getPrimaryImage(baseURL: "", maxWidth: 1).absoluteString; let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]; return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^"; } func getBackdropImageBlurHash() -> String { let rawImgURL = self.getBackdropImage(baseURL: "", maxWidth: 1).absoluteString; let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]; if(rawImgURL.contains("Backdrop")) { return self.imageBlurHashes?.backdrop?[imgTag] ?? "001fC^"; } else { return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^"; } } func getBackdropImage(baseURL: String, maxWidth: Int) -> URL { var imageType = ""; var imageTag = ""; if(self.primaryImageAspectRatio ?? 0.0 < 1.0) { imageType = "Backdrop"; imageTag = (self.backdropImageTags ?? [""])[0] } else { imageType = "Primary"; imageTag = self.imageTags?["Primary"] ?? "" } if(imageTag == "") { imageType = "Backdrop"; imageTag = self.parentBackdropImageTags?[0] ?? "" } let x = UIScreen.main.nativeScale * CGFloat(maxWidth) let urlString = "\(baseURL)/Items/\(self.id ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=85&tag=\(imageTag)" return URL(string: urlString)! } func getSeriesBackdropImage(baseURL: String, maxWidth: Int) -> URL { let imageType = "Backdrop"; let imageTag = (self.parentBackdropImageTags ?? [])[0]; print(imageType) print(imageTag) let x = UIScreen.main.nativeScale * CGFloat(maxWidth) let urlString = "\(baseURL)/Items/\(self.parentBackdropItemId ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=85&tag=\(imageTag)" return URL(string: urlString)! } func getSeriesPrimaryImage(baseURL: String, maxWidth: Int) -> URL { let imageType = "Primary"; let imageTag = self.seriesPrimaryImageTag ?? "" let x = UIScreen.main.nativeScale * CGFloat(maxWidth) let urlString = "\(baseURL)/Items/\(self.seriesId ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=85&tag=\(imageTag)" return URL(string: urlString)! } func getPrimaryImage(baseURL: String, maxWidth: Int) -> URL { let imageType = "Primary"; var imageTag = self.imageTags?["Primary"] ?? ""; if(imageTag == "") { imageTag = self.seriesPrimaryImageTag ?? "" } let x = UIScreen.main.nativeScale * CGFloat(maxWidth) let urlString = "\(baseURL)/Items/\(self.id ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=85&tag=\(imageTag)" return URL(string: urlString)! } //MARK: Calculations func getItemRuntime() -> String { let seconds: Int = Int(self.runTimeTicks!) / 10_000_000 let hours = (seconds / 3600) let minutes = ((seconds - (hours * 3600)) / 60) if hours != 0 { return "\(hours):\(String(minutes).leftPad(toWidth: 2, withString: "0"))" } else { return "\(String(minutes).leftPad(toWidth: 2, withString: "0"))m" } } func getItemProgressString() -> String { if(self.userData?.playbackPositionTicks == nil || self.userData?.playbackPositionTicks == 0) { return ""; } let remainingSecs = Int(self.runTimeTicks! - (self.userData?.playbackPositionTicks!)!) / 10_000_000 let proghours = Int(remainingSecs / 3600) let progminutes = Int((Int(remainingSecs) - (proghours * 3600)) / 60) if proghours != 0 { return "\(proghours):\(String(progminutes).leftPad(toWidth: 2, withString: "0"))" } else { return "\(String(progminutes).leftPad(toWidth: 2, withString: "0"))m" } } } extension BaseItemPerson { func getImage(baseURL: String, maxWidth: Int) -> URL { let imageType = "Primary"; let imageTag = self.primaryImageTag ?? "" let x = UIScreen.main.nativeScale * CGFloat(maxWidth) let urlString = "\(baseURL)/Items/\(self.id ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=85&tag=\(imageTag)" return URL(string: urlString)! } func getBlurHash() -> String { let rawImgURL = self.getImage(baseURL: "", maxWidth: 1).absoluteString; let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]; return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^"; } }