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 {