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

Save fetched remote artwork to album directory

This commit is contained in:
Daniel Barber 2019-03-29 16:51:42 -04:00
parent 6bec0c170d
commit 29ab98b28c
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
2 changed files with 51 additions and 18 deletions

View File

@ -13,16 +13,14 @@ class AlbumArtService {
var preferences = Preferences()
let song: Song
let album: Album
let cachedArtworkSize = 180
let cachedArtworkQuality: CGFloat = 0.5
let bigArtworkSize = 600
var session = URLSession(configuration: .default)
let artworkQueue = DispatchQueue(
label: "albumArtQueue",
qos: .background,
attributes: .concurrent
)
let artworkQueue = DispatchQueue(label: "albumArtQueue", qos: .background)
init(song: Song) {
self.song = song
@ -32,8 +30,18 @@ class AlbumArtService {
func fetchBigAlbumArt() -> Promise<NSImage?> {
return firstly {
self.getArtworkFromFilesystem()
}.then { (artwork: NSImage?) -> Promise<NSImage?> in
artwork.map(Promise.value) ?? self.getRemoteArtwork().map(Optional.some)
}.then { (image: NSImage?) -> Promise<NSImage?> in
image.map(Promise.value) ?? self.getRemoteArtwork().map(Optional.some)
}.compactMap(on :artworkQueue) { image in
if self.fileSystemArtworkFilePath() != nil {
let sizedImage = image?.toFitBox(
size: NSSize(width: self.bigArtworkSize, height: self.bigArtworkSize)
)
self.saveArtworkToFilesystem(data: sizedImage?.jpegData(compressionQuality: self.cachedArtworkQuality))
return sizedImage
} else {
return image
}
}
}

View File

@ -10,30 +10,55 @@ import Cocoa
import PromiseKit
extension AlbumArtService {
func getArtworkFromFilesystem() -> Promise<NSImage?> {
let coverArtFilenames = [
var coverArtFilenames: [String] {
return [
"folder.jpg",
"cover.jpg",
"\(album.artist) - \(album.title).jpg"
]
}
let musicDir = self.preferences.expandedMpdLibraryDir
let songPath = self.songPath()
var musicDir: String {
return self.preferences.expandedMpdLibraryDir
}
func getArtworkFromFilesystem() -> Promise<NSImage?> {
return Promise { seal in
artworkQueue.async {
let image = coverArtFilenames
.lazy
.map { "\(musicDir)/\(songPath)/\($0)" }
.compactMap(self.tryImage)
.first
guard let artworkPath = self.fileSystemArtworkFilePath()
else { seal.fulfill(nil); return }
let image = self.tryImage(artworkPath)
seal.fulfill(image)
}
}
}
func songPath() -> String {
func saveArtworkToFilesystem(data: Data?) {
let artworkFileName = coverArtFilenames.first!
if self.fileSystemArtworkFilePath() == nil {
FileManager.default.createFile(
atPath: "\(self.musicDir)/\(self.songPath)/\(artworkFileName)",
contents: data,
attributes: nil
)
}
}
func fileSystemArtworkFilePath() -> String? {
let musicDir = self.preferences.expandedMpdLibraryDir
return self.coverArtFilenames
.lazy
.map { "\(musicDir)/\(self.songPath)/\($0)" }
.first {
FileManager.default.fileExists(atPath: $0)
}
}
var songPath: String {
return song
.mpdSong
.uriString