From 29ab98b28c7dc4010e4dff37367812739713dd79 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Fri, 29 Mar 2019 16:51:42 -0400 Subject: [PATCH] Save fetched remote artwork to album directory --- Persephone/Services/AlbumArtService.swift | 24 ++++++---- .../AlbumArtService+Filesystem.swift | 45 ++++++++++++++----- 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/Persephone/Services/AlbumArtService.swift b/Persephone/Services/AlbumArtService.swift index b96e6f6..b7d8aec 100644 --- a/Persephone/Services/AlbumArtService.swift +++ b/Persephone/Services/AlbumArtService.swift @@ -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 { return firstly { self.getArtworkFromFilesystem() - }.then { (artwork: NSImage?) -> Promise in - artwork.map(Promise.value) ?? self.getRemoteArtwork().map(Optional.some) + }.then { (image: NSImage?) -> Promise 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 + } } } diff --git a/Persephone/Services/Extensions/AlbumArtService+Filesystem.swift b/Persephone/Services/Extensions/AlbumArtService+Filesystem.swift index 39b2be5..d0d8437 100644 --- a/Persephone/Services/Extensions/AlbumArtService+Filesystem.swift +++ b/Persephone/Services/Extensions/AlbumArtService+Filesystem.swift @@ -10,30 +10,55 @@ import Cocoa import PromiseKit extension AlbumArtService { - func getArtworkFromFilesystem() -> Promise { - 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 { 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