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); }
/// <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); }