private async Task <List <CatalogueResult> > CatalogueAsync(MusicDb db, PathData pd) { db.ChangeTracker.AutoDetectChangesEnabled = false; taskItem = await db.TaskItems.FindAsync(taskId); try { bool changesPresent(OpusFolder folder) { var(result, changes) = folder.CheckForChanges(db); if (result) { log.Information($"{folder}, change {changes}"); } return(result); }; var results = new List <CatalogueResult>(); var folder = new OpusFolder(musicOptions, pd); //if (forceChanges == true || folder.CheckForChanges(db)) if (forceChanges == true || changesPresent(folder)) { var delay = GetRandomDelay(); log.Debug($"{taskItem} starting {folder.ToString()} after delay of {delay}ms"); await Task.Delay(TimeSpan.FromMilliseconds(delay)); results = await ProcessFolderAsync(db, folder); var success = results.All(x => x.Status == CatalogueStatus.Success || x.Status == CatalogueStatus.GeneratedFilesOutOfDate); taskItem.Status = success ? Music.Core.TaskStatus.Finished : Music.Core.TaskStatus.Failed; } else { taskItem.Status = Music.Core.TaskStatus.Finished; results.Add(new CatalogueResult { Status = CatalogueStatus.Success }); log.Information($"{taskItem} starting {folder.ToString()} no update required"); } taskItem.FinishedAt = DateTimeOffset.Now; await db.SaveChangesAsync(); return(results); } catch (Exception xe) { log.Error(xe, $"task {taskItem}"); throw new CatalogueFailed { TaskId = taskId }; } }
private IEnumerable <IMusicSet> GetMusicSets(MusicDb db, OpusFolder musicFolder, List <MusicFile> files) { Debug.Assert(ValidateMusicFileSet(db, files) == true); var style = files.First().Style; switch (style) { default: case MusicStyles.Popular: return(new PopularMusicSetCollection(musicOptions, db, musicFolder, files, taskItem)); case MusicStyles.WesternClassical: return(new WesternClassicalMusicSetCollection(musicOptions, db, musicFolder, files, taskItem)); } }
private async Task <List <MusicFile> > WriteAudioFilesAsync(MusicDb db, OpusFolder folder) { var list = await folder.UpdateAudioFilesToDbAsync(db); return(list); }
private async Task <List <CatalogueResult> > ProcessFolderAsync(MusicDb db, OpusFolder folder) { var results = new List <CatalogueResult>(); db.Database.SetCommandTimeout(TimeSpan.FromMinutes(10)); StepTimer st = null; if (musicOptions.TimeCatalogueSteps) { st = new StepTimer(); st.Start(); } if (/*true ||*/ taskItem.Force) { var deletedFilesCount = folder.RemoveCurrentMusicFiles(db); st?.Time("Removal"); if (deletedFilesCount > 0) { await db.SaveChangesAsync(); } } var musicFiles = await WriteAudioFilesAsync(db, folder); st?.Time("MusicFiles to DB"); if (musicFiles.Count() > 0) // count is 0 most often when trying to find singles for an artist { await UpdateTagsAsync(db, musicFiles); st?.Time("Extract tags"); var musicSets = GetMusicSets(db, folder, musicFiles); st?.Time("Split into sets"); int i = 0; foreach (var set in musicSets) { var cr = await set.CatalogueAsync(); st?.Time($"Set {i++ + 1}"); results.Add(cr); if (cr.Status == CatalogueStatus.Success) { if (cr.Artist == null) { log.Trace($"Artist missing"); } switch (cr.MusicSetType) { case Type T when T == typeof(PopularMusicAlbumSet) || T == typeof(WesternClassicalAlbumSet): if (cr.Work == null) { log.Trace($"Album missing"); } else if (cr.Work.Tracks == null || cr.Work.Tracks.Count() == 0) { log.Trace($"Work has no tracks"); } if (cr.Tracks == null) { log.Trace($"Tracks missing"); } else if (cr.Tracks.Count() == 0) { log.Trace($"Track count is 0"); } //if(cr.TaskItem != null) //{ // QueueTask(cr.TaskItem); //} break; case Type T when T == typeof(WesternClassicalCompositionSet): if (cr.Composition == null) { log.Trace($"Composition missing"); } if (cr.Performance == null) { log.Trace($"Performance missing"); } else if (cr.Performance.Movements == null || cr.Performance.Movements.Count() == 0) { log.Trace($"Performance has no movements"); } break; } } } } else { results.Add(new CatalogueResult { Status = CatalogueStatus.Success }); } return(results); }
private void Catalogue() { void ListFiles(OpusFolder folder) { var files = folder.GetFilesOnDisk(); var partCount = files.Where(x => x.part != null).Select(x => x.part.Number).Distinct().Count(); log.Information($"{(folder.IsCollection ? "Collection" : folder.ArtistName)}, {folder.OpusName}, {folder.Source}, {files.Count()} files in {partCount} parts {(folder.IsGenerated ? ", (generated)" : "")}"); } var names = new string[] { @"D:\Music\flac\Western\Popular\Bruce Springsteen", @"D:\Music\flac\Western\Popular\Elton John", @"D:\Music\flac\Western\Popular\Bruce Springsteen\Born In The USA", @"D:\Music\flac\Western\Popular\Bruce Springsteen\The River", @"D:\Music\flac\Western\Popular\Collections", @"D:\Music\flac\Western\Opera\Collections\The Essential Maria Callas", @"D:\Music\flac\Western\Classical" }; foreach (var name in names) { var pd = MusicMetaDataMethods.GetPathData(musicOptions, name); if (pd?.OpusPath != null) { // single opus folder var folder = new OpusFolder(musicOptions, pd); ListFiles(folder); } else if (pd?.OpusPath == null && (pd?.IsCollections ?? false)) { var cf = new CollectionsFolder(musicOptions, pd.MusicStyle); foreach (var folder in cf.GetOpusFolders()) { ListFiles(folder); } } else if (pd?.OpusPath == null && pd?.ArtistPath != null) { // artist folder var af = new ArtistFolder(musicOptions, pd.MusicStyle, pd.ArtistPath); foreach (var folder in af.GetOpusFolders(name)) { ListFiles(folder); } } else if (pd != null) { //style folder foreach (var af in pd.MusicStyle.GetArtistFolders(musicOptions)) { foreach (var folder in af.GetOpusFolders(name)) { ListFiles(folder); } } foreach (var folder in pd.MusicStyle.GetCollectionsFolder(musicOptions).GetOpusFolders(name)) { ListFiles(folder); } } } }