diff --git a/Shared/Extensions/BlurHashDecode.swift b/Shared/Extensions/BlurHashDecode.swift index b3de466c..2e8513fb 100644 --- a/Shared/Extensions/BlurHashDecode.swift +++ b/Shared/Extensions/BlurHashDecode.swift @@ -8,6 +8,8 @@ import UIKit +// https://github.com/woltapp/blurhash/tree/master/Swift + public extension UIImage { convenience init?(blurHash: String, size: CGSize, punch: Float = 1) { guard blurHash.count >= 6 else { return nil } diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift index 2cc57295..27a6fdcb 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift @@ -55,7 +55,11 @@ public extension BaseItemDto { } if imgURL.queryParameters?[ImageType.backdrop.rawValue] == nil { - return imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" + if itemType == .episode { + return imageBlurHashes?.backdrop?.values.first ?? "001fC^" + } else { + return imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" + } } else { return imageBlurHashes?.primary?[imgTag] ?? "001fC^" } diff --git a/Shared/Views/ImageView.swift b/Shared/Views/ImageView.swift index 9dad2701..c31ba6fd 100644 --- a/Shared/Views/ImageView.swift +++ b/Shared/Views/ImageView.swift @@ -9,6 +9,8 @@ import NukeUI import SwiftUI +// TODO: update multiple sources so that multiple blurhashes can be taken, clean up + struct ImageView: View { @State @@ -34,24 +36,10 @@ struct ImageView: View { // TODO: fix placeholder hash view @ViewBuilder - private func placeholderView() -> some View { -// Image(uiImage: UIImage(blurHash: blurhash, size: CGSize(width: 8, height: 8)) ?? -// UIImage(blurHash: "001fC^", size: CGSize(width: 8, height: 8))!) -// .resizable() - - #if os(tvOS) - ZStack { - Color.black.ignoresSafeArea() - - ProgressView() - } - #else - ZStack { - Color.gray.ignoresSafeArea() - - ProgressView() - } - #endif + private var placeholderView: some View { + Image(uiImage: UIImage(blurHash: blurhash, size: CGSize(width: 12, height: 12)) ?? + UIImage(blurHash: "001fC^", size: CGSize(width: 12, height: 12))!) + .resizable() } @ViewBuilder @@ -73,9 +61,9 @@ struct ImageView: View { if let image = state.image { image } else if state.error != nil { - failureImage().onAppear { sources.removeFirst() } + placeholderView.onAppear { sources.removeFirst() } } else { - placeholderView() + placeholderView } } .pipeline(ImagePipeline(configuration: .withDataCache)) diff --git a/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift b/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift index db91e1c6..e86e1731 100644 --- a/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift +++ b/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift @@ -24,7 +24,8 @@ struct PortraitHeaderOverlayView: View { // MARK: Portrait Image - ImageView(src: viewModel.item.portraitHeaderViewURL(maxWidth: 130)) + ImageView(src: viewModel.item.portraitHeaderViewURL(maxWidth: 130), + bh: viewModel.item.getPrimaryImageBlurHash()) .portraitPoster(width: 130) .accessibilityIgnoresInvertColors()