Skip to content

Commit 4a7e4c2

Browse files
authored
Show album art based color gradients across views (#222)
1 parent 8970ec6 commit 4a7e4c2

17 files changed

Lines changed: 636 additions & 237 deletions

Core/MetadataExtractor.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class MetadataExtractor {
136136
&& AlbumArtFormat.isSupported(ext)
137137
{
138138
if let data = try? Data(contentsOf: url) {
139-
artworkMap[directory] = ImageResizer.compressImage(from: data, source: url.path) ?? data
139+
artworkMap[directory] = ImageUtils.compressImage(from: data, source: url.path) ?? data
140140
foundArtworkInCurrentDir = true
141141
}
142142
}
@@ -599,7 +599,7 @@ class MetadataExtractor {
599599
) {
600600
// Get the first attached picture
601601
if let firstPicture = audioMetadata.attachedPictures.first {
602-
metadata.artworkData = ImageResizer.compressImage(from: firstPicture.imageData, source: source)
602+
metadata.artworkData = ImageUtils.compressImage(from: firstPicture.imageData, source: source)
603603
?? firstPicture.imageData
604604
}
605605
}

Managers/Database/DMBackgroundMigration.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ extension DatabaseManager {
7171
guard let rowId: Int64 = row[Album.Columns.id],
7272
let original: Data = row[Album.Columns.artworkData] else { continue }
7373
let name: String? = row[Album.Columns.title]
74-
guard let compressed = ImageResizer.compressImage(
74+
guard let compressed = ImageUtils.compressImage(
7575
from: original, source: "album: \(name ?? "id=\(rowId)")"
7676
) else { continue }
7777
guard compressed.count < original.count else { continue }
@@ -101,7 +101,7 @@ extension DatabaseManager {
101101
guard let rowId: Int64 = row[Artist.Columns.id],
102102
let original: Data = row[Artist.Columns.artworkData] else { continue }
103103
let name: String? = row[Artist.Columns.name]
104-
guard let compressed = ImageResizer.compressImage(
104+
guard let compressed = ImageUtils.compressImage(
105105
from: original, source: "artist: \(name ?? "id=\(rowId)")"
106106
) else { continue }
107107
guard compressed.count < original.count else { continue }
@@ -131,7 +131,7 @@ extension DatabaseManager {
131131
guard let rowId: Int64 = row[FullTrack.Columns.trackId],
132132
let original: Data = row[FullTrack.Columns.trackArtworkData] else { continue }
133133
let name: String? = row[FullTrack.Columns.filename]
134-
guard let compressed = ImageResizer.compressImage(
134+
guard let compressed = ImageUtils.compressImage(
135135
from: original, source: "track: \(name ?? "id=\(rowId)")"
136136
) else { continue }
137137
guard compressed.count < original.count else { continue }
@@ -161,7 +161,7 @@ extension DatabaseManager {
161161
guard let rowId: String = row[Playlist.Columns.id],
162162
let original: Data = row[Playlist.Columns.coverArtworkData] else { continue }
163163
let name: String? = row[Playlist.Columns.name]
164-
guard let compressed = ImageResizer.compressImage(
164+
guard let compressed = ImageUtils.compressImage(
165165
from: original, source: "playlist: \(name ?? "id=\(rowId)")"
166166
) else { continue }
167167
guard compressed.count < original.count else { continue }

Models/Core/Entity.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Foundation
22
import AppKit
3+
import SwiftUI
34

45
// MARK: - Entity Protocol
56
protocol Entity: Identifiable {
@@ -33,7 +34,7 @@ struct ArtistEntity: Entity {
3334
return cached as Data
3435
}
3536

36-
if let jpegData = ImageResizer.resizeImage(from: original, to: ImageResizer.Size.medium) {
37+
if let jpegData = ImageUtils.resizeImage(from: original, to: ImageUtils.Size.medium) {
3738
ArtistEntity.artworkCache.setObject(jpegData as NSData, forKey: cacheKey)
3839
return jpegData
3940
}
@@ -48,7 +49,7 @@ struct ArtistEntity: Entity {
4849
return cached as Data
4950
}
5051

51-
if let jpegData = ImageResizer.resizeImage(from: original, to: ImageResizer.Size.large) {
52+
if let jpegData = ImageUtils.resizeImage(from: original, to: ImageUtils.Size.large) {
5253
ArtistEntity.artworkCache.setObject(jpegData as NSData, forKey: cacheKey)
5354
return jpegData
5455
}
@@ -102,7 +103,7 @@ struct AlbumEntity: Entity {
102103
return cached as Data
103104
}
104105

105-
if let jpegData = ImageResizer.resizeImage(from: original, to: ImageResizer.Size.medium) {
106+
if let jpegData = ImageUtils.resizeImage(from: original, to: ImageUtils.Size.medium) {
106107
AlbumEntity.artworkCache.setObject(jpegData as NSData, forKey: cacheKey)
107108
return jpegData
108109
}
@@ -117,13 +118,23 @@ struct AlbumEntity: Entity {
117118
return cached as Data
118119
}
119120

120-
if let jpegData = ImageResizer.resizeImage(from: original, to: ImageResizer.Size.large) {
121+
if let jpegData = ImageUtils.resizeImage(from: original, to: ImageUtils.Size.large) {
121122
AlbumEntity.artworkCache.setObject(jpegData as NSData, forKey: cacheKey)
122123
return jpegData
123124
}
124125
return nil
125126
}
126127

128+
var dominantColors: [NSColor] {
129+
guard let original = artworkData else { return [] }
130+
return ImageUtils.cachedDominantColors(id: id, imageData: original)
131+
}
132+
133+
func backgroundGradientColors(isDark: Bool) -> [Color] {
134+
guard let original = artworkData else { return [] }
135+
return ImageUtils.cachedBackgroundGradientColors(id: id, imageData: original, isDark: isDark)
136+
}
137+
127138
init(name: String, tracks: [Track]) {
128139
let namespace = UUID(uuidString: "6BA7B811-9DAD-11D1-80B4-00C04FD430C8")!
129140
self.id = UUID(name: name.lowercased(), namespace: namespace)

Models/Core/Playlist.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ struct Playlist: Identifiable, FetchableRecord, PersistableRecord {
384384
Logger.warning("Failed to create CGImage from collage")
385385
return nil
386386
}
387-
return ImageResizer.encodeHEIC(cgImage)
387+
return ImageUtils.encodeHEIC(cgImage)
388388
}
389389
}
390390

Models/Core/Track.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Foundation
22
import GRDB
33
import AppKit
4+
import SwiftUI
45

56
struct Track: Identifiable, Equatable, Hashable, FetchableRecord, PersistableRecord {
67
let id = UUID()
@@ -58,7 +59,7 @@ struct Track: Identifiable, Equatable, Hashable, FetchableRecord, PersistableRec
5859
return cached as Data
5960
}
6061

61-
if let jpegData = ImageResizer.resizeImage(from: original, to: ImageResizer.Size.small) {
62+
if let jpegData = ImageUtils.resizeImage(from: original, to: ImageUtils.Size.small) {
6263
Track.artworkCache.setObject(jpegData as NSData, forKey: cacheKey)
6364
return jpegData
6465
}
@@ -81,7 +82,7 @@ struct Track: Identifiable, Equatable, Hashable, FetchableRecord, PersistableRec
8182
return cached as Data
8283
}
8384

84-
if let jpegData = ImageResizer.resizeImage(from: original, to: ImageResizer.Size.medium) {
85+
if let jpegData = ImageUtils.resizeImage(from: original, to: ImageUtils.Size.medium) {
8586
Track.artworkCache.setObject(jpegData as NSData, forKey: cacheKey)
8687
return jpegData
8788
}
@@ -104,7 +105,7 @@ struct Track: Identifiable, Equatable, Hashable, FetchableRecord, PersistableRec
104105
return cached as Data
105106
}
106107

107-
if let jpegData = ImageResizer.resizeImage(from: original, to: ImageResizer.Size.large) {
108+
if let jpegData = ImageUtils.resizeImage(from: original, to: ImageUtils.Size.large) {
108109
Track.artworkCache.setObject(jpegData as NSData, forKey: cacheKey)
109110
return jpegData
110111
}
@@ -118,6 +119,16 @@ struct Track: Identifiable, Equatable, Hashable, FetchableRecord, PersistableRec
118119
}
119120
}
120121

122+
var dominantColors: [NSColor] {
123+
guard let original = albumArtworkData else { return [] }
124+
return ImageUtils.cachedDominantColors(id: id, imageData: original)
125+
}
126+
127+
func backgroundGradientColors(isDark: Bool) -> [Color] {
128+
guard let original = albumArtworkData else { return [] }
129+
return ImageUtils.cachedBackgroundGradientColors(id: id, imageData: original, isDark: isDark)
130+
}
131+
121132
// MARK: - Initialization
122133

123134
init(url: URL) {
@@ -385,7 +396,7 @@ extension Track {
385396
/// - Returns: FullTrack with all metadata, or nil if not found
386397
func fullTrack(using dbQueue: DatabaseQueue) async throws -> FullTrack? {
387398
guard let trackId = trackId else { return nil }
388-
399+
389400
return try await dbQueue.read { db in
390401
try FullTrack
391402
.filter(FullTrack.Columns.trackId == trackId)

Utilities/ImageResizer.swift

Lines changed: 0 additions & 108 deletions
This file was deleted.

0 commit comments

Comments
 (0)