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:
parent
11be238788
commit
5672ded50a
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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!
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user