diff --git a/JellyfinPlayer/SeriesItemView.swift b/JellyfinPlayer/SeriesItemView.swift index 801361dd..325bd684 100644 --- a/JellyfinPlayer/SeriesItemView.swift +++ b/JellyfinPlayer/SeriesItemView.swift @@ -208,7 +208,7 @@ struct SeriesItemView: View { } } } - .padding(.top, 16) + .padding([.top, .leading], 16) innerBody } } diff --git a/Shared/Extensions/APIExtensions.swift b/Shared/Extensions/APIExtensions.swift index 7ebbbdd1..24a8a5f4 100644 --- a/Shared/Extensions/APIExtensions.swift +++ b/Shared/Extensions/APIExtensions.swift @@ -12,70 +12,71 @@ import UIKit // 001fC^ = dark grey plain blurhash extension BaseItemDto { - // MARK: Images + func getSeriesBackdropImageBlurHash() -> String { - let rawImgURL = self.getSeriesBackdropImage(maxWidth: 1).absoluteString + let rawImgURL = getSeriesBackdropImage(maxWidth: 1).absoluteString let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] - return self.imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" + return imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" } func getSeriesPrimaryImageBlurHash() -> String { - let rawImgURL = self.getSeriesPrimaryImage(maxWidth: 1).absoluteString + let rawImgURL = getSeriesPrimaryImage(maxWidth: 1).absoluteString let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] - return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^" + return imageBlurHashes?.primary?[imgTag] ?? "001fC^" } func getPrimaryImageBlurHash() -> String { - let rawImgURL = self.getPrimaryImage(maxWidth: 1).absoluteString + let rawImgURL = getPrimaryImage(maxWidth: 1).absoluteString let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] - return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^" + return imageBlurHashes?.primary?[imgTag] ?? "001fC^" } func getBackdropImageBlurHash() -> String { - let rawImgURL = self.getBackdropImage(maxWidth: 1).absoluteString + let rawImgURL = getBackdropImage(maxWidth: 1).absoluteString let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] if rawImgURL.contains("Backdrop") { - return self.imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" + return imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" } else { - return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^" + return imageBlurHashes?.primary?[imgTag] ?? "001fC^" } } func getBackdropImage(maxWidth: Int) -> URL { var imageType = "" var imageTag = "" - var imageItemId = self.id ?? "" + var imageItemId = id ?? "" - if self.primaryImageAspectRatio ?? 0.0 < 1.0 { + if primaryImageAspectRatio ?? 0.0 < 1.0 { imageType = "Backdrop" - if !(self.backdropImageTags?.isEmpty ?? true) { - imageTag = (self.backdropImageTags ?? [""])[0] + if !(backdropImageTags?.isEmpty ?? true) { + imageTag = (backdropImageTags ?? [""])[0] } } else { imageType = "Primary" - imageTag = self.imageTags?["Primary"] ?? "" + imageTag = imageTags?["Primary"] ?? "" } if imageTag == "" || imageItemId == "" { imageType = "Backdrop" - if !(self.parentBackdropImageTags?.isEmpty ?? true) { - imageTag = (self.parentBackdropImageTags ?? [""])[0] - imageItemId = self.parentBackdropItemId ?? "" + if !(parentBackdropImageTags?.isEmpty ?? true) { + imageTag = (parentBackdropImageTags ?? [""])[0] + imageItemId = parentBackdropItemId ?? "" } } let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = "\(ServerEnvironment.current.server.baseURI!)/Items/\(imageItemId)/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" + let urlString = + "\(ServerEnvironment.current.server.baseURI!)/Items/\(imageItemId)/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" return URL(string: urlString)! } func getEpisodeLocator() -> String { - if let seasonNo = self.parentIndexNumber, let episodeNo = self.indexNumber { + if let seasonNo = parentIndexNumber, let episodeNo = indexNumber { return "S\(seasonNo):E\(episodeNo)" } return "" @@ -83,39 +84,43 @@ extension BaseItemDto { func getSeriesBackdropImage(maxWidth: Int) -> URL { let imageType = "Backdrop" - let imageTag = (self.parentBackdropImageTags ?? [""])[0] + let imageTag = (parentBackdropImageTags ?? [""])[0] let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = "\(ServerEnvironment.current.server.baseURI!)/Items/\(self.parentBackdropItemId ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" + let urlString = + "\(ServerEnvironment.current.server.baseURI!)/Items/\(parentBackdropItemId ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" return URL(string: urlString)! } func getSeriesPrimaryImage(maxWidth: Int) -> URL { let imageType = "Primary" - let imageTag = self.seriesPrimaryImageTag ?? "" + let imageTag = seriesPrimaryImageTag ?? "" let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = "\(ServerEnvironment.current.server.baseURI!)/Items/\(self.seriesId ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" + let urlString = + "\(ServerEnvironment.current.server.baseURI!)/Items/\(seriesId ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" return URL(string: urlString)! } func getPrimaryImage(maxWidth: Int) -> URL { let imageType = "Primary" - var imageTag = self.imageTags?["Primary"] ?? "" - var imageItemId = self.id ?? "" + var imageTag = imageTags?["Primary"] ?? "" + var imageItemId = id ?? "" if imageTag == "" || imageItemId == "" { - imageTag = self.seriesPrimaryImageTag ?? "" - imageItemId = self.seriesId ?? "" + imageTag = seriesPrimaryImageTag ?? "" + imageItemId = seriesId ?? "" } let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = "\(ServerEnvironment.current.server.baseURI!)/Items/\(imageItemId)/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" + let urlString = + "\(ServerEnvironment.current.server.baseURI!)/Items/\(imageItemId)/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" // print(urlString) return URL(string: urlString)! } // MARK: Calculations + func getItemRuntime() -> String { let timeHMSFormatter: DateComponentsFormatter = { let formatter = DateComponentsFormatter() @@ -124,17 +129,18 @@ extension BaseItemDto { return formatter }() - let text = timeHMSFormatter.string(from: Double(self.runTimeTicks! / 10_000_000)) ?? "" + guard let runTimeTicks = runTimeTicks, + let text = timeHMSFormatter.string(from: Double(runTimeTicks / 10_000_000)) else { return "" } return text } func getItemProgressString() -> String { - if self.userData?.playbackPositionTicks == nil || self.userData?.playbackPositionTicks == 0 { + if userData?.playbackPositionTicks == nil || userData?.playbackPositionTicks == 0 { return "" } - let remainingSecs = ((self.runTimeTicks ?? 0) - (self.userData?.playbackPositionTicks ?? 0)) / 10_000_000 + let remainingSecs = ((runTimeTicks ?? 0) - (userData?.playbackPositionTicks ?? 0)) / 10_000_000 let proghours = Int(remainingSecs / 3600) let progminutes = Int((Int(remainingSecs) - (proghours * 3600)) / 60) if proghours != 0 { @@ -146,24 +152,24 @@ extension BaseItemDto { } func round(_ value: Double, toNearest: Double) -> Double { - return round(value / toNearest) * toNearest + return round(value / toNearest) * toNearest } extension BaseItemPerson { func getImage(baseURL: String, maxWidth: Int) -> URL { let imageType = "Primary" - let imageTag = self.primaryImageTag ?? "" + let imageTag = primaryImageTag ?? "" let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = "\(baseURL)/Items/\(self.id ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=85&tag=\(imageTag)" + let urlString = "\(baseURL)/Items/\(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 rawImgURL = getImage(baseURL: "", maxWidth: 1).absoluteString let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] - return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^" + return imageBlurHashes?.primary?[imgTag] ?? "001fC^" } }