diff --git a/Persephone/Extensions/NSImage.swift b/Persephone/Extensions/NSImage.swift index d44d76f..a7b6a96 100644 --- a/Persephone/Extensions/NSImage.swift +++ b/Persephone/Extensions/NSImage.swift @@ -13,4 +13,24 @@ extension NSImage { static let pauseIcon = NSImage(named: "pauseButton") static let defaultCoverArt = NSImage(named: "blankAlbum") + + func toFitBox(size: NSSize) -> NSImage { + let newImage = NSImage(size: size) + newImage.lockFocus() + self.draw(in: newImage.alignmentRect) + newImage.unlockFocus() + return newImage + } + + func jpegData(compressionQuality: CGFloat) -> Data? { + guard let image = cgImage(forProposedRect: nil, context: nil, hints: nil) + else { return nil } + + let bitmapImageRep = NSBitmapImageRep(cgImage: image) + + return bitmapImageRep.representation( + using: .jpeg, + properties: [.compressionFactor: compressionQuality] + ) + } } diff --git a/Persephone/Services/AlbumArtService.swift b/Persephone/Services/AlbumArtService.swift index 62c91f1..91fc2c5 100644 --- a/Persephone/Services/AlbumArtService.swift +++ b/Persephone/Services/AlbumArtService.swift @@ -76,8 +76,15 @@ class AlbumArtService: NSObject { if FileManager.default.fileExists(atPath: coverArtURI), let data = FileManager.default.contents(atPath: coverArtURI), let image = NSImage(data: data) { - self.cacheArtwork(for: album, data: data) - callback(image) + + let imageThumb = image.toFitBox( + size: NSSize(width: 180, height: 180) + ) + self.cacheArtwork( + for: album, + data: imageThumb.jpegData(compressionQuality: 0.5) + ) + callback(imageThumb) break } } @@ -85,7 +92,7 @@ class AlbumArtService: NSObject { ) } - func cacheArtwork(for album: AlbumItem, data: Data) { + func cacheArtwork(for album: AlbumItem, data: Data?) { guard let bundleIdentifier = Bundle.main.bundleIdentifier, let cacheDir = try? FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true) .appendingPathComponent(bundleIdentifier)