Update Nuke to 0.6.1

This commit is contained in:
Aiden Vigue 2021-06-12 10:41:56 -07:00
parent f33edf11f0
commit 96dba15f04
No known key found for this signature in database
GPG Key ID: B9A09843AB079D5B
15 changed files with 83 additions and 270 deletions

View File

@ -9,6 +9,7 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
53192D5D265AA78A008A4215 /* DeviceProfileBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53192D5C265AA78A008A4215 /* DeviceProfileBuilder.swift */; }; 53192D5D265AA78A008A4215 /* DeviceProfileBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53192D5C265AA78A008A4215 /* DeviceProfileBuilder.swift */; };
531ABF6C2671F5CC00C0FE20 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 628B95212670CABD0091AF3B /* WidgetKit.framework */; }; 531ABF6C2671F5CC00C0FE20 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 628B95212670CABD0091AF3B /* WidgetKit.framework */; };
531AC8BF26750DE20091C7EB /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531AC8BE26750DE20091C7EB /* ImageView.swift */; };
5321753B2671BCFC005491E6 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5321753A2671BCFC005491E6 /* SettingsViewModel.swift */; }; 5321753B2671BCFC005491E6 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5321753A2671BCFC005491E6 /* SettingsViewModel.swift */; };
5321753E2671DE9C005491E6 /* Typings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535870AC2669D8DD00D05A09 /* Typings.swift */; }; 5321753E2671DE9C005491E6 /* Typings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535870AC2669D8DD00D05A09 /* Typings.swift */; };
5321753F2671DEA6005491E6 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5321753A2671BCFC005491E6 /* SettingsViewModel.swift */; }; 5321753F2671DEA6005491E6 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5321753A2671BCFC005491E6 /* SettingsViewModel.swift */; };
@ -36,7 +37,6 @@
535870A62669D8AE00D05A09 /* LazyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338B22660A07800A81A2A /* LazyView.swift */; }; 535870A62669D8AE00D05A09 /* LazyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338B22660A07800A81A2A /* LazyView.swift */; };
535870A72669D8AE00D05A09 /* MultiSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E4E648263F725B00F67C6B /* MultiSelectorView.swift */; }; 535870A72669D8AE00D05A09 /* MultiSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E4E648263F725B00F67C6B /* MultiSelectorView.swift */; };
535870A82669D8AE00D05A09 /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338922660107500A81A2A /* StringExtensions.swift */; }; 535870A82669D8AE00D05A09 /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338922660107500A81A2A /* StringExtensions.swift */; };
535870A92669D8AE00D05A09 /* NukeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621C638126676728004216EA /* NukeExtensions.swift */; };
535870AA2669D8AE00D05A09 /* BlurHashDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5389277B263CC3DB0035E14B /* BlurHashDecode.swift */; }; 535870AA2669D8AE00D05A09 /* BlurHashDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5389277B263CC3DB0035E14B /* BlurHashDecode.swift */; };
535870AD2669D8DD00D05A09 /* Typings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535870AC2669D8DD00D05A09 /* Typings.swift */; }; 535870AD2669D8DD00D05A09 /* Typings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535870AC2669D8DD00D05A09 /* Typings.swift */; };
535BAE9F2649E569005FA86D /* ItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535BAE9E2649E569005FA86D /* ItemView.swift */; }; 535BAE9F2649E569005FA86D /* ItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535BAE9E2649E569005FA86D /* ItemView.swift */; };
@ -72,7 +72,6 @@
621338932660107500A81A2A /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338922660107500A81A2A /* StringExtensions.swift */; }; 621338932660107500A81A2A /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338922660107500A81A2A /* StringExtensions.swift */; };
621338B32660A07800A81A2A /* LazyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338B22660A07800A81A2A /* LazyView.swift */; }; 621338B32660A07800A81A2A /* LazyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621338B22660A07800A81A2A /* LazyView.swift */; };
621C638026672A30004216EA /* NukeUI in Frameworks */ = {isa = PBXBuildFile; productRef = 621C637F26672A30004216EA /* NukeUI */; }; 621C638026672A30004216EA /* NukeUI in Frameworks */ = {isa = PBXBuildFile; productRef = 621C637F26672A30004216EA /* NukeUI */; };
621C638226676728004216EA /* NukeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 621C638126676728004216EA /* NukeExtensions.swift */; };
6225FCCB2663841E00E067F6 /* ParallaxHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6225FCCA2663841E00E067F6 /* ParallaxHeader.swift */; }; 6225FCCB2663841E00E067F6 /* ParallaxHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6225FCCA2663841E00E067F6 /* ParallaxHeader.swift */; };
6228B1C22670EB010067FD35 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5377CBFD263B596B003A4E83 /* PersistenceController.swift */; }; 6228B1C22670EB010067FD35 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5377CBFD263B596B003A4E83 /* PersistenceController.swift */; };
6267B3D42671024A00A7371D /* APIExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5364F454266CA0DC0026ECBA /* APIExtensions.swift */; }; 6267B3D42671024A00A7371D /* APIExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5364F454266CA0DC0026ECBA /* APIExtensions.swift */; };
@ -153,6 +152,7 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
53192D5C265AA78A008A4215 /* DeviceProfileBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceProfileBuilder.swift; sourceTree = "<group>"; }; 53192D5C265AA78A008A4215 /* DeviceProfileBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceProfileBuilder.swift; sourceTree = "<group>"; };
531AC8BE26750DE20091C7EB /* ImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageView.swift; sourceTree = "<group>"; };
5321753A2671BCFC005491E6 /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; }; 5321753A2671BCFC005491E6 /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; };
53313B8F265EEA6D00947AA3 /* VideoPlayer.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = VideoPlayer.storyboard; sourceTree = "<group>"; }; 53313B8F265EEA6D00947AA3 /* VideoPlayer.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = VideoPlayer.storyboard; sourceTree = "<group>"; };
5338F74D263B61370014BF09 /* ConnectToServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectToServerView.swift; sourceTree = "<group>"; }; 5338F74D263B61370014BF09 /* ConnectToServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectToServerView.swift; sourceTree = "<group>"; };
@ -201,7 +201,6 @@
6213388F265F83A900A81A2A /* LibraryListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryListView.swift; sourceTree = "<group>"; }; 6213388F265F83A900A81A2A /* LibraryListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryListView.swift; sourceTree = "<group>"; };
621338922660107500A81A2A /* StringExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtensions.swift; sourceTree = "<group>"; }; 621338922660107500A81A2A /* StringExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtensions.swift; sourceTree = "<group>"; };
621338B22660A07800A81A2A /* LazyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyView.swift; sourceTree = "<group>"; }; 621338B22660A07800A81A2A /* LazyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyView.swift; sourceTree = "<group>"; };
621C638126676728004216EA /* NukeExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NukeExtensions.swift; sourceTree = "<group>"; };
6225FCCA2663841E00E067F6 /* ParallaxHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParallaxHeader.swift; sourceTree = "<group>"; }; 6225FCCA2663841E00E067F6 /* ParallaxHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParallaxHeader.swift; sourceTree = "<group>"; };
6267B3D526710B8900A7371D /* CollectionExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionExtensions.swift; sourceTree = "<group>"; }; 6267B3D526710B8900A7371D /* CollectionExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionExtensions.swift; sourceTree = "<group>"; };
6267B3D92671138200A7371D /* ImageExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageExtensions.swift; sourceTree = "<group>"; }; 6267B3D92671138200A7371D /* ImageExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageExtensions.swift; sourceTree = "<group>"; };
@ -359,6 +358,7 @@
53313B8F265EEA6D00947AA3 /* VideoPlayer.storyboard */, 53313B8F265EEA6D00947AA3 /* VideoPlayer.storyboard */,
53F8377C265FF67C00F456B3 /* VideoPlayerSettingsView.swift */, 53F8377C265FF67C00F456B3 /* VideoPlayerSettingsView.swift */,
53DE4BD1267098F300739748 /* SearchBarView.swift */, 53DE4BD1267098F300739748 /* SearchBarView.swift */,
531AC8BE26750DE20091C7EB /* ImageView.swift */,
); );
path = JellyfinPlayer; path = JellyfinPlayer;
sourceTree = "<group>"; sourceTree = "<group>";
@ -391,7 +391,6 @@
53C4404D266C75C70049424C /* HandleAPIRequestCompletion.swift */, 53C4404D266C75C70049424C /* HandleAPIRequestCompletion.swift */,
621338B22660A07800A81A2A /* LazyView.swift */, 621338B22660A07800A81A2A /* LazyView.swift */,
53E4E648263F725B00F67C6B /* MultiSelectorView.swift */, 53E4E648263F725B00F67C6B /* MultiSelectorView.swift */,
621C638126676728004216EA /* NukeExtensions.swift */,
6225FCCA2663841E00E067F6 /* ParallaxHeader.swift */, 6225FCCA2663841E00E067F6 /* ParallaxHeader.swift */,
621338922660107500A81A2A /* StringExtensions.swift */, 621338922660107500A81A2A /* StringExtensions.swift */,
6267B3D526710B8900A7371D /* CollectionExtensions.swift */, 6267B3D526710B8900A7371D /* CollectionExtensions.swift */,
@ -589,7 +588,6 @@
6267B3D826710B9800A7371D /* CollectionExtensions.swift in Sources */, 6267B3D826710B9800A7371D /* CollectionExtensions.swift in Sources */,
535870A52669D8AE00D05A09 /* ParallaxHeader.swift in Sources */, 535870A52669D8AE00D05A09 /* ParallaxHeader.swift in Sources */,
535870A72669D8AE00D05A09 /* MultiSelectorView.swift in Sources */, 535870A72669D8AE00D05A09 /* MultiSelectorView.swift in Sources */,
535870A92669D8AE00D05A09 /* NukeExtensions.swift in Sources */,
5358706C2669D21700D05A09 /* Persistence.swift in Sources */, 5358706C2669D21700D05A09 /* Persistence.swift in Sources */,
5321753F2671DEA6005491E6 /* SettingsViewModel.swift in Sources */, 5321753F2671DEA6005491E6 /* SettingsViewModel.swift in Sources */,
535870AA2669D8AE00D05A09 /* BlurHashDecode.swift in Sources */, 535870AA2669D8AE00D05A09 /* BlurHashDecode.swift in Sources */,
@ -610,7 +608,6 @@
files = ( files = (
5364F455266CA0DC0026ECBA /* APIExtensions.swift in Sources */, 5364F455266CA0DC0026ECBA /* APIExtensions.swift in Sources */,
621338932660107500A81A2A /* StringExtensions.swift in Sources */, 621338932660107500A81A2A /* StringExtensions.swift in Sources */,
621C638226676728004216EA /* NukeExtensions.swift in Sources */,
53FF7F2A263CF3F500585C35 /* LatestMediaView.swift in Sources */, 53FF7F2A263CF3F500585C35 /* LatestMediaView.swift in Sources */,
5377CBFE263B596B003A4E83 /* PersistenceController.swift in Sources */, 5377CBFE263B596B003A4E83 /* PersistenceController.swift in Sources */,
5389276E263C25100035E14B /* ContinueWatchingView.swift in Sources */, 5389276E263C25100035E14B /* ContinueWatchingView.swift in Sources */,
@ -632,6 +629,7 @@
53DE4BD2267098F300739748 /* SearchBarView.swift in Sources */, 53DE4BD2267098F300739748 /* SearchBarView.swift in Sources */,
53E4E649263F725B00F67C6B /* MultiSelectorView.swift in Sources */, 53E4E649263F725B00F67C6B /* MultiSelectorView.swift in Sources */,
621338B32660A07800A81A2A /* LazyView.swift in Sources */, 621338B32660A07800A81A2A /* LazyView.swift in Sources */,
531AC8BF26750DE20091C7EB /* ImageView.swift in Sources */,
535870AD2669D8DD00D05A09 /* Typings.swift in Sources */, 535870AD2669D8DD00D05A09 /* Typings.swift in Sources */,
53C4404E266C75C70049424C /* HandleAPIRequestCompletion.swift in Sources */, 53C4404E266C75C70049424C /* HandleAPIRequestCompletion.swift in Sources */,
6267B3DA2671138200A7371D /* ImageExtensions.swift in Sources */, 6267B3DA2671138200A7371D /* ImageExtensions.swift in Sources */,
@ -1043,8 +1041,8 @@
isa = XCRemoteSwiftPackageReference; isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/kean/NukeUI"; repositoryURL = "https://github.com/kean/NukeUI";
requirement = { requirement = {
kind = exactVersion; kind = upToNextMajorVersion;
version = 0.3.0; minimumVersion = 0.3.0;
}; };
}; };
/* End XCRemoteSwiftPackageReference section */ /* End XCRemoteSwiftPackageReference section */

