示例#1
0
 public DownloadExceptionListenerContext(ComicDownloadRequest request, ComicChapter chapter,
                                         ComicPage page, CancellationToken token,
                                         Exception exception)
     : base(request, chapter, page, token)
 {
     Exception = exception;
 }
示例#2
0
        public async Task <ComicPage[]> GetPagesAsync(string targetUrl)
        {
            var tur = new Uri(targetUrl).Segments;
            var seg = tur[tur.Length - 2].Trim('/');
            var idx = tur[tur.Length - 1].Replace(".html", string.Empty);
            var url = string.Format(pagesUrl, seg, idx);

            using (var stream = await GetStreamAsync(url))
            {
                var str = string.Empty;
                using (var sr = new StreamReader(stream))
                {
                    str = sr.ReadToEnd();
                }
                using (var jobj = JsonVisitor.FromString(str))
                {
                    var imgs  = jobj["listImg"].ToEnumerable();
                    var pages = new List <ComicPage>();
                    var i     = 0;
                    foreach (var item in imgs)
                    {
                        var page = new ComicPage {
                            Name = i++.ToString(), TargetUrl = item.ToString()
                        };
                        pages.Add(page);
                    }
                    return(pages.ToArray());
                }
            }
        }
        private static void seedDB(ModelBuilder builder)
        {
            // Store and Define Objects
            User u1 = new User {
                EntityId = 1L, Name = "Kevin", IsAdmin = true
            };
            User u2 = new User {
                EntityId = 2L, Name = "Robert", IsAdmin = false
            };

            // Using Test Image
            var obj = new ImageConvertor();
            var img = Image.FromFile("Images/test_img.jpg");

            byte[] imgByteArr = obj.ConvertImageToByteArray(img, ".jpg");

            ComicPage p1 = new ComicPage {
                EntityId = 1L, ComicBookId = 1L, PageNumber = 1, Image = imgByteArr, PageTitle = "Tin goes to the amuesment park"
            };
            ComicBook b1 = new ComicBook {
                EntityId = 1L, Title = "Tin Tin's Adventure", Author = "Hergé", Genre = "Adventure", EditionNumber = 32, Description = "Description goes here"
            };

            // Insert the seed data to MS SQL DB
            builder.Entity <User>().HasData(u1);
            builder.Entity <User>().HasData(u2);

            builder.Entity <ComicBook>().HasData(b1);
            builder.Entity <ComicPage>().HasData(p1);
        }
示例#4
0
 public DownloadListenerContext(ComicDownloadRequest request, ComicChapter chapter, ComicPage page, CancellationToken token)
 {
     Request = request;
     Chapter = chapter;
     Page    = page;
     Token   = token;
 }
示例#5
0
 private void ShowNextPanelOnTouch(ComicPage curPage)
 {
     if (Input.GetMouseButtonDown(0))
     {
         ShowNextPanelAndStartTimer(curPage);
     }
 }
示例#6
0
        private void LoadNextPage()
        {
            Debug.Log("Load next page called");
            ComicPage comicPage = _pages[_pageIndex - 1];

            comicPage.Hide();
            comicPage.FadeOutComplete += ShowNextPage;
            Debug.Log("Setting update to noop");
            _update = Constants.Noop;
            // stop coroutine that waits for touch to hide page, since we're now waiting on fadeoutcomplete
            StopCoroutine(_nextTimer);
        }
示例#7
0
 public ComicDownloadContext(ComicEntity entity,
                             ComicChapter chapter,
                             ComicPage page,
                             Stream sourceStream,
                             CancellationToken token)
 {
     Token        = token;
     Entity       = entity;
     Chapter      = chapter;
     Page         = page;
     SourceStream = sourceStream;
 }
示例#8
0
        public void GivenValueInit_PropertyValueMustEqualGiven()
        {
            var chapter = new ComicChapter();
            var page    = new ComicPage();
            var req     = new DownloadItemRequest(chapter, page);

            Assert.AreEqual(chapter, req.Chapter);
            Assert.AreEqual(page, req.Page);
            req = new DownloadItemRequest(page);
            Assert.IsNull(req.Chapter);
            Assert.AreEqual(page, req.Page);
        }
