/// <summary> /// 갤러리를 파싱합니다. /// 그룹/시리즈만 파싱함 /// </summary> /// <param name="source"></param> /// <returns></returns> static public HitomiArticle ParseGallery(string source) { HitomiArticle article = new HitomiArticle(); HtmlDocument document = new HtmlDocument(); document.LoadHtml(source); HtmlNode nodes = document.DocumentNode.SelectSingleNode("//div[@class='content']"); article.Magic = nodes.SelectSingleNode("./div[3]/h1/a").GetAttributeValue("href", "").Split('/')[2].Split('.')[0]; //article.Title = nodes.SelectSingleNode("./div[3]/h1").InnerText.Trim(); //article.Thumbnail = nodes.SelectSingleNode("./div[2]/div/a/img").GetAttributeValue("src", ""); //article.Artists = nodes.SelectSingleNode(".") foreach (var tr in document.DocumentNode.SelectNodes("//div[@class='gallery-info']/table/tr").ToList()) { var tt = tr.SelectSingleNode("./td").InnerText.ToLower().Trim(); if (tt == "group") { article.Groups = tr.SelectNodes(".//a")?.Select(x => x.InnerText.Trim()).ToArray(); } else if (tt == "characters") { article.Characters = tr.SelectNodes(".//a")?.Select(x => x.InnerText.Trim()).ToArray(); } } return(article); }
public static HitomiMetadata ArticleToMetadata(HitomiArticle article) { HitomiMetadata metadata = new HitomiMetadata(); if (article.Artists != null) { metadata.Artists = article.Artists; } if (article.Characters != null) { metadata.Characters = article.Characters; } if (article.Groups != null) { metadata.Groups = article.Groups; } metadata.ID = Convert.ToInt32(article.Magic); metadata.Language = LegalizeLanguage(article.Language); metadata.Name = article.Title; if (article.Series != null) { metadata.Parodies = article.Series; } if (article.Tags != null) { metadata.Tags = article.Tags.Select(x => LegalizeTag(x)).ToArray(); } metadata.Type = article.Type; return(metadata); }
/// <summary> /// 갤러리 블록을 파싱합니다. /// </summary> /// <param name="source"></param> /// <returns></returns> static public HitomiArticle ParseGalleryBlock(string source) { HitomiArticle article = new HitomiArticle(); HtmlDocument document = new HtmlDocument(); document.LoadHtml(source); HtmlNode nodes = document.DocumentNode.SelectNodes("/div")[0]; article.Magic = nodes.SelectSingleNode("./a").GetAttributeValue("href", "").Split('/')[2].Split('.')[0]; try { article.Thumbnail = nodes.SelectSingleNode("./a//img").GetAttributeValue("data-src", "").Substring("//tn.hitomi.la/".Length).Replace("smallbig", "big"); } catch { article.Thumbnail = nodes.SelectSingleNode("./a//img").GetAttributeValue("src", "").Substring("//tn.hitomi.la/".Length); } article.Title = nodes.SelectSingleNode("./h1").InnerText; try { article.Artists = nodes.SelectNodes(".//div[@class='artist-list']//li").Select(node => node.SelectSingleNode("./a").InnerText).ToArray(); } catch { article.Artists = new[] { "N/A" }; } var contents = nodes.SelectSingleNode("./div[2]/table"); try { article.Series = contents.SelectNodes("./tr[1]/td[2]/ul/li").Select(node => node.SelectSingleNode(".//a").InnerText).ToArray(); } catch { } article.Type = contents.SelectSingleNode("./tr[2]/td[2]/a").InnerText; try { article.Language = HitomiLegalize.LegalizeLanguage(contents.SelectSingleNode("./tr[3]/td[2]/a").InnerText); } catch { } try { article.Tags = contents.SelectNodes("./tr[4]/td[2]/ul/li").Select(node => HitomiLegalize.LegalizeTag(node.SelectSingleNode(".//a").InnerText)).ToArray(); } catch { } article.DateTime = nodes.SelectSingleNode("./div[2]/p").InnerText; return(article); }
public static async Task <IArticle> Collect(string uri) { string magic = Regex.Match(uri, "(\\d+)").Value; string html_source = await Task.Run(() => NetCommon.DownloadString($"{HitomiCommon.HitomiGalleryBlock}{magic}.html")); HitomiArticle article = HitomiParser.ParseGalleryBlock(html_source); return(article); }
public void SetModelFromArticle(HitomiArticle article) { model.Id = article.Magic; model.Title = article.Title; model.Artists = article.Artists; model.Series = article.Series; model.Characters = article.Characters; model.Groups = article.Groups; model.Types = article.Type; model.Pages = article.ImagesLink.Count; model.Tags = article.Tags; }
public static HitomiArticle MetadataToArticle(HitomiMetadata metadata) { HitomiArticle article = new HitomiArticle(); article.Artists = metadata.Artists; article.Characters = metadata.Characters; article.Groups = metadata.Groups; article.Language = metadata.Language; article.Magic = metadata.ID.ToString(); article.Series = metadata.Parodies; article.Tags = metadata.Tags; article.Title = metadata.Name; article.Type = metadata.Type; return(article); }
public void AddArticle(HitomiArticle article, DateTime dt) { HitomiLogModel mm = new HitomiLogModel(); mm.Id = article.Magic; mm.Title = article.Title; mm.Artists = article.Artists; mm.Groups = article.Groups; mm.Series = article.Series; mm.Characters = article.Characters; mm.Tags = article.Tags; mm.Time = dt; model.Add(mm); downloaded.Add(Convert.ToInt32(article.Magic)); }
public static HitomiMetadata ArticleToMetadata(HitomiArticle article) { HitomiMetadata metadata = new HitomiMetadata(); if (article.Artists != null) { metadata.Artists = article.Artists; } if (article.Characters != null) { metadata.Characters = article.Characters; } if (article.Groups != null) { metadata.Groups = article.Groups; } try { if (article.Magic.Contains("-")) { metadata.ID = Convert.ToInt32(article.Magic.Split('-').Last().Split('.')[0]); } else if (article.Magic.Contains("galleries")) { metadata.ID = Convert.ToInt32(article.Magic.Split('/').Last().Split('.')[0]); } else { metadata.ID = Convert.ToInt32(article.Magic); } } catch { ; } metadata.Language = LegalizeLanguage(article.Language); metadata.Name = article.Title; if (article.Series != null) { metadata.Parodies = article.Series; } if (article.Tags != null) { metadata.Tags = article.Tags.Select(x => LegalizeTag(x)).ToArray(); } metadata.Type = article.Type; return(metadata); }
static public void FillGallery(string source, HitomiArticle article) { HtmlDocument document = new HtmlDocument(); document.LoadHtml(source); HtmlNode nodes = document.DocumentNode.SelectSingleNode("/div[@class='gallery-info']/table/tbody"); foreach (var tr in nodes.SelectNodes("./tr").ToList()) { var tt = tr.SelectSingleNode("./td").InnerText.ToLower().Trim(); if (tt == "group") { article.Groups = tr.SelectNodes(".//a").Select(x => x.InnerText.Trim()).ToArray(); } else if (tt == "characters") { article.Characters = tr.SelectNodes(".//a").Select(x => x.InnerText.Trim()).ToArray(); } } }
public static HitomiArticle MetadataToArticle(HitomiIndexMetadata metadata) { HitomiArticle article = new HitomiArticle(); if (metadata.Artists != null) { article.Artists = metadata.Artists.Select(x => HitomiIndex.Instance.index.Artists[x]).ToArray(); } if (metadata.Characters != null) { article.Characters = metadata.Characters.Select(x => HitomiIndex.Instance.index.Characters[x]).ToArray(); } if (metadata.Groups != null) { article.Groups = metadata.Groups.Select(x => HitomiIndex.Instance.index.Groups[x]).ToArray(); } if (metadata.Language >= 0) { article.Language = HitomiIndex.Instance.index.Languages[metadata.Language]; } article.Magic = metadata.ID.ToString(); if (metadata.Parodies != null) { article.Series = metadata.Parodies.Select(x => HitomiIndex.Instance.index.Series[x]).ToArray(); } if (metadata.Tags != null) { article.Tags = metadata.Tags.Select(x => HitomiIndex.Instance.index.Tags[x]).ToArray(); } article.Title = metadata.Name; if (metadata.Type >= 0) { article.Type = HitomiIndex.Instance.index.Types[metadata.Type]; } return(article); }
/// <summary> /// Article의 디렉토리 경로를 만듭니다. /// </summary> /// <param name="article"></param> /// <param name="search_text"></param> /// <returns></returns> public static string MakeDownloadDirectory(HitomiArticle article, string search_text = "") { string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); string title = article.Title ?? ""; string artists = ""; string type = article.Type ?? ""; string series = ""; string search = search_text; if (article.Artists != null) { //if (HitomiSetting.Instance.GetModel().ReplaceArtistsWithTitle == false) artists = article.Artists[0]; //else //{ // TextInfo textInfo = new CultureInfo("en-US", false).TextInfo; // artists = textInfo.ToTitleCase(article.Artists[0]); //} } if (article.Series != null) { series = article.Series[0]; } if (title != null) { title = title.Replace('|', 'ㅣ'); foreach (char c in invalid) { title = title.Replace(c.ToString(), ""); } } if (artists != null) { foreach (char c in invalid) { artists = artists.Replace(c.ToString(), ""); } } if (series != null) { foreach (char c in invalid) { series = series.Replace(c.ToString(), ""); } } if (search != null) { foreach (char c in invalid) { search = search.Replace(c.ToString(), ""); } } string path = Settings.Instance.Hitomi.Path; path = Regex.Replace(path, "{Title}", title, RegexOptions.IgnoreCase); path = Regex.Replace(path, "{Artists}", artists, RegexOptions.IgnoreCase); path = Regex.Replace(path, "{Id}", article.Magic, RegexOptions.IgnoreCase); path = Regex.Replace(path, "{Type}", type, RegexOptions.IgnoreCase); path = Regex.Replace(path, "{Date}", DateTime.Now.ToString("yyyy-MM-dd"), RegexOptions.IgnoreCase); path = Regex.Replace(path, "{Series}", series, RegexOptions.IgnoreCase); path = Regex.Replace(path, "{Search}", search, RegexOptions.IgnoreCase); path = Regex.Replace(path, "{Upload}", HitomiDate.estimate_datetime(article.Magic.ToInt32()).ToString("yyyy-MM-dd"), RegexOptions.IgnoreCase); return(path); }
public void AddArticle(HitomiArticle article) { AddArticle(article, DateTime.Now); }