View File

@ -51,8 +51,8 @@
"repositoryURL": "https://github.com/kean/NukeUI", "repositoryURL": "https://github.com/kean/NukeUI",
"state": { "state": {
"branch": null, "branch": null,
"revision": "d2580b8d22b29c6244418d8e4b568f3162191460", "revision": "62b55e26eddc2ed59e63377ab877efac4f9e049c",
"version": "0.3.0" "version": "0.6.1"
} }
}, },
{ {

View File

@ -8,7 +8,6 @@
import SwiftUI import SwiftUI
import CoreData import CoreData
import KeychainSwift import KeychainSwift
import NukeUI
import JellyfinAPI import JellyfinAPI
struct ConnectToServerView: View { struct ConnectToServerView: View {
@ -290,11 +289,9 @@ struct ConnectToServerView: View {
Text(publicUser.name ?? "").font(.subheadline).fontWeight(.semibold) Text(publicUser.name ?? "").font(.subheadline).fontWeight(.semibold)
Spacer() Spacer()
if publicUser.primaryImageTag != nil { if publicUser.primaryImageTag != nil {
LazyImage(source: URL(string: "\(uri)/Users/\(publicUser.id ?? "")/Images/Primary?width=200&quality=80&tag=\(publicUser.primaryImageTag!)")) ImageView(src: URL(string: "\(uri)/Users/\(publicUser.id ?? "")/Images/Primary?width=200&quality=80&tag=\(publicUser.primaryImageTag!)")!)
.contentMode(.aspectFill)
.frame(width: 60, height: 60) .frame(width: 60, height: 60)
.cornerRadius(30.0) .cornerRadius(30.0)
.shadow(radius: 6)
} else { } else {
Image(systemName: "person.fill") Image(systemName: "person.fill")
.foregroundColor(Color(red: 1, green: 1, blue: 1).opacity(0.8)) .foregroundColor(Color(red: 1, green: 1, blue: 1).opacity(0.8))

View File

@ -224,7 +224,7 @@ struct ContentView: View {
.onAppear(perform: { .onAppear(perform: {
DispatchQueue.main.async { [self] in DispatchQueue.main.async { [self] in
_viewDidLoad.wrappedValue = false _viewDidLoad.wrappedValue = false
usleep(500_000) sleep(1)
self.jsi.did = false self.jsi.did = false
} }
}) })

View File

@ -1,4 +1,5 @@
/* JellyfinPlayer/Swiftfin is subject to the terms of the Mozilla Public /*
* JellyfinPlayer/Swiftfin is subject to the terms of the Mozilla Public
* License, v2.0. If a copy of the MPL was not distributed with this * 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/. * file, you can obtain one at https://mozilla.org/MPL/2.0/.
* *
@ -6,7 +7,6 @@
*/ */
import SwiftUI import SwiftUI
import NukeUI
import JellyfinAPI import JellyfinAPI
struct ProgressBar: Shape { struct ProgressBar: Shape {
@ -56,15 +56,7 @@ struct ContinueWatchingView: View {
NavigationLink(destination: ItemView(item: item)) { NavigationLink(destination: ItemView(item: item)) {
VStack(alignment: .leading) { VStack(alignment: .leading) {
Spacer().frame(height: 10) Spacer().frame(height: 10)
LazyImage(source: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 320)) ImageView(src: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 320), bh: item.getBackdropImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getBackdropImageBlurHash(), size: CGSize(width: 48, height: 32))!)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 320, height: 180)
.cornerRadius(10)
}
.aspectRatio(contentMode: .fill)
.frame(width: 320, height: 180) .frame(width: 320, height: 180)
.cornerRadius(10) .cornerRadius(10)
.overlay( .overlay(

View File

@ -6,7 +6,6 @@
*/ */
import SwiftUI import SwiftUI
import NukeUI
import JellyfinAPI import JellyfinAPI
struct EpisodeItemView: View { struct EpisodeItemView: View {
@ -63,13 +62,7 @@ struct EpisodeItemView: View {
} }
var portraitHeaderView: some View { var portraitHeaderView: some View {
LazyImage(source: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 1200)) ImageView(src: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: UIDevice.current.userInterfaceIdiom == .pad ? 622 : Int(UIScreen.main.bounds.width)), bh: item.getBackdropImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getBackdropImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
}
.contentMode(.aspectFill)
.opacity(0.4) .opacity(0.4)
.blur(radius: 2.0) .blur(radius: 2.0)
} }
@ -77,24 +70,16 @@ struct EpisodeItemView: View {
var portraitHeaderOverlayView: some View { var portraitHeaderOverlayView: some View {
VStack(alignment: .leading) { VStack(alignment: .leading) {
HStack(alignment: .bottom, spacing: 12) { HStack(alignment: .bottom, spacing: 12) {
LazyImage(source: item.getSeriesPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120)) ImageView(src: item.getSeriesPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120), bh: item.getSeriesPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getSeriesPrimaryImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 120, height: 180)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.frame(width: 120, height: 180) .frame(width: 120, height: 180)
.cornerRadius(10) .cornerRadius(10)
VStack(alignment: .leading) { VStack(alignment: .leading) {
Spacer() Spacer()
Text(item.name!).font(.headline) Text(item.name ?? "").font(.headline)
.fontWeight(.semibold) .fontWeight(.semibold)
.foregroundColor(.primary) .foregroundColor(.primary)
.fixedSize(horizontal: false, vertical: true) .fixedSize(horizontal: false, vertical: true)
.offset(y: -4) .offset(y: 5)
HStack { HStack {
Text(String(item.productionYear ?? 0)).font(.subheadline) Text(String(item.productionYear ?? 0)).font(.subheadline)
.fontWeight(.medium) .fontWeight(.medium)
@ -157,7 +142,7 @@ struct EpisodeItemView: View {
} }
} }
} }
} }.padding(.top, 8)
} }
.padding(.horizontal, 16) .padding(.horizontal, 16)
.padding(.bottom, UIDevice.current.userInterfaceIdiom == .pad ? -189 : -64) .padding(.bottom, UIDevice.current.userInterfaceIdiom == .pad ? -189 : -64)
@ -205,17 +190,7 @@ struct EpisodeItemView: View {
LibraryView(withPerson: person) LibraryView(withPerson: person)
}) { }) {
VStack { VStack {
LazyImage(source: person.getImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: person.getImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: person.getBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: person.getBlurHash(),
size: CGSize(width: 16,
height: 16))!)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 100, height: 100)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.frame(width: 100, height: 100) .frame(width: 100, height: 100)
.cornerRadius(10) .cornerRadius(10)
Text(person.name ?? "").font(.footnote).fontWeight(.regular).lineLimit(1) Text(person.name ?? "").font(.footnote).fontWeight(.regular).lineLimit(1)
@ -254,18 +229,7 @@ struct EpisodeItemView: View {
} else { } else {
GeometryReader { geometry in GeometryReader { geometry in
ZStack { ZStack {
LazyImage(source: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 200)) ImageView(src: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 200), bh: item.getBackdropImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getBackdropImageBlurHash(),
size: CGSize(width: 16, height: 16))!)
.resizable()
.frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets
.trailing,
height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets
.bottom)
}
.contentMode(.aspectFill)
.opacity(0.3) .opacity(0.3)
.frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing, .frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing,
height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom) height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom)
@ -273,16 +237,9 @@ struct EpisodeItemView: View {
.blur(radius: 4) .blur(radius: 4)
HStack { HStack {
VStack { VStack {
LazyImage(source: item.getSeriesPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120)) ImageView(src: item.getSeriesPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120), bh: item.getSeriesPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getSeriesPrimaryImageBlurHash(),
size: CGSize(width: 16, height: 16))!)
.resizable()
.frame(width: 120, height: 180)
}
.frame(width: 120, height: 180) .frame(width: 120, height: 180)
.cornerRadius(10) .cornerRadius(10)
.shadow(radius: 5)
Spacer().frame(height: 15) Spacer().frame(height: 15)
Button { Button {
self.playbackInfo.itemToPlay = item self.playbackInfo.itemToPlay = item
@ -404,17 +361,7 @@ struct EpisodeItemView: View {
LibraryView(withPerson: person) LibraryView(withPerson: person)
}) { }) {
VStack { VStack {
LazyImage(source: person.getImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: person.getImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: person.getBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: person.getBlurHash(),
size: CGSize(width: 16,
height: 16))!)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 100, height: 100)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.frame(width: 100, height: 100) .frame(width: 100, height: 100)
.cornerRadius(10) .cornerRadius(10)
Text(person.name ?? "").font(.footnote).fontWeight(.regular).lineLimit(1) Text(person.name ?? "").font(.footnote).fontWeight(.regular).lineLimit(1)

View File

@ -0,0 +1,39 @@
//
/*
* 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 SwiftUI
import NukeUI
struct ImageView: View {
private var source: URL = URL(string: "https://example.com")!
private var blurhash: String = "001fC^"
init(src: URL) {
self.source = src
}
init(src: URL, bh: String) {
self.source = src
self.blurhash = bh
}
var body: some View {
LazyImage(source: source, content: { state in
if let image = state.image {
image.resizingMode(.aspectFill)
} else if state.error != nil {
Image(uiImage: UIImage(blurHash: "001fC^", size: CGSize(width: 1, height: 1))!)
.resizable()
} else {
Image(uiImage: UIImage(blurHash: blurhash, size: CGSize(width: 16, height: 16))!)
.resizable()
}
})
}
}

View File

@ -6,7 +6,6 @@
*/ */
import SwiftUI import SwiftUI
import NukeUI
import JellyfinAPI import JellyfinAPI
struct LatestMediaView: View { struct LatestMediaView: View {
@ -46,13 +45,7 @@ struct LatestMediaView: View {
NavigationLink(destination: ItemView(item: item)) { NavigationLink(destination: ItemView(item: item)) {
VStack(alignment: .leading) { VStack(alignment: .leading) {
Spacer().frame(height: 10) Spacer().frame(height: 10)
LazyImage(source: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: item.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getPrimaryImageBlurHash(), size: CGSize(width: 16, height: 20))!)
.resizable()
.frame(width: 100, height: 150)
.cornerRadius(10)
}
.frame(width: 100, height: 150) .frame(width: 100, height: 150)
.cornerRadius(10) .cornerRadius(10)
Spacer().frame(height: 5) Spacer().frame(height: 5)

View File

@ -6,7 +6,6 @@
*/ */
import SwiftUI import SwiftUI
import NukeUI
import JellyfinAPI import JellyfinAPI
struct LibrarySearchView: View { struct LibrarySearchView: View {
@ -69,14 +68,7 @@ struct LibrarySearchView: View {
ForEach(items, id: \.id) { item in ForEach(items, id: \.id) { item in
NavigationLink(destination: ItemView(item: item)) { NavigationLink(destination: ItemView(item: item)) {
VStack(alignment: .leading) { VStack(alignment: .leading) {
LazyImage(source: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: item.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getPrimaryImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 100, height: 150)
.cornerRadius(10)
}
.frame(width: 100, height: 150) .frame(width: 100, height: 150)
.cornerRadius(10) .cornerRadius(10)
Text(item.name ?? "") Text(item.name ?? "")

View File

@ -107,14 +107,7 @@ struct LibraryView: View {
ForEach(items, id: \.id) { item in ForEach(items, id: \.id) { item in
NavigationLink(destination: ItemView(item: item)) { NavigationLink(destination: ItemView(item: item)) {
VStack(alignment: .leading) { VStack(alignment: .leading) {
LazyImage(source: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: item.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getPrimaryImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 100, height: 150)
.cornerRadius(10)
}
.frame(width: 100, height: 150) .frame(width: 100, height: 150)
.cornerRadius(10) .cornerRadius(10)
Text(item.name ?? "") Text(item.name ?? "")
@ -200,3 +193,4 @@ struct LibraryView: View {
} }
// stream BM^S by nicki! // stream BM^S by nicki!
//

View File

@ -6,7 +6,6 @@
*/ */
import SwiftUI import SwiftUI
import NukeUI
import JellyfinAPI import JellyfinAPI
struct MovieItemView: View { struct MovieItemView: View {
@ -63,13 +62,7 @@ struct MovieItemView: View {
} }
var portraitHeaderView: some View { var portraitHeaderView: some View {
LazyImage(source: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 1200)) ImageView(src: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: UIDevice.current.userInterfaceIdiom == .pad ? 622 : Int(UIScreen.main.bounds.width)), bh: item.getBackdropImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getBackdropImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
}
.contentMode(.aspectFill)
.opacity(0.4) .opacity(0.4)
.blur(radius: 2.0) .blur(radius: 2.0)
} }
@ -77,24 +70,16 @@ struct MovieItemView: View {
var portraitHeaderOverlayView: some View { var portraitHeaderOverlayView: some View {
VStack(alignment: .leading) { VStack(alignment: .leading) {
HStack(alignment: .bottom, spacing: 12) { HStack(alignment: .bottom, spacing: 12) {
LazyImage(source: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120)) ImageView(src: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120))
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getPrimaryImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 120, height: 180)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.frame(width: 120, height: 180) .frame(width: 120, height: 180)
.cornerRadius(10) .cornerRadius(10)
VStack(alignment: .leading) { VStack(alignment: .leading) {
Spacer() Spacer()
Text(item.name!).font(.headline) Text(item.name ?? "").font(.headline)
.fontWeight(.semibold) .fontWeight(.semibold)
.foregroundColor(.primary) .foregroundColor(.primary)
.fixedSize(horizontal: false, vertical: true) .lineLimit(1)
.offset(y: -4) .offset(y: 5)
HStack { HStack {
if item.productionYear != nil { if item.productionYear != nil {
Text(String(item.productionYear ?? 0)).font(.subheadline) Text(String(item.productionYear ?? 0)).font(.subheadline)
@ -159,7 +144,7 @@ struct MovieItemView: View {
} }
} }
} }
} }.padding(.top, 8)
} }
.padding(.horizontal, 16) .padding(.horizontal, 16)
.padding(.bottom, UIDevice.current.userInterfaceIdiom == .pad ? -189 : -64) .padding(.bottom, UIDevice.current.userInterfaceIdiom == .pad ? -189 : -64)
@ -207,17 +192,7 @@ struct MovieItemView: View {
LibraryView(withPerson: person) LibraryView(withPerson: person)
}) { }) {
VStack { VStack {
LazyImage(source: person.getImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: person.getImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: person.getBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: person.getBlurHash(),
size: CGSize(width: 16,
height: 16))!)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 100, height: 100)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.frame(width: 100, height: 100) .frame(width: 100, height: 100)
.cornerRadius(10) .cornerRadius(10)
Text(person.name ?? "").font(.footnote).fontWeight(.regular).lineLimit(1) Text(person.name ?? "").font(.footnote).fontWeight(.regular).lineLimit(1)
@ -256,18 +231,7 @@ struct MovieItemView: View {
} else { } else {
GeometryReader { geometry in GeometryReader { geometry in
ZStack { ZStack {
LazyImage(source: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 200)) ImageView(src: item.getBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 200), bh: item.getBackdropImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getBackdropImageBlurHash(),
size: CGSize(width: 16, height: 16))!)
.resizable()
.frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets
.trailing,
height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets
.bottom)
}
.contentMode(.aspectFill)
.opacity(0.3) .opacity(0.3)
.frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing, .frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing,
height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom) height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom)
@ -275,16 +239,9 @@ struct MovieItemView: View {
.blur(radius: 4) .blur(radius: 4)
HStack { HStack {
VStack { VStack {
LazyImage(source: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120)) ImageView(src: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120), bh: item.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getPrimaryImageBlurHash(),
size: CGSize(width: 16, height: 16))!)
.resizable()
.frame(width: 120, height: 180)
}
.frame(width: 120, height: 180) .frame(width: 120, height: 180)
.cornerRadius(10) .cornerRadius(10)
.shadow(radius: 5)
Spacer().frame(height: 15) Spacer().frame(height: 15)
Button { Button {
self.playbackInfo.itemToPlay = item self.playbackInfo.itemToPlay = item
@ -408,17 +365,7 @@ struct MovieItemView: View {
LibraryView(withPerson: person) LibraryView(withPerson: person)
}) { }) {
VStack { VStack {
LazyImage(source: person.getImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: person.getImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: person.getBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: person.getBlurHash(),
size: CGSize(width: 16,
height: 16))!)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 100, height: 100)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.frame(width: 100, height: 100) .frame(width: 100, height: 100)
.cornerRadius(10) .cornerRadius(10)
Text(person.name ?? "").font(.footnote).fontWeight(.regular).lineLimit(1) Text(person.name ?? "").font(.footnote).fontWeight(.regular).lineLimit(1)

View File

@ -6,7 +6,6 @@
*/ */
import SwiftUI import SwiftUI
import NukeUI
import JellyfinAPI import JellyfinAPI
struct NextUpView: View { struct NextUpView: View {
@ -45,13 +44,7 @@ struct NextUpView: View {
ForEach(items, id: \.id) { item in ForEach(items, id: \.id) { item in
NavigationLink(destination: ItemView(item: item)) { NavigationLink(destination: ItemView(item: item)) {
VStack(alignment: .leading) { VStack(alignment: .leading) {
LazyImage(source: item.getSeriesPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: item.getSeriesPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: item.getSeriesPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getSeriesPrimaryImageBlurHash(), size: CGSize(width: 16, height: 20))!)
.resizable()
.frame(width: 100, height: 150)
.cornerRadius(10)
}
.frame(width: 100, height: 150) .frame(width: 100, height: 150)
.cornerRadius(10) .cornerRadius(10)
Spacer().frame(height: 5) Spacer().frame(height: 5)

View File

@ -5,7 +5,6 @@
* Copyright 2021 Aiden Vigue & Jellyfin Contributors * Copyright 2021 Aiden Vigue & Jellyfin Contributors
*/ */
import NukeUI
import SwiftUI import SwiftUI
import JellyfinAPI import JellyfinAPI
@ -46,13 +45,7 @@ struct SeasonItemView: View {
if isLoading { if isLoading {
EmptyView() EmptyView()
} else { } else {
LazyImage(source: item.getSeriesBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 1500)) ImageView(src: item.getSeriesBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: UIDevice.current.userInterfaceIdiom == .pad ? 622 : Int(UIScreen.main.bounds.width)), bh: item.getSeriesBackdropImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getSeriesBackdropImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
}
.contentMode(.aspectFill)
.opacity(0.4) .opacity(0.4)
.blur(radius: 2.0) .blur(radius: 2.0)
} }
@ -60,15 +53,7 @@ struct SeasonItemView: View {
var portraitHeaderOverlayView: some View { var portraitHeaderOverlayView: some View {
HStack(alignment: .bottom, spacing: 12) { HStack(alignment: .bottom, spacing: 12) {
LazyImage(source: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120)) ImageView(src: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120), bh: item.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getPrimaryImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 120, height: 180)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.frame(width: 120, height: 180) .frame(width: 120, height: 180)
.cornerRadius(10) .cornerRadius(10)
VStack(alignment: .leading) { VStack(alignment: .leading) {
@ -107,15 +92,7 @@ struct SeasonItemView: View {
ForEach(episodes, id: \.id) { episode in ForEach(episodes, id: \.id) { episode in
NavigationLink(destination: ItemView(item: episode)) { NavigationLink(destination: ItemView(item: episode)) {
HStack { HStack {
LazyImage(source: episode.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 150)) ImageView(src: episode.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 150), bh: episode.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: episode.getPrimaryImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 150, height: 90)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.shadow(radius: 5) .shadow(radius: 5)
.frame(width: 150, height: 90) .frame(width: 150, height: 90)
.cornerRadius(10) .cornerRadius(10)
@ -174,18 +151,7 @@ struct SeasonItemView: View {
} else { } else {
GeometryReader { geometry in GeometryReader { geometry in
ZStack { ZStack {
LazyImage(source: item.getSeriesBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 200)) ImageView(src: item.getSeriesBackdropImage(baseURL: globalData.server.baseURI!, maxWidth: 200), bh: item.getSeriesBackdropImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getSeriesBackdropImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets
.trailing,
height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets
.bottom)
}
.contentMode(.aspectFill)
.opacity(0.4) .opacity(0.4)
.frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing, .frame(width: geometry.size.width + geometry.safeAreaInsets.leading + geometry.safeAreaInsets.trailing,
height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom) height: geometry.size.height + geometry.safeAreaInsets.top + geometry.safeAreaInsets.bottom)
@ -194,15 +160,7 @@ struct SeasonItemView: View {
HStack { HStack {
VStack(alignment: .leading) { VStack(alignment: .leading) {
Spacer().frame(height: 16) Spacer().frame(height: 16)
LazyImage(source: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120)) ImageView(src: item.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 120), bh: item.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: item.getPrimaryImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 120, height: 180)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.frame(width: 120, height: 180) .frame(width: 120, height: 180)
.cornerRadius(10) .cornerRadius(10)
Spacer().frame(height: 4) Spacer().frame(height: 4)
@ -227,15 +185,7 @@ struct SeasonItemView: View {
ForEach(episodes, id: \.id) { episode in ForEach(episodes, id: \.id) { episode in
NavigationLink(destination: ItemView(item: episode)) { NavigationLink(destination: ItemView(item: episode)) {
HStack { HStack {
LazyImage(source: episode.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 150)) ImageView(src: episode.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 150), bh: episode.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: episode.getPrimaryImageBlurHash(),
size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 150, height: 90)
.cornerRadius(10)
}
.contentMode(.aspectFill)
.shadow(radius: 5) .shadow(radius: 5)
.frame(width: 150, height: 90) .frame(width: 150, height: 90)
.cornerRadius(10) .cornerRadius(10)

View File

@ -6,7 +6,6 @@
*/ */
import SwiftUI import SwiftUI
import NukeUI
import JellyfinAPI import JellyfinAPI
struct SeriesItemView: View { struct SeriesItemView: View {
@ -61,13 +60,7 @@ struct SeriesItemView: View {
ForEach(seasons, id: \.id) { season in ForEach(seasons, id: \.id) { season in
NavigationLink(destination: ItemView(item: season)) { NavigationLink(destination: ItemView(item: season)) {
VStack(alignment: .leading) { VStack(alignment: .leading) {
LazyImage(source: season.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100)) ImageView(src: season.getPrimaryImage(baseURL: globalData.server.baseURI!, maxWidth: 100), bh: season.getPrimaryImageBlurHash())
.placeholderAndFailure {
Image(uiImage: UIImage(blurHash: season.getPrimaryImageBlurHash(), size: CGSize(width: 32, height: 32))!)
.resizable()
.frame(width: 100, height: 150)
.cornerRadius(10)
}
.frame(width: 100, height: 150) .frame(width: 100, height: 150)
.cornerRadius(10) .cornerRadius(10)
.shadow(radius: 5) .shadow(radius: 5)

View File

@ -1,22 +0,0 @@
/* JellyfinPlayer/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 SwiftUI
import NukeUI
extension LazyImage {
func placeholderAndFailure<Content: View>(@ViewBuilder _ content: () -> Content?) -> LazyImage {
placeholder {
content()
}
.failure {
content()
}
}
}