Example #1
0
        private OperationResult <AudioMetaData> MetaDataForFileFromATL(string fileName)
        {
            var sw = new Stopwatch();

            sw.Start();
            AudioMetaData result    = new AudioMetaData();
            var           isSuccess = false;

            try
            {
                result.Filename = fileName;
                var theTrack = new ATL.Track(fileName);
                result.Release         = theTrack.Album;
                result.Artist          = theTrack.AlbumArtist ?? theTrack.Artist;
                result.ArtistRaw       = theTrack.AlbumArtist ?? theTrack.Artist;
                result.Genres          = ID3TagsHelper.SplitGenre(theTrack.Genre);
                result.TrackArtist     = theTrack.OriginalArtist ?? theTrack.Artist ?? theTrack.AlbumArtist;
                result.TrackArtistRaw  = theTrack.OriginalArtist ?? theTrack.Artist ?? theTrack.AlbumArtist;
                result.AudioBitrate    = (int?)theTrack.Bitrate;
                result.AudioSampleRate = (int)theTrack.Bitrate;
                result.Disc            = theTrack.DiscNumber;
                if (theTrack.AdditionalFields.ContainsKey("TSST"))
                {
                    result.DiscSubTitle = theTrack.AdditionalFields["TSST"];
                }
                result.Images = theTrack.EmbeddedPictures?.Select(x => new AudioMetaDataImage
                {
                    Data        = x.PictureData,
                    Description = x.Description,
                    MimeType    = "image/jpg",
                    Type        = x.PicType == PictureInfo.PIC_TYPE.Front || x.PicType == PictureInfo.PIC_TYPE.Generic ? AudioMetaDataImageType.FrontCover : AudioMetaDataImageType.Other
                }).ToArray();
                result.Time        = theTrack.DurationMs > 0 ? ((decimal?)theTrack.DurationMs).ToTimeSpan() : null;
                result.Title       = theTrack.Title.ToTitleCase(false);
                result.TrackNumber = (short)theTrack.TrackNumber;
                result.Year        = theTrack.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
            });
        }
Example #2
0
        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);
        }
Example #3
0
        public OperationResult <AudioMetaData> MetaDataForFile(string fileName, bool returnEvenIfInvalid = false)
        {
            var r      = new OperationResult <AudioMetaData>();
            var result = this.MetaDataForFileFromIdSharp(fileName);

            if (result.Messages != null && result.Messages.Any())
            {
                foreach (var m in result.Messages)
                {
                    r.AddMessage(m);
                }
            }
            if (result.Errors != null && result.Errors.Any())
            {
                foreach (var e in result.Errors)
                {
                    r.AddError(e);
                }
            }
            if (!result.IsSuccess)
            {
                result = this.MetaDataForFileFromATL(fileName);
                if (result.Messages != null && result.Messages.Any())
                {
                    foreach (var m in result.Messages)
                    {
                        r.AddMessage(m);
                    }
                }
                if (result.Errors != null && result.Errors.Any())
                {
                    foreach (var e in result.Errors)
                    {
                        r.AddError(e);
                    }
                }
            }
            if (!result.IsSuccess)
            {
                r.AddMessage($"Missing Data `[{ ID3TagsHelper.DetermineMissingRequiredMetaData(result.Data) }]`");
            }
            r.Data      = result.Data;
            r.IsSuccess = result.IsSuccess;
            return(r);
        }
Example #4
0
        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
            });
        }