示例#1
0
        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
                };
            }
        }
示例#2
0
        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));
            }
        }
示例#3
0
        private async Task <List <MusicFile> > WriteAudioFilesAsync(MusicDb db, OpusFolder folder)
        {
            var list = await folder.UpdateAudioFilesToDbAsync(db);

            return(list);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
                    }
                }
            }
        }