コード例 #1
0
ファイル: HitomiParser.cs プロジェクト: ggbuta/koromo-copy
        /// <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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: HitomiParser.cs プロジェクト: ggbuta/koromo-copy
        /// <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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 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;
 }
コード例 #6
0
        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);
        }
コード例 #7
0
        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));
        }
コード例 #8
0
        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);
        }
コード例 #9
0
ファイル: HitomiParser.cs プロジェクト: ggbuta/koromo-copy
        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();
                }
            }
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        /// <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);
        }
コード例 #12
0
 public void AddArticle(HitomiArticle article)
 {
     AddArticle(article, DateTime.Now);
 }