protected virtual async IAsyncEnumerable <AlbumInfo> LoadAllAlbumsAsync() { var setFolders = _db.MediaFolders; var dbAlbums = await setFolders .AsNoTracking() .OfType <MediaAlbum>() .Select(x => new { x.Id, x.Name }) .ToDictionaryAsync(x => x.Name); foreach (var lazyProvider in _albumProviders) { var provider = lazyProvider.Value; var albums = provider.GetAlbums().DistinctBy(x => x.Name).ToArray(); foreach (var album in albums) { var info = new AlbumInfo { Name = album.Name, ProviderType = provider.GetType(), IsSystemAlbum = typeof(SystemAlbumProvider) == provider.GetType(), DisplayHint = provider.GetDisplayHint(album) ?? new AlbumDisplayHint() }; if (provider is IMediaTrackDetector detector) { var propertyTable = new TrackedMediaPropertyTable(album.Name); detector.ConfigureTracks(album.Name, propertyTable); info.IsTrackDetector = true; info.TrackedProperties = propertyTable.GetProperties(); } if (dbAlbums.TryGetValue(album.Name, out var dbAlbum)) { info.Id = dbAlbum.Id; } else { setFolders.Add(album); await _db.SaveChangesAsync(); info.Id = album.Id; } yield return(info); } } }
protected virtual IEnumerable <AlbumInfo> LoadAllAlbums() { var dbAlbums = _db.MediaAlbums .AsNoTracking() .Select(x => new { x.Id, x.Name }) .ToDictionary(x => x.Name); var trackDetectors = _trackDetectors.Select(x => x.Value).ToArray(); foreach (var lazyProvider in _albumProviders) { var provider = lazyProvider.Value; var albums = provider.GetAlbums().DistinctBy(x => x.Name).ToArray(); foreach (var album in albums) { var albumTrackDetectors = trackDetectors.Where(x => x.MatchAlbum(album.Name)); var albumInfo = new AlbumInfo { Name = album.Name, ProviderType = provider.GetType(), IsSystemAlbum = typeof(SystemAlbumProvider) == provider.GetType(), DisplayHint = provider.GetDisplayHint(album) ?? new AlbumDisplayHint(), TrackDetectorTypes = albumTrackDetectors.Select(x => x.GetType()).ToArray() }; if (albumInfo.HasTrackDetector) { var propertyTable = new TrackedMediaPropertyTable(album.Name); albumTrackDetectors.Each(detector => detector.ConfigureTracks(album.Name, propertyTable)); albumInfo.TrackedProperties = propertyTable.GetProperties(); } if (dbAlbums.TryGetValue(album.Name, out var dbAlbum)) { albumInfo.Id = dbAlbum.Id; } else { _db.MediaAlbums.Add(album); _db.SaveChanges(); albumInfo.Id = album.Id; } yield return(albumInfo); } } }