예제 #1
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool TwipplePhoto_CreateImage(CreateImageArgs args)
        {
            var mc = Regex.Match(args.Url.Value, "^http://p.twipple.jp/(?<contentId>[0-9a-z]+)", RegexOptions.IgnoreCase);
            if (!mc.Success)
            {
                return false;
            }

            var src = string.Empty;
            var http = new HttpVarious();
            if (!http.GetData(args.Url.Key, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            var contentId = mc.Groups["contentId"].Value;
            var thumbnailUrl = "http://p.twpl.jp/show/large/" + contentId;
            var img = http.GetImage(thumbnailUrl, args.Url.Key, 0, ref args.Errmsg);
            if (img == null)
            {
                return false;
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return true;
        }
예제 #2
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Piapro_CreateImage(CreateImageArgs args)
        {
            var mc = Regex.Match(args.Url.Value, "^http://piapro\\.jp/(?:content/[0-9a-z]+|t/[0-9a-zA-Z_\\-]+)$");
            if (!mc.Success)
            {
                return false;
            }

            string src = string.Empty;
            var http = new HttpVarious();
            if (!http.GetData(args.Url.Key, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            Match mc2 = Regex.Match(src, "<meta property=\"og:image\" content=\"(?<big_img>http://c1\\.piapro\\.jp/timg/[0-9a-z]+_\\d{14}_0500_0500\\.(?:jpg|png|gif)?)\" />");
            if (!mc2.Success)
            {
                args.Errmsg = "Pattern NotFound";
                return false;
            }

            // 各画像には120x120のサムネイルがある(多分)ので、URLを置き換える。元々ページに埋め込まれている画像は500x500
            var r = new Regex("_\\d{4}_\\d{4}");
            string minImgUrl = r.Replace(mc2.Groups["big_img"].Value, "_0120_0120");
            Image img = http.GetImage(minImgUrl, args.Url.Key, 0, ref args.Errmsg);
            if (img == null)
            {
                return false;
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return true;
        }
예제 #3
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Instagram_CreateImage(CreateImageArgs args)
        {
            var src  = string.Empty;
            var http = new HttpVarious();

            if (!http.GetData(args.Url.Value, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            var mc = Regex.Match(src, "<meta property=\"og:image\" content=\"(?<url>.+)\" ?/>");

            if (!mc.Success)
            {
                args.Errmsg = "Pattern NotFound";
                return(false);
            }

            var img = http.GetImage(mc.Groups["url"].Value, args.Url.Key, 0, ref args.Errmsg);

            if (img == null)
            {
                return(false);
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return(true);
        }
예제 #4
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Flickr_CreateImage(CreateImageArgs args)
        {
            /*

            // 参考: http://tanarky.blogspot.com/2010/03/flickr-urlunavailable.html アグレッシブエンジニア: flickr の画像URL仕様についてまとめ(Unavailable画像)
            // 画像URL仕様 http://farm{farm}.static.flickr.com/{server}/{id}_{secret}_{size}.{extension}
            // photostreamなど複数の画像がある場合先頭の一つのみ認識と言うことにする
            // (二つ目のキャプチャ 一つ目の画像はユーザーアイコン)
            */
            string src = string.Empty;
            var http = new HttpVarious();
            if (!http.GetData(args.Url.Value, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            var mc = Regex.Match(args.Url.Value, "^http://www.flickr.com/", RegexOptions.IgnoreCase);
            var mc2 = Regex.Matches(src, mc.Result("http://farm[0-9]+\\.staticflickr\\.com/[0-9]+/.+?\\.([a-zA-Z]+)"));

            // 二つ以上キャプチャした場合先頭の一つだけ 一つだけの場合はユーザーアイコンしか取れなかった
            if (mc2.Count > 1)
            {
                var img = http.GetImage(mc2[1].Value, args.Url.Value, 0, ref args.Errmsg);
                if (img == null)
                {
                    return false;
                }

                args.AddTooltipInfo(args.Url.Key, string.Empty, img);
                return true;
            }

            args.Errmsg = "Pattern NotFound";
            return false;
        }
예제 #5
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool TwipplePhoto_CreateImage(CreateImageArgs args)
        {
            var mc = Regex.Match(args.Url.Value, "^http://p.twipple.jp/(?<contentId>[0-9a-z]+)", RegexOptions.IgnoreCase);

            if (!mc.Success)
            {
                return(false);
            }

            var src  = string.Empty;
            var http = new HttpVarious();

            if (!http.GetData(args.Url.Key, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            var contentId    = mc.Groups["contentId"].Value;
            var thumbnailUrl = "http://p.twpl.jp/show/large/" + contentId;
            var img          = http.GetImage(thumbnailUrl, args.Url.Key, 0, ref args.Errmsg);

            if (img == null)
            {
                return(false);
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return(true);
        }
예제 #6
0
        public string LanguageDetect(string source)
        {
            var http    = new HttpVarious();
            var headers = new Dictionary <string, string>
            {
                { "User-Agent", MyCommon.GetUserAgentString() },
                { "v", "1.0" },
                { "q", source }
            };
            var content = string.Empty;

            if (!http.GetData(LanguageDetectEndPoint, headers, ref content))
            {
                return(string.Empty);
            }

            try
            {
                var res = D.CreateDataFromJson <LanguageDetectResponse>(content);
                return(res.ResponseData.Language);
            }
            catch (Exception)
            {
                return(string.Empty);
            }
        }
예제 #7
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Instagram_CreateImage(CreateImageArgs args)
        {
            var src = string.Empty;
            var http = new HttpVarious();
            if (!http.GetData(args.Url.Value, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            var mc = Regex.Match(src, "<meta property=\"og:image\" content=\"(?<url>.+)\" ?/>");
            if (!mc.Success)
            {
                args.Errmsg = "Pattern NotFound";
                return false;
            }

            var img = http.GetImage(mc.Groups["url"].Value, args.Url.Key, 0, ref args.Errmsg);
            if (img == null)
            {
                return false;
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return true;
        }
예제 #8
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Tumblr_CreateImage(CreateImageArgs args)
        {
            var    http      = new HttpVarious();
            string targetUrl = args.Url.Value;
            string tmp       = http.GetRedirectTo(targetUrl);

            while (!targetUrl.Equals(tmp))
            {
                targetUrl = tmp;
                tmp       = http.GetRedirectTo(targetUrl);
            }

            Match  mc     = Regex.Match(targetUrl, "(?<base>http://.+?\\.tumblr\\.com/)post/(?<postID>[0-9]+)(/(?<subject>.+?)/)?", RegexOptions.IgnoreCase);
            string apiurl = mc.Groups["base"].Value + "api/read?id=" + mc.Groups["postID"].Value;
            string src    = string.Empty;

            if (!http.GetData(apiurl, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            string imgurl;

            try
            {
                var xdoc = new XmlDocument();
                xdoc.LoadXml(src);
                string type = xdoc.SelectSingleNode("/tumblr/posts/post").Attributes["type"].Value;
                if (type == "photo")
                {
                    imgurl = xdoc.SelectSingleNode("/tumblr/posts/post/photo-url").InnerText;
                }
                else
                {
                    args.Errmsg = "PostType:" + type;
                    imgurl      = string.Empty;
                }
            }
            catch (Exception)
            {
                imgurl = string.Empty;
            }

            if (!string.IsNullOrEmpty(imgurl))
            {
                Image img = http.GetImage(imgurl, args.Url.Key, 0, ref args.Errmsg);
                if (img == null)
                {
                    return(false);
                }

                args.AddTooltipInfo(args.Url.Key, string.Empty, img);
                return(true);
            }

            return(false);
        }
예제 #9
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Tumblr_CreateImage(CreateImageArgs args)
        {
            var http = new HttpVarious();
            string targetUrl = args.Url.Value;
            string tmp = http.GetRedirectTo(targetUrl);
            while (!targetUrl.Equals(tmp))
            {
                targetUrl = tmp;
                tmp = http.GetRedirectTo(targetUrl);
            }

            Match mc = Regex.Match(targetUrl, "(?<base>http://.+?\\.tumblr\\.com/)post/(?<postID>[0-9]+)(/(?<subject>.+?)/)?", RegexOptions.IgnoreCase);
            string apiurl = mc.Groups["base"].Value + "api/read?id=" + mc.Groups["postID"].Value;
            string src = string.Empty;
            if (!http.GetData(apiurl, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            string imgurl;
            try
            {
                var xdoc = new XmlDocument();
                xdoc.LoadXml(src);
                string type = xdoc.SelectSingleNode("/tumblr/posts/post").Attributes["type"].Value;
                if (type == "photo")
                {
                    imgurl = xdoc.SelectSingleNode("/tumblr/posts/post/photo-url").InnerText;
                }
                else
                {
                    args.Errmsg = "PostType:" + type;
                    imgurl = string.Empty;
                }
            }
            catch (Exception)
            {
                imgurl = string.Empty;
            }

            if (!string.IsNullOrEmpty(imgurl))
            {
                Image img = http.GetImage(imgurl, args.Url.Key, 0, ref args.Errmsg);
                if (img == null)
                {
                    return false;
                }

                args.AddTooltipInfo(args.Url.Key, string.Empty, img);
                return true;
            }

            return false;
        }
예제 #10
0
파일: bing.cs 프로젝트: t-ashula/hoehoe2
        public bool Translate(string from, string to, string text, ref string buf)
        {
            var    http    = new HttpVarious();
            string apiurl  = TranslateUri + "&text=" + HttpUtility.UrlEncode(text) + "&to=" + to;
            string content = string.Empty;

            if (http.GetData(apiurl, null, ref content))
            {
                buf = string.Copy(content);
                return(true);
            }

            return(false);
        }
예제 #11
0
        public bool Translate(string srclng, string dstlng, string source, ref string destination, out string errorMessage)
        {
            errorMessage = string.Empty;
            if (string.IsNullOrEmpty(srclng) || string.IsNullOrEmpty(dstlng))
            {
                return(false);
            }

            var headers = new Dictionary <string, string>
            {
                { "v", "1.0" },
                { "User-Agent", MyCommon.GetUserAgentString() },
                { "langpair", string.Format("{0}|{1}", srclng, dstlng) },
                { "q", source }
            };

            var content = string.Empty;
            var http    = new HttpVarious();

            if (!http.GetData(TranslateEndPoint, headers, ref content))
            {
                return(false);
            }

            TranslateResponse res;

            try
            {
                res = D.CreateDataFromJson <TranslateResponse>(content);
            }
            catch (Exception)
            {
                errorMessage = "Err:Invalid JSON";
                return(false);
            }

            if (res.ResponseData == null)
            {
                errorMessage = "Err:" + res.ResponseDetails;
                return(false);
            }

            var body = res.ResponseData.TranslatedText;
            var buf  = HttpUtility.UrlDecode(body);

            destination = string.Copy(buf);
            return(true);
        }
예제 #12
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Photozou_CreateImage(CreateImageArgs args)
        {
            var mc = Regex.Match(args.Url.Value, "^http://photozou\\.jp/photo/show/(?<userId>[0-9]+)/(?<photoId>[0-9]+)", RegexOptions.IgnoreCase);

            if (!mc.Success)
            {
                return(false);
            }

            string src    = string.Empty;
            string apiUrl = mc.Result("http://api.photozou.jp/rest/photo_info?photo_id=${photoId}");
            var    http   = new HttpVarious();

            if (!http.GetData(apiUrl, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            string thumbnailUrl;

            try
            {
                var xdoc = new XmlDocument();
                xdoc.LoadXml(src);
                thumbnailUrl = xdoc.SelectSingleNode("/rsp/info/photo/thumbnail_image_url").InnerText;
            }
            catch (Exception ex)
            {
                args.Errmsg  = ex.Message;
                thumbnailUrl = string.Empty;
            }

            if (string.IsNullOrEmpty(thumbnailUrl))
            {
                return(false);
            }

            Image img = http.GetImage(thumbnailUrl, args.Url.Key);

            if (img == null)
            {
                return(false);
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return(true);
        }
예제 #13
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Photozou_CreateImage(CreateImageArgs args)
        {
            var mc = Regex.Match(args.Url.Value, "^http://photozou\\.jp/photo/show/(?<userId>[0-9]+)/(?<photoId>[0-9]+)", RegexOptions.IgnoreCase);
            if (!mc.Success)
            {
                return false;
            }

            string src = string.Empty;
            string apiUrl = mc.Result("http://api.photozou.jp/rest/photo_info?photo_id=${photoId}");
            var http = new HttpVarious();
            if (!http.GetData(apiUrl, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            string thumbnailUrl;
            try
            {
                var xdoc = new XmlDocument();
                xdoc.LoadXml(src);
                thumbnailUrl = xdoc.SelectSingleNode("/rsp/info/photo/thumbnail_image_url").InnerText;
            }
            catch (Exception ex)
            {
                args.Errmsg = ex.Message;
                thumbnailUrl = string.Empty;
            }

            if (string.IsNullOrEmpty(thumbnailUrl))
            {
                return false;
            }

            Image img = http.GetImage(thumbnailUrl, args.Url.Key);
            if (img == null)
            {
                return false;
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return true;
        }
예제 #14
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Pixiv_CreateImage(CreateImageArgs args)
        {
            var url     = new Uri(args.Url.Value);
            var queries = HttpUtility.ParseQueryString(url.Query);

            if (!string.IsNullOrEmpty(queries["tag"]) && queries["tag"].StartsWith("R-18"))
            {
                args.Errmsg = "NotSupported";
                return(false);
            }

            //var mc = Regex.Match(args.Url.Value, "^http://www\\.pixiv\\.net/(member_illust|index)\\.php\\?mode=(medium|big)&(amp;)?illust_id=(?<illustId>[0-9]+)(&(amp;)?tag=(?<tag>.+)?)*$", RegexOptions.IgnoreCase);

            var    http = new HttpVarious();
            string src  = string.Empty;

            if (!http.GetData(Regex.Replace(args.Url.Value, "amp;", string.Empty), null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            // illustIDをキャプチャ
            var illustId = queries["illust_id"];
            var mc2      = Regex.Match(src, string.Format(@"http://i(mg)?([0-9]+)\.pixiv\.net/.+/img/.+/{0}_[ms]\.([a-zA-Z]+)", illustId));

            if (!mc2.Success)
            {
                args.Errmsg = Regex.Match(src, "<span class='error'>ログインしてください</span>").Success ? "NotSupported" : "Pattern NotFound";
                return(false);
            }

            var img = http.GetImage(mc2.Value, args.Url.Value, 0, ref args.Errmsg);

            if (img == null)
            {
                return(false);
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return(true);
        }
예제 #15
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Piapro_CreateImage(CreateImageArgs args)
        {
            var mc = Regex.Match(args.Url.Value, "^http://piapro\\.jp/(?:content/[0-9a-z]+|t/[0-9a-zA-Z_\\-]+)$");

            if (!mc.Success)
            {
                return(false);
            }

            string src  = string.Empty;
            var    http = new HttpVarious();

            if (!http.GetData(args.Url.Key, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            Match mc2 = Regex.Match(src, "<meta property=\"og:image\" content=\"(?<big_img>http://c1\\.piapro\\.jp/timg/[0-9a-z]+_\\d{14}_0500_0500\\.(?:jpg|png|gif)?)\" />");

            if (!mc2.Success)
            {
                args.Errmsg = "Pattern NotFound";
                return(false);
            }

            // 各画像には120x120のサムネイルがある(多分)ので、URLを置き換える。元々ページに埋め込まれている画像は500x500
            var    r         = new Regex("_\\d{4}_\\d{4}");
            string minImgUrl = r.Replace(mc2.Groups["big_img"].Value, "_0120_0120");
            Image  img       = http.GetImage(minImgUrl, args.Url.Key, 0, ref args.Errmsg);

            if (img == null)
            {
                return(false);
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return(true);
        }
예제 #16
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Pixiv_CreateImage(CreateImageArgs args)
        {
            var url = new Uri(args.Url.Value);
            var queries = HttpUtility.ParseQueryString(url.Query);
            if (!string.IsNullOrEmpty(queries["tag"]) && queries["tag"].StartsWith("R-18"))
            {
                args.Errmsg = "NotSupported";
                return false;
            }

            //var mc = Regex.Match(args.Url.Value, "^http://www\\.pixiv\\.net/(member_illust|index)\\.php\\?mode=(medium|big)&(amp;)?illust_id=(?<illustId>[0-9]+)(&(amp;)?tag=(?<tag>.+)?)*$", RegexOptions.IgnoreCase);

            var http = new HttpVarious();
            string src = string.Empty;
            if (!http.GetData(Regex.Replace(args.Url.Value, "amp;", string.Empty), null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            // illustIDをキャプチャ
            var illustId = queries["illust_id"];
            var mc2 = Regex.Match(src, string.Format(@"http://i(mg)?([0-9]+)\.pixiv\.net/.+/img/.+/{0}_[ms]\.([a-zA-Z]+)", illustId));
            if (!mc2.Success)
            {
                args.Errmsg = Regex.Match(src, "<span class='error'>ログインしてください</span>").Success ? "NotSupported" : "Pattern NotFound";
                return false;
            }

            var img = http.GetImage(mc2.Value, args.Url.Value, 0, ref args.Errmsg);
            if (img == null)
            {
                return false;
            }

            args.AddTooltipInfo(args.Url.Key, string.Empty, img);
            return true;
        }
예제 #17
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Flickr_CreateImage(CreateImageArgs args)
        {
            /*
             *
             * // 参考: http://tanarky.blogspot.com/2010/03/flickr-urlunavailable.html アグレッシブエンジニア: flickr の画像URL仕様についてまとめ(Unavailable画像)
             * // 画像URL仕様 http://farm{farm}.static.flickr.com/{server}/{id}_{secret}_{size}.{extension}
             * // photostreamなど複数の画像がある場合先頭の一つのみ認識と言うことにする
             * // (二つ目のキャプチャ 一つ目の画像はユーザーアイコン)
             */
            string src  = string.Empty;
            var    http = new HttpVarious();

            if (!http.GetData(args.Url.Value, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            var mc  = Regex.Match(args.Url.Value, "^http://www.flickr.com/", RegexOptions.IgnoreCase);
            var mc2 = Regex.Matches(src, mc.Result("http://farm[0-9]+\\.staticflickr\\.com/[0-9]+/.+?\\.([a-zA-Z]+)"));

            // 二つ以上キャプチャした場合先頭の一つだけ 一つだけの場合はユーザーアイコンしか取れなかった
            if (mc2.Count > 1)
            {
                var img = http.GetImage(mc2[1].Value, args.Url.Value, 0, ref args.Errmsg);
                if (img == null)
                {
                    return(false);
                }

                args.AddTooltipInfo(args.Url.Key, string.Empty, img);
                return(true);
            }

            args.Errmsg = "Pattern NotFound";
            return(false);
        }
예제 #18
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Vimeo_CreateImage(CreateImageArgs args)
        {
            var    http   = new HttpVarious();
            Match  mc     = Regex.Match(args.Url.Value, "http://vimeo\\.com/(?<postID>[0-9]+)", RegexOptions.IgnoreCase);
            string apiurl = "http://vimeo.com/api/v2/video/" + mc.Groups["postID"].Value + ".xml";
            string src    = string.Empty;

            if (!http.GetData(apiurl, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            var    sb     = new StringBuilder();
            string imgurl = null;

            try
            {
                var xdoc = new XmlDocument();
                xdoc.LoadXml(src);
                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/title").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        sb.Append(R.VimeoInfoText1);
                        sb.Append(tmp);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    DateTime tmpdate;
                    if (DateTime.TryParse(xdoc.SelectSingleNode("videos/video/upload_date").InnerText, out tmpdate))
                    {
                        sb.Append(R.VimeoInfoText2);
                        sb.Append(tmpdate);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_likes").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        sb.Append(R.VimeoInfoText3);
                        sb.Append(tmp);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_plays").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        sb.Append(R.VimeoInfoText4);
                        sb.Append(tmp);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_comments").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        sb.Append(R.VimeoInfoText5);
                        sb.Append(tmp);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    int sec;
                    if (int.TryParse(xdoc.SelectSingleNode("videos/video/duration").InnerText, out sec))
                    {
                        sb.Append(R.VimeoInfoText6);
                        sb.AppendFormat("{0:d}:{1:d2}", sec / 60, sec % 60);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/thumbnail_medium").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        imgurl = tmp;
                    }
                }
                catch (Exception)
                {
                }
            }
            catch (Exception)
            {
                imgurl = string.Empty;
            }

            if (string.IsNullOrEmpty(imgurl))
            {
                return(false);
            }

            Image img = http.GetImage(imgurl, args.Url.Key, 0, ref args.Errmsg);

            if (img == null)
            {
                return(false);
            }

            args.AddTooltipInfo(args.Url.Key, sb.ToString().Trim(), img);
            return(true);
        }
예제 #19
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Tinami_CreateImage(CreateImageArgs args)
        {
            var mc = Regex.Match(args.Url.Value, "^http://www\\.tinami\\.com/view/(?<ContentId>\\d+)$", RegexOptions.IgnoreCase);

            if (!mc.Success)
            {
                return(false);
            }

            var          src         = string.Empty;
            const string apiKey      = "4e353d9113dce";        // TODO: TINAMI API Key
            var          contentInfo = mc.Result("http://api.tinami.com/content/info?api_key=" + apiKey + "&cont_id=${ContentId}");
            var          http        = new HttpVarious();

            if (!http.GetData(contentInfo, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return(false);
            }

            var xdoc = new XmlDocument();

            try
            {
                xdoc.LoadXml(src);
                var stat = xdoc.SelectSingleNode("/rsp").Attributes.GetNamedItem("stat").InnerText;
                if (stat != "ok")
                {
                    args.Errmsg = xdoc.SelectSingleNode("/rsp/err") != null?
                                  xdoc.SelectSingleNode("/rsp/err").Attributes.GetNamedItem("msg").InnerText:
                                  "DeletedOrSuspended";

                    return(false);
                }

                if (xdoc.SelectSingleNode("/rsp/content/thumbnails/thumbnail_150x150") != null)
                {
                    var nd           = xdoc.SelectSingleNode("/rsp/content/thumbnails/thumbnail_150x150");
                    var thumbnailUrl = nd.Attributes.GetNamedItem("url").InnerText;
                    if (string.IsNullOrEmpty(thumbnailUrl))
                    {
                        return(false);
                    }

                    var img = http.GetImage(thumbnailUrl, args.Url.Key);
                    if (img == null)
                    {
                        return(false);
                    }

                    args.AddTooltipInfo(args.Url.Key, string.Empty, img);
                    return(true);
                }

                // エラー処理 エラーメッセージが返ってきた場合はここで処理
                if (xdoc.SelectSingleNode("/rsp/err") != null)
                {
                    args.Errmsg = xdoc.SelectSingleNode("/rsp/err").Attributes.GetNamedItem("msg").InnerText;
                }

                return(false);
            }
            catch (Exception ex)
            {
                args.Errmsg = ex.Message;
                return(false);
            }
        }
예제 #20
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Tinami_CreateImage(CreateImageArgs args)
        {
            var mc = Regex.Match(args.Url.Value, "^http://www\\.tinami\\.com/view/(?<ContentId>\\d+)$", RegexOptions.IgnoreCase);
            if (!mc.Success)
            {
                return false;
            }

            var src = string.Empty;
            const string apiKey = "4e353d9113dce";             // TODO: TINAMI API Key
            var contentInfo = mc.Result("http://api.tinami.com/content/info?api_key=" + apiKey + "&cont_id=${ContentId}");
            var http = new HttpVarious();
            if (!http.GetData(contentInfo, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            var xdoc = new XmlDocument();
            try
            {
                xdoc.LoadXml(src);
                var stat = xdoc.SelectSingleNode("/rsp").Attributes.GetNamedItem("stat").InnerText;
                if (stat != "ok")
                {
                    args.Errmsg = xdoc.SelectSingleNode("/rsp/err") != null ?
                        xdoc.SelectSingleNode("/rsp/err").Attributes.GetNamedItem("msg").InnerText :
                        "DeletedOrSuspended";
                    return false;
                }

                if (xdoc.SelectSingleNode("/rsp/content/thumbnails/thumbnail_150x150") != null)
                {
                    var nd = xdoc.SelectSingleNode("/rsp/content/thumbnails/thumbnail_150x150");
                    var thumbnailUrl = nd.Attributes.GetNamedItem("url").InnerText;
                    if (string.IsNullOrEmpty(thumbnailUrl))
                    {
                        return false;
                    }

                    var img = http.GetImage(thumbnailUrl, args.Url.Key);
                    if (img == null)
                    {
                        return false;
                    }

                    args.AddTooltipInfo(args.Url.Key, string.Empty, img);
                    return true;
                }

                // エラー処理 エラーメッセージが返ってきた場合はここで処理
                if (xdoc.SelectSingleNode("/rsp/err") != null)
                {
                    args.Errmsg = xdoc.SelectSingleNode("/rsp/err").Attributes.GetNamedItem("msg").InnerText;
                }

                return false;
            }
            catch (Exception ex)
            {
                args.Errmsg = ex.Message;
                return false;
            }
        }
예제 #21
0
파일: Google.cs 프로젝트: t-ashula/hoehoe2
        public bool Translate(string srclng, string dstlng, string source, ref string destination, out string errorMessage)
        {
            errorMessage = string.Empty;
            if (string.IsNullOrEmpty(srclng) || string.IsNullOrEmpty(dstlng))
            {
                return false;
            }

            var headers = new Dictionary<string, string>
                {
                    { "v", "1.0" },
                    { "User-Agent", MyCommon.GetUserAgentString()},
                    { "langpair", string.Format("{0}|{1}", srclng, dstlng) },
                    { "q", source }
                };

            var content = string.Empty;
            var http = new HttpVarious();
            if (!http.GetData(TranslateEndPoint, headers, ref content))
            {
                return false;
            }

            TranslateResponse res;
            try
            {
                res = D.CreateDataFromJson<TranslateResponse>(content);
            }
            catch (Exception)
            {
                errorMessage = "Err:Invalid JSON";
                return false;
            }

            if (res.ResponseData == null)
            {
                errorMessage = "Err:" + res.ResponseDetails;
                return false;
            }

            var body = res.ResponseData.TranslatedText;
            var buf = HttpUtility.UrlDecode(body);
            destination = string.Copy(buf);
            return true;
        }
예제 #22
0
        /// <summary>
        /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート
        /// </summary>
        /// <param name="args">Class CreateImageArgs
        ///                                 url As KeyValuePair(Of String, String)                  元URLとサムネイルURLのKeyValuePair
        ///                                 pics As List(Of KeyValuePair(Of String, Image))         元URLとサムネイル画像のKeyValuePair
        ///                                 tooltiptext As List(Of KeyValuePair(Of String, String)) 元URLとツールチップテキストのKeyValuePair
        ///                                 errmsg As String                                        取得に失敗した際のエラーメッセージ
        /// </param>
        /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse
        /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns>
        /// <remarks></remarks>
        private static bool Vimeo_CreateImage(CreateImageArgs args)
        {
            var http = new HttpVarious();
            Match mc = Regex.Match(args.Url.Value, "http://vimeo\\.com/(?<postID>[0-9]+)", RegexOptions.IgnoreCase);
            string apiurl = "http://vimeo.com/api/v2/video/" + mc.Groups["postID"].Value + ".xml";
            string src = string.Empty;
            if (!http.GetData(apiurl, null, ref src, 0, ref args.Errmsg, string.Empty))
            {
                return false;
            }

            var sb = new StringBuilder();
            string imgurl = null;
            try
            {
                var xdoc = new XmlDocument();
                xdoc.LoadXml(src);
                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/title").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        sb.Append(R.VimeoInfoText1);
                        sb.Append(tmp);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    DateTime tmpdate;
                    if (DateTime.TryParse(xdoc.SelectSingleNode("videos/video/upload_date").InnerText, out tmpdate))
                    {
                        sb.Append(R.VimeoInfoText2);
                        sb.Append(tmpdate);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_likes").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        sb.Append(R.VimeoInfoText3);
                        sb.Append(tmp);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_plays").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        sb.Append(R.VimeoInfoText4);
                        sb.Append(tmp);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_comments").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        sb.Append(R.VimeoInfoText5);
                        sb.Append(tmp);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    int sec;
                    if (int.TryParse(xdoc.SelectSingleNode("videos/video/duration").InnerText, out sec))
                    {
                        sb.Append(R.VimeoInfoText6);
                        sb.AppendFormat("{0:d}:{1:d2}", sec / 60, sec % 60);
                        sb.AppendLine();
                    }
                }
                catch (Exception)
                {
                }

                try
                {
                    string tmp = xdoc.SelectSingleNode("videos/video/thumbnail_medium").InnerText;
                    if (!string.IsNullOrEmpty(tmp))
                    {
                        imgurl = tmp;
                    }
                }
                catch (Exception)
                {
                }
            }
            catch (Exception)
            {
                imgurl = string.Empty;
            }

            if (string.IsNullOrEmpty(imgurl))
            {
                return false;
            }

            Image img = http.GetImage(imgurl, args.Url.Key, 0, ref args.Errmsg);
            if (img == null)
            {
                return false;
            }

            args.AddTooltipInfo(args.Url.Key, sb.ToString().Trim(), img);
            return true;
        }
예제 #23
0
파일: bing.cs 프로젝트: t-ashula/hoehoe2
        public bool Translate(string from, string to, string text, ref string buf)
        {
            var http = new HttpVarious();
            string apiurl = TranslateUri + "&text=" + HttpUtility.UrlEncode(text) + "&to=" + to;
            string content = string.Empty;
            if (http.GetData(apiurl, null, ref content))
            {
                buf = string.Copy(content);
                return true;
            }

            return false;
        }
예제 #24
0
파일: Google.cs 프로젝트: t-ashula/hoehoe2
        public string LanguageDetect(string source)
        {
            var http = new HttpVarious();
            var headers = new Dictionary<string, string>
                {
                    { "User-Agent", MyCommon.GetUserAgentString() },
                    { "v", "1.0" },
                    { "q", source }
                };
            var content = string.Empty;
            if (!http.GetData(LanguageDetectEndPoint, headers, ref content))
            {
                return string.Empty;
            }

            try
            {
                var res = D.CreateDataFromJson<LanguageDetectResponse>(content);
                return res.ResponseData.Language;
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }