Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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()));
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 6
0
        private IManga Get(string url)
        {
            var manga = Mangas.Create(new Uri(url));

            new Grouple.Parser().UpdateContent(manga);
            return(manga);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        /// <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);
        }
Exemplo n.º 10
0
        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);
                }
            }
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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);
        }
Exemplo n.º 13
0
        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);
                }
            }
        }
Exemplo n.º 14
0
        /// <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);
            }
        }
Exemplo n.º 15
0
        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";
            }
        }
Exemplo n.º 17
0
        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);
        }
Exemplo n.º 18
0
        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);
        }
Exemplo n.º 19
0
        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);
        }
Exemplo n.º 20
0
        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);
                }
            }
        }
Exemplo n.º 21
0
        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);
                }
            }
        }
Exemplo n.º 22
0
        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);
        }
Exemplo n.º 23
0
        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);
        }
Exemplo n.º 24
0
        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);
        }
Exemplo n.º 25
0
        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);
        }