Exemple #1
0
        public override async Task UpdateContent(IManga manga)
        {
            var chapters = new List <MangachanChapter>();

            try
            {
                var document = new HtmlDocument();
                var client   = await MangachanPlugin.Instance.GetCookieClient(true).ConfigureAwait(false);

                var content = (await client.GetPage(manga.Uri).ConfigureAwait(false)).Content;
                document.LoadHtml(content);

                var chapterNodes = document.DocumentNode.SelectNodes("//table[@class=\"table_cha\"]//a");
                if (chapterNodes != null)
                {
                    foreach (var node in chapterNodes)
                    {
                        var link = node.Attributes.Single(a => a.Name == "href").Value;
                        chapters.Add(new MangachanChapter(new Uri(manga.Uri, link), WebUtility.HtmlDecode(node.InnerText)));
                    }
                    chapters.Reverse();
                }
            }
            catch (NullReferenceException ex)
            {
                Log.Exception(ex, $"Возможно, требуется регистрация для доступа к {manga.Uri}");
            }

            var volumes = new List <VolumeDto>();

            foreach (var volume in chapters.GroupBy(c => c.VolumeNumber).ToList())
            {
                var vol = new VolumeDto(volume.Key);
                vol.Container.AddRange(volume.Select(c => new ChapterDto(c.Uri, c.Name)
                {
                    Number = c.Number
                }));
                chapters.RemoveAll(c => volume.Contains(c));
                volumes.Add(vol);
            }

            var chaptersDto = chapters.Select(c => new ChapterDto(c.Uri, c.Name)
            {
                Number = c.Number
            }).ToList();

            FillMangaVolumes(manga, volumes);
            FillMangaChapters(manga, chaptersDto);
        }
        public override async Task UpdateContent(IManga manga)
        {
            var dic         = new Dictionary <Uri, string>();
            var links       = new List <Uri> {
            };
            var description = new List <string> {
            };
            var page        = await Page.GetPageAsync(manga.Uri, GetClient()).ConfigureAwait(false);

            var hasCopyrightNotice = false;

            try
            {
                var document = new HtmlDocument();
                document.LoadHtml(page.Content);
                hasCopyrightNotice = document.DocumentNode.InnerText.Contains(Copyright);
                var linkNodes = document.DocumentNode
                                .SelectNodes("//div[@class=\"expandable chapters-link\"]//a[@href]")
                                .Reverse()
                                .ToList();
                links = linkNodes
                        .ConvertAll(r => r.Attributes.Single(a => a.Name == "href").Value)
                        .Where(k => k != string.Empty)
                        .Select(s => page.ResponseUri.GetLeftPart(UriPartial.Authority) + s + "?mature=1")
                        .Select(s => new Uri(s))
                        .ToList();
                description = linkNodes
                              .ConvertAll(r => WebUtility.HtmlDecode(r.InnerText.Replace("\r\n", string.Empty).Trim()))
                              .ToList();
            }
            catch (NullReferenceException ex)
            {
                Log.Exception(ex, $"Ошибка получения списка глав с адреса {page.ResponseUri}");
            }
            catch (ArgumentNullException ex)
            {
                Log.Exception(ex, hasCopyrightNotice
            ? $"{Copyright}, адрес манги {page.ResponseUri}"
            : $"Главы не найдены по адресу {page.ResponseUri}");
            }

            for (var i = 0; i < links.Count; i++)
            {
                dic.Add(links[i], description[i]);
            }

            var rmVolumes = dic
                            .Select(cs => new GroupleChapter(cs.Key, cs.Value))
                            .GroupBy(c => c.VolumeNumber)
                            .Select(g =>
            {
                var v = new VolumeDto(g.Key);
                v.Container.AddRange(g.Select(c => new ChapterDto(c.Uri, c.Name)
                {
                    Number = c.Number
                }));
                return(v);
            })
                            .ToList();

            FillMangaVolumes(manga, rmVolumes);
        }
Exemple #3
0
        /// <summary>
        /// Получить содержание манги - тома и главы.
        /// </summary>
        /// <param name="manga">Манга.</param>
        public override async Task UpdateContent(IManga manga)
        {
            var volumes  = new List <VolumeDto>();
            var chapters = new List <ChapterDto>();
            var pages    = new List <MangaPageDto>();

            try
            {
                var document = new HtmlDocument();
                document.LoadHtml((await Page.GetPageAsync(new Uri(manga.Uri.OriginalString + @"/content"), this.GetClient()).ConfigureAwait(false)).Content);

                var volumeNodes = document.DocumentNode.SelectNodes(VolumeXPath);
                if (volumeNodes != null)
                {
                    for (var i = 0; i < volumeNodes.Count; i++)
                    {
                        var volume    = volumeNodes[i];
                        var desc      = WebUtility.HtmlDecode(volume.InnerText);
                        var newVolume = new VolumeDto()
                        {
                            Name = desc, Number = volumes.Count + 1
                        };
                        var skipped = volume.ParentNode.ChildNodes
                                      .SkipWhile(cn => cn.PreviousSibling != volume);
                        var volumeChapterNodes = skipped
                                                 .TakeWhile(cn => !cn.Attributes.Any() || cn.Attributes[0].Value != VolumeClassName);
                        var volumeChapters = volumeChapterNodes
                                             .Select(cn => cn.SelectNodes(".//a"))
                                             .Where(cn => cn != null)
                                             .SelectMany(cn => cn)
                                             .Select(CreateChapterDto);
                        newVolume.Container.AddRange(volumeChapters);
                        volumes.Add(newVolume);
                    }
                }

                if (volumeNodes == null || !volumes.Any())
                {
                    var nodes = document.DocumentNode.SelectNodes(ChapterXPath);
                    if (nodes != null)
                    {
                        chapters.AddRange(nodes.Select(CreateChapterDto));
                    }
                }

                var allPages = await GetMangaPages(manga.Uri).ConfigureAwait(false);

                var innerChapters = chapters.Count == 0 ? volumes.SelectMany(v => v.Container).ToList() : chapters;
                for (int i = 0; i < innerChapters.Count; i++)
                {
                    var current = innerChapters[i].Number;
                    var next    = i + 1 != innerChapters.Count ? innerChapters[i + 1].Number : int.MaxValue;
                    innerChapters[i].Container.AddRange(allPages.Where(p => current <= p.Number && p.Number < next));
                    innerChapters[i].Number = i + 1;
                }
                pages = allPages.Except(innerChapters.SelectMany(c => c.Container)).ToList();
            }
            catch (NullReferenceException ex) { Log.Exception(ex); }

            manga.HasVolumes  = volumes.Any();
            manga.HasChapters = volumes.Any() || chapters.Any();
            FillMangaVolumes(manga, volumes);
            FillMangaChapters(manga, chapters);
            FillMangaPages(manga, pages);
        }