示例#9
0
文件: PageBoxTest.cs 项目: Cricle/Anf
        public void GivenAnyPropertyValue_GetMustEqualGiven()
        {
            var page     = new ComicPage();
            var resource = new object();
            var box      = new PageBox <object>();

            box.DoNotDispose = true;
            box.Page         = page;
            box.Resource     = resource;
            Assert.IsTrue(box.DoNotDispose);
            Assert.AreEqual(page, box.Page);
            Assert.AreEqual(resource, box.Resource);
        }
        private static void seedDB(ModelBuilder builder)
        {
            // Store and Define Objects
            User u1 = new User {
                EntityId = 1L, Name = "Kevin", IsAdmin = true
            };
            User u2 = new User {
                EntityId = 2L, Name = "Robert", IsAdmin = false
            };
            //
            // Using Test Image
            var obj = new ImageConvertor();
            var img = Image.FromFile("Images/test_img.jpg");

            byte[] imgByteArr = obj.ConvertImageToByteArray(img, ".jpg");

            var img2 = Image.FromFile("Images/test_img2.jpg");

            byte[] imgByteArr2 = obj.ConvertImageToByteArray(img2, ".jpg");

            var img3 = Image.FromFile("Images/test_img3.jpg");

            byte[] imgByteArr3 = obj.ConvertImageToByteArray(img3, ".jpg");

            ComicPage p1 = new ComicPage {
                EntityId = 1L, ComicBookId = 1L, PageNumber = 1, Image = imgByteArr, PageTitle = "Tin goes to the amuesment park"
            };
            ComicPage p2 = new ComicPage {
                EntityId = 2L, ComicBookId = 2L, PageNumber = 1, Image = imgByteArr2, PageTitle = "The Wedding's of the Harlequin"
            };
            ComicPage p3 = new ComicPage {
                EntityId = 3L, ComicBookId = 2L, PageNumber = 2, Image = imgByteArr3, PageTitle = "Superwoman goes for a swim"
            };

            ComicBook b1 = new ComicBook {
                EntityId = 1L, Title = "Tin Tin's Adventure", Author = "Hergé", Genre = "Adventure", EditionNumber = 32, Description = "Description goes here"
            };
            ComicBook b2 = new ComicBook {
                EntityId = 2L, Title = "All American Comic", Author = "Frank", Genre = "Action", EditionNumber = 2, Description = "Different Description"
            };

            // Insert the seed data to MS SQL DB
            builder.Entity <User>().HasData(u1);
            builder.Entity <User>().HasData(u2);

            builder.Entity <ComicBook>().HasData(b1);
            builder.Entity <ComicBook>().HasData(b2);
            builder.Entity <ComicPage>().HasData(p1);
            builder.Entity <ComicPage>().HasData(p2);
            builder.Entity <ComicPage>().HasData(p3);
        }
示例#11
0
    public void Init(string petColor)
    {
        // Hide all and dont play
        for (int i = 0; i < pages.Count; i++)
        {
            ComicPage page = pages[i].GetComponent <ComicPage>();
            // Set the pet color
            page.Init(petColor);

            page.ToggleActive(false);
        }

        // Call on next frame, wait for tween toggle to init!!!
        StartCoroutine(StartComic());
    }
示例#12
0
        public void GivenValue_PropertyValueMustEqualGiven()
        {
            var saver = new NullComicSaver();
            var req   = new DownloadItemRequest[0];
            var prov  = new NullSourceProvider();
            var eq    = new ComicDownloadRequest(saver, null, null, req, prov);
            var chp   = new ComicChapter();
            var page  = new ComicPage();
            var ctx   = new DownloadListenerContext(eq, chp, page, default);

            Assert.AreEqual(eq, ctx.Request);
            Assert.AreEqual(chp, ctx.Chapter);
            Assert.AreEqual(page, ctx.Page);
            Assert.AreEqual(CancellationToken.None, ctx.Token);
        }
示例#13
0
        public IActionResult Index(Guid?pageId)
        {
            ComicPage comicPage = pageId is null
                ? _defaultComicPageRetriever.RetrieveDefaultComicPage()
                : _comicPageFromIdRetriever.RetrieveComicPageFromId(pageId.Value);

            ComicIssue comicIssue = _comicIssueResolver.ResolveComicIssue(comicPage.IssueId);

            ComicPageViewModel comicPageViewModel = new ComicPageViewModel()
            {
                ComicPage  = comicPage,
                ComicIssue = comicIssue
            };

            return(View(comicPageViewModel));
        }
