mirror of
https://github.com/danbee/persephone
synced 2025-03-04 08:39:11 +00:00
57 lines
1.5 KiB
Swift
57 lines
1.5 KiB
Swift
//
|
|
// AlbumArtService.swift
|
|
// Persephone
|
|
//
|
|
// Created by Daniel Barber on 2019/2/23.
|
|
// Copyright © 2019 Dan Barber. All rights reserved.
|
|
//
|
|
|
|
import Cocoa
|
|
import PromiseKit
|
|
|
|
class AlbumArtService {
|
|
var preferences = Preferences()
|
|
let song: Song
|
|
let album: Album
|
|
|
|
let cachedArtworkSize = 180
|
|
let cachedArtworkQuality: CGFloat = 0.5
|
|
|
|
var session = URLSession(configuration: .default)
|
|
let cacheQueue = DispatchQueue(label: "albumArtCacheQueue")
|
|
|
|
init(song: Song) {
|
|
self.song = song
|
|
self.album = song.album
|
|
}
|
|
|
|
func fetchAlbumArt(callback: @escaping (_ image: NSImage?) -> Void) {
|
|
cacheQueue.async {
|
|
firstly {
|
|
self.getCachedArtwork()
|
|
}.then { artwork -> Promise<NSImage?> in
|
|
artwork.map { Promise.value($0 as NSImage?) } ?? self.cacheIfNecessary(self.getArtworkFromFilesystem())
|
|
}.then { artwork -> Promise<NSImage?> in
|
|
artwork.map { Promise.value($0 as NSImage?) } ?? self.cacheIfNecessary(self.getArtworkFromMusicBrainz().map(Optional.some))
|
|
}.tap { result in
|
|
switch result {
|
|
case .fulfilled(nil), .rejected(MusicBrainzError.noArtworkAvailable):
|
|
self.cacheArtwork(data: Data())
|
|
default:
|
|
break
|
|
}
|
|
}.recover { error in
|
|
.value(nil)
|
|
}.done(callback)
|
|
}
|
|
}
|
|
|
|
func cacheIfNecessary(_ promise: Promise<NSImage?>) -> Promise<NSImage?> {
|
|
return promise.get { image in
|
|
if let data = image?.jpegData(compressionQuality: self.cachedArtworkQuality) {
|
|
self.cacheArtwork(data: data)
|
|
}
|
|
}
|
|
}
|
|
}
|