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); }
private AcoustIdInfo QueryForAcoustId(String fileName, Ares.ModelInfo.IProgressMonitor progressMonitor) { var pcmTask = Task.Factory.StartNew(() => { double seconds; Int16[] data = PcmExtractor.ExtractPcm(fileName, out seconds); progressMonitor.IncreaseProgress(25); return(new PcmInfo { Data = data, Seconds = seconds }); }, m_Token, TaskCreationOptions.AttachedToParent, TaskScheduler.Default); var chromaTask = pcmTask.ContinueWith((task) => { var result = (pcmTask.Result != null && pcmTask.Result.Data != null) ? new ChromaPrintInfo { Code = ChromaPrint.CalculateChromaprintCode(pcmTask.Result.Data), Seconds = pcmTask.Result.Seconds } : null; progressMonitor.IncreaseProgress(15); return(result); }, m_Token, TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent, TaskScheduler.Default); var acoustTask = chromaTask.ContinueWith((task) => { var result = (chromaTask.Result != null && !String.IsNullOrEmpty(chromaTask.Result.Code)) ? m_AcoustAPI.IdentifySong(chromaTask.Result.Code, chromaTask.Result.Seconds) : null; progressMonitor.IncreaseProgress(60); return(result); }, m_Token, TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent, TaskScheduler.Default); try { return(acoustTask.Result); } catch (OperationCanceledException) { return(new AcoustIdInfo() { AcoustId = String.Empty, MusicBrainzId = String.Empty }); } catch (AggregateException) { return(new AcoustIdInfo() { AcoustId = String.Empty, MusicBrainzId = String.Empty }); } }
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); }