Ejemplo n.º 1
0
        private async Task UpdateDatabaseMetadataAsync(IFileMetadata fileMetadata, bool updateAlbumArtwork)
        {
            Track track = await this.trackRepository.GetTrackAsync(fileMetadata.SafePath);

            if (track == null)
            {
                return;
            }

            // Track
            if (fileMetadata.Title.IsValueChanged)
            {
                track.TrackTitle = fileMetadata.Title.Value;
            }
            if (fileMetadata.Year.IsValueChanged)
            {
                track.Year = fileMetadata.Year.Value.SafeConvertToLong();
            }
            if (fileMetadata.TrackNumber.IsValueChanged)
            {
                track.TrackNumber = fileMetadata.TrackNumber.Value.SafeConvertToLong();
            }
            if (fileMetadata.TrackCount.IsValueChanged)
            {
                track.TrackCount = fileMetadata.TrackCount.Value.SafeConvertToLong();
            }
            if (fileMetadata.DiscNumber.IsValueChanged)
            {
                track.DiscNumber = fileMetadata.DiscNumber.Value.SafeConvertToLong();
            }
            if (fileMetadata.DiscCount.IsValueChanged)
            {
                track.DiscCount = fileMetadata.DiscCount.Value.SafeConvertToLong();
            }
            if (fileMetadata.Lyrics.IsValueChanged)
            {
                track.HasLyrics = string.IsNullOrWhiteSpace(fileMetadata.Lyrics.Value) ? 0 : 1;
            }

            // Artist
            if (fileMetadata.Artists.IsValueChanged)
            {
                string newArtistName = fileMetadata.Artists.Values != null && !string.IsNullOrEmpty(fileMetadata.Artists.Values.FirstOrDefault()) ? fileMetadata.Artists.Values.FirstOrDefault() : Defaults.UnknownArtistText;
                Artist artist        = await this.artistRepository.GetArtistAsync(newArtistName);

                if (artist == null)
                {
                    artist = await this.artistRepository.AddArtistAsync(new Artist { ArtistName = newArtistName });
                }
                if (artist != null)
                {
                    track.ArtistID = artist.ArtistID;
                }
            }

            // Genre
            if (fileMetadata.Genres.IsValueChanged)
            {
                string newGenreName = fileMetadata.Genres.Values != null && !string.IsNullOrEmpty(fileMetadata.Genres.Values.FirstOrDefault()) ? fileMetadata.Genres.Values.FirstOrDefault() : Defaults.UnknownGenreText;
                Genre  genre        = await this.genreRepository.GetGenreAsync(newGenreName);

                if (genre == null)
                {
                    genre = await this.genreRepository.AddGenreAsync(new Genre { GenreName = newGenreName });
                }
                if (genre != null)
                {
                    track.GenreID = genre.GenreID;
                }
            }

            // Album
            if (fileMetadata.Album.IsValueChanged || fileMetadata.AlbumArtists.IsValueChanged || fileMetadata.Year.IsValueChanged)
            {
                string newAlbumTitle  = !string.IsNullOrWhiteSpace(fileMetadata.Album.Value) ? fileMetadata.Album.Value : Defaults.UnknownAlbumText;
                string newAlbumArtist = fileMetadata.AlbumArtists.Values != null && !string.IsNullOrEmpty(fileMetadata.AlbumArtists.Values.FirstOrDefault()) ? fileMetadata.AlbumArtists.Values.FirstOrDefault() : Defaults.UnknownArtistText;
                Album  album          = await this.albumRepository.GetAlbumAsync(newAlbumTitle, newAlbumArtist);

                if (album == null)
                {
                    album = new Album {
                        AlbumTitle = newAlbumTitle, AlbumArtist = newAlbumArtist, DateLastSynced = DateTime.Now.Ticks
                    };
                    album.ArtworkID = await this.cacheService.CacheArtworkAsync(IndexerUtils.GetArtwork(album, this.metadataFactory.Create(track.Path)));

                    album = await this.albumRepository.AddAlbumAsync(album);
                }

                if (album != null)
                {
                    track.AlbumID = album.AlbumID;
                }

                await Task.Run(() => MetadataUtils.UpdateAlbumYear(album, fileMetadata.Year.Value.SafeConvertToLong())); // Update Album year

                await this.albumRepository.UpdateAlbumAsync(album);
            }

            await this.trackRepository.UpdateTrackAsync(track); // Update Track in the database

            if (updateAlbumArtwork)
            {
                // Get album artist
                string albumArtist = fileMetadata.AlbumArtists.Values != null && !string.IsNullOrEmpty(fileMetadata.AlbumArtists.Values.FirstOrDefault()) ? fileMetadata.AlbumArtists.Values.FirstOrDefault() : string.Empty;

                // If no album artist is found, use the artist name. The album was probably saved using the artist name.
                if (string.IsNullOrEmpty(albumArtist))
                {
                    albumArtist = fileMetadata.Artists.Values != null && !string.IsNullOrEmpty(fileMetadata.Artists.Values.FirstOrDefault()) ? fileMetadata.Artists.Values.FirstOrDefault() : Defaults.UnknownArtistText;
                }

                // Get the album title
                string albumTitle = !string.IsNullOrWhiteSpace(fileMetadata.Album.Value) ? fileMetadata.Album.Value : Defaults.UnknownAlbumText;

                // Cache the new artwork
                string artworkID = await this.cacheService.CacheArtworkAsync(fileMetadata.ArtworkData.Value);

                // Update the album artwork in the database
                await this.albumRepository.UpdateAlbumArtworkAsync(albumTitle, albumArtist, artworkID);
            }
        }