示例#14
0
        public async Task <ComicPage[]> GetPagesAsync(string targetUrl)
        {
            var str = string.Empty;

            using (var sr = new StreamReader(await GetStreamAsync(targetUrl)))
            {
                str = sr.ReadToEnd();
            }
            var html = new HtmlDocument();

            html.LoadHtml(str);
            var eval = await GetJsEvalAsync(FetchJsEvalAsync);

            var dataBlock  = dataRegex.Match(str);
            var noticLeft  = str.IndexOf("window[\"n", str.IndexOf("window[\"n") + 4);
            var noticRight = str.IndexOf(";", noticLeft);
            var notic      = str.Substring(noticLeft, noticRight - noticLeft);
            var data       = dataBlock.Groups[1].Value;
            var dataJs     = "var DATA='" + data + "';window.DATA=DATA;";
            var sb         = new StringBuilder();

            sb.Append(varJs);
            sb.Append(dataJs);
            sb.Append(notic + ";");
            sb.Append(eval);
            sb.Append(";JSON.stringify(_v);");
            var val = jsEngine.Evaluate(sb.ToString()).ToString();

            using (var doc = JsonVisitor.FromString(val))
            {
                var pages = new List <ComicPage>();
                var pics  = doc["picture"].ToEnumerable();
                foreach (var item in pics)
                {
                    var pid  = item["pid"];
                    var url  = item["url"];
                    var page = new ComicPage
                    {
                        Name      = pid.ToString(),
                        TargetUrl = url.ToString()
                    };
                    pages.Add(page);
                }
                return(pages.ToArray());
            }
        }
示例#15
0
    public void SetCurrentComicPage(ComicPage page)
    {
        bEndOfLineReached = false;
        CurrentComicPage  = page;
        SetCurrentPanelLine(0, EPanelDirection.MAX);
        SetCameraPosition(CurrentComicPage.PanelLineList[0].PanelList[0].gameObject.transform.position - new Vector3(PanelOffset * 0.9f, 0.0f));
        NumOfPanels = page.PanelLineList.Count;


        if (ComicAppearance.instance != null)
        {
            ComicAppearance.instance.Refresh();
        }

        if (CurrentComicPage == ComicPageEnd.instance)
        {
            StartCoroutine(EndScrollRoutine(33.0f));
        }
    }
示例#16
0
        private void ShowNextPage()
        {
            ComicPage curPage = _pages[_pageIndex++];

            curPage.Show();
            Action curPageOnFadeInComplete = delegate { ShowNextPanelAndStartTimer(curPage); };

            curPage.FadeInComplete        += curPageOnFadeInComplete;
            curPage.AllPanelsShowComplete += () => {
                Debug.Log("All panels show complete for " + curPage.name);
                bool isLastPage = _pageIndex == _pages.Length;
                Debug.Log("Setting update to " + (isLastPage ? "noop" : "hide current page on touch"));
                _update = isLastPage ? Constants.Noop : HideCurrentPageOnTouch;
                StopCoroutine(_nextTimer);
                pageFinished?.Invoke(_pageIndex - 1);
                if (!isLastPage)
                {
                    _nextTimer = StartCoroutine(Coroutines.ExecuteAfterSeconds(3, LoadNextPage));
                }
            };
            Debug.Log("Setting update to show next panel on touch");
            _update = () => ShowNextPanelOnTouch(curPage);
        }
示例#17
0
        public async Task <ComicPage[]> GetPagesAsync(string targetUrl)
        {
            var str = string.Empty;

            using (var sr = new StreamReader(await CreateRequest(targetUrl)))
            {
                str = sr.ReadToEnd();
            }
            var jsCodesRgx = regex.Match(str);
            var jsCode     = jsCodesRgx.Groups[1].Value;
            var val        = jsEngine.Evaluate <string>("var a=JSON.stringify(" + jsCode + ");a");
            var visitor    = JsonVisitor.FromString(val);

            try
            {
                var info = visitor["data"]
                           .ToArray().First()["res"]["data"]["comic_info"];
                var comics = info["comic_images"].ToArray();
                var pages  = new List <ComicPage>();
                var title  = info["title"].ToString();
                foreach (var item in comics)
                {
                    var uri  = item["url"].ToString();
                    var page = new ComicPage
                    {
                        Name      = title,
                        TargetUrl = uri
                    };
                    pages.Add(page);
                }
                return(pages.ToArray());
            }
            finally
            {
                visitor.Dispose();
            }
        }
