public static short?DetermineTotalTrackNumbers(string filename, string trackNumber = null) { short?result = null; if (!string.IsNullOrEmpty(filename)) { var fileInfo = new FileInfo(filename); var directoryName = fileInfo.DirectoryName; // See if CUE sheet exists if so read tracks from that and return latest track number var cueFiles = Directory.GetFiles(directoryName, ("*.cue")); if (cueFiles != null && cueFiles.Any()) { try { ICatalogDataReader theReader = CatalogDataReaderFactory.GetInstance().GetCatalogDataReader(cueFiles.First()); result = (short)theReader.Tracks.Max(x => x.TrackNumber); } catch (Exception ex) { Trace.Write("Error Reading Cue: " + ex.ToString()); } } if (!result.HasValue) { // See if M3U sheet exists if so read tracks from that and return latest track number var m3uFiles = Directory.GetFiles(directoryName, ("*.m3u")); if (m3uFiles != null && m3uFiles.Any()) { try { IPlaylistReader theReader = PlaylistReaderFactory.GetInstance().GetPlaylistReader(m3uFiles.First()); result = (short)theReader.GetFiles().Count(); } catch (Exception ex) { Trace.Write("Error Reading m3u: " + ex.ToString()); } } } } // Try to parse from TrackNumber if (!result.HasValue) { result = ID3TagsHelper.ParseTotalTrackNumber(trackNumber); } return(result); }
private OperationResult <AudioMetaData> MetaDataForFileFromIdSharp(string fileName) { var sw = new Stopwatch(); sw.Start(); AudioMetaData result = new AudioMetaData(); var isSuccess = false; try { result.Filename = fileName; IAudioFile audioFile = AudioFile.Create(fileName, true); if (ID3v2Tag.DoesTagExist(fileName)) { IID3v2Tag id3v2 = new ID3v2Tag(fileName); result.Release = id3v2.Album; result.Artist = id3v2.AlbumArtist ?? id3v2.Artist; result.ArtistRaw = id3v2.AlbumArtist ?? id3v2.Artist; result.Genres = id3v2.Genre?.Split(new char[] { ',', '\\' }); result.TrackArtist = id3v2.OriginalArtist ?? id3v2.Artist ?? id3v2.AlbumArtist; result.TrackArtistRaw = id3v2.OriginalArtist; result.AudioBitrate = (int?)audioFile.Bitrate; result.AudioChannels = audioFile.Channels; result.AudioSampleRate = (int)audioFile.Bitrate; result.Disk = ID3TagsHelper.ParseDiscNumber(id3v2.DiscNumber); result.DiskSubTitle = id3v2.SetSubtitle; result.Images = id3v2.PictureList?.Select(x => new AudioMetaDataImage { Data = x.PictureData, Description = x.Description, MimeType = x.MimeType, Type = (AudioMetaDataImageType)x.PictureType }).ToArray(); result.Time = audioFile.TotalSeconds > 0 ? ((decimal?)audioFile.TotalSeconds).ToTimeSpan() : null; result.Title = id3v2.Title.ToTitleCase(false); result.TrackNumber = ID3TagsHelper.ParseTrackNumber(id3v2.TrackNumber); result.TotalTrackNumbers = ID3TagsHelper.ParseTotalTrackNumber(id3v2.TrackNumber); var year = id3v2.Year ?? id3v2.RecordingTimestamp ?? id3v2.ReleaseTimestamp ?? id3v2.OriginalReleaseTimestamp; result.Year = ID3TagsHelper.ParseYear(year); isSuccess = result.IsValid; } if (!isSuccess) { if (ID3v1Tag.DoesTagExist(fileName)) { IID3v1Tag id3v1 = new ID3v1Tag(fileName); result.Release = id3v1.Album; result.Artist = id3v1.Artist; result.ArtistRaw = id3v1.Artist; result.AudioBitrate = (int?)audioFile.Bitrate; result.AudioChannels = audioFile.Channels; result.AudioSampleRate = (int)audioFile.Bitrate; result.Time = audioFile.TotalSeconds > 0 ? ((decimal?)audioFile.TotalSeconds).ToTimeSpan() : null; result.Title = id3v1.Title.ToTitleCase(false); result.TrackNumber = SafeParser.ToNumber <short?>(id3v1.TrackNumber); var date = SafeParser.ToDateTime(id3v1.Year); result.Year = date?.Year ?? SafeParser.ToNumber <int?>(id3v1.Year); isSuccess = result.IsValid; } } } catch (Exception ex) { this.Logger.LogError(ex, "MetaDataForFileFromTagLib Filename [" + fileName + "] Error [" + ex.Serialize() + "]"); } sw.Stop(); return(new OperationResult <AudioMetaData> { IsSuccess = isSuccess, OperationTime = sw.ElapsedMilliseconds, Data = result }); }