Пример #1
0
        private async void LoadInstruction(BookInstruction B, bool useCache)
        {
            if (!BookInstruction.OpLocks.AcquireLock(B.GID, out AsyncLocks <string, bool> .QueueToken QT))
            {
                await QT.Task;
            }

            SpiderBook SBook = await SpiderBook.CreateSAsync(B.ZoneId, B.ZItemId, B.BookSpiderDef);

            if (Shared.Storage.FileExists(SBook.MetaLocation))
            {
                B.LastCache = Shared.Storage.FileTime(SBook.MetaLocation).LocalDateTime;
            }

            if (useCache && (B.Packed == true || Shared.BooksDb.Volumes.Any(x => x.Book == B.Entry)))
            {
                if (B.Packed != true)
                {
                    B.PackSavedVols(SBook.PSettings);
                }
            }
            else
            {
                bool UpdateFailed = true;

                await SBook.Process();

                if (SBook.Processed && SBook.ProcessSuccess)
                {
                    B.LastCache = DateTime.Now;
                    BookInstruction BUpdate = SBook.GetBook();

                    if (BUpdate.Packable && BUpdate.Packed != true)
                    {
                        BUpdate.PackVolumes(SBook.GetPPConvoy());
                        B.Update(BUpdate);
                        UpdateFailed = false;
                    }
                }

                // Cannot download content, use cache if available
                if (UpdateFailed && Shared.BooksDb.Volumes.Any(x => x.Book == B.Entry))
                {
                    Logger.Log(ID, "Spider failed to produce instructions, using cache instead", LogType.WARNING);
                    B.PackSavedVols(SBook.PSettings);
                }
            }

            QT.TrySetResult(true);
            OnComplete(B);
        }
Пример #2
0
        private async void LoadInst(BookInstruction b)
        {
            if (!BookInstruction.OpLocks.AcquireLock(b.GID, out AsyncLocks <string, bool> .QueueToken QT))
            {
                await QT.Task;
            }

            foreach (VolInstruction VInst in b.GetVolInsts())
            {
                Shared.LoadMessage("SubProcessRun", VInst.Title);
                // This should finalize the chapter info
                var Convoy = await VInst.Process(b);
            }

            Shared.LoadMessage("CompilingTOC", b.Title);

            IEnumerable <Volume> Vols = b.GetVolInsts().Remap(x => x.ToVolume(b.Entry));

            if (Vols.Any())
            {
                List <Volume> NewVolumes = new List <Volume>();
                Vols.ExecEach(Vol =>
                {
                    string VID  = Vol.Meta[AppKeys.GLOBAL_VID];
                    Volume NVol = b.Entry.Volumes.FirstOrDefault(x => x.Meta[AppKeys.GLOBAL_VID] == VID) ?? Vol;
                    if (NVol != Vol)
                    {
                        NVol.Title     = Vol.Title;
                        NVol.Index     = Vol.Index;
                        NVol.Json_Meta = Vol.Json_Meta;
                    }

                    Shared.BooksDb.LoadCollection(NVol, x => x.Chapters, x => x.Index);

                    List <Chapter> NewChapters = new List <Chapter>();
                    Vol.Chapters.ExecEach(Ch =>
                    {
                        string CID  = Ch.Meta[AppKeys.GLOBAL_CID];
                        Chapter NCh = NVol.Chapters.FirstOrDefault(x => x.Meta[AppKeys.GLOBAL_CID] == CID) ?? Ch;
                        if (NCh != Ch)
                        {
                            NCh.Title     = Ch.Title;
                            NCh.Index     = Ch.Index;
                            NCh.Json_Meta = Ch.Json_Meta;
                        }
                        NewChapters.Add(NCh);
                    });

                    NewVolumes.Add(NVol);
                });

                b.Entry.Volumes = NewVolumes;
                b.SaveInfo();
            }
            else
            {
                MessageBus.SendUI(GetType(), AppKeys.HS_NO_VOLDATA, b);
            }

            QT.TrySetResult(true);
            OnComplete(b);
        }