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 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) { func addObserver(_ observer: NSObject, forKeyPath keyPath: String) {
preferences.addObserver(observer, forKeyPath: keyPath, options: .new, context: nil) preferences.addObserver(observer, forKeyPath: keyPath, options: .new, context: nil)
} }

View File

@ -18,6 +18,12 @@ class AlbumArtPrefsController: NSViewController {
mpdLibraryDirField.stringValue = mpdLibraryDir mpdLibraryDirField.stringValue = mpdLibraryDir
} }
if preferences.fetchMissingArtworkFromInternet {
fetchMissingArtworkFromInternet.state = .on
} else {
fetchMissingArtworkFromInternet.state = .off
}
preferredContentSize = NSMakeSize(view.frame.size.width, view.frame.size.height) preferredContentSize = NSMakeSize(view.frame.size.width, view.frame.size.height)
} }
@ -34,4 +40,14 @@ class AlbumArtPrefsController: NSViewController {
} }
@IBOutlet var mpdLibraryDirField: NSTextField! @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"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
<connections>
<action selector="updateFetchMissingArtworkFromInternet:" target="3C9-vU-zjZ" id="I7x-9V-xJr"/>
</connections>
</button> </button>
</subviews> </subviews>
<constraints> <constraints>
@ -339,6 +342,7 @@
</constraints> </constraints>
</view> </view>
<connections> <connections>
<outlet property="fetchMissingArtworkFromInternet" destination="pRL-MG-1Be" id="Xcp-sb-iZm"/>
<outlet property="mpdLibraryDirField" destination="gDk-ca-eOa" id="myi-BQ-0NS"/> <outlet property="mpdLibraryDirField" destination="gDk-ca-eOa" id="myi-BQ-0NS"/>
</connections> </connections>
</viewController> </viewController>

View File

@ -9,11 +9,12 @@
import Cocoa import Cocoa
class AlbumArtService: NSObject { class AlbumArtService: NSObject {
var preferences = Preferences()
let cachedArtworkSize = 180 let cachedArtworkSize = 180
let cachedArtworkQuality: CGFloat = 0.5 let cachedArtworkQuality: CGFloat = 0.5
static var shared = AlbumArtService() static var shared = AlbumArtService()
var preferences = Preferences()
var session = URLSession(configuration: .default) var session = URLSession(configuration: .default)
let cacheQueue = DispatchQueue(label: "albumArtCacheQueue", attributes: .concurrent) let cacheQueue = DispatchQueue(label: "albumArtCacheQueue", attributes: .concurrent)

View File

@ -12,7 +12,9 @@ extension AlbumArtService {
func getArtworkFromFilesystem( func getArtworkFromFilesystem(
for album: AlbumItem, for album: AlbumItem,
callback: @escaping (_ image: NSImage) -> Void callback: @escaping (_ image: NSImage) -> Void
) { ) {
var tryImage: NSImage?
let coverArtFilenames = [ let coverArtFilenames = [
"folder.jpg", "folder.jpg",
"cover.jpg", "cover.jpg",
@ -29,7 +31,9 @@ extension AlbumArtService {
for coverArtFilename in coverArtFilenames { for coverArtFilename in coverArtFilenames {
let coverArtURI = "\(fullAlbumURI)/\(coverArtFilename)" let coverArtURI = "\(fullAlbumURI)/\(coverArtFilename)"
if let image = self.tryImage(coverArtURI) { tryImage = self.tryImage(coverArtURI)
if let image = tryImage {
self.cacheArtwork( self.cacheArtwork(
for: album, for: album,
data: image.jpegData(compressionQuality: self.cachedArtworkQuality) data: image.jpegData(compressionQuality: self.cachedArtworkQuality)
@ -38,6 +42,10 @@ extension AlbumArtService {
break break
} }
} }
if tryImage == nil && self.preferences.fetchMissingArtworkFromInternet {
self.getRemoteArtwork(for: album, callback: callback)
}
} }
AppDelegate.mpdClient.getAlbumURI( AppDelegate.mpdClient.getAlbumURI(
@ -47,17 +55,15 @@ extension AlbumArtService {
} }
func tryImage(_ filePath: String) -> NSImage? { 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 data = FileManager.default.contents(atPath: filePath),
let image = NSImage(data: data) { let image = NSImage(data: data)
else { return nil }
let imageThumb = image.toFitBox( let imageThumb = image.toFitBox(
size: NSSize(width: self.cachedArtworkSize, height: self.cachedArtworkSize) size: NSSize(width: self.cachedArtworkSize, height: self.cachedArtworkSize)
) )
return imageThumb return imageThumb
} else {
return nil
}
} }
} }

View File

@ -40,8 +40,15 @@ extension AlbumArtService {
let url = urlComponents!.url let url = urlComponents!.url
return URLSession.shared.dataTask(.promise, with: url!).validate() return URLSession.shared.dataTask(.promise, with: url!).validate()
}.compactMap { }.compactMap {
self.cacheArtwork(for: album, data: $0.data) NSImage(data: $0.data)?.toFitBox(
return NSImage(data: $0.data) size: NSSize(width: self.cachedArtworkSize, height: self.cachedArtworkSize)
)
}.compactMap {
self.cacheArtwork(
for: album,
data: $0.jpegData(compressionQuality: self.cachedArtworkQuality)
)
return $0
}.done { }.done {
callback($0) callback($0)
}.catch { }.catch {