1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00

Fetch artwork from MusicBrainz if not on FS

This commit is contained in:
Daniel Barber 2019-03-19 19:29:20 -04:00
parent 11be238788
commit 5672ded50a
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
6 changed files with 57 additions and 14 deletions

View File

@ -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)
}

View File

@ -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!
}

View File

@ -326,6 +326,9 @@
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="updateFetchMissingArtworkFromInternet:" target="3C9-vU-zjZ" id="I7x-9V-xJr"/>
</connections>
</button>
</subviews>
<constraints>
@ -339,6 +342,7 @@
</constraints>
</view>
<connections>
<outlet property="fetchMissingArtworkFromInternet" destination="pRL-MG-1Be" id="Xcp-sb-iZm"/>
<outlet property="mpdLibraryDirField" destination="gDk-ca-eOa" id="myi-BQ-0NS"/>
</connections>
</viewController>

View File

@ -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)

View File

@ -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
}
}

View File

@ -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 {