1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00
persephone/Persephone/Services/AlbumArtService.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)
}
}
}
}