Example #1
0
        /// <summary>
        /// Get image data from all sources for either fileanme or MetaData
        /// </summary>
        /// <param name="filename">Name of the File (ie a CUE file)</param>
        /// <param name="metaData">Populated MetaData</param>
        /// <returns></returns>
        public AudioMetaDataImage GetPictureForMetaData(string filename, AudioMetaData metaData)
        {
            SimpleContract.Requires <ArgumentException>(!string.IsNullOrEmpty(filename), "Invalid Filename");
            SimpleContract.Requires <ArgumentException>(metaData != null, "Invalid MetaData");

            return(this.ImageForFilename(filename));
        }
Example #2
0
 public void GetMetaData(AudioMetaData audioMD)
 {
     using (IMarshaler marsh = audioMD.GetMarshaler(true))
     {
         SafeNativeMethods.xnGetAudioMetaData(this.InternalObject, marsh.Native);
     }
 }
Example #3
0
        public static string DetermineMissingRequiredMetaData(AudioMetaData metaData)
        {
            var result = new List <string>();

            if (string.IsNullOrEmpty(metaData.Artist))
            {
                result.Add("Artist Name (TPE1)");
            }
            if (string.IsNullOrEmpty(metaData.Release))
            {
                result.Add("Release Title (TALB)");
            }
            if (string.IsNullOrEmpty(metaData.Title))
            {
                result.Add("Track Title (TIT2)");
            }
            if ((metaData.Year ?? 0) < 1)
            {
                result.Add("Release Year (TYER | TDRC | TORY | TDOR)");
            }
            if ((metaData.TrackNumber ?? 0) < 1)
            {
                result.Add("TrackNumber (TRCK)");
            }
            return(string.Join(", ", result));
        }
        public TextToSpeechDecal()
        {
            MetaData = new AudioMetaData();
            CanResize = false;
            Stretch = System.Windows.Media.Stretch.None;
            Center = new System.Windows.Point(0.5,1);
            PinPoint = new System.Windows.Point(0.5,1);
            CanMove = false;

            #if !SILVERLIGHT
            Play = new DelegateCommand(() =>
            {
                if (!string.IsNullOrEmpty(MetaData.Source) && !_isSpeaking)
                {
                    synthesizer = new SpeechSynthesizer();
                    synthesizer.Rate = -1;

                    synthesizer.SpeakAsync(MetaData.Source);
                    _isSpeaking = true;
                    // always dispose resources!
                    synthesizer.SpeakCompleted += new EventHandler<System.Speech.Synthesis.SpeakCompletedEventArgs>(task_SpeakCompleted);
                }
            }, () =>
            {
                return !string.IsNullOrEmpty(MetaData.Source);
            });
            #endif
        }
        public TextToSpeechDecal()
        {
            MetaData  = new AudioMetaData();
            CanResize = false;
            Stretch   = System.Windows.Media.Stretch.None;
            Center    = new System.Windows.Point(0.5, 1);
            PinPoint  = new System.Windows.Point(0.5, 1);
            CanMove   = false;

#if !SILVERLIGHT
            Play = new DelegateCommand(() =>
            {
                if (!string.IsNullOrEmpty(MetaData.Source) && !_isSpeaking)
                {
                    synthesizer      = new SpeechSynthesizer();
                    synthesizer.Rate = -1;

                    synthesizer.SpeakAsync(MetaData.Source);
                    _isSpeaking = true;
                    // always dispose resources!
                    synthesizer.SpeakCompleted += new EventHandler <System.Speech.Synthesis.SpeakCompletedEventArgs>(task_SpeakCompleted);
                }
            }, () =>
            {
                return(!string.IsNullOrEmpty(MetaData.Source));
            });
#endif
        }
Example #6
0
 public void GetMetaData(AudioMetaData audioMD)
 {
     using (IMarshaler marsh = audioMD.GetMarshaler(true))
     {
         OpenNIImporter.xnGetAudioMetaData(this.InternalObject, marsh.Native);
     }
 }
Example #7
0
 /// <summary>
 /// Returns the Full path (FQDN) for given Track details
 /// </summary>
 /// <param name="metaData">Populated Track MetaData</param>
 /// <param name="destinationFolder">Optional Root folder defaults to Library Folder from Settings</param>
 /// <param name="artistFolder">Optional ArtistFolder default is to get from MetaData artist</param>
 public static string TrackFullPath(IRoadieSettings configuration, AudioMetaData metaData, string destinationFolder = null, string artistFolder = null, string releaseFolder = null)
 {
     return(FolderPathHelper.TrackFullPath(configuration, metaData.Artist, metaData.Release, SafeParser.ToDateTime(metaData.Year).Value,
                                           metaData.Title, metaData.TrackNumber ?? 0, destinationFolder, metaData.Disc ?? 0,
                                           metaData.TotalTrackNumbers ?? 0,
                                           artistFolder: artistFolder,
                                           releaseFolder: releaseFolder));
 }
Example #8
0
 private extern static IntPtr readaudio(String filename,
                                        Int32 sr,
                                        [In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R4)]
                                        float[] buf,
                                        ref UInt32 buflen,
                                        float nbsecs,
                                        ref AudioMetaData mdata,
                                        ref Int32 error);
Example #9
0
 public TrackDownloadService(TrackModel track, AudioProcessor audioProcessor, IDownloadPathConfigurator downloadPathConfigurator)
 {
     Track                    = track;
     AudioProcessor           = audioProcessor;
     DownloadPathConfigurator = downloadPathConfigurator;
     AudioMetaData            = new AudioMetaData();
     Mp3MetaData              = new Mp3MetaData();
     Cleanup                  = true;
     OutputDirectory          = "download";
 }
Example #10
0
        /// <summary>
        ///     Returns the Directory for a Track (just directory not Track FileName)
        /// </summary>
        /// <param name="metaData">Populated Track MetaData</param>
        /// <param name="destinationFolder">Optional Root folder defaults to Library Folder from Settings</param>
        /// <param name="artistFolder">Optional ArtistFolder default is to get from MetaData artist</param>
        /// ///
        public static string TrackPath(IRoadieSettings configuration, AudioMetaData metaData, string destinationFolder = null, string artistFolder = null)
        {
            var fileInfo = new FileInfo(TrackFullPath(configuration, metaData, destinationFolder, artistFolder));
            var tf       = fileInfo.Directory.Parent.FullName.Replace(new DirectoryInfo(configuration.LibraryFolder).FullName, "");

            if (tf.StartsWith(Path.DirectorySeparatorChar))
            {
                tf = tf.RemoveFirst(Path.DirectorySeparatorChar.ToString());
            }
            return(Path.Combine(tf, fileInfo.Directory.Name));
        }
Example #11
0
        private OperationResult <AudioMetaData> MetaDataForFileFromATL(string fileName)
        {
            var sw = new Stopwatch();

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

            try
            {
                result.Filename = fileName;
                var theTrack = new Track(fileName);
                result.Release         = theTrack.Album;
                result.Artist          = theTrack.AlbumArtist ?? theTrack.Artist;
                result.ArtistRaw       = theTrack.AlbumArtist ?? theTrack.Artist;
                result.Genres          = SplitGenre(theTrack.Genre);
                result.TrackArtist     = theTrack.OriginalArtist ?? theTrack.Artist ?? theTrack.AlbumArtist;
                result.TrackArtistRaw  = theTrack.OriginalArtist ?? theTrack.Artist ?? theTrack.AlbumArtist;
                result.AudioBitrate    = theTrack.Bitrate;
                result.AudioSampleRate = 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)
            {
                Logger.LogError(ex,
                                "MetaDataForFileFromTagLib Filename [" + fileName + "] Error [" + ex.Serialize() + "]");
            }

            sw.Stop();
            return(new OperationResult <AudioMetaData>
            {
                IsSuccess = isSuccess,
                OperationTime = sw.ElapsedMilliseconds,
                Data = result
            });
        }
Example #12
0
 public static int DetermineDiscNumber(AudioMetaData metaData)
 {
     for (var i = MaximumDiscNumber; i > 0; i--)
     {
         if (Regex.IsMatch(metaData.Filename, @"(cd\s*(0*" + i + "))", RegexOptions.IgnoreCase))
         {
             return(i);
         }
     }
     return(1);
 }
Example #13
0
 private void LoadFile(AudioMetaData file)
 {
     if (HasValidExtension(file))
     {
         InGameDebug.Log("\t\tLoading '" + file.Path + "'.");
         StartCoroutine(StreamFile(file));
     }
     else
     {
         InGameDebug.Log("\t\tAudioLoader: '" + file + "' has invalid extension.");
     }
 }
Example #14
0
        public override OperationResult <AudioMetaData> Process(AudioMetaData metaData)
        {
            var result = new OperationResult <AudioMetaData>();
            var metaDatasForFilesInFolder = GetAudioMetaDatasForDirectory(metaData.FileInfo.Directory);

            metaData.TrackNumber       = (metaData.TrackNumber ?? 0) > 0 ? metaData.TrackNumber : ID3TagsHelper.DetermineTrackNumber(metaData.FileInfo.Name);
            metaData.TotalTrackNumbers = ID3TagsHelper.DetermineTotalTrackNumbers(metaData.Filename) ?? metaDatasForFilesInFolder.Count();
            metaData.Disc           = ID3TagsHelper.DetermineDiscNumber(metaData);
            metaData.TotalDiscCount = ID3TagsHelper.DetermineTotalDiscNumbers(metaDatasForFilesInFolder);
            result.Data             = metaData;
            result.IsSuccess        = true;
            return(result);
        }
Example #15
0
        public override OperationResult <AudioMetaData> Process(AudioMetaData metaData)
        {
            var result = new OperationResult <AudioMetaData>();

            if (this.Configuration.Processing.DoAudioCleanup)
            {
                metaData.Artist      = CleanArtist(metaData.ArtistRaw);
                metaData.TrackArtist = CleanArtist(metaData.TrackArtistRaw, metaData.ArtistRaw);
            }
            result.Data      = metaData;
            result.IsSuccess = true;
            return(result);
        }
Example #16
0
        public static int DetermineDiscNumber(AudioMetaData metaData)
        {
            var maxDiscNumber = 500; // Damnit Karajan

            for (var i = maxDiscNumber; i > 0; i--)
            {
                if (Regex.IsMatch(metaData.Filename, @"(cd\s*(0*" + i + "))", RegexOptions.IgnoreCase))
                {
                    return(i);
                }
            }
            return(1);
        }
Example #17
0
    /// <summary>
    ///   Read in an audio file and return a buffer of samples at given samplerate, sr
    /// </summary>
    /// <param name="strign">name of file</param>
    /// <param name="Int32">sr samplerate of samples, e.g. 6000 samples per sec</param>
    /// <param name="float*">buf pre-allocated buffer of floats in which to put the signal, can be null,
    ///                      in which case a buffer is allocated by the function.</param>
    /// <param name="UInt32">buflen, reference to unsigned int to return the length of the buffer.</param>
    /// <param name="float">nbsecs, number of seconds to read from the file, 0 for complete file.</param>
    /// <param name="AudioMetaData">mdata, reference to struct AudioMetaData to return metadata in file.</param>
    /// <param name="int">error, ref to int to indicate error code in case of error.</param>
    /// <returns>float[] array of samples  </returns>

    public static float[] readaudio(string filename, 
                                    Int32 sr, 
                                    float nbsecs,
                                    ref AudioMetaData mdata, 
                                    ref Int32 error)
    {
      UInt32 buflen = 0;
      IntPtr buf = readaudio(filename, sr, null, ref buflen, nbsecs, ref mdata, ref error); 

      float[] buffer = new float[(Int32)buflen];
      Marshal.Copy(buf, buffer, 0, (Int32)buflen);

      audiodata_free(buf);
      return buffer;
    }
Example #18
0
        /// <summary>
        ///   Read in an audio file and return a buffer of samples at given samplerate, sr
        /// </summary>
        /// <param name="strign">name of file</param>
        /// <param name="Int32">sr samplerate of samples, e.g. 6000 samples per sec</param>
        /// <param name="float*">buf pre-allocated buffer of floats in which to put the signal, can be null,
        ///                      in which case a buffer is allocated by the function.</param>
        /// <param name="UInt32">buflen, reference to unsigned int to return the length of the buffer.</param>
        /// <param name="float">nbsecs, number of seconds to read from the file, 0 for complete file.</param>
        /// <param name="AudioMetaData">mdata, reference to struct AudioMetaData to return metadata in file.</param>
        /// <param name="int">error, ref to int to indicate error code in case of error.</param>
        /// <returns>float[] array of samples  </returns>

        public static float[] readaudio(string filename,
                                        Int32 sr,
                                        float nbsecs,
                                        ref AudioMetaData mdata,
                                        ref Int32 error)
        {
            UInt32 buflen = 0;
            IntPtr buf    = readaudio(filename, sr, null, ref buflen, nbsecs, ref mdata, ref error);

            float[] buffer = new float[(Int32)buflen];
            Marshal.Copy(buf, buffer, 0, (Int32)buflen);

            audiodata_free(buf);
            return(buffer);
        }
Example #19
0
        public override OperationResult <AudioMetaData> Process(AudioMetaData metaData)
        {
            var result = new OperationResult <AudioMetaData>();

            if (this.Configuration.Processing.DoAudioCleanup)
            {
                if (this.Configuration.Processing.DoClearComments)
                {
                    metaData.Comments = null;
                }
            }
            result.Data      = metaData;
            result.IsSuccess = true;
            return(result);
        }
Example #20
0
        private IMediaMetaData GetMetaData(string mediaType)
        {
            IMediaMetaData result = default(IMediaMetaData);

            switch (mediaType)
            {
            case "Video":
                result = new VideoMetaData() as IMediaMetaData;
                break;

            case "Audio":
                result = new AudioMetaData() as IMediaMetaData;
                break;
            }
            return(result);
        }
        public override OperationResult <AudioMetaData> Process(AudioMetaData metaData)
        {
            var result = new OperationResult <AudioMetaData>();

            if (this.Configuration.Processing.DoAudioCleanup)
            {
                if (metaData.FileInfo.IsReadOnly)
                {
                    metaData.FileInfo.Attributes = RemoveAttribute(metaData.FileInfo.Attributes, FileAttributes.ReadOnly);
                    Console.WriteLine($"â•Ÿ Removed read only attribute on file file [{ metaData.FileInfo.Name}");
                }
            }
            result.Data      = metaData;
            result.IsSuccess = true;
            return(result);
        }
        public override OperationResult <AudioMetaData> Process(AudioMetaData metaData)
        {
            var result = new OperationResult <AudioMetaData>();

            if (this.Configuration.Processing.DoAudioCleanup)
            {
                var originalRelease = metaData.Release;
                metaData.Release = metaData.Release?.CleanString(this.Configuration, this.Configuration.Processing.ReleaseRemoveStringsRegex).ToTitleCase(doPutTheAtEnd: false);
                if (string.IsNullOrEmpty(metaData.Release))
                {
                    metaData.Release = originalRelease;
                }
            }
            result.Data      = metaData;
            result.IsSuccess = true;
            return(result);
        }
Example #23
0
        private async Task <string> DetermineArtistFolder(string destinationRoot, AudioMetaData metaData, bool doJustInfo)
        {
            var artist = await this.ArtistLookupEngine.GetByName(metaData, !doJustInfo);

            if (!artist.IsSuccess)
            {
                return(null);
            }
            try
            {
                return(artist.Data.ArtistFileFolder(this.Configuration, destinationRoot));
            }
            catch (Exception ex)
            {
                this.Logger.LogError(ex, ex.Serialize());
            }
            return(null);
        }
Example #24
0
        public static string ReleaseInspectorToken(AudioMetaData metaData)
        {
            var hashids   = new Hashids(Inspector.Salt);
            var releaseId = 0;
            var bytes     = System.Text.Encoding.ASCII.GetBytes(metaData.Artist + metaData.Release);
            var looper    = bytes.Length / 4;

            for (var i = 0; i < looper; i++)
            {
                releaseId += BitConverter.ToInt32(bytes, i * 4);
            }
            if (releaseId < 0)
            {
                releaseId = releaseId * -1;
            }
            var token = hashids.Encode(releaseId);

            return(token);
        }
Example #25
0
        public override OperationResult <AudioMetaData> Process(AudioMetaData metaData)
        {
            var result = new OperationResult <AudioMetaData>();

            if (Configuration.Processing.DoAudioCleanup)
            {
                var originalTitle = metaData.Title;
                metaData.Title = metaData.Title
                                 ?.CleanString(Configuration, Configuration.Processing.TrackRemoveStringsRegex).ToTitleCase(false);
                if (string.IsNullOrEmpty(metaData.Title))
                {
                    metaData.Title = originalTitle;
                }
            }

            result.Data      = metaData;
            result.IsSuccess = true;
            return(result);
        }
Example #26
0
        private async Task <string> DetermineArtistFolder(AudioMetaData metaData,
                                                          bool doJustInfo)
        {
            var artist = await ArtistLookupEngine.GetByName(metaData, !doJustInfo).ConfigureAwait(false);

            if (!artist.IsSuccess)
            {
                return(null);
            }
            try
            {
                return(artist.Data.ArtistFileFolder(Configuration));
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, ex.Serialize());
            }

            return(null);
        }
Example #27
0
        private async Task <string> DetermineReleaseFolder(string artistFolder, AudioMetaData metaData, bool doJustInfo, int?submissionId)
        {
            var artist = await this.ArtistLookupEngine.GetByName(metaData, !doJustInfo);

            if (!artist.IsSuccess)
            {
                return(null);
            }
            this._artistId = artist.Data.RoadieId;
            var release = await this.ReleaseLookupEngine.GetByName(artist.Data, metaData, !doJustInfo, submissionId : submissionId);

            if (!release.IsSuccess)
            {
                return(null);
            }
            this._releaseId          = release.Data.RoadieId;
            release.Data.ReleaseDate = SafeParser.ToDateTime(release.Data.ReleaseYear ?? metaData.Year);
            if (release.Data.ReleaseYear.HasValue && release.Data.ReleaseYear != metaData.Year)
            {
                this.Logger.LogWarning($"Found Release `{ release.Data }` has different Release Year than MetaData Year `{ metaData }`");
            }
            return(release.Data.ReleaseFileFolder(artistFolder));
        }
Example #28
0
        private IEnumerator <UnityWebRequestAsyncOperation> StreamFile(AudioMetaData file)
        {
            var path = file.Path.Replace('\\', '/');

            using (var www = UnityWebRequestMultimedia.GetAudioClip("file://" + path, GetAudioType(path)))
            {
                yield return(www.SendWebRequest());

                if (www.isNetworkError)
                {
                    InGameDebug.Log(www.error);
                }
                else
                {
                    var clip = DownloadHandlerAudioClip.GetContent(www);
                    InGameDebug.Log("\t\t<color=green>AudioLoader: '" + path + "' loaded.</color>");
                    Clips.Add(file, clip);
                    if (Clips.Count == _count)
                    {
                        OnLoadingDone?.Invoke();
                    }
                }
            }
        }
Example #29
0
        public async Task <OperationResult <Data.Release> > GetByName(Data.Artist artist, AudioMetaData metaData, bool doFindIfNotInDatabase = false, bool doAddTracksInDatabase = false, int?submissionId = null)
        {
            SimpleContract.Requires <ArgumentNullException>(artist != null, "Invalid Artist");
            SimpleContract.Requires <ArgumentOutOfRangeException>(artist.Id > 0, "Invalid Artist Id");
            try
            {
                var sw = new Stopwatch();
                sw.Start();
                var cacheRegion   = (new Data.Release {
                    Artist = artist, Title = metaData.Release
                }).CacheRegion;
                var cacheKey      = string.Format("urn:release_by_artist_id_and_name:{0}:{1}", artist.Id, metaData.Release);
                var resultInCache = this.CacheManager.Get <Data.Release>(cacheKey, cacheRegion);
                if (resultInCache != null)
                {
                    sw.Stop();
                    return(new OperationResult <Data.Release>
                    {
                        IsSuccess = true,
                        OperationTime = sw.ElapsedMilliseconds,
                        Data = resultInCache
                    });
                }

                var searchName        = metaData.Release.NormalizeName().ToLower();
                var specialSearchName = metaData.Release.ToAlphanumericName();

                var altStart = $"{ searchName }|";
                var altIn    = $"|{ searchName }|";
                var altEnds  = $"|{ searchName }";

                var altStartSpecial = $"{ specialSearchName }|";
                var altInSpecial    = $"|{ specialSearchName }|";
                var altEndsSpecial  = $"|{ specialSearchName }";

                var release = (from r in this.DbContext.Releases
                               where (r.ArtistId == artist.Id)
                               where (r.Title.ToLower() == searchName ||
                                      r.AlternateNames.ToLower() == searchName ||
                                      r.AlternateNames.ToLower() == specialSearchName ||
                                      r.AlternateNames.ToLower().Contains(altStart) ||
                                      r.AlternateNames.ToLower().Contains(altIn) ||
                                      r.AlternateNames.ToLower().Contains(altEnds) ||
                                      r.AlternateNames.ToLower().Contains(altStartSpecial) ||
                                      r.AlternateNames.ToLower().Contains(altInSpecial) ||
                                      r.AlternateNames.ToLower().Contains(altEndsSpecial))
                               select r
                               ).FirstOrDefault();

                sw.Stop();
                if (release == null || !release.IsValid)
                {
                    this.Logger.LogInformation("ReleaseFactory: Release Not Found For Artist `{0}` MetaData [{1}]", artist.ToString(), metaData.ToString());
                    if (doFindIfNotInDatabase)
                    {
                        OperationResult <Data.Release> releaseSearch = new OperationResult <Data.Release>();
                        try
                        {
                            releaseSearch = await this.PerformMetaDataProvidersReleaseSearch(metaData, artist.ArtistFileFolder(this.Configuration, this.Configuration.LibraryFolder), submissionId);
                        }
                        catch (Exception ex)
                        {
                            sw.Stop();
                            this.Logger.LogError(ex);
                            return(new OperationResult <Data.Release>
                            {
                                OperationTime = sw.ElapsedMilliseconds,
                                Errors = new Exception[1] {
                                    ex
                                }
                            });
                        }
                        if (releaseSearch.IsSuccess)
                        {
                            release          = releaseSearch.Data;
                            release.ArtistId = artist.Id;
                            var addResult = await this.Add(release, doAddTracksInDatabase);

                            if (!addResult.IsSuccess)
                            {
                                sw.Stop();
                                return(new OperationResult <Data.Release>
                                {
                                    OperationTime = sw.ElapsedMilliseconds,
                                    Errors = addResult.Errors
                                });
                            }
                        }
                    }
                }
                if (release != null)
                {
                    this.CacheManager.Add(cacheKey, release);
                }
                return(new OperationResult <Data.Release>
                {
                    IsSuccess = release != null,
                    OperationTime = sw.ElapsedMilliseconds,
                    Data = release
                });
            }
            catch (Exception ex)
            {
                this.Logger.LogError(ex);
            }
            return(new OperationResult <Data.Release>());
        }