示例#18
0
文件: ComicKeeper.cs 项目: Cricle/Anf
        protected virtual async Task StorePageAsync(ComicEntity entity, ComicChapter chapter, ComicPage page)
        {
            KeepingAction?.Invoke(entity, chapter, page, null, KeepingActionTypes.BeginStorePage);
            OnBeginStorePage(chapter, page);
            try
            {
                var mode = WriteMode;
                if (mode == ComicStoreWriteModes.NotExists)
                {
                    var ok = await storeService.ExistsAsync(page.TargetUrl);

                    if (ok)
                    {
                        KeepingAction?.Invoke(entity, chapter, page, null, KeepingActionTypes.EndStorePage);
                        OnEndStorePage(chapter, page, false);
                        return;
                    }
                }
                var path = page.TargetUrl;
                if (HasImageFolderName)
                {
                    path = string.Concat(ImageFolderName, "/", page.TargetUrl);
                }
                var stream = await fetchService.GetStreamAsync(page.TargetUrl);

                if (stream is null)
                {
                    stream = await Provider.GetImageStreamAsync(page.TargetUrl);

                    if (fetchService != storeService)
                    {
                        await fetchService.SaveAsync(path, stream);
                    }
                }
                stream.Seek(0, SeekOrigin.Begin);
                await storeService.SaveAsync(path, stream);
            }
            catch (Exception ex)
            {
                KeepingAction?.Invoke(entity, chapter, page, ex, KeepingActionTypes.StorePageException);
                OnStorePageException(chapter, page, ex);
            }
            KeepingAction?.Invoke(entity, chapter, page, null, KeepingActionTypes.EndStorePage);
            OnEndStorePage(chapter, page, true);
        }
示例#19
0
文件: ComicKeeper.cs 项目: Cricle/Anf
 protected virtual void OnBeginStorePage(ComicChapter chapter, ComicPage page)
 {
 }
示例#20
0
        private async Task DownloadPageAsync(ComicDownloadRequest request, ComicChapter chapter, ComicPage page, CancellationToken token)
        {
            var listener = request.Listener;
            DownloadListenerContext listenerContext = null;

            if (listener != null)
            {
                listenerContext = new DownloadListenerContext(request, chapter, page, token);
                await listener.ReadyFetchAsync(listenerContext);
            }
            if (listener != null && token.IsCancellationRequested)
            {
                await listener.CanceledAsync(listenerContext);

                return;
            }
            var ctx = new ComicDownloadContext(request.Entity, chapter, page, null, token);

            if (!request.Saver.NeedToSave(ctx))
            {
                if (listener != null)
                {
                    await listener.NotNeedToSaveAsync(listenerContext);
                }
                return;
            }
            try
            {
                if (listener != null)
                {
                    await listener.BeginFetchPageAsync(listenerContext);
                }
                using (var stream = await request.Provider.GetImageStreamAsync(page.TargetUrl))
                    using (var destStream = streamManager.GetStream())
                    {
                        DownloadSaveListenerContext saveCtx = null;
                        if (listener != null)
                        {
                            saveCtx = new DownloadSaveListenerContext(request, chapter, page, token, destStream);
                            await listener.ReadySaveAsync(saveCtx);
                        }
                        await stream.CopyToAsync(destStream);

                        destStream.Seek(0, SeekOrigin.Begin);
                        ctx = new ComicDownloadContext(request.Entity, chapter, page, destStream, token);
                        await request.Saver.SaveAsync(ctx);

                        if (listener != null)
                        {
                            await listener.EndFetchPageAsync(saveCtx);
                        }
                    }
            }
            catch (Exception ex)
            {
                if (listener != null)
                {
                    var errCtx = new DownloadExceptionListenerContext(request, chapter, page, token, ex);
                    await listener.FetchPageExceptionAsync(errCtx);
                }
            }
            if (listener != null)
            {
                await listener.ComplatedSaveAsync(listenerContext);
            }
        }
示例#21
0
 public DownloadItemRequest(ComicPage page)
 {
     Page = page;
 }
示例#22
0
 public DownloadItemRequest(ComicChapter chapter, ComicPage page)
 {
     Chapter = chapter;
     Page    = page;
 }
示例#23
0
文件: ComicKeeper.cs 项目: Cricle/Anf
 protected virtual void OnEndStorePage(ComicChapter chapter, ComicPage page, bool write)
 {
 }
示例#24
0
 public DownloadSaveListenerContext(ComicDownloadRequest request, ComicChapter chapter, ComicPage page, CancellationToken token,
                                    Stream targetStream)
     : base(request, chapter, page, token)
 {
     baseStream = targetStream;
 }
示例#25
0
文件: ComicKeeper.cs 项目: Cricle/Anf
 protected virtual void OnStorePageException(ComicChapter chapter, ComicPage page, Exception ex)
 {
 }
示例#26
0
 private void ShowNextPanelAndStartTimer(ComicPage curPage)
 {
     StopCoroutine(_nextTimer);
     _nextTimer = StartCoroutine(Coroutines.ExecuteAfterSeconds(3, () => ShowNextPanelAndStartTimer(curPage)));
     curPage.ShowNextPanel();
 }