From 5672ded50a1c86084a12081b88dd512432fcaa6b Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Tue, 19 Mar 2019 19:29:20 -0400 Subject: [PATCH] Fetch artwork from MusicBrainz if not on FS --- Persephone/Models/Preferences.swift | 9 ++++++ .../Controllers/AlbumArtPrefsController.swift | 16 +++++++++++ .../Resources/Base.lproj/Main.storyboard | 4 +++ Persephone/Services/AlbumArtService.swift | 3 +- .../AlbumArtService+Filesystem.swift | 28 +++++++++++-------- .../Extensions/AlbumArtService+Remote.swift | 11 ++++++-- 6 files changed, 57 insertions(+), 14 deletions(-) diff --git a/Persephone/Models/Preferences.swift b/Persephone/Models/Preferences.swift index 94926c9..4e0b599 100644 --- a/Persephone/Models/Preferences.swift +++ b/Persephone/Models/Preferences.swift @@ -62,6 +62,15 @@ struct Preferences { return NSString(string: mpdLibraryDirOrDefault).expandingTildeInPath } + var fetchMissingArtworkFromInternet: Bool { + get { + return preferences.bool(forKey: "fetchMissingArtworkFromInternet") + } + set { + preferences.set(newValue, forKey: "fetchMissingArtworkFromInternet") + } + } + func addObserver(_ observer: NSObject, forKeyPath keyPath: String) { preferences.addObserver(observer, forKeyPath: keyPath, options: .new, context: nil) } diff --git a/Persephone/Preferences/Controllers/AlbumArtPrefsController.swift b/Persephone/Preferences/Controllers/AlbumArtPrefsController.swift index 97c33ad..979ad71 100644 --- a/Persephone/Preferences/Controllers/AlbumArtPrefsController.swift +++ b/Persephone/Preferences/Controllers/AlbumArtPrefsController.swift @@ -18,6 +18,12 @@ class AlbumArtPrefsController: NSViewController { mpdLibraryDirField.stringValue = mpdLibraryDir } + if preferences.fetchMissingArtworkFromInternet { + fetchMissingArtworkFromInternet.state = .on + } else { + fetchMissingArtworkFromInternet.state = .off + } + preferredContentSize = NSMakeSize(view.frame.size.width, view.frame.size.height) } @@ -34,4 +40,14 @@ class AlbumArtPrefsController: NSViewController { } @IBOutlet var mpdLibraryDirField: NSTextField! + + @IBAction func updateFetchMissingArtworkFromInternet(_ sender: NSButton) { + if sender.state == .on { + preferences.fetchMissingArtworkFromInternet = true + } else { + preferences.fetchMissingArtworkFromInternet = false + } + } + + @IBOutlet var fetchMissingArtworkFromInternet: NSButton! } diff --git a/Persephone/Resources/Base.lproj/Main.storyboard b/Persephone/Resources/Base.lproj/Main.storyboard index 786cf4f..b717309 100644 --- a/Persephone/Resources/Base.lproj/Main.storyboard +++ b/Persephone/Resources/Base.lproj/Main.storyboard @@ -326,6 +326,9 @@ + + + @@ -339,6 +342,7 @@ + diff --git a/Persephone/Services/AlbumArtService.swift b/Persephone/Services/AlbumArtService.swift index 8b151f4..ecdb88f 100644 --- a/Persephone/Services/AlbumArtService.swift +++ b/Persephone/Services/AlbumArtService.swift @@ -9,11 +9,12 @@ import Cocoa class AlbumArtService: NSObject { + var preferences = Preferences() + let cachedArtworkSize = 180 let cachedArtworkQuality: CGFloat = 0.5 static var shared = AlbumArtService() - var preferences = Preferences() var session = URLSession(configuration: .default) let cacheQueue = DispatchQueue(label: "albumArtCacheQueue", attributes: .concurrent) diff --git a/Persephone/Services/Extensions/AlbumArtService+Filesystem.swift b/Persephone/Services/Extensions/AlbumArtService+Filesystem.swift index 8e8c08e..3989a1e 100644 --- a/Persephone/Services/Extensions/AlbumArtService+Filesystem.swift +++ b/Persephone/Services/Extensions/AlbumArtService+Filesystem.swift @@ -12,7 +12,9 @@ extension AlbumArtService { func getArtworkFromFilesystem( for album: AlbumItem, callback: @escaping (_ image: NSImage) -> Void - ) { + ) { + var tryImage: NSImage? + let coverArtFilenames = [ "folder.jpg", "cover.jpg", @@ -29,7 +31,9 @@ extension AlbumArtService { for coverArtFilename in coverArtFilenames { let coverArtURI = "\(fullAlbumURI)/\(coverArtFilename)" - if let image = self.tryImage(coverArtURI) { + tryImage = self.tryImage(coverArtURI) + + if let image = tryImage { self.cacheArtwork( for: album, data: image.jpegData(compressionQuality: self.cachedArtworkQuality) @@ -38,6 +42,10 @@ extension AlbumArtService { break } } + + if tryImage == nil && self.preferences.fetchMissingArtworkFromInternet { + self.getRemoteArtwork(for: album, callback: callback) + } } AppDelegate.mpdClient.getAlbumURI( @@ -47,17 +55,15 @@ extension AlbumArtService { } func tryImage(_ filePath: String) -> NSImage? { - if FileManager.default.fileExists(atPath: filePath), + guard FileManager.default.fileExists(atPath: filePath), let data = FileManager.default.contents(atPath: filePath), - let image = NSImage(data: data) { + let image = NSImage(data: data) + else { return nil } - let imageThumb = image.toFitBox( - size: NSSize(width: self.cachedArtworkSize, height: self.cachedArtworkSize) - ) + let imageThumb = image.toFitBox( + size: NSSize(width: self.cachedArtworkSize, height: self.cachedArtworkSize) + ) - return imageThumb - } else { - return nil - } + return imageThumb } } diff --git a/Persephone/Services/Extensions/AlbumArtService+Remote.swift b/Persephone/Services/Extensions/AlbumArtService+Remote.swift index 2c017d1..7c9fa87 100644 --- a/Persephone/Services/Extensions/AlbumArtService+Remote.swift +++ b/Persephone/Services/Extensions/AlbumArtService+Remote.swift @@ -40,8 +40,15 @@ extension AlbumArtService { let url = urlComponents!.url return URLSession.shared.dataTask(.promise, with: url!).validate() }.compactMap { - self.cacheArtwork(for: album, data: $0.data) - return NSImage(data: $0.data) + NSImage(data: $0.data)?.toFitBox( + size: NSSize(width: self.cachedArtworkSize, height: self.cachedArtworkSize) + ) + }.compactMap { + self.cacheArtwork( + for: album, + data: $0.jpegData(compressionQuality: self.cachedArtworkQuality) + ) + return $0 }.done { callback($0) }.catch {