Merge pull request #143 from jellyfin/PangMo5/fix-crash
Fix crash when appearing some ItemView
This commit is contained in:
commit
6f243621c1
|
@ -208,7 +208,7 @@ struct SeriesItemView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.top, 16)
|
.padding([.top, .leading], 16)
|
||||||
innerBody
|
innerBody
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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^"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue