Exemple #1
0
        private void RetrieveInfo(String fileName, Ares.Tags.FileIdentification data, int query, Ares.ModelInfo.IProgressMonitor progressMonitor)
        {
            var id3Task = Task.Factory.StartNew(() =>
            {
                if ((query & (ARTIST | ALBUM | TITLE)) != 0)
                {
                    Un4seen.Bass.AddOn.Tags.TAG_INFO tag = Un4seen.Bass.AddOn.Tags.BassTags.BASS_TAG_GetFromFile(fileName, true, true);
                    if (tag != null)
                    {
                        if (!String.IsNullOrEmpty(tag.artist) && ((query & ARTIST) != 0))
                        {
                            data.Artist = tag.artist;
                            query      &= ~ARTIST;
                        }
                        if (!String.IsNullOrEmpty(tag.album) && ((query & ALBUM) != 0))
                        {
                            data.Album = tag.album;
                            query     &= ~ALBUM;
                        }
                        if (!String.IsNullOrEmpty(tag.title) && ((query & TITLE) != 0))
                        {
                            data.Title = tag.title;
                            // API always returns a title
                            // try to get a better title through MusicBrainz if it must be queried anyway
                            if ((query & (ARTIST | ALBUM)) == 0)
                            {
                                query &= ~TITLE;
                            }
                        }
                    }
                }
                progressMonitor.IncreaseProgress(15);
                return(query);
            }, m_Token, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);


            var acoustIdTask = id3Task.ContinueWith((task) =>
            {
                SequentialProgressMonitor subMon = new SequentialProgressMonitor(progressMonitor, 15, 55);
                return(id3Task.Result != 0 ? QueryForAcoustId(fileName, subMon) : null);
            }, m_Token, TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent, TaskScheduler.Default);

            var lastTask = acoustIdTask.ContinueWith((task) =>
            {
                if (acoustIdTask.Result != null)
                {
                    int adaptedQuery = id3Task.Result;
                    data.AcoustId    = acoustIdTask.Result.AcoustId;
                    if (((adaptedQuery & (ARTIST | ALBUM | TITLE)) != 0) && !String.IsNullOrEmpty(acoustIdTask.Result.MusicBrainzId))
                    {
                        QueryForMusicInfo(data, adaptedQuery, acoustIdTask.Result.MusicBrainzId);
                    }
                }
                progressMonitor.IncreaseProgress(30);
            }, m_Token, TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent, TaskScheduler.Default);
        }
Exemple #2
0
        private Task <int> DoUpdateAsync(IList <String> files, String musicDirectory)
        {
            m_Monitor.IncreaseProgress(0.0);
            int countWithId = 0;
            IList <Ares.Tags.FileIdentification> identification = Ares.Tags.TagsModule.GetTagsDB().ReadInterface.GetIdentificationForFiles(files);

            List <Ares.Tags.FileIdentification> retrievedInfo  = new List <Tags.FileIdentification>();
            List <Ares.Tags.FileIdentification> needsRetrieval = new List <Tags.FileIdentification>();
            List <String> filesNeedRetrieval = new List <string>();

            for (int i = 0; i < files.Count; ++i)
            {
                if (files[i].EndsWith(".m3u", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }
                if (files[i].EndsWith(".m3u8", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }
                if (NeedsRetrieval(identification[i]))
                {
                    retrievedInfo.Add(identification[i]);
                    filesNeedRetrieval.Add(files[i]);
                }
                else
                {
                    ++countWithId;
                }
            }
            int nrOfRetrievals = filesNeedRetrieval.Count;

            if (nrOfRetrievals == 0)
            {
                return(Task.Factory.StartNew(() => { return countWithId; }));
            }

            String basePath = musicDirectory;
            MusicIdentificationRetriever retriever = new MusicIdentificationRetriever(m_Token);

            List <Task> tasks = new List <Task>();

            m_Monitor.IncreaseProgress(5);
            SequentialProgressMonitor seqMon      = new SequentialProgressMonitor(m_Monitor, 5.0, 95.0);
            ParallelProgressMonitor   parallelMon = new ParallelProgressMonitor(seqMon, 100.0, filesNeedRetrieval.Count);
            // use packages of 30 files to reduce system load
            const int PACKAGE_SIZE = 30;
            int       subTaskCount = (filesNeedRetrieval.Count + PACKAGE_SIZE - 1) / PACKAGE_SIZE;

            var task = Task.Factory.StartNew(() =>
            {
                for (int t = 0; t < subTaskCount; ++t)
                {
                    List <Task> subTasks = CreateTaskPackage(filesNeedRetrieval, basePath, retriever, retrievedInfo, parallelMon, t, PACKAGE_SIZE);
                    Task.WaitAll(subTasks.ToArray());
                    List <String> retrievedFiles = new List <String>();
                    List <Ares.Tags.FileIdentification> retrievedInfo2 = new List <Tags.FileIdentification>();
                    for (int i = 0; i < PACKAGE_SIZE; ++i)
                    {
                        int fileIndex = t * PACKAGE_SIZE + i;
                        if (fileIndex >= filesNeedRetrieval.Count)
                        {
                            break;
                        }
                        retrievedFiles.Add(filesNeedRetrieval[fileIndex]);
                        retrievedInfo2.Add(retrievedInfo[fileIndex]);
                        if (!String.IsNullOrEmpty(retrievedInfo[fileIndex].AcoustId))
                        {
                            ++countWithId;
                        }
                    }
                    Ares.Tags.TagsModule.GetTagsDB().WriteInterface.SetFileIdentifications(retrievedFiles, retrievedInfo2);
                    subTasks       = null;
                    retrievedFiles = null;
                    retrievedInfo2 = null;
                    System.GC.Collect();
                }
                retriever.Dispose();
                return(countWithId);
            }, m_Token);

            return(task);
        }