Example #30
0
        public async Task <OperationResult <Data.Release> > PerformMetaDataProvidersReleaseSearch(AudioMetaData metaData, string artistFolder = null, int?submissionId = null)
        {
            SimpleContract.Requires <ArgumentNullException>(metaData != null, "Invalid MetaData");

            var sw = new Stopwatch();

            sw.Start();

            var result = new Data.Release
            {
                Title        = metaData.Release.ToTitleCase(false),
                TrackCount   = (short)(metaData.TotalTrackNumbers ?? 0),
                ReleaseDate  = SafeParser.ToDateTime(metaData.Year),
                SubmissionId = submissionId
            };
            var resultsExceptions = new List <Exception>();
            var releaseGenres     = new List <string>();

            // Add any Genre found in the given MetaData
            if (metaData.Genres != null)
            {
                releaseGenres.AddRange(metaData.Genres);
            }
            var releaseLabels    = new List <ReleaseLabelSearchResult>();
            var releaseMedias    = new List <ReleaseMediaSearchResult>();
            var releaseImageUrls = new List <string>();

            var dontDoMetaDataProvidersSearchArtists = this.Configuration.DontDoMetaDataProvidersSearchArtists;

            if (!dontDoMetaDataProvidersSearchArtists.Any(x => x.Equals(metaData.Artist, StringComparison.OrdinalIgnoreCase)))
            {
                try
                {
                    #region ITunes

                    if (this.ITunesReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("ITunesReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var iTunesResult = await this.ITunesReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (iTunesResult.IsSuccess)
                        {
                            var i = iTunesResult.Data.First();
                            if (i.AlternateNames != null)
                            {
                                result.AlternateNames = result.AlternateNames.AddToDelimitedList(i.AlternateNames);
                            }
                            if (i.Tags != null)
                            {
                                result.Tags = result.Tags.AddToDelimitedList(i.Tags);
                            }
                            if (i.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(i.Urls);
                            }
                            if (i.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(i.ImageUrls);
                            }
                            if (i.ReleaseGenres != null)
                            {
                                releaseGenres.AddRange(i.ReleaseGenres);
                            }
                            result.CopyTo(new Data.Release
                            {
                                ReleaseDate = result.ReleaseDate ?? i.ReleaseDate,
                                AmgId       = i.AmgId,
                                Profile     = i.Profile,
                                ITunesId    = i.iTunesId,
                                Title       = result.Title ?? i.ReleaseTitle,
                                Thumbnail   = i.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(i.ReleaseThumbnailUrl) : null,
                                ReleaseType = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(i.ReleaseType) : result.ReleaseType
                            });
                            if (i.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(i.ReleaseLabel);
                            }
                            if (i.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(i.ReleaseMedia);
                            }
                        }
                        if (iTunesResult.Errors != null)
                        {
                            resultsExceptions.AddRange(iTunesResult.Errors);
                        }
                    }

                    #endregion ITunes

                    #region MusicBrainz

                    if (this.MusicBrainzReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("MusicBrainzReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var mbResult = await this.MusicBrainzReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (mbResult.IsSuccess)
                        {
                            var mb = mbResult.Data.First();
                            if (mb.AlternateNames != null)
                            {
                                result.AlternateNames = result.AlternateNames.AddToDelimitedList(mb.AlternateNames);
                            }
                            if (mb.Tags != null)
                            {
                                result.Tags = result.Tags.AddToDelimitedList(mb.Tags);
                            }
                            if (mb.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(mb.Urls);
                            }
                            if (mb.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(mb.ImageUrls);
                            }
                            if (mb.ReleaseGenres != null)
                            {
                                releaseGenres.AddRange(mb.ReleaseGenres);
                            }
                            if (!string.IsNullOrEmpty(mb.ReleaseTitle) && !mb.ReleaseTitle.Equals(result.Title, StringComparison.OrdinalIgnoreCase))
                            {
                                result.AlternateNames.AddToDelimitedList(new string[] { mb.ReleaseTitle });
                            }
                            result.CopyTo(new Data.Release
                            {
                                ReleaseDate   = result.ReleaseDate ?? mb.ReleaseDate,
                                AmgId         = mb.AmgId,
                                Profile       = mb.Profile,
                                TrackCount    = mb.ReleaseMedia != null ? (short)mb.ReleaseMedia.Sum(x => x.TrackCount) : (short)0,
                                MusicBrainzId = mb.MusicBrainzId,
                                ITunesId      = mb.iTunesId,
                                Title         = result.Title ?? mb.ReleaseTitle,
                                Thumbnail     = mb.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(mb.ReleaseThumbnailUrl) : null,
                                ReleaseType   = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(mb.ReleaseType) : result.ReleaseType
                            });
                            if (mb.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(mb.ReleaseLabel);
                            }
                            if (mb.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(mb.ReleaseMedia);
                            }
                        }
                        if (mbResult.Errors != null)
                        {
                            resultsExceptions.AddRange(mbResult.Errors);
                        }
                    }

                    #endregion MusicBrainz

                    #region LastFm

                    if (this.LastFmReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("LastFmReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var lastFmResult = await this.LastFmReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (lastFmResult.IsSuccess)
                        {
                            var l = lastFmResult.Data.First();
                            if (l.AlternateNames != null)
                            {
                                result.AlternateNames = result.AlternateNames.AddToDelimitedList(l.AlternateNames);
                            }
                            if (l.Tags != null)
                            {
                                result.Tags = result.Tags.AddToDelimitedList(l.Tags);
                            }
                            if (l.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(l.Urls);
                            }
                            if (l.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(l.ImageUrls);
                            }
                            if (l.ReleaseGenres != null)
                            {
                                releaseGenres.AddRange(l.ReleaseGenres);
                            }
                            if (!string.IsNullOrEmpty(l.ReleaseTitle) && !l.ReleaseTitle.Equals(result.Title, StringComparison.OrdinalIgnoreCase))
                            {
                                result.AlternateNames.AddToDelimitedList(new string[] { l.ReleaseTitle });
                            }
                            result.CopyTo(new Data.Release
                            {
                                ReleaseDate   = result.ReleaseDate ?? l.ReleaseDate,
                                AmgId         = l.AmgId,
                                Profile       = l.Profile,
                                LastFMId      = l.LastFMId,
                                LastFMSummary = l.LastFMSummary,
                                MusicBrainzId = l.MusicBrainzId,
                                ITunesId      = l.iTunesId,
                                Title         = result.Title ?? l.ReleaseTitle,
                                Thumbnail     = l.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(l.ReleaseThumbnailUrl) : null,
                                ReleaseType   = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(l.ReleaseType) : result.ReleaseType
                            });
                            if (l.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(l.ReleaseLabel);
                            }
                            if (l.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(l.ReleaseMedia);
                            }
                        }
                        if (lastFmResult.Errors != null)
                        {
                            resultsExceptions.AddRange(lastFmResult.Errors);
                        }
                    }

                    #endregion LastFm

                    #region Spotify

                    if (this.SpotifyReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("SpotifyReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var spotifyResult = await this.SpotifyReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (spotifyResult.IsSuccess)
                        {
                            var s = spotifyResult.Data.First();
                            if (s.Tags != null)
                            {
                                result.Tags = result.Tags.AddToDelimitedList(s.Tags);
                            }
                            if (s.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(s.Urls);
                            }
                            if (s.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(s.ImageUrls);
                            }
                            if (s.ReleaseGenres != null)
                            {
                                releaseGenres.AddRange(s.ReleaseGenres);
                            }
                            if (!string.IsNullOrEmpty(s.ReleaseTitle) && !s.ReleaseTitle.Equals(result.Title, StringComparison.OrdinalIgnoreCase))
                            {
                                result.AlternateNames.AddToDelimitedList(new string[] { s.ReleaseTitle });
                            }
                            result.CopyTo(new Data.Release
                            {
                                ReleaseDate   = result.ReleaseDate ?? s.ReleaseDate,
                                AmgId         = s.AmgId,
                                Profile       = this.HttpEncoder.HtmlEncode(s.Profile),
                                SpotifyId     = s.SpotifyId,
                                MusicBrainzId = s.MusicBrainzId,
                                ITunesId      = s.iTunesId,
                                Title         = result.Title ?? s.ReleaseTitle,
                                Thumbnail     = s.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(s.ReleaseThumbnailUrl) : null,
                                ReleaseType   = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(s.ReleaseType) : result.ReleaseType
                            });
                            if (s.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(s.ReleaseLabel);
                            }
                            if (s.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(s.ReleaseMedia);
                            }
                        }
                        if (spotifyResult.Errors != null)
                        {
                            resultsExceptions.AddRange(spotifyResult.Errors);
                        }
                    }

                    #endregion Spotify

                    #region Discogs

                    if (this.DiscogsReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("DiscogsReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var discogsResult = await this.DiscogsReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (discogsResult.IsSuccess)
                        {
                            var d = discogsResult.Data.First();
                            if (d.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(d.Urls);
                            }
                            if (d.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(d.ImageUrls);
                            }
                            if (d.AlternateNames != null)
                            {
                                result.AlternateNames = result.AlternateNames.AddToDelimitedList(d.AlternateNames);
                            }
                            if (!string.IsNullOrEmpty(d.ReleaseTitle) && !d.ReleaseTitle.Equals(result.Title, StringComparison.OrdinalIgnoreCase))
                            {
                                result.AlternateNames.AddToDelimitedList(new string[] { d.ReleaseTitle });
                            }
                            result.CopyTo(new Data.Release
                            {
                                Profile     = this.HttpEncoder.HtmlEncode(d.Profile),
                                DiscogsId   = d.DiscogsId,
                                Title       = result.Title ?? d.ReleaseTitle,
                                Thumbnail   = d.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(d.ReleaseThumbnailUrl) : null,
                                ReleaseType = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(d.ReleaseType) : result.ReleaseType
                            });
                            if (d.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(d.ReleaseLabel);
                            }
                            if (d.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(d.ReleaseMedia);
                            }
                        }
                        if (discogsResult.Errors != null)
                        {
                            resultsExceptions.AddRange(discogsResult.Errors);
                        }
                    }

                    #endregion Discogs
                }
                catch (Exception ex)
                {
                    this.Logger.LogError(ex);
                }

                this.Logger.LogTrace("Metadata Providers Search Complete. [{0}]", sw.ElapsedMilliseconds);
            }
            else
            {
                this.Logger.LogTrace("Skipped Metadata Providers Search, DontDoMetaDataProvidersSearchArtists set for Artist [{0}].", metaData.Artist);
            }

            if (result.AlternateNames != null)
            {
                result.AlternateNames = string.Join("|", result.AlternateNames.ToListFromDelimited().Distinct().OrderBy(x => x));
            }
            if (result.URLs != null)
            {
                result.URLs = string.Join("|", result.URLs.ToListFromDelimited().Distinct().OrderBy(x => x));
            }
            if (result.Tags != null)
            {
                result.Tags = string.Join("|", result.Tags.ToListFromDelimited().Distinct().OrderBy(x => x));
            }
            if (releaseGenres.Any())
            {
                result.Genres = new List <ReleaseGenre>();
                foreach (var releaseGenre in releaseGenres.Where(x => !string.IsNullOrEmpty(x)).GroupBy(x => x).Select(x => x.First()))
                {
                    var rg = releaseGenre.Trim();
                    if (!string.IsNullOrEmpty(rg))
                    {
                        result.Genres.Add(new Data.ReleaseGenre
                        {
                            Genre = (this.DbContext.Genres.Where(x => x.Name.ToLower() == rg.ToLower()).FirstOrDefault() ?? new Data.Genre {
                                Name = rg
                            })
                        });
                    }
                }
                ;
            }
            if (releaseImageUrls.Any())
            {
                var imageBag = new ConcurrentBag <Data.Image>();
                var i        = releaseImageUrls.Select(async url =>
                {
                    imageBag.Add(await WebHelper.GetImageFromUrlAsync(url));
                });
                await Task.WhenAll(i);

                // If the release has images merge any fetched images
                var existingImages = result.Images != null?result.Images.ToList() : new List <Data.Image>();

                existingImages.AddRange(imageBag.ToList());
                // Now set release images to be unique image based on image hash
                result.Images = existingImages.Where(x => x != null && x.Bytes != null).GroupBy(x => x.Signature).Select(x => x.First()).Take(this.Configuration.Processing.MaximumReleaseImagesToAdd).ToList();
                if (result.Thumbnail == null && result.Images != null)
                {
                    result.Thumbnail = result.Images.First().Bytes;
                }
            }

            if (releaseLabels.Any())
            {
                result.Labels = releaseLabels.GroupBy(x => x.CatalogNumber).Select(x => x.First()).Select(x => new Data.ReleaseLabel
                {
                    CatalogNumber = x.CatalogNumber,
                    BeginDate     = x.BeginDate,
                    EndDate       = x.EndDate,
                    Status        = Statuses.New,
                    Label         = new Data.Label
                    {
                        Name           = x.Label.LabelName,
                        SortName       = x.Label.LabelSortName,
                        MusicBrainzId  = x.Label.MusicBrainzId,
                        BeginDate      = x.Label.StartDate,
                        EndDate        = x.Label.EndDate,
                        ImageUrl       = x.Label.LabelImageUrl,
                        AlternateNames = x.Label.AlternateNames.ToDelimitedList(),
                        URLs           = x.Label.Urls.ToDelimitedList(),
                        Status         = Statuses.New
                    }
                }).ToList();
            }

            if (releaseMedias.Any())
            {
                var resultReleaseMedias = new List <Data.ReleaseMedia>();
                foreach (var releaseMedia in releaseMedias.GroupBy(x => x.ReleaseMediaNumber).Select(x => x.First()))
                {
                    var rm = new Data.ReleaseMedia
                    {
                        MediaNumber = releaseMedia.ReleaseMediaNumber ?? 0,
                        SubTitle    = releaseMedia.ReleaseMediaSubTitle,
                        TrackCount  = releaseMedia.TrackCount ?? 0,
                        Status      = Statuses.New
                    };
                    var rmTracks = new List <Data.Track>();
                    foreach (var releaseTrack in releaseMedias.Where(x => x.ReleaseMediaNumber == releaseMedia.ReleaseMediaNumber)
                             .SelectMany(x => x.Tracks)
                             .Where(x => x.TrackNumber.HasValue)
                             .OrderBy(x => x.TrackNumber))
                    {
                        var foundTrack = true;
                        var rmTrack    = rmTracks.FirstOrDefault(x => x.TrackNumber == releaseTrack.TrackNumber.Value);
                        if (rmTrack == null)
                        {
                            Data.Artist trackArtist = null;
                            if (releaseTrack.Artist != null)
                            {
                                trackArtist = new Data.Artist
                                {
                                    Name       = releaseTrack.Artist.ArtistName,
                                    SpotifyId  = releaseTrack.Artist.SpotifyId,
                                    ArtistType = releaseTrack.Artist.ArtistType
                                };
                            }
                            rmTrack = new Data.Track
                            {
                                TrackArtist    = trackArtist,
                                TrackArtists   = releaseTrack.Artists,
                                TrackNumber    = releaseTrack.TrackNumber.Value,
                                MusicBrainzId  = releaseTrack.MusicBrainzId,
                                SpotifyId      = releaseTrack.SpotifyId,
                                AmgId          = releaseTrack.AmgId,
                                Title          = releaseTrack.Title,
                                AlternateNames = releaseTrack.AlternateNames.ToDelimitedList(),
                                Duration       = releaseTrack.Duration,
                                Tags           = releaseTrack.Tags.ToDelimitedList(),
                                ISRC           = releaseTrack.ISRC,
                                LastFMId       = releaseTrack.LastFMId,
                                Status         = Statuses.New
                            };
                            foundTrack = false;
                        }
                        rmTrack.Duration      = rmTrack.Duration ?? releaseTrack.Duration;
                        rmTrack.MusicBrainzId = rmTrack.MusicBrainzId ?? releaseTrack.MusicBrainzId;
                        rmTrack.SpotifyId     = rmTrack.SpotifyId ?? releaseTrack.SpotifyId;
                        rmTrack.AmgId         = rmTrack.AmgId ?? releaseTrack.AmgId;
                        rmTrack.Title         = rmTrack.Title ?? releaseTrack.Title;
                        rmTrack.Duration      = releaseTrack.Duration;
                        rmTrack.Tags          = rmTrack.Tags == null?releaseTrack.Tags.ToDelimitedList() : rmTrack.Tags.AddToDelimitedList(releaseTrack.Tags);

                        rmTrack.AlternateNames = rmTrack.AlternateNames == null?releaseTrack.AlternateNames.ToDelimitedList() : rmTrack.AlternateNames.AddToDelimitedList(releaseTrack.AlternateNames);

                        rmTrack.ISRC     = rmTrack.ISRC ?? releaseTrack.ISRC;
                        rmTrack.LastFMId = rmTrack.LastFMId ?? releaseTrack.LastFMId;
                        if (!foundTrack)
                        {
                            rmTracks.Add(rmTrack);
                        }
                    }
                    rm.Tracks     = rmTracks;
                    rm.TrackCount = (short)rmTracks.Count();
                    resultReleaseMedias.Add(rm);
                }
                result.Medias     = resultReleaseMedias;
                result.TrackCount = (short)releaseMedias.SelectMany(x => x.Tracks).Count();
            }

            if (metaData.Images != null && metaData.Images.Any())
            {
                var image = metaData.Images.FirstOrDefault(x => x.Type == AudioMetaDataImageType.FrontCover);
                if (image == null)
                {
                    image = metaData.Images.FirstOrDefault();
                }
                // If there is an image on the metadata file itself then that over-rides metadata providers.
                if (image != null)
                {
                    result.Thumbnail = image.Data;
                }
            }
            if (!string.IsNullOrEmpty(artistFolder))
            {
                // If any file exist for cover that over-rides whatever if found in metadata providers.
                var releaseFolder = new DirectoryInfo(result.ReleaseFileFolder(artistFolder));
                if (releaseFolder.Exists)
                {
                    var cover = ImageHelper.FindImageTypeInDirectory(releaseFolder, ImageType.Release);
                    if (cover.Any())
                    {
                        // Read image and convert to jpeg
                        var coverFileName = cover.First().FullName;
                        result.Thumbnail = File.ReadAllBytes(coverFileName);
                        this.Logger.LogDebug("Using Release Cover File [{0}]", coverFileName);
                    }
                }
            }

            if (result.Thumbnail != null)
            {
                result.Thumbnail = ImageHelper.ResizeImage(result.Thumbnail, this.Configuration.ThumbnailImageSize.Width, this.Configuration.ThumbnailImageSize.Height);
                result.Thumbnail = ImageHelper.ConvertToJpegFormat(result.Thumbnail);
            }
            sw.Stop();
            return(new OperationResult <Data.Release>
            {
                Data = result,
                IsSuccess = result != null,
                Errors = resultsExceptions,
                OperationTime = sw.ElapsedMilliseconds
            });
        }
Example #31
0
 public AudioMetaData GetMetaData()
 {
     AudioMetaData audioMD = new AudioMetaData();
     GetMetaData(audioMD);
     return audioMD;
 }
Example #32
0
 public abstract OperationResult <AudioMetaData> Process(AudioMetaData metaData);
Example #33
0
        private bool HasValidExtension(AudioMetaData file)
        {
            var extension = Path.GetExtension(file.Path);

            return(extension == ".ogg" || extension == ".wav");
        }
Example #34
0
 public static string ArtistInspectorToken(AudioMetaData metaData) => ToToken(metaData.Artist);
 public void SetData(AudioMetaData audioMD)
 {
     SetData(audioMD, audioMD.FrameID, audioMD.Timestamp);
 }
Example #36
0
 public extern static void free_mdata(ref AudioMetaData mdata);
Example #37
0
    private extern static IntPtr readaudio(String filename, 
                                           Int32 sr, 
					   [ In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R4)] 
                                           float[] buf, 
                                           ref UInt32 buflen,
                                           float nbsecs,
                                           ref AudioMetaData mdata,
                                           ref Int32 error);
Example #38
0
 public static string ReleaseInspectorToken(AudioMetaData metaData) => ToToken(metaData.Artist + metaData.Release);
 public void SetData(AudioMetaData audioMD, UInt32 frameID, UInt64 timestamp)
 {
     SetData(frameID, timestamp, audioMD.DataSize, audioMD.AudioBufferPtr);
 }