private void View() { var hm = new HentaiModel { Link = Link, Title = "lul" }; if (Link.ToLower().Contains("hentai.org")) { hm.Site = "ExHentai.org"; } else if (Link.ToLower().Contains("nhentai")) { hm.Site = "nHentai.net"; } else if (Link.ToLower().Contains("hentai.cafe")) { hm.Site = "Hentai.cafe"; } else { return; } var viewWindow = new HentaiViewerWindow { DataContext = new HentaiViewerWindowViewModel(hm), WindowStartupLocation = WindowStartupLocation.CenterScreen }; viewWindow.Show(); }
//private bool _saving; public HentaiViewerWindowViewModel(HentaiModel hentai, bool saveEnabled = true) { Hentai = hentai; CopyLinkCommand = new ActionCommand(() => Clipboard.SetText(Hentai.Link)); ChangeModeCommand = new ActionCommand(ChangeMode); JumpCommand = new ActionCommand(Jump); ImageObjects = new ReadOnlyObservableCollection <object>(_imageObjects); GetImagesCommand = new ActionCommand(async() => { FetchButtonVisibility = Visibility.Collapsed; PregressBarVisibility = Visibility.Visible; var links = new List <object>(); if (!hentai.IsSavedGallery) { var files = Directory.GetFiles(hentai.SavePath).ToList(); files.ForEach(links.Add); files.Remove("INFO.json"); SetPages(files.Count, files.Count); } else { links = await SelectSiteAsync(hentai); } _images = new ObservableCollection <object>(links); Images = new ReadOnlyObservableCollection <object>(_images); PagesList = new ReadOnlyObservableCollection <int>(_pagesList); PageIntList(); PregressBarVisibility = Visibility.Collapsed; foreach (var link in links) { if (_isClosing || _imageObjects.Count == 5) { break; } _imageObjects.Add(new ImageModel { PageNumber = links.IndexOf(link) + 1, Source = link, IsGif = link.ToString().Contains(".gif") }); await Task.Delay(10); Loaded++; } SaveEnabled = saveEnabled; }); SaveImagesCommand = new ActionCommand(() => { if (SaveProgress == Visibility.Collapsed) { SaveImagesAsync(); } }); Setting = SettingsController.Settings; if (Setting.Other.InstantFetch) { GetImagesCommand.Execute(null); } }
//private bool _dialogIsOpen = false; private void OpenDialog() { //if (_dialogIsOpen) { // return; //} //_dialogIsOpen = true; //var dia = new GalleryLinkDialog(); //await DialogHost.Show(dia); //_dialogIsOpen = false; if (!Clipboard.ContainsText() && !Clipboard.GetText().StartsWith("http")) { return; } var link = Clipboard.GetText(); var hm = new HentaiModel { Link = link, Title = "lul" }; if (link.ToLower().Contains("hentai.org/g/")) { hm.Site = "ExHentai.org"; } else if (link.ToLower().Contains("nhentai.net/g/")) { hm.Site = "nHentai.net"; } else if (link.ToLower().Contains("hentai.cafe")) { hm.Site = "Hentai.cafe"; } else if (link.ToLower().Contains("pururin.us/gallery/")) { hm.Site = "Pururin.us"; } else if (link.ToLower().Contains("imgur.com/a/")) { hm.Site = "Imgur.com"; } else { return; } var viewWindow = new HentaiViewerWindow { DataContext = new HentaiViewerWindowViewModel(hm), WindowStartupLocation = WindowStartupLocation.CenterScreen }; viewWindow.Show(); viewWindow.Focus(); }
private async Task <List <object> > SelectSiteAsync(HentaiModel hentai) { switch (hentai.Site) { case "Hentai.cafe": { var(paths, count) = await HentaiCafe.CollectImagesTaskAsync(hentai, SetPages); Pages = $"{paths.Count} : {count}"; return(paths); } case "nHentai.net": { var(paths, count) = await NHentai.CollectImagesTaskAsync(hentai, SetPages); Pages = $"{paths.Count} : {count}"; return(paths); } case "ExHentai.org": { var(paths, count) = await ExHentai.CollectImagesTaskAsync(hentai, SetPages); Pages = $"{paths.Count} : {count}"; return(paths); } case "Pururin.us": { var(paths, count) = await Pururin.CollectImagesTaskAsync(hentai, SetPages); Pages = $"{paths.Count} : {count}"; return(paths); } case "Imgur.com": { var(paths, count) = await Sites.Imgur.CollectImagesTaskAsync(hentai, SetPages); Pages = $"{paths.Count} : {count}"; return(paths); } default: return(null); } }
public static async Task <(List <object>, int)> CollectImagesTaskAsync(HentaiModel hentai, Action <int, int> setPages) { //var mockUrl = "https://api.imgur.com/3/album/5F5Cy/images"; //https://imgur.com/a/LNKof var galleryId = hentai.Link.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Last(); var client = new ImgurClient("b9a0d31f5189a6e"); var endpoint = new AlbumEndpoint(client); IAlbum album; try { album = await endpoint.GetAlbumAsync(galleryId); } catch (ImgurException e) { hentai.Title = e.Message; return(new List <object>(), 0); } if (hentai.Title == "lul") { hentai.Title = album.Title ?? album.Link; } if (Directory.Exists(hentai.SavePath)) { //var files = Directory.GetFiles(hentai.SavePath, "*.png"); var files = new DirectoryInfo(hentai.SavePath).GetFileSystemInfos("*.???") .OrderBy(fs => int.Parse(fs.Name.Split('.')[0])); var paths = new List <object>(); files.ToList().ForEach(p => paths.Add(p.FullName)); if (files.ToList().Count == album.ImagesCount) { setPages(files.Count(), album.ImagesCount); } return(new List <object>(paths), album.ImagesCount); } setPages(album.Images.Count(), album.ImagesCount); return(new List <object>(album.Images.Select(i => i.Link).ToList()), album.ImagesCount); }
public static async Task <(List <object>, int)> CollectImagesTaskAsync(HentaiModel hentai, Action <int, int> setPages) { if (Directory.Exists(hentai.SavePath) && hentai.IsSavedGallery) { var files = new DirectoryInfo(hentai.SavePath).GetFileSystemInfos("*.???") .OrderBy(fs => int.Parse(fs.Name.Split('.')[0])); var paths = new List <object>(); files.ToList().ForEach(p => paths.Add(p.FullName)); return(new List <object>(paths), files.Count()); } //http://pururin.us/gallery/32056/rem-ram-revolution //http://pururin.us/assets/image/data/32056/1.jpg var _galleryId = hentai.Link.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries)[3]; var document = await ParseHtmlStringAsync(await GetHtmlStringAsync(hentai.Link)); var pages = int.Parse(Regex.Match(document.DocumentElement.OuterHtml, "<li>([0-9]+) Pages</li>").Groups[1].Value); if (hentai.Title == "lul") { var firstOrDefault = document.All.FirstOrDefault(h => h.LocalName == "h1" && h.ClassList.Contains("otitle")); if (firstOrDefault != null) { hentai.Title = firstOrDefault.TextContent; } } var images = new List <object>(); for (var i = 1; i <= pages; i++) { images.Add($"http://pururin.us/assets/image/data/{_galleryId}/{i}.jpg"); } return(images, pages); }
public static async Task <(List <object>, int)> CollectImagesTaskAsync(HentaiModel hentai, Action <int, int> setPages) { if (Directory.Exists(hentai.SavePath) && hentai.IsSavedGallery) { var files = new DirectoryInfo(hentai.SavePath).GetFileSystemInfos("*.???") .OrderBy(fs => int.Parse(fs.Name.Split('.')[0])); var paths = new List <object>(); files.ToList().ForEach(p => paths.Add(p.FullName)); return(new List <object>(paths), files.Count()); } var url = hentai.Link; //Let's create a new parser using this configuration var parser = new HtmlParser(); //Just get the DOM representation var entryPage = await parser.ParseAsync(await GetHtmlStringAsync(url)); var entryLink = entryPage.All.Where(l => l.LocalName == "a" && l.ClassList.Contains("x-btn-large")).ToList()[0] .GetAttribute("href"); if (hentai.Title == "lul") { var firstOrDefault = entryPage.All.FirstOrDefault(h => h.LocalName == "h3"); if (firstOrDefault != null) { hentai.Title = firstOrDefault.TextContent; } } var blankurl = entryLink + "page/"; if (!entryLink.EndsWith("page/1")) { entryLink = entryLink + "page/1"; } var html = await GetHtmlStringAsync(entryLink); var match = Regex.Match(html, "<div class=\"text\">([0-9]+) ⤵</div>", RegexOptions.IgnoreCase); var retlist = new List <object>(); var lastChapterNumber = int.Parse(match.Groups[1].Value); setPages(0, lastChapterNumber); for (var i = 1; i <= lastChapterNumber; i++) { var htmlpage = await parser.ParseAsync(await GetHtmlStringAsync($"{blankurl}{i}")); var img = htmlpage.All.First(im => im.LocalName == "img" && im.ClassList.Contains("open") && im.HasAttribute("src") && im.GetAttribute("src") .Contains("https://cdn.hentai.cafe/manga/content/comics/")) .GetAttribute("src"); retlist.Add(img); setPages(i, lastChapterNumber); } return(retlist, lastChapterNumber); }
public static async Task <(List <object>, int)> CollectImagesTaskAsync(HentaiModel hentai, Action <int, int> setPages) { if (Directory.Exists(hentai.SavePath) && hentai.IsSavedGallery) { var files = new DirectoryInfo(hentai.SavePath).GetFileSystemInfos("*.???") .OrderBy(fs => int.Parse(fs.Name.Split('.')[0])); var paths = new List <object>(); files.ToList().ForEach(p => paths.Add(p.FullName)); return(new List <object>(paths), files.Count()); } var url = hentai.Link; var document = await ParseHtmlStringAsync(await GetHtmlStringAsync(url)); var pages = int.Parse(Regex.Match(document.DocumentElement.OuterHtml, "<div>([0-9]+) pages</div>").Groups[1].Value); setPages(0, pages); if (hentai.Title == "lul") { var firstOrDefault = document.All.FirstOrDefault(h => h.LocalName == "h1"); if (firstOrDefault != null) { hentai.Title = firstOrDefault.TextContent; } } var thumbnailcontainer = document.All.First( c => c.LocalName == "div" && c.HasAttribute("id") && c.GetAttribute("id") == "thumbnail-container"); var imgt = thumbnailcontainer.Children .Select(thumbnailcontainerChild => thumbnailcontainerChild.Children[0].Children[0]).ToList(); //var imgTags = thumbnailcontainer?.Children.Where(i => i.LocalName == "img" && i.ClassList.Contains("lazyload")); var images = imgt?.Select( element => $"{element.GetAttribute("data-src").Replace("t.j", ".j").Replace("/t.", "/i.").Replace("t.pn", ".pn")}") .Cast <object>() .ToList(); //img link https://t.nhentai.net/galleries/775571/6.jpg // overview link https://nhentai.net/g/124787/ //var imagelinktmp = url.Replace("/g/", "/galleries/").Replace("://t.", "://i."); //for (int i = 1; i <= pages; i++) { // images.Add($"{imagelinktmp}{i}.jpg"); //} setPages(images.Count, pages); var ims = new List <object>(); foreach (var image in images) { if (image.ToString().StartsWith("http")) { ims.Add(image); continue; } ims.Add($"https:{image}"); } return(ims, pages); }
public static async Task <(List <object>, int)> CollectImagesTaskAsync(HentaiModel hentai, Action <int, int> setPages) { if (Directory.Exists(hentai.SavePath) && !hentai.IsSavedGallery) { var files = new DirectoryInfo(hentai.SavePath).GetFileSystemInfos("*.???") .OrderBy(fs => int.Parse(fs.Name.Split('.')[0])); var paths = new List <object>(); files.ToList().ForEach(p => paths.Add(p.FullName)); return(new List <object>(paths), files.Count()); } var url = hentai.Link; var client = new RestClient { UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36", Encoding = Encoding.UTF8, Timeout = 60000, BaseUrl = new Uri(url), CookieContainer = GetCookies() }; if (hentai.Link.Contains("g.e-hentai.org")) { client.CookieContainer.Add(new Cookie("nw", "1", "/", "g.e-hentai.org")); } var document = await ParseHtmlStringAsync(await GetHtmlStringAsync(client)); if (hentai.Title == "lul") { hentai.Title = document.Title.Replace(" - ExHentai.org", string.Empty); } var urlsplit = url.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); var galleryid = urlsplit[urlsplit.Length - 2]; var ptag = document.All.Where(p => p.LocalName == "p" && p.ClassList.Contains("gpc")); var showingimages = ptag.First().TextContent.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var pn = showingimages[showingimages.Length - 2].Trim().Replace(",", string.Empty); var pages = int.Parse(pn, CultureInfo.InvariantCulture); setPages(0, pages); var imgpagestd = document.All.Where( t => t.LocalName == "a" && t.HasAttribute("href") && t.GetAttribute("href").Contains("?p=")); var impagelink = new List <string> { url }; foreach (var element in imgpagestd) { var link = element.GetAttribute("href"); if (!impagelink.Contains(link)) { impagelink.Add(link); } } var imgagelinkpages = new List <string>(); foreach (var imgpage in impagelink) { client.BaseUrl = new Uri(imgpage); var html = await ParseHtmlStringAsync(await GetHtmlStringAsync(client)); var atags = html.All.Where( t => t.LocalName == "a" && t.HasAttribute("href") && t.GetAttribute("href").Contains($"{galleryid}-")); foreach (var element in atags) { if (!imgagelinkpages.Contains(element.GetAttribute("href"))) { imgagelinkpages.Add(element.GetAttribute("href")); } } //https://exhentai.org/s/8cbbff2c8a/1069378-1 imgagelinkpages = new List <string>(imgagelinkpages.OrderBy(x => int.Parse(x.Split('-').Last()))); } var images = new List <object>(); for (var index = 0; index < imgagelinkpages.Count; index++) { var imgagelinkpage = imgagelinkpages[index]; client.BaseUrl = new Uri(imgagelinkpage); var html = await ParseHtmlStringAsync(await GetHtmlStringAsync(client)); var atags = html.All.Where( t => t.LocalName == "img" && t.HasAttribute("id") && t.Id.Contains("img")); if (atags.Count(c => c.HasAttribute("id")) == 0) { atags = html.All.Where( t => t.LocalName == "img" && t.HasAttribute("src") && t.GetAttribute("src").Contains("keystamp")); } var imglist = atags.Select(element => element.GetAttribute("src")); images.AddRange(imglist); setPages(index, pages); } return(images, pages); }