Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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);
                }
            }
        }