private async Task <IEnumerable <string> > FindPagesInChapter(string chapterUrl, CancellationToken cancellationToken) { var input = await downloader.GetStringAsync(chapterUrl, cancellationToken); // <div...id="thumbnail-container"><div class="thumb-container"><a...href="/g/93922/1/"> var links = selector.SelectMany(input, "//div[@id='thumbnail-container']//div[contains(@class, 'thumb-container')]//a") .Select(n => SiteUrl + n.Attributes["href"]); return(links.ToArray()); }
public async Task <string> RefreshTokenAsync(string authToken, IWebProxy proxy) { string baseUrl = _configurationValues.ApiBaseUrl; string url = baseUrl + Endpoints.RefreshToken; string json = await _httpDownloader.GetStringAsync(url, new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase) { { "Content-Type", "application/json" }, { "Authorization", $"Bearer {authToken}" } }, proxy); return(json); }
public async Task <IEnumerable <Chapter> > GetChapters(string manga, IProgress <string> progress, CancellationToken cancellationToken) { string input = await downloader.GetStringAsync(manga, cancellationToken); var title = selector.Select(input, "//h1").InnerText; var chaps = selector .SelectMany(input, "//td/a") .Select(n => { string url = $"https://readms.net{n.Attributes["href"]}"; return(new Chapter($"{title} {n.InnerText}", url)); }); return(chaps); }
public async Task <IEnumerable <Chapter> > GetChapters(string manga, IProgress <string> progress, CancellationToken cancellationToken) { string input = await downloader.GetStringAsync(manga, cancellationToken); var title = selector.Select(input, "//h2[@class='aname']").InnerText; var chaps = selector .SelectMany(input, "//table[@id='listing']//a") .Select(n => { string url = n.Attributes["href"]; var resultUrl = new Uri(new Uri(manga), url).AbsoluteUri; return(new Chapter(n.InnerText, resultUrl)); }); chaps = chaps.Reverse().GroupBy(x => x.Url).Select(g => g.First()).ToList(); return(chaps); }
public async void FindImages() { var images = await service.GetImages("https://www.mangahere.cc/manga/deathtopia/c001/1.html", new Progress <string>(), source.Token); Assert.Equal(60, images.Count()); Assert.StartsWith("https://l.mangatown.com/store/manga/14771/001.0/compressed/uimg001.jpg", images.ToArray()[0]); Assert.StartsWith("https://l.mangatown.com/store/manga/14771/001.0/compressed/uimg002.jpg", images.ToArray()[1]); Assert.StartsWith("https://l.mangatown.com/store/manga/14771/001.0/compressed/uimg059.jpg", images.ToArray()[58]); string imageString = await downloader.GetStringAsync(images.ToArray()[0], source.Token); Assert.NotNull(imageString); }
public async Task <IEnumerable <Chapter> > GetChapters(string manga, IProgress <string> progress, CancellationToken cancellationToken) { string input = await downloader.GetStringAsync(manga, cancellationToken); var chaps = selector .SelectMany(input, "//ul[contains(@class, 'chapters-list')]/li/a") .Select(n => { string url = n.Attributes["href"]; return(new Chapter(null, url)); }).ToList(); var chap_numbers = selector .SelectMany(input, "//ul[contains(@class, 'chapters-list')]/li/a/span[contains(@class, 'chapter__no')]") .Select(n => n.InnerText) .ToList(); chaps.ForEach(c => c.Name = "One Punch Man " + chap_numbers[chaps.IndexOf(c)]); return(chaps); }
public async Task <string> GetSeriesSearchResultsAsync(SeriesSearchParams searchParams, string authToken, IWebProxy proxy) { string baseUrl = _configurationValues.ApiBaseUrl; string url = baseUrl + Endpoints.SeriesSearch; Dictionary <string, string> queryParams = new Dictionary <string, string> { { "type", "series" }, }; if (!string.IsNullOrWhiteSpace(searchParams?.Name)) { queryParams.Add("query", searchParams.Name); } // TODO: Search by IMDB ID //if (!string.IsNullOrWhiteSpace(searchParams?.ImdbId)) // queryParams.Add("imdbId", searchParams.ImdbId); string queryString = "?"; foreach (var param in queryParams) { if (queryString.Length > 1) { queryString += "&"; } queryString += $"{WebUtility.UrlEncode(param.Key)}={WebUtility.UrlEncode(param.Value)}"; } url += queryString; string json = await _httpDownloader.GetStringAsync(url, new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase) { { "Authorization", $"Bearer {authToken}" } }, proxy); return(json); }
public async void FindImages() { var images = await service.GetImages("https://fanfox.net/manga/tian_jiang_xian_shu_nan/c001/1.html", new Progress <string>(), source.Token); Assert.Equal(16, images.Count()); Assert.StartsWith("https://s.fanfox.net/store/manga/19803/001.0/compressed/q001.jpg", images.ToArray()[0]); Assert.StartsWith("https://s.fanfox.net/store/manga/19803/001.0/compressed/q002.jpg", images.ToArray()[1]); Assert.StartsWith("https://s.fanfox.net/store/manga/19803/001.0/compressed/q003.jpg", images.ToArray()[2]); string imageString = await downloader.GetStringAsync(images.ToArray()[0], source.Token); Assert.NotNull(imageString); }
public async Task FindImages() { var images = await service.GetImages("https://www.mangareader.net/naruto/1", new Progress <string>(), source.Token); Assert.Equal(53, images.Count()); Assert.Equal("https://i10.mangareader.net/naruto/1/naruto-1564773.jpg", images.ToArray()[0]); Assert.Equal("https://i4.mangareader.net/naruto/1/naruto-1564774.jpg", images.ToArray()[1]); Assert.Equal("https://i1.mangareader.net/naruto/1/naruto-1564825.jpg", images.ToArray()[52]); string imageString = await downloader.GetStringAsync(images.ToArray()[0], source.Token); Assert.NotNull(imageString); }
//public async Task<string> GetAuthTokenAsync(IWebProxy proxy) //{ // string baseUrl = _configurationValues.ApiBaseUrl; // string apiKey = _configurationValues.ApiKey; // string url = baseUrl + Endpoints.NewAuthenticationToken; // Dictionary<string, string> queryParams = new Dictionary<string, string> // { // {"api_key", apiKey}, // }; // string queryString = "?"; // foreach (var param in queryParams) // { // if (queryString.Length > 1) queryString += "&"; // queryString += $"{WebUtility.UrlEncode(param.Key)}={WebUtility.UrlEncode(param.Value)}"; // } // url += queryString; // string json = await _httpDownloader.GetStringAsync(url, // new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) // { // {"Content-Type", "application/json"} // }, // proxy); // return json; //} public async Task <string> FindByExternalId(MovieSearchParams searchParams, IWebProxy proxy) { string baseUrl = _configurationValues.ApiBaseUrl; string apiKey = _configurationValues.ApiKey; string url = baseUrl; Dictionary <string, string> queryParams = new Dictionary <string, string> { { "api_key", apiKey }, }; if (!string.IsNullOrWhiteSpace(searchParams.ImdbId)) { url = baseUrl + string.Format(Endpoints.FindByExternalId, searchParams.ImdbId); queryParams.Add("external_source", "imdb_id"); } string queryString = "?"; foreach (var param in queryParams) { if (queryString.Length > 1) { queryString += "&"; } queryString += $"{WebUtility.UrlEncode(param.Key)}={WebUtility.UrlEncode(param.Value)}"; } url += queryString; string json = await _httpDownloader.GetStringAsync(url, new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase) { { "Content-Type", "application/json" } }, proxy); return(json); }
private async Task <IEnumerable <Chapter> > GetChaptersImpl(string manga, CancellationToken cancellationToken) { string input = await downloader.GetStringAsync(manga, cancellationToken); var title = selector.Select(input, "//span[@class='detail-info-right-title-font']").InnerText; var hrefs = selector.SelectMany(input, "//ul[@class='detail-main-list']/li/a").Select(a => a.Attributes["href"]).ToList(); var texts = selector.SelectMany(input, "//ul[@class='detail-main-list']/li/a/div/p[@class='title3']").Select(p => p.InnerText).ToList(); var chaps = new List <Chapter>(); for (int i = 0; i < hrefs.Count(); i++) { var chap = new Chapter($"{title} {texts[i]}", hrefs[i]); chaps.Add(chap); } return(chaps); }
public Task <string> GetStringAsync(string url, CancellationToken token) { logger.Info($"> DownloadStringAsync: {url}"); return(downloader.GetStringAsync(url, token)); }