diff --git a/SharedSources/MediaLibraryModel/ArtistModel.swift b/SharedSources/MediaLibraryModel/ArtistModel.swift index 3b1b905d1f89ef719df36b446f0ab85e52ef8746..cc2df61f63ae2828557c54d86ee0e486e8985881 100644 --- a/SharedSources/MediaLibraryModel/ArtistModel.swift +++ b/SharedSources/MediaLibraryModel/ArtistModel.swift @@ -33,6 +33,33 @@ class ArtistModel: AudioCollectionModel { func append(_ item: VLCMLArtist) { files.append(item) } + + private func addNewArtists(_ artists: [VLCMLArtist]) { + let newArtists = artists.filter() { + for artist in files { + if artist.identifier() == $0.identifier() { + return false + } + } + return true + } + + for artist in newArtists { + if !files.contains(where: { $0.identifier() == artist.identifier() }) { + files.append(artist) + } + } + } + + private func filterGeneratedArtists() { + for (index, artist) in files.enumerated() { + if artist.identifier() == UnknownArtistID || artist.identifier() == VariousArtistID { + if artist.tracksCount() == 0 { + files.remove(at: index) + } + } + } + } } // MARK: - Sort @@ -62,9 +89,11 @@ extension ArtistModel: MediaLibraryObserver { func medialibrary(_ medialibrary: MediaLibraryService, didModifyArtistsWithIds artistsIds: [NSNumber]) { + + let uniqueArtistsIds = Array(Set(artistsIds)) var artists = [VLCMLArtist]() - artistsIds.forEach() { + uniqueArtistsIds.forEach() { guard let safeArtist = medialibrary.medialib.artist(withIdentifier: $0.int64Value) else { return @@ -73,6 +102,8 @@ extension ArtistModel: MediaLibraryObserver { } files = swapModels(with: artists) + addNewArtists(artists) + filterGeneratedArtists() updateView?() }