From f014c4f929adc33fa9bb2d86b805039d943f0422 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Sun, 31 Mar 2019 17:33:10 -0400 Subject: [PATCH] Ensure artwork is fetched when the pref is changed --- .../Controllers/AlbumViewController.swift | 6 ++++- .../Controllers/QueueViewController.swift | 10 ++++---- Persephone/DataSources/AlbumDataSource.swift | 13 +++++++++- Persephone/Extensions/String.swift | 24 ------------------- Persephone/Models/Song.swift | 2 +- Persephone/Services/AlbumArtService.swift | 10 +++----- 6 files changed, 26 insertions(+), 39 deletions(-) delete mode 100644 Persephone/Extensions/String.swift diff --git a/Persephone/Controllers/AlbumViewController.swift b/Persephone/Controllers/AlbumViewController.swift index 40c5f10..5f5ca5b 100644 --- a/Persephone/Controllers/AlbumViewController.swift +++ b/Persephone/Controllers/AlbumViewController.swift @@ -40,6 +40,7 @@ class AlbumViewController: NSViewController, albumCollectionView.dataSource = dataSource preferences.addObserver(self, forKeyPath: "mpdLibraryDir") + preferences.addObserver(self, forKeyPath: "fetchMissingArtworkFromInternet") } override func viewWillLayout() { @@ -66,6 +67,9 @@ class AlbumViewController: NSViewController, switch keyPath { case "mpdLibraryDir": albumCollectionView.reloadData() + case "fetchMissingArtworkFromInternet": + dataSource.resetCoverArt() + albumCollectionView.reloadData() default: break } @@ -75,7 +79,7 @@ class AlbumViewController: NSViewController, guard let albums = notification.userInfo?[Notification.albumsKey] as? [MPDClient.MPDAlbum] else { return } - dataSource.albums = albums.map { Album(mpdAlbum: $0, coverArt: nil) } + dataSource.albums = albums.map { Album(mpdAlbum: $0) } albumCollectionView.reloadData() } diff --git a/Persephone/Controllers/QueueViewController.swift b/Persephone/Controllers/QueueViewController.swift index a2acb7e..82e2d22 100644 --- a/Persephone/Controllers/QueueViewController.swift +++ b/Persephone/Controllers/QueueViewController.swift @@ -72,11 +72,11 @@ class QueueViewController: NSViewController, albumArtService.fetchBigAlbumArt() .done() { - guard let image = $0 else { return } - - self.queueAlbumArtImage.image = image.toFitBox( - size: NSSize(width: 500, height: 500) - ) + if let image = $0 { + self.queueAlbumArtImage.image = image + } else { + self.queueAlbumArtImage.image = NSImage.defaultCoverArt + } } .cauterize() } else { diff --git a/Persephone/DataSources/AlbumDataSource.swift b/Persephone/DataSources/AlbumDataSource.swift index b7f6a59..88129e2 100644 --- a/Persephone/DataSources/AlbumDataSource.swift +++ b/Persephone/DataSources/AlbumDataSource.swift @@ -16,6 +16,14 @@ class AlbumDataSource: NSObject, NSCollectionViewDataSource { return albums.count } + func resetCoverArt() { + albums = albums.map { + var album = $0 + album.coverArtFetched = false + return album + } + } + func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { let item = collectionView.makeItem(withIdentifier: .albumViewItem, for: indexPath) guard let albumViewItem = item as? AlbumViewItem else { return item } @@ -23,7 +31,9 @@ class AlbumDataSource: NSObject, NSCollectionViewDataSource { albumViewItem.view.wantsLayer = true albumViewItem.setAlbum(albums[indexPath.item]) - if albums[indexPath.item].coverArt == nil { + if albums[indexPath.item].coverArt == nil && + !albums[indexPath.item].coverArtFetched { + AppDelegate.mpdClient.getAlbumFirstSong(for: albums[indexPath.item].mpdAlbum) { guard let song = $0 else { return } @@ -31,6 +41,7 @@ class AlbumDataSource: NSObject, NSCollectionViewDataSource { .fetchAlbumArt() .done { image in self.albums[indexPath.item].coverArt = image + self.albums[indexPath.item].coverArtFetched = true DispatchQueue.main.async { collectionView.reloadItems(at: [indexPath]) diff --git a/Persephone/Extensions/String.swift b/Persephone/Extensions/String.swift deleted file mode 100644 index e81abfe..0000000 --- a/Persephone/Extensions/String.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// String.swift -// Persephone -// -// Created by Daniel Barber on 2019/3/01. -// Copyright © 2019 Dan Barber. All rights reserved. -// - -import Foundation - -extension String { - func sha1() -> String { - let data = self.data(using: String.Encoding.utf8)! - var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH)) - - data.withUnsafeBytes { - _ = CC_SHA1($0, CC_LONG(data.count), &digest) - } - - let hexBytes = digest.map { String(format: "%02hhx", $0) } - - return hexBytes.joined() - } -} diff --git a/Persephone/Models/Song.swift b/Persephone/Models/Song.swift index 9aed5cc..b3327a7 100644 --- a/Persephone/Models/Song.swift +++ b/Persephone/Models/Song.swift @@ -20,6 +20,6 @@ struct Song { } var album: Album { - return Album(mpdAlbum: mpdSong.album, coverArt: nil) + return Album(mpdAlbum: mpdSong.album) } } diff --git a/Persephone/Services/AlbumArtService.swift b/Persephone/Services/AlbumArtService.swift index 6b3c422..29e8a3e 100644 --- a/Persephone/Services/AlbumArtService.swift +++ b/Persephone/Services/AlbumArtService.swift @@ -42,6 +42,8 @@ class AlbumArtService { } else { return image } + }.recover { (_) -> Guarantee in + return .value(nil) } } @@ -54,13 +56,7 @@ class AlbumArtService { artwork.map(Promise.value) ?? self.getRemoteArtwork() }.compactMap(on: artworkQueue) { return self.sizeAndCacheImage($0).map(Optional.some) - }.recover { error in - switch error { - case RemoteArtworkError.noArtworkAvailable: - self.cacheArtwork(data: Data()) - default: - break - } + }.recover { _ in return .value(nil) } }