From 2bdaf173a475853170f03ccae04722c985531bd7 Mon Sep 17 00:00:00 2001 From: Ethan Pippin Date: Fri, 7 Jan 2022 17:58:51 -0700 Subject: [PATCH] cache image attempt --- Shared/Views/ImageView.swift | 30 +++++-- Swiftfin.xcodeproj/project.pbxproj | 87 +++++++++++-------- .../xcshareddata/swiftpm/Package.resolved | 9 ++ 3 files changed, 84 insertions(+), 42 deletions(-) diff --git a/Shared/Views/ImageView.swift b/Shared/Views/ImageView.swift index 42d13995..460e77a5 100644 --- a/Shared/Views/ImageView.swift +++ b/Shared/Views/ImageView.swift @@ -7,6 +7,7 @@ * Copyright 2021 Aiden Vigue & Jellyfin Contributors */ +import CachedAsyncImage import SwiftUI struct ImageView: View { @@ -31,7 +32,7 @@ struct ImageView: View { private var failureImage: some View { ZStack { Rectangle() - .foregroundColor(Color.systemFill) + .foregroundColor(Color(UIColor.darkGray)) Text(failureInitials) .font(.largeTitle) @@ -40,21 +41,36 @@ struct ImageView: View { } var body: some View { - AsyncImage(url: source) { phase in - if let image = phase.image { + CachedAsyncImage(url: source, urlCache: .imageCache, transaction: Transaction(animation: .easeInOut)) { phase in + switch phase { + case .success(let image): image .resizable() .aspectRatio(contentMode: .fill) - } else if phase.error != nil { + case .failure(_): failureImage - } else { + default: // TODO: remove once placeholder hash image fixed + + #if os(tvOS) ZStack { - Color.gray.ignoresSafeArea() - + Color.black.ignoresSafeArea() + ProgressView() } + #else + ZStack { + Color.gray.ignoresSafeArea() + + ProgressView() + } + #endif } } } } + +extension URLCache { + + static let imageCache = URLCache(memoryCapacity: 512*1000*1000, diskCapacity: 10*1000*1000*1000) +} diff --git a/Swiftfin.xcodeproj/project.pbxproj b/Swiftfin.xcodeproj/project.pbxproj index 70f53719..d46163c6 100644 --- a/Swiftfin.xcodeproj/project.pbxproj +++ b/Swiftfin.xcodeproj/project.pbxproj @@ -270,10 +270,7 @@ E11D224227378428003F9CB3 /* ServerDetailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11D224127378428003F9CB3 /* ServerDetailCoordinator.swift */; }; E11D224327378428003F9CB3 /* ServerDetailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11D224127378428003F9CB3 /* ServerDetailCoordinator.swift */; }; E12186DE2718F1C50010884C /* Defaults in Frameworks */ = {isa = PBXBuildFile; productRef = E12186DD2718F1C50010884C /* Defaults */; }; - E1218C9A271A26BA00EA0737 /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = E1218C99271A26BA00EA0737 /* Nuke */; }; - E1218C9C271A26C400EA0737 /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = E1218C9B271A26C400EA0737 /* Nuke */; }; E1218C9E271A2CD600EA0737 /* CombineExt in Frameworks */ = {isa = PBXBuildFile; productRef = E1218C9D271A2CD600EA0737 /* CombineExt */; }; - E1218CA0271A2CF200EA0737 /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = E1218C9F271A2CF200EA0737 /* Nuke */; }; E122A9132788EAAD0060FA63 /* MediaStreamExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E122A9122788EAAD0060FA63 /* MediaStreamExtension.swift */; }; E122A9142788EAAD0060FA63 /* MediaStreamExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E122A9122788EAAD0060FA63 /* MediaStreamExtension.swift */; }; E1267D3E271A1F46003C492E /* PreferenceUIHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1267D3D271A1F46003C492E /* PreferenceUIHostingController.swift */; }; @@ -374,6 +371,8 @@ E1AD105C26D9ABDD003E4A08 /* PillHStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1AD105B26D9ABDD003E4A08 /* PillHStackView.swift */; }; E1AD105F26D9ADDD003E4A08 /* NameGUIDPairExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1AD105E26D9ADDD003E4A08 /* NameGUIDPairExtensions.swift */; }; E1AD106226D9B7CD003E4A08 /* ItemPortraitHeaderOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1AD106126D9B7CD003E4A08 /* ItemPortraitHeaderOverlayView.swift */; }; + E1AE8E7C2789135A00FBDDAA /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = E1AE8E7B2789135A00FBDDAA /* Nuke */; }; + E1AE8E7E2789136D00FBDDAA /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = E1AE8E7D2789136D00FBDDAA /* Nuke */; }; E1B59FD52786ADE500A5287E /* ContinueWatchingCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B59FD42786ADE500A5287E /* ContinueWatchingCard.swift */; }; E1B59FD92786AE4600A5287E /* NextUpCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1B59FD82786AE4600A5287E /* NextUpCard.swift */; }; E1B6DCE8271A23780015B715 /* CombineExt in Frameworks */ = {isa = PBXBuildFile; productRef = E1B6DCE7271A23780015B715 /* CombineExt */; }; @@ -408,6 +407,8 @@ E1E00A35278628A40022235B /* DoubleExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E00A34278628A40022235B /* DoubleExtensions.swift */; }; E1E00A36278628A40022235B /* DoubleExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E00A34278628A40022235B /* DoubleExtensions.swift */; }; E1E00A37278628A40022235B /* DoubleExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E00A34278628A40022235B /* DoubleExtensions.swift */; }; + E1E0F4D8278911680084F701 /* CachedAsyncImage in Frameworks */ = {isa = PBXBuildFile; productRef = E1E0F4D7278911680084F701 /* CachedAsyncImage */; }; + E1E0F4DA278911A30084F701 /* CachedAsyncImage in Frameworks */ = {isa = PBXBuildFile; productRef = E1E0F4D9278911A30084F701 /* CachedAsyncImage */; }; E1E48CC9271E6D410021A2F9 /* RefreshHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E48CC8271E6D410021A2F9 /* RefreshHelper.swift */; }; E1E5D5372783A52C00692DFE /* CinematicEpisodeItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D5362783A52C00692DFE /* CinematicEpisodeItemView.swift */; }; E1E5D5392783A56B00692DFE /* EpisodesRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E5D5382783A56B00692DFE /* EpisodesRowView.swift */; }; @@ -751,13 +752,14 @@ files = ( 53649AAF269CFAF600A2D8B7 /* Puppy in Frameworks */, E1218C9E271A2CD600EA0737 /* CombineExt in Frameworks */, - E1218CA0271A2CF200EA0737 /* Nuke in Frameworks */, 6220D0C926D63F3700B8E046 /* Stinsen in Frameworks */, 535870912669D7A800D05A09 /* Introspect in Frameworks */, 536D3D84267BEA550004248C /* ParallaxView in Frameworks */, 53ABFDDC267972BF00886593 /* TVServices.framework in Frameworks */, E1A9999B271A343C008E78C0 /* SwiftUICollection in Frameworks */, E13DD3CD27164CA7009D4DAF /* CoreStore in Frameworks */, + E1E0F4DA278911A30084F701 /* CachedAsyncImage in Frameworks */, + E1AE8E7E2789136D00FBDDAA /* Nuke in Frameworks */, E178857D278037FD0094FBCF /* JellyfinAPI in Frameworks */, E12186DE2718F1C50010884C /* Defaults in Frameworks */, 53ABFDED26799D7700886593 /* ActivityIndicator in Frameworks */, @@ -774,10 +776,11 @@ E10EAA4D277BB716000269ED /* Sliders in Frameworks */, 62C29E9C26D0FE4200C1D2E7 /* Stinsen in Frameworks */, E1A99999271A3429008E78C0 /* SwiftUICollection in Frameworks */, - E1218C9A271A26BA00EA0737 /* Nuke in Frameworks */, E1B6DCEA271A23880015B715 /* SwiftyJSON in Frameworks */, 53352571265EA0A0006CCA86 /* Introspect in Frameworks */, E13DD3C62716499E009D4DAF /* CoreStore in Frameworks */, + E1E0F4D8278911680084F701 /* CachedAsyncImage in Frameworks */, + E1AE8E7C2789135A00FBDDAA /* Nuke in Frameworks */, 625CB57A2678C4A400530A6E /* ActivityIndicator in Frameworks */, E1B6DCE8271A23780015B715 /* CombineExt in Frameworks */, E10EAA45277BB646000269ED /* JellyfinAPI in Frameworks */, @@ -795,7 +798,6 @@ 53649AB5269D423A00A2D8B7 /* Puppy in Frameworks */, 536D3D7D267BD5F90004248C /* ActivityIndicator in Frameworks */, E13DD3CF27164E1F009D4DAF /* CoreStore in Frameworks */, - E1218C9C271A26C400EA0737 /* Nuke in Frameworks */, E10EAA47277BB670000269ED /* JellyfinAPI in Frameworks */, 3B8BA25B211CA261017ABA16 /* Pods_Swiftfin_Widget.framework in Frameworks */, ); @@ -1638,9 +1640,10 @@ E13DD3CC27164CA7009D4DAF /* CoreStore */, E12186DD2718F1C50010884C /* Defaults */, E1218C9D271A2CD600EA0737 /* CombineExt */, - E1218C9F271A2CF200EA0737 /* Nuke */, E1A9999A271A343C008E78C0 /* SwiftUICollection */, E178857C278037FD0094FBCF /* JellyfinAPI */, + E1E0F4D9278911A30084F701 /* CachedAsyncImage */, + E1AE8E7D2789136D00FBDDAA /* Nuke */, ); productName = "JellyfinPlayer tvOS"; productReference = 535870602669D21600D05A09 /* Swiftfin tvOS.app */; @@ -1675,10 +1678,11 @@ E13DD3D227168E65009D4DAF /* Defaults */, E1B6DCE7271A23780015B715 /* CombineExt */, E1B6DCE9271A23880015B715 /* SwiftyJSON */, - E1218C99271A26BA00EA0737 /* Nuke */, E1A99998271A3429008E78C0 /* SwiftUICollection */, E10EAA44277BB646000269ED /* JellyfinAPI */, E10EAA4C277BB716000269ED /* Sliders */, + E1E0F4D7278911680084F701 /* CachedAsyncImage */, + E1AE8E7B2789135A00FBDDAA /* Nuke */, ); productName = JellyfinPlayer; productReference = 5377CBF1263B596A003A4E83 /* Swiftfin iOS.app */; @@ -1703,7 +1707,6 @@ 53649AB4269D423A00A2D8B7 /* Puppy */, E13DD3CE27164E1F009D4DAF /* CoreStore */, E13DD3DC27175CE3009D4DAF /* Defaults */, - E1218C9B271A26C400EA0737 /* Nuke */, E10EAA46277BB670000269ED /* JellyfinAPI */, ); productName = WidgetExtensionExtension; @@ -1767,10 +1770,11 @@ E13DD3D127168E65009D4DAF /* XCRemoteSwiftPackageReference "Defaults" */, E1267D42271A212C003C492E /* XCRemoteSwiftPackageReference "CombineExt" */, E1C16B89271A2180009A5D25 /* XCRemoteSwiftPackageReference "SwiftyJSON" */, - E1218C98271A26BA00EA0737 /* XCRemoteSwiftPackageReference "Nuke" */, C4BFD4E327167B63007739E3 /* XCRemoteSwiftPackageReference "SwiftUICollection" */, E10EAA43277BB646000269ED /* XCRemoteSwiftPackageReference "jellyfin-sdk-swift" */, E10EAA4B277BB716000269ED /* XCRemoteSwiftPackageReference "swiftui-sliders" */, + E1E0F4D6278911680084F701 /* XCRemoteSwiftPackageReference "SwiftUI-CachedAsyncImage" */, + E1AE8E7A2789135A00FBDDAA /* XCRemoteSwiftPackageReference "Nuke" */, ); productRefGroup = 5377CBF2263B596A003A4E83 /* Products */; projectDirPath = ""; @@ -2525,7 +2529,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 66; DEVELOPMENT_ASSET_PATHS = "\"Swiftfin tvOS/Preview Content\""; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = TY84JMYEFE; ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "Swiftfin tvOS/Info.plist"; @@ -2555,7 +2559,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 66; DEVELOPMENT_ASSET_PATHS = "\"Swiftfin tvOS/Preview Content\""; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = TY84JMYEFE; ENABLE_PREVIEWS = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "Swiftfin tvOS/Info.plist"; @@ -2926,14 +2930,6 @@ kind = branch; }; }; - E1218C98271A26BA00EA0737 /* XCRemoteSwiftPackageReference "Nuke" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/kean/Nuke"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 9.0.0; - }; - }; E1267D42271A212C003C492E /* XCRemoteSwiftPackageReference "CombineExt" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/CombineCommunity/CombineExt"; @@ -2958,6 +2954,14 @@ minimumVersion = 6.0.0; }; }; + E1AE8E7A2789135A00FBDDAA /* XCRemoteSwiftPackageReference "Nuke" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/kean/Nuke"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 9.6.0; + }; + }; E1C16B89271A2180009A5D25 /* XCRemoteSwiftPackageReference "SwiftyJSON" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/SwiftyJSON/SwiftyJSON"; @@ -2966,6 +2970,14 @@ minimumVersion = 5.0.0; }; }; + E1E0F4D6278911680084F701 /* XCRemoteSwiftPackageReference "SwiftUI-CachedAsyncImage" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/lorenzofiamingo/SwiftUI-CachedAsyncImage"; + requirement = { + branch = main; + kind = branch; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -3044,26 +3056,11 @@ package = E13DD3D127168E65009D4DAF /* XCRemoteSwiftPackageReference "Defaults" */; productName = Defaults; }; - E1218C99271A26BA00EA0737 /* Nuke */ = { - isa = XCSwiftPackageProductDependency; - package = E1218C98271A26BA00EA0737 /* XCRemoteSwiftPackageReference "Nuke" */; - productName = Nuke; - }; - E1218C9B271A26C400EA0737 /* Nuke */ = { - isa = XCSwiftPackageProductDependency; - package = E1218C98271A26BA00EA0737 /* XCRemoteSwiftPackageReference "Nuke" */; - productName = Nuke; - }; E1218C9D271A2CD600EA0737 /* CombineExt */ = { isa = XCSwiftPackageProductDependency; package = E1267D42271A212C003C492E /* XCRemoteSwiftPackageReference "CombineExt" */; productName = CombineExt; }; - E1218C9F271A2CF200EA0737 /* Nuke */ = { - isa = XCSwiftPackageProductDependency; - package = E1218C98271A26BA00EA0737 /* XCRemoteSwiftPackageReference "Nuke" */; - productName = Nuke; - }; E13DD3C52716499E009D4DAF /* CoreStore */ = { isa = XCSwiftPackageProductDependency; package = E13DD3C42716499E009D4DAF /* XCRemoteSwiftPackageReference "CoreStore" */; @@ -3104,6 +3101,16 @@ package = C4BFD4E327167B63007739E3 /* XCRemoteSwiftPackageReference "SwiftUICollection" */; productName = SwiftUICollection; }; + E1AE8E7B2789135A00FBDDAA /* Nuke */ = { + isa = XCSwiftPackageProductDependency; + package = E1AE8E7A2789135A00FBDDAA /* XCRemoteSwiftPackageReference "Nuke" */; + productName = Nuke; + }; + E1AE8E7D2789136D00FBDDAA /* Nuke */ = { + isa = XCSwiftPackageProductDependency; + package = E1AE8E7A2789135A00FBDDAA /* XCRemoteSwiftPackageReference "Nuke" */; + productName = Nuke; + }; E1B6DCE7271A23780015B715 /* CombineExt */ = { isa = XCSwiftPackageProductDependency; package = E1267D42271A212C003C492E /* XCRemoteSwiftPackageReference "CombineExt" */; @@ -3114,6 +3121,16 @@ package = E1C16B89271A2180009A5D25 /* XCRemoteSwiftPackageReference "SwiftyJSON" */; productName = SwiftyJSON; }; + E1E0F4D7278911680084F701 /* CachedAsyncImage */ = { + isa = XCSwiftPackageProductDependency; + package = E1E0F4D6278911680084F701 /* XCRemoteSwiftPackageReference "SwiftUI-CachedAsyncImage" */; + productName = CachedAsyncImage; + }; + E1E0F4D9278911A30084F701 /* CachedAsyncImage */ = { + isa = XCSwiftPackageProductDependency; + package = E1E0F4D6278911680084F701 /* XCRemoteSwiftPackageReference "SwiftUI-CachedAsyncImage" */; + productName = CachedAsyncImage; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 5377CBE9263B596A003A4E83 /* Project object */; diff --git a/Swiftfin.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Swiftfin.xcworkspace/xcshareddata/swiftpm/Package.resolved index 3ed0ea18..cf80eed4 100644 --- a/Swiftfin.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Swiftfin.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -100,6 +100,15 @@ "version": "1.4.2" } }, + { + "package": "CachedAsyncImage", + "repositoryURL": "https://github.com/lorenzofiamingo/SwiftUI-CachedAsyncImage", + "state": { + "branch": "main", + "revision": "eb489a699be1f6e6c1a19fecdd6bfdc556474fd6", + "version": null + } + }, { "package": "Introspect", "repositoryURL": "https://github.com/siteline/SwiftUI-Introspect",