protected override async Task <List <IManga> > DownloadBookmarks() { var bookmarks = new List <IManga>(); var document = new HtmlDocument(); await this.DoLogin(); if (!IsLogined) { return(bookmarks); } var page = await Page.GetPageAsync(BookmarksUri, GetClient()); document.LoadHtml(page.Content); var nodes = document.DocumentNode.SelectNodes("//table[@class=\"decor\"]//a"); if (nodes == null) { Log.AddFormat("Bookmarks from '{0}' not found.", this.MainUri); return(bookmarks); } foreach (var node in nodes) { var name = WebUtility.HtmlDecode(node.ChildNodes.Single().InnerText); var url = node.Attributes.Single().Value; var manga = Mangas.Create(new Uri(this.MainUri, url)); manga.Name = name; bookmarks.Add(manga); } return(bookmarks); }
private async Task <int> GetCountOfChapters(string url) { var manga = await Mangas.Create(new Uri(url)).ConfigureAwait(false); await new Parser().UpdateContent(manga).ConfigureAwait(false); return(manga.Volumes.Sum(v => v.Container.Count())); }
protected override async Task <IManga> GetMangaFromNode(Uri host, CookieClient client, HtmlNode manga) { // Это переводчик, идем дальше. if (manga.SelectSingleNode(".//i[@class='fa fa-user text-info']") != null) { return(null); } var image = manga.SelectSingleNode(".//div[@class='img']//a//img"); var imageUri = image?.Attributes.Single(a => a.Name == "data-original").Value; var mangaNode = manga.SelectSingleNode(".//h3//a"); var mangaUri = mangaNode.Attributes.Single(a => a.Name == "href").Value; var mangaName = mangaNode.Attributes.Single(a => a.Name == "title").Value; if (!Uri.TryCreate(mangaUri, UriKind.Relative, out Uri test)) { return(null); } var result = await Mangas.Create(new Uri(host, mangaUri)).ConfigureAwait(false); result.Name = WebUtility.HtmlDecode(mangaName); if (!string.IsNullOrWhiteSpace(imageUri)) { result.Cover = await client.DownloadDataTaskAsync(new Uri(host, imageUri)).ConfigureAwait(false); } return(result); }
private int GetCountOfChapters(string url) { var manga = Mangas.Create(new Uri(url)); new Grouple.Parser().UpdateContent(manga); return(manga.Volumes.Sum(v => v.Container.Count())); }
public override async Task Execute(object parameter) { var model = parameter as MangaSearchViewModel; if (model == null) { return; } var manga = await Mangas.Create(model.Uri).ConfigureAwait(true); if (manga == null) { return; } manga.Cover = model.Cover; await manga.Refresh().ConfigureAwait(true); if (await manga.IsValid().ConfigureAwait(true)) { var explorer = ExplorerViewModel.Instance; var searchTab = new MangaModel(manga); explorer.Tabs.Add(searchTab); explorer.SelectedTab = searchTab; } }
private IManga Get(string url) { var manga = Mangas.Create(new Uri(url)); new Grouple.Parser().UpdateContent(manga); return(manga); }
private async Task <IManga> Get(string url) { var manga = await Mangas.Create(new Uri(url)).ConfigureAwait(false); await parser.UpdateContent(manga).ConfigureAwait(false); return(manga); }
public static Acomics.Acomics CreateAcomics() { var manga = Mangas.Create(AcomicsUri) as Acomics.Acomics; manga.Status = "example status"; manga.NeedUpdate = false; manga.Name = "Acomics from example" + Guid.NewGuid(); manga.Save(); return(manga); }
/// <summary> /// Создать мангу. /// </summary> /// <returns></returns> public static Grouple.Readmanga CreateReadmanga() { var manga = Mangas.Create(ReadmangaUri) as Grouple.Readmanga; manga.Status = "example status"; manga.NeedUpdate = false; manga.Name = "readmanga from example" + Guid.NewGuid(); manga.Save(); return(manga); }
public override IEnumerable <IManga> Search(string name) { var hosts = ConfigStorage.Plugins .Where(p => p.GetParser().GetType() == typeof(Parser)) .Select(p => p.GetSettings().MainUri); var client = new CookieClient(); foreach (var host in hosts) { var searchHost = new Uri(host, "search?q=" + WebUtility.UrlEncode(name)); var page = Page.GetPage(searchHost, client); if (!page.HasContent) { continue; } var document = new HtmlDocument(); document.LoadHtml(page.Content); var mangas = document.DocumentNode.SelectNodes("//div[contains(@class, 'col-sm-6')]"); if (mangas == null) { continue; } foreach (var manga in mangas) { // Это переводчик, идем дальше. if (manga.SelectSingleNode(".//i[@class='fa fa-user text-info']") != null) { continue; } var image = manga.SelectSingleNode(".//div[@class='img']//a//img"); var imageUri = image?.Attributes.Single(a => a.Name == "data-original").Value; var mangaNode = manga.SelectSingleNode(".//h3//a"); var mangaUri = mangaNode.Attributes.Single(a => a.Name == "href").Value; var mangaName = mangaNode.Attributes.Single(a => a.Name == "title").Value; if (!Uri.TryCreate(mangaUri, UriKind.Relative, out Uri test)) { continue; } var result = Mangas.Create(new Uri(host, mangaUri)); result.Name = WebUtility.HtmlDecode(mangaName); if (imageUri != null) { result.Cover = client.DownloadData(imageUri); } yield return(result); } } }
public async Task AddReadmangaWithGoldChapters() { var manga = await Mangas.Create(new Uri("https://readmanga.io/from_common_job_class_to_the_strongest_in_the_world")).ConfigureAwait(false); await new ReadmangaParser().UpdateContent(manga).ConfigureAwait(false); var volume = manga.Volumes.FirstOrDefault(v => v.Number == 4); Assert.NotNull(volume); Assert.AreEqual(7, volume.Container.Count); }
protected override async Task <List <IManga> > DownloadBookmarks(Guid mangaType) { var bookmarks = new List <IManga>(); var document = new HtmlDocument(); var isLogined = await this.DoLogin(mangaType).ConfigureAwait(false); if (!isLogined) { return(bookmarks); } var plugin = ConfigStorage.Plugins.Single(p => p.MangaGuid == mangaType); var client = await plugin.GetCookieClient(false).ConfigureAwait(false); var page = await client.GetPage(BookmarksUri).ConfigureAwait(false); document.LoadHtml(page.Content); var firstOrDefault = document.DocumentNode .SelectNodes("//div[@class=\"bookmarks-lists\"]"); var bookMarksNode = firstOrDefault?.FirstOrDefault(); if (bookMarksNode == null) { Log.AddFormat("Bookmarks from '{0}' not found.", this.MainUri); return(bookmarks); } var parser = plugin.GetParser(); using (var context = Repository.GetEntityContext("Loading bookmarks")) { var loadedBookmarks = Regex .Matches(bookMarksNode.OuterHtml, @"href='(.*?)'", RegexOptions.IgnoreCase) .OfType <Group>() .Select(g => g.Captures[0]) .OfType <Match>() .Select(m => new Uri(m.Groups[1].Value)); await Task.WhenAll(loadedBookmarks.Select(async b => { var manga = await Mangas.Create(b).ConfigureAwait(false); if (manga.Setting.Manga != mangaType) { return; } await parser.UpdateNameAndStatus(manga).ConfigureAwait(false); bookmarks.Add(manga); })).ConfigureAwait(false); } return(bookmarks); }
public override IEnumerable <IManga> Search(string name) { var hosts = ConfigStorage.Plugins .Where(p => p.GetParser().GetType() == typeof(Parser)) .Select(p => p.GetSettings().MainUri); var client = new CookieClient(); foreach (var host in hosts) { var searchHost = new Uri(host, "?do=search&subaction=search&story=" + WebUtility.UrlEncode(name)); var page = Page.GetPage(searchHost, client); if (!page.HasContent) { continue; } var document = new HtmlDocument(); document.LoadHtml(page.Content); var mangas = document.DocumentNode.SelectNodes("//div[@class='content_row']"); if (mangas == null) { continue; } foreach (var manga in mangas) { var image = manga.SelectSingleNode(".//div[@class='manga_images']//img"); var imageUri = image?.Attributes.Single(a => a.Name == "src").Value; var mangaNode = manga.SelectSingleNode(".//h2//a"); var mangaUri = mangaNode.Attributes.Single(a => a.Name == "href").Value; var mangaName = mangaNode.InnerText; // Это не манга, идем дальше. if (!mangaUri.Contains("/manga/")) { continue; } var result = Mangas.Create(new Uri(mangaUri)); result.Name = WebUtility.HtmlDecode(mangaName); if (imageUri != null) { result.Cover = client.DownloadData(new Uri(host, imageUri)); } yield return(result); } } }
/// <summary> /// Создать мангу. /// </summary> /// <returns></returns> public static async Task <Grouple.Readmanga> CreateReadmanga() { using (var context = Repository.GetEntityContext()) { var manga = await Mangas.Create(ReadmangaUri).ConfigureAwait(false) as Grouple.Readmanga; manga.Status = "example status"; manga.NeedUpdate = false; manga.Name = "readmanga from example" + Guid.NewGuid(); await context.Save(manga).ConfigureAwait(false); return(manga); } }
public static async Task <Acomics.Acomics> CreateAcomics() { using (var context = Repository.GetEntityContext()) { var manga = await Mangas.Create(AcomicsUri).ConfigureAwait(false) as Acomics.Acomics; manga.Status = "example status"; manga.NeedUpdate = false; manga.Name = "Acomics from example" + Guid.NewGuid(); await context.Save(manga).ConfigureAwait(false); return(manga); } }
public override async Task Execute(object parameter) { if (isLoading) { return; } var model = parameter as MangaSearchViewModel; if (model == null) { return; } try { this.isLoading = true; this.OnCanExecuteChanged(); this.Name = "Loading..."; var manga = await Mangas.Create(model.Uri).ConfigureAwait(true); if (manga == null) { return; } await manga.Refresh().ConfigureAwait(true); if (await manga.IsValid().ConfigureAwait(true)) { var explorer = ExplorerViewModel.Instance; var searchTab = new MangaModel(manga); explorer.Tabs.Add(searchTab); explorer.SelectedTab = searchTab; var covers = await manga.Parser.GetPreviews(manga).ConfigureAwait(true); searchTab.Cover = covers.FirstOrDefault(); } } finally { this.isLoading = false; this.OnCanExecuteChanged(); this.Name = "Preview"; } }
protected override async Task <List <IManga> > DownloadBookmarks() { var bookmarks = new List <IManga>(); var document = new HtmlDocument(); await this.DoLogin(); if (!IsLogined) { return(bookmarks); } var page = await Page.GetPageAsync(BookmarksUri, GetClient()); document.LoadHtml(page.Content); var firstOrDefault = document.DocumentNode .SelectNodes("//div[@class=\"bookmarks-lists\"]"); var bookMarksNode = firstOrDefault?.FirstOrDefault(); if (bookMarksNode == null) { Log.AddFormat("Bookmarks from '{0}' not found.", this.MainUri); return(bookmarks); } var parser = new Parser(); var loadedBookmarks = Regex .Matches(bookMarksNode.OuterHtml, @"href='(.*?)'", RegexOptions.IgnoreCase) .OfType <Group>() .Select(g => g.Captures[0]) .OfType <Match>() .Select(m => new Uri(m.Groups[1].Value)) .Select(s => { var manga = Mangas.Create(s); parser.UpdateNameAndStatus(manga); return(manga); }) .ToList(); bookmarks.AddRange(loadedBookmarks); return(bookmarks); }
protected override async Task <IManga> GetMangaFromNode(Uri host, ISiteHttpClient client, HtmlNode manga) { var image = manga.SelectSingleNode(".//div[@class='manga_images']//img"); var imageUri = image?.Attributes.Single(a => a.Name == "src").Value; var mangaNode = manga.SelectSingleNode(".//h2//a"); var mangaUri = mangaNode.Attributes.Single(a => a.Name == "href").Value; var mangaName = mangaNode.InnerText; var result = await Mangas.Create(new Uri(mangaUri)).ConfigureAwait(false); result.Name = WebUtility.HtmlDecode(mangaName); if (!string.IsNullOrWhiteSpace(imageUri)) { result.Cover = await client.GetData(new Uri(host, imageUri)).ConfigureAwait(false); } return(result); }
protected override async Task <IManga> GetMangaFromNode(Uri host, CookieClient client, HtmlNode manga) { var image = manga.SelectSingleNode(".//img"); var imageUri = image?.Attributes.Single(a => a.Name == "data-src").Value; var mangaNode = manga.SelectSingleNode(".//div[@class='img-overlay text-center']//a"); var mangaUri = mangaNode.Attributes.Single(a => a.Name == "href").Value; var mangaName = mangaNode.InnerText.Trim(); var result = await Mangas.Create(new Uri(host, mangaUri)).ConfigureAwait(false); result.Name = WebUtility.HtmlDecode(mangaName); if (!string.IsNullOrWhiteSpace(imageUri) && client != null) { result.Cover = await client.DownloadDataTaskAsync(new Uri(host, imageUri)).ConfigureAwait(false); } return(result); }
public override IEnumerable <IManga> Search(string name) { var hosts = ConfigStorage.Plugins .Where(p => p.GetParser().GetType() == typeof(Parser)) .Select(p => p.GetSettings().MainUri); var client = new CookieClient(); foreach (var host in hosts) { var searchHost = new Uri(host, "search?keyword=" + WebUtility.UrlEncode(name)); var page = Page.GetPage(searchHost, client); if (!page.HasContent) { continue; } var document = new HtmlDocument(); document.LoadHtml(page.Content); var mangas = document.DocumentNode.SelectNodes("//table[@class='catalog-elem list-loadable']"); if (mangas == null) { continue; } foreach (var manga in mangas) { var image = manga.SelectSingleNode(".//td[@class='catdata1']//a//img"); var imageUri = image?.Attributes.Single(a => a.Name == "src").Value; var mangaNode = manga.SelectSingleNode(".//div[@class='title']//a"); var mangaUri = mangaNode.Attributes.Single(a => a.Name == "href").Value; var mangaName = mangaNode.InnerText; var result = Mangas.Create(new Uri(host, mangaUri)); result.Name = WebUtility.HtmlDecode(mangaName); if (imageUri != null) { result.Cover = client.DownloadData(new Uri(host, imageUri)); } yield return(result); } } }
private async Task ShowPreview() { if (Uri.TryCreate(ManualUri, UriKind.Absolute, out Uri parsedUri)) { using (Repository.GetEntityContext($"Show preview for manga from uri {parsedUri}")) { var manga = await Mangas.Create(parsedUri).ConfigureAwait(true); if (manga == null) { return; } var model = new MangaSearchViewModel(manga); model.Cover = (await manga.Parser.GetPreviews(manga).ConfigureAwait(true)).FirstOrDefault(); await model.PreviewFoundManga.Execute(model).ConfigureAwait(true); } } }
protected override async Task <List <IManga> > DownloadBookmarks(Guid mangaType) { var bookmarks = new List <IManga>(); var document = new HtmlDocument(); var isLogined = await this.DoLogin(mangaType).ConfigureAwait(false); if (!isLogined) { return(bookmarks); } var client = await GetClient().ConfigureAwait(false); var page = await client.GetPage(BookmarksUri).ConfigureAwait(false); document.LoadHtml(page.Content); var nodes = document.DocumentNode .SelectNodes("//div[@style=\"float:left;width:810px;margin-top:3px;\"]//a[not(contains(@style,'font-size:11px;'))]"); if (nodes == null) { Log.AddFormat("Bookmarks from '{0}' not found.", this.MainUri); return(bookmarks); } await Task.WhenAll(nodes.Select(async u => { #warning HACK for https in bookmarks var manga = await Mangas.Create(new Uri(MainUri, new Uri(u.Attributes[0].Value).PathAndQuery)).ConfigureAwait(false); if (manga == null) { return; } manga.ServerName = WebUtility.HtmlDecode(u.InnerText); bookmarks.Add(manga); })).ConfigureAwait(false); return(bookmarks); }
protected override async Task <List <IManga> > DownloadBookmarks() { var bookmarks = new List <IManga>(); var document = new HtmlDocument(); await this.DoLogin(); if (!IsLogined) { return(bookmarks); } var page = await Page.GetPageAsync(BookmarksUri, GetClient()); document.LoadHtml(page.Content); var nodes = document.DocumentNode .SelectNodes("//div[@style=\"float:left;width:810px;margin-top:3px;\"]//a[not(contains(@style,'font-size:11px;'))]"); if (nodes == null) { Log.AddFormat("Bookmarks from '{0}' not found.", this.MainUri); return(bookmarks); } var parser = new Parser(); var mangas = nodes .Select(u => { var manga = Mangas.Create(new Uri(u.Attributes[0].Value)); manga.ServerName = WebUtility.HtmlDecode(u.InnerText); return(manga); }) // .Where(m => !string.IsNullOrWhiteSpace(m.Name)) .ToList(); bookmarks.AddRange(mangas); return(bookmarks); }
protected override async Task <IManga> GetMangaFromNode(Uri host, CookieClient client, HtmlNode manga) { var image = manga.SelectSingleNode(".//div[@class='manga_images']//img"); var imageUri = image?.Attributes.Single(a => a.Name == "src").Value; var mangaNode = manga.SelectSingleNode(".//h2//a"); var mangaUri = mangaNode.Attributes.Single(a => a.Name == "href").Value; var mangaName = mangaNode.InnerText; // Это не манга, идем дальше. if (!mangaUri.Contains("/manga/")) { return(null); } var result = await Mangas.Create(new Uri(mangaUri)).ConfigureAwait(false); result.Name = WebUtility.HtmlDecode(mangaName); if (!string.IsNullOrWhiteSpace(imageUri)) { result.Cover = await client.DownloadDataTaskAsync(new Uri(host, imageUri)).ConfigureAwait(false); } return(result); }
protected override async Task <List <IManga> > DownloadBookmarks() { var bookmarks = new List <IManga>(); var document = new HtmlDocument(); await this.DoLogin().ConfigureAwait(false); if (!IsLogined) { return(bookmarks); } var pages = new List <Uri>() { BookmarksUri }; for (int i = 0; i < pages.Count; i++) { var page = await Page.GetPageAsync(pages[i], GetClient()).ConfigureAwait(false); document.LoadHtml(page.Content); if (i == 0) { var pageNodes = document.DocumentNode.SelectNodes("//div[@class=\"navigation\"]//a"); if (pageNodes != null) { foreach (var node in pageNodes) { pages.Add(new Uri(node.Attributes[0].Value)); } pages = pages.Distinct().ToList(); } } var nodes = document.DocumentNode.SelectNodes("//div[@class=\"manga_row1\"]"); if (nodes == null) { Log.AddFormat("Bookmarks from '{0}' not found.", this.MainUri); return(bookmarks); } var parser = new Parser(); var mangas = nodes .Select(n => n.OuterHtml) .SelectMany(h => Regex.Matches(h, "href=\"(.*?)\"", RegexOptions.IgnoreCase) .OfType <Group>() .Select(g => g.Captures[0]) .OfType <Match>() .Select(m => new Uri(m.Groups[1].Value))); await Task.WhenAll(mangas.Select(async m => { var manga = await Mangas.Create(m).ConfigureAwait(false); if (manga == null) { return; } await parser.UpdateNameAndStatus(manga).ConfigureAwait(false); if (!string.IsNullOrWhiteSpace(manga.Name)) { bookmarks.Add(manga); } })).ConfigureAwait(false); } return(bookmarks); }