jellyflood/Shared/Extensions/APIExtensions.swift

149 lines
5.4 KiB
Swift

/* 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^"
}
}