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); }
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); }
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); } }
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); }
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); }