示例#1
0
        private async Task <Album> GetAlbumForTag(IAudioFileMetadata tag)
        {
            if (string.IsNullOrWhiteSpace(tag.Album))
            {
                return(null);
            }

            await _dbContextMutex.WaitAsync();

            var existingAlbum = OrderedAlbums.FirstOrDefault(a => a.Name.Equals(tag.Album, StringComparison.CurrentCulture));

            if (existingAlbum != null)
            {
                _dbContextMutex.Release();

                logger.WarnFormat("Not adding album with name '{0}' as another album with the same name already exists in the database", tag.Album);
                return(existingAlbum);
            }

            var newAlbum = new Album()
            {
                Name = tag.Album, hasAlbumArt = tag.HasAlbumArt ? 1 : 0
            };

            logger.DebugFormat("New album: {0}", newAlbum.Name);

            _dukeboxData.Albums.Add(newAlbum);
            _allAlbumsCache.Add(newAlbum);
            _dbContextMutex.Release();

            return(newAlbum);
        }
示例#2
0
        private async Task <Artist> GetArtistForTag(IAudioFileMetadata tag)
        {
            if (string.IsNullOrWhiteSpace(tag.Artist))
            {
                return(null);
            }

            await _dbContextMutex.WaitAsync();

            var existingArtist = OrderedArtists.FirstOrDefault(a => a.Name.Equals(tag.Artist, StringComparison.CurrentCulture));

            if (existingArtist != null)
            {
                _dbContextMutex.Release();

                logger.WarnFormat("Not adding artist with name '{0}' as an artist with the same name already exists in the database", tag.Artist);
                return(existingArtist);
            }

            var newArtist = new Artist()
            {
                Name = tag.Artist
            };

            logger.DebugFormat("New artist: {0}", newArtist.Name);

            _dukeboxData.Artists.Add(newArtist);
            _allArtistsCache.Add(newArtist);
            _dbContextMutex.Release();

            return(newArtist);
        }
示例#3
0
        public async Task <Song> AddFile(string filename, IAudioFileMetadata metadata = null)
        {
            if (!File.Exists(filename))
            {
                throw new FileNotFoundException(string.Format("Could not add file '{0}' as it is was not found on this system", filename));
            }

            if (!_audioFormats.FileSupported(filename))
            {
                throw new FileFormatException(string.Format("Error adding file '{0}': this format is not supported", filename));
            }

            if (metadata == null)
            {
                metadata = AudioFileMetadata.BuildAudioFileMetaData(filename);
            }

            var artist = await GetArtistForTag(metadata);

            var album = await GetAlbumForTag(metadata);

            var newSong = await BuildSongFromMetadata(filename, metadata, artist, album);

            return(newSong);
        }
        public void AddAlbumToCache(Album album, IAudioFileMetadata metadata)
        {
            if (album == null)
            {
                throw new ArgumentNullException("album");
            }

            var albumId = album.Id;

            if (CheckCacheForAlbum(albumId))
            {
                logger.WarnFormat("Not processing album with id {0} into album art cache as it is already in the album art cache.",
                                  albumId);
                return;
            }

            if (!metadata.HasAlbumArt)
            {
                logger.WarnFormat("Not processing album with id {0} into album art cache as the song does not contain album art data.",
                                  albumId);
                return;
            }

            var stopwatch = Stopwatch.StartNew();

            try
            {
                var albumIdString = album.Id.ToString();
                var path          = Path.Combine(_cachePath, albumIdString);

                metadata.GetAlbumArt(i => { i.Save(path); });

                if (!File.Exists(path))
                {
                    throw new FileNotFoundException("Image class failed to save image to file");
                }

                var fileInfo = new FileInfo(path);

                if (fileInfo.Length == 0)
                {
                    File.Delete(path);
                    throw new Exception("File generated by Image class was empty, empty generated file has been deleted");
                }

                stopwatch.Stop();
                logger.InfoFormat("Added album with id {0} into album art cache.", albumIdString);
                logger.DebugFormat("Adding album into album art cache took {0}ms. Album id: {1}",
                                   stopwatch.ElapsedMilliseconds, albumIdString);

                Task.Run(() => AlbumAdded?.Invoke(this, EventArgs.Empty));
            }
            catch (Exception ex)
            {
                logger.Error(string.Format("Error adding album with id {0} into album art cache.", albumId), ex);
            }
        }
示例#5
0
        public static ITrack BuildTrackInstance(string fileName, IAudioFileMetadata audioFileMetadata = null)
        {
            if (string.IsNullOrEmpty(fileName))
            {
                throw new ArgumentException("Cannot build track instance with a null or empty file name");
            }

            var song = new Song()
            {
                Id = -1, AlbumId = -1, ArtistId = -1, FileName = fileName
            };
            var track = BuildTrackInstance(song) as Track;

            track.Song.Title   = track.Metadata.Title;
            track._album.Name  = track.Metadata.Album;
            track._artist.Name = track.Metadata.Artist;

            return(track as ITrack);
        }
示例#6
0
        private async Task <Song> BuildSongFromMetadata(string filename, IAudioFileMetadata metadata, Artist artistObj, Album albumObj)
        {
            await _dbContextMutex.WaitAsync();

            var existingSongFile = _allFilesCache.FirstOrDefault(f => f.Equals(filename, StringComparison.CurrentCulture));

            if (existingSongFile != null)
            {
                var existingSong = _dukeboxData.Songs.FirstOrDefault(s => s.FileName.Equals(existingSongFile, StringComparison.CurrentCulture));
                _dbContextMutex.Release();

                logger.WarnFormat("Not adding song from file '{0}' as a song with that filename already exists in the database", filename);
                return(existingSong);
            }

            var newSong = new Song()
            {
                FileName = filename, Title = metadata.Title, Album = albumObj, Artist = artistObj
            };

            logger.DebugFormat("Title for file '{0}': {1}", newSong.FileName, newSong.Title);

            if (string.IsNullOrEmpty(newSong.Title))
            {
                var errMsg = string.Format("Title for file '{0}' is null or empty", filename);

                logger.Error(errMsg);
                throw new InvalidDataException(errMsg);
            }

            _dukeboxData.Songs.Add(newSong);
            _allFilesCache.Add(filename);
            _dbContextMutex.Release();

            logger.InfoFormat("New song: {0}.", filename);

            return(newSong);
        }