@@ -3,12 +3,13 @@ import GRDB
33
44class Track : Identifiable , ObservableObject , Equatable , FetchableRecord , PersistableRecord {
55 let id = UUID ( )
6- var trackId : Int64 ? // Database ID
6+ var trackId : Int64 ?
77 let url : URL
88
99 @Published var title : String
1010 @Published var artist : String
1111 @Published var album : String
12+ @Published var composer : String
1213 @Published var genre : String
1314 @Published var year : String
1415 @Published var duration : Double
@@ -29,6 +30,7 @@ class Track: Identifiable, ObservableObject, Equatable, FetchableRecord, Persist
2930 self . title = url. deletingPathExtension ( ) . lastPathComponent
3031 self . artist = " Unknown Artist "
3132 self . album = " Unknown Album "
33+ self . composer = " Unknown Composer "
3234 self . genre = " Unknown Genre "
3335 self . year = " Unknown Year "
3436 self . duration = 0
@@ -47,6 +49,7 @@ class Track: Identifiable, ObservableObject, Equatable, FetchableRecord, Persist
4749 static let title = Column ( " title " )
4850 static let artist = Column ( " artist " )
4951 static let album = Column ( " album " )
52+ static let composer = Column ( " composer " )
5053 static let genre = Column ( " genre " )
5154 static let year = Column ( " year " )
5255 static let duration = Column ( " duration " )
@@ -73,6 +76,11 @@ class Track: Identifiable, ObservableObject, Equatable, FetchableRecord, Persist
7376 artist = row [ Columns . artist] ?? " Unknown Artist "
7477 album = row [ Columns . album] ?? " Unknown Album "
7578 genre = row [ Columns . genre] ?? " Unknown Genre "
79+
80+ // Normalize empty composer strings
81+ let composerValue = row [ Columns . composer] ?? " Unknown Composer "
82+ composer = composerValue. isEmpty ? " Unknown Composer " : composerValue
83+
7684 year = row [ Columns . year] ?? " "
7785 duration = row [ Columns . duration] ?? 0
7886 format = row [ Columns . format] ?? url. pathExtension
@@ -82,7 +90,6 @@ class Track: Identifiable, ObservableObject, Equatable, FetchableRecord, Persist
8290 lastPlayedDate = row [ Columns . lastPlayedDate]
8391 isMetadataLoaded = true
8492 }
85-
8693 // MARK: - PersistableRecord
8794
8895 func encode( to container: inout PersistenceContainer ) throws {
@@ -93,6 +100,7 @@ class Track: Identifiable, ObservableObject, Equatable, FetchableRecord, Persist
93100 container [ Columns . title] = title
94101 container [ Columns . artist] = artist
95102 container [ Columns . album] = album
103+ container [ Columns . composer] = composer
96104 container [ Columns . genre] = genre
97105 container [ Columns . year] = year
98106 container [ Columns . duration] = duration
@@ -123,3 +131,12 @@ class Track: Identifiable, ObservableObject, Equatable, FetchableRecord, Persist
123131 return lhs. id == rhs. id
124132 }
125133}
134+
135+ // MARK: - Hashable Conformance
136+
137+ extension Track : Hashable {
138+ func hash( into hasher: inout Hasher ) {
139+ // Use the unique ID for hashing
140+ hasher. combine ( id)
141+ }
142+ }
0 commit comments