|
|
|
@ -11,14 +11,29 @@ final class LibraryViewModel { |
|
|
|
var trackCount = 0 |
|
|
|
var trackCount = 0 |
|
|
|
|
|
|
|
|
|
|
|
private let db: DatabaseService |
|
|
|
private let db: DatabaseService |
|
|
|
|
|
|
|
private let editService: TrackEditService |
|
|
|
private var cancellable: AnyDatabaseCancellable? |
|
|
|
private var cancellable: AnyDatabaseCancellable? |
|
|
|
private var searchTask: Task<Void, Never>? |
|
|
|
private var searchTask: Task<Void, Never>? |
|
|
|
|
|
|
|
|
|
|
|
init(db: DatabaseService) { |
|
|
|
init(db: DatabaseService) { |
|
|
|
self.db = db |
|
|
|
self.db = db |
|
|
|
|
|
|
|
self.editService = TrackEditService(database: db) |
|
|
|
updateQuery() |
|
|
|
updateQuery() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Applies metadata edits to one or more tracks. File-tag writes run off the |
|
|
|
|
|
|
|
// main actor; the library list refreshes automatically via the DB observation |
|
|
|
|
|
|
|
// (no manual reload). Returns per-track warnings (unsupported format / file |
|
|
|
|
|
|
|
// write failure) for the caller to surface; the DB edit always lands. |
|
|
|
|
|
|
|
func applyTrackEdits( |
|
|
|
|
|
|
|
_ values: EditableTrackFields, |
|
|
|
|
|
|
|
editing edited: Set<EditableTrackField>, |
|
|
|
|
|
|
|
to tracks: [Track] |
|
|
|
|
|
|
|
) async -> [TrackEditWarning] { |
|
|
|
|
|
|
|
let service = editService |
|
|
|
|
|
|
|
return await Task.detached { service.save(values, editing: edited, to: tracks) }.value |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func search(_ text: String) { |
|
|
|
func search(_ text: String) { |
|
|
|
searchText = text |
|
|
|
searchText = text |
|
|
|
searchTask?.cancel() |
|
|
|
searchTask?.cancel() |
|
|
|
|