Merge pull request #143 from jellyfin/PangMo5/fix-crash

Fix crash when appearing some ItemView
This commit is contained in:
aiden 3 2021-08-15 20:01:17 -04:00 committed by GitHub
commit 6f243621c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 38 deletions

View File

@ -208,7 +208,7 @@ struct SeriesItemView: View {
} }
} }
} }
.padding(.top, 16) .padding([.top, .leading], 16)
innerBody innerBody
} }
} }

View File

@ -12,70 +12,71 @@ import UIKit
// 001fC^ = dark grey plain blurhash // 001fC^ = dark grey plain blurhash
extension BaseItemDto { extension BaseItemDto {
// MARK: Images // MARK: Images
func getSeriesBackdropImageBlurHash() -> String { func getSeriesBackdropImageBlurHash() -> String {
let rawImgURL = self.getSeriesBackdropImage(maxWidth: 1).absoluteString let rawImgURL = getSeriesBackdropImage(maxWidth: 1).absoluteString
let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]
return self.imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" return imageBlurHashes?.backdrop?[imgTag] ?? "001fC^"
} }
func getSeriesPrimaryImageBlurHash() -> String { func getSeriesPrimaryImageBlurHash() -> String {
let rawImgURL = self.getSeriesPrimaryImage(maxWidth: 1).absoluteString let rawImgURL = getSeriesPrimaryImage(maxWidth: 1).absoluteString
let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]
return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^" return imageBlurHashes?.primary?[imgTag] ?? "001fC^"
} }
func getPrimaryImageBlurHash() -> String { func getPrimaryImageBlurHash() -> String {
let rawImgURL = self.getPrimaryImage(maxWidth: 1).absoluteString let rawImgURL = getPrimaryImage(maxWidth: 1).absoluteString
let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]
return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^" return imageBlurHashes?.primary?[imgTag] ?? "001fC^"
} }
func getBackdropImageBlurHash() -> String { func getBackdropImageBlurHash() -> String {
let rawImgURL = self.getBackdropImage(maxWidth: 1).absoluteString let rawImgURL = getBackdropImage(maxWidth: 1).absoluteString
let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]
if rawImgURL.contains("Backdrop") { if rawImgURL.contains("Backdrop") {
return self.imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" return imageBlurHashes?.backdrop?[imgTag] ?? "001fC^"
} else { } else {
return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^" return imageBlurHashes?.primary?[imgTag] ?? "001fC^"
} }
} }
func getBackdropImage(maxWidth: Int) -> URL { func getBackdropImage(maxWidth: Int) -> URL {
var imageType = "" var imageType = ""
var imageTag = "" var imageTag = ""
var imageItemId = self.id ?? "" var imageItemId = id ?? ""
if self.primaryImageAspectRatio ?? 0.0 < 1.0 { if primaryImageAspectRatio ?? 0.0 < 1.0 {
imageType = "Backdrop" imageType = "Backdrop"
if !(self.backdropImageTags?.isEmpty ?? true) { if !(backdropImageTags?.isEmpty ?? true) {
imageTag = (self.backdropImageTags ?? [""])[0] imageTag = (backdropImageTags ?? [""])[0]
} }
} else { } else {
imageType = "Primary" imageType = "Primary"
imageTag = self.imageTags?["Primary"] ?? "" imageTag = imageTags?["Primary"] ?? ""
} }
if imageTag == "" || imageItemId == "" { if imageTag == "" || imageItemId == "" {
imageType = "Backdrop" imageType = "Backdrop"
if !(self.parentBackdropImageTags?.isEmpty ?? true) { if !(parentBackdropImageTags?.isEmpty ?? true) {
imageTag = (self.parentBackdropImageTags ?? [""])[0] imageTag = (parentBackdropImageTags ?? [""])[0]
imageItemId = self.parentBackdropItemId ?? "" imageItemId = parentBackdropItemId ?? ""
} }
} }
let x = UIScreen.main.nativeScale * CGFloat(maxWidth) 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)! return URL(string: urlString)!
} }
func getEpisodeLocator() -> String { 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 "S\(seasonNo):E\(episodeNo)"
} }
return "" return ""
@ -83,39 +84,43 @@ extension BaseItemDto {
func getSeriesBackdropImage(maxWidth: Int) -> URL { func getSeriesBackdropImage(maxWidth: Int) -> URL {
let imageType = "Backdrop" let imageType = "Backdrop"
let imageTag = (self.parentBackdropImageTags ?? [""])[0] let imageTag = (parentBackdropImageTags ?? [""])[0]
let x = UIScreen.main.nativeScale * CGFloat(maxWidth) 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)! return URL(string: urlString)!
} }
func getSeriesPrimaryImage(maxWidth: Int) -> URL { func getSeriesPrimaryImage(maxWidth: Int) -> URL {
let imageType = "Primary" let imageType = "Primary"
let imageTag = self.seriesPrimaryImageTag ?? "" let imageTag = seriesPrimaryImageTag ?? ""
let x = UIScreen.main.nativeScale * CGFloat(maxWidth) 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)! return URL(string: urlString)!
} }
func getPrimaryImage(maxWidth: Int) -> URL { func getPrimaryImage(maxWidth: Int) -> URL {
let imageType = "Primary" let imageType = "Primary"
var imageTag = self.imageTags?["Primary"] ?? "" var imageTag = imageTags?["Primary"] ?? ""
var imageItemId = self.id ?? "" var imageItemId = id ?? ""
if imageTag == "" || imageItemId == "" { if imageTag == "" || imageItemId == "" {
imageTag = self.seriesPrimaryImageTag ?? "" imageTag = seriesPrimaryImageTag ?? ""
imageItemId = self.seriesId ?? "" imageItemId = seriesId ?? ""
} }
let x = UIScreen.main.nativeScale * CGFloat(maxWidth) 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) // print(urlString)
return URL(string: urlString)! return URL(string: urlString)!
} }
// MARK: Calculations // MARK: Calculations
func getItemRuntime() -> String { func getItemRuntime() -> String {
let timeHMSFormatter: DateComponentsFormatter = { let timeHMSFormatter: DateComponentsFormatter = {
let formatter = DateComponentsFormatter() let formatter = DateComponentsFormatter()
@ -124,17 +129,18 @@ extension BaseItemDto {
return formatter 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 return text
} }
func getItemProgressString() -> String { func getItemProgressString() -> String {
if self.userData?.playbackPositionTicks == nil || self.userData?.playbackPositionTicks == 0 { if userData?.playbackPositionTicks == nil || userData?.playbackPositionTicks == 0 {
return "" 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 proghours = Int(remainingSecs / 3600)
let progminutes = Int((Int(remainingSecs) - (proghours * 3600)) / 60) let progminutes = Int((Int(remainingSecs) - (proghours * 3600)) / 60)
if proghours != 0 { if proghours != 0 {
@ -146,24 +152,24 @@ extension BaseItemDto {
} }
func round(_ value: Double, toNearest: Double) -> Double { func round(_ value: Double, toNearest: Double) -> Double {
return round(value / toNearest) * toNearest return round(value / toNearest) * toNearest
} }
extension BaseItemPerson { extension BaseItemPerson {
func getImage(baseURL: String, maxWidth: Int) -> URL { func getImage(baseURL: String, maxWidth: Int) -> URL {
let imageType = "Primary" let imageType = "Primary"
let imageTag = self.primaryImageTag ?? "" let imageTag = primaryImageTag ?? ""
let x = UIScreen.main.nativeScale * CGFloat(maxWidth) 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)! return URL(string: urlString)!
} }
func getBlurHash() -> String { 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] let imgTag = rawImgURL.components(separatedBy: "&tag=")[1]
return self.imageBlurHashes?.primary?[imgTag] ?? "001fC^" return imageBlurHashes?.primary?[imgTag] ?? "001fC^"
} }
} }