示例#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 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);
        }
示例#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 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;
        }
示例#3
0
        public static string Resolve(string orgData, bool tcoResolve)
        {
            if (!isResolve)
            {
                return(orgData);
            }

            lock (LockObj)
            {
                if (UrlCache.Count > 500)
                {
                    // 定期的にリセット
                    UrlCache.Clear();
                }
            }

            var urlList = new List <string>();
            var m       = Regex.Matches(orgData, "<a href=\"(?<svc>http://.+?/)(?<path>[^\"]+)?\"", RegexOptions.IgnoreCase);

            foreach (Match orgUrlMatch in m)
            {
                var orgUrl     = orgUrlMatch.Result("${svc}");
                var orgUrlPath = orgUrlMatch.Result("${path}");
                if ((isForceResolve || Array.IndexOf(ShortUrlServices, orgUrl) > -1) &&
                    !urlList.Contains(orgUrl + orgUrlPath) && orgUrl != "http://twitter.com/")
                {
                    if (!tcoResolve && (orgUrl == "http://t.co/" || orgUrl == "https://t.co"))
                    {
                        continue;
                    }

                    lock (LockObj)
                    {
                        urlList.Add(orgUrl + orgUrlPath);
                    }
                }
            }

            foreach (string orgUrl in urlList)
            {
                if (UrlCache.ContainsKey(orgUrl))
                {
                    try
                    {
                        orgData = orgData.Replace("<a href=\"" + orgUrl + "\"", "<a href=\"" + UrlCache[orgUrl] + "\"");
                    }
                    catch (Exception)
                    {
                        // Through
                    }
                }
                else
                {
                    try
                    {
                        // urlとして生成できない場合があるらしい
                        var tmpurlStr = new Uri(MyCommon.GetUrlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path);
                        var httpVar   = new HttpVarious();
                        var retUrlStr = MyCommon.GetUrlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr));
                        if (retUrlStr.StartsWith("http"))
                        {
                            // ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード
                            retUrlStr = retUrlStr.Replace("\"", "%22");
                            orgData   = orgData.Replace("<a href=\"" + tmpurlStr, "<a href=\"" + retUrlStr);
                            lock (LockObj)
                            {
                                if (!UrlCache.ContainsKey(orgUrl))
                                {
                                    UrlCache.Add(orgUrl, retUrlStr);
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        // Through
                    }
                }
            }

            return(orgData);
        }
示例#4
0
        public static string ResolveMedia(string orgData, bool tcoResolve)
        {
            if (!isResolve)
            {
                return(orgData);
            }

            lock (LockObj)
            {
                if (UrlCache.Count > 500)
                {
                    // 定期的にリセット
                    UrlCache.Clear();
                }
            }

            var m = Regex.Match(orgData, "(?<svc>https?://.+?/)(?<path>[^\"]+)?", RegexOptions.IgnoreCase);

            if (!m.Success)
            {
                return(orgData);
            }

            var orgUrl     = m.Result("${svc}");
            var orgUrlPath = m.Result("${path}");

            if ((isForceResolve || Array.IndexOf(ShortUrlServices, orgUrl) > -1) && orgUrl != "http://twitter.com/")
            {
                if (!tcoResolve && (orgUrl == "http://t.co/" || orgUrl == "https://t.co/"))
                {
                    return(orgData);
                }

                orgUrl += orgUrlPath;
                if (UrlCache.ContainsKey(orgUrl))
                {
                    return(orgData.Replace(orgUrl, UrlCache[orgUrl]));
                }

                try
                {
                    // urlとして生成できない場合があるらしい
                    var tmpurlStr = new Uri(MyCommon.GetUrlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path);
                    var httpVar   = new HttpVarious();
                    var retUrlStr = MyCommon.GetUrlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr));
                    if (retUrlStr.StartsWith("http"))
                    {
                        // ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード
                        retUrlStr = retUrlStr.Replace("\"", "%22");
                        lock (LockObj)
                        {
                            if (!UrlCache.ContainsKey(orgUrl))
                            {
                                UrlCache.Add(orgUrl, orgData.Replace(tmpurlStr, retUrlStr));
                            }
                        }

                        return(orgData.Replace(tmpurlStr, retUrlStr));
                    }
                }
                catch (Exception)
                {
                    return(orgData);
                }
            }

            return(orgData);
        }
示例#5
0
        public static string ResolveMedia(string orgData, bool tcoResolve)
        {
            if (!isResolve)
            {
                return orgData;
            }

            lock (LockObj)
            {
                if (UrlCache.Count > 500)
                {
                    // 定期的にリセット
                    UrlCache.Clear();
                }
            }

            var m = Regex.Match(orgData, "(?<svc>https?://.+?/)(?<path>[^\"]+)?", RegexOptions.IgnoreCase);
            if (!m.Success)
            {
                return orgData;
            }

            var orgUrl = m.Result("${svc}");
            var orgUrlPath = m.Result("${path}");
            if ((isForceResolve || Array.IndexOf(ShortUrlServices, orgUrl) > -1) && orgUrl != "http://twitter.com/")
            {
                if (!tcoResolve && (orgUrl == "http://t.co/" || orgUrl == "https://t.co/"))
                {
                    return orgData;
                }

                orgUrl += orgUrlPath;
                if (UrlCache.ContainsKey(orgUrl))
                {
                    return orgData.Replace(orgUrl, UrlCache[orgUrl]);
                }

                try
                {
                    // urlとして生成できない場合があるらしい
                    var tmpurlStr = new Uri(MyCommon.GetUrlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path);
                    var httpVar = new HttpVarious();
                    var retUrlStr = MyCommon.GetUrlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr));
                    if (retUrlStr.StartsWith("http"))
                    {
                        // ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード
                        retUrlStr = retUrlStr.Replace("\"", "%22");
                        lock (LockObj)
                        {
                            if (!UrlCache.ContainsKey(orgUrl))
                            {
                                UrlCache.Add(orgUrl, orgData.Replace(tmpurlStr, retUrlStr));
                            }
                        }

                        return orgData.Replace(tmpurlStr, retUrlStr);
                    }
                }
                catch (Exception)
                {
                    return orgData;
                }
            }

            return orgData;
        }
示例#6
0
        public static string Resolve(string orgData, bool tcoResolve)
        {
            if (!isResolve)
            {
                return orgData;
            }

            lock (LockObj)
            {
                if (UrlCache.Count > 500)
                {
                    // 定期的にリセット
                    UrlCache.Clear();
                }
            }

            var urlList = new List<string>();
            var m = Regex.Matches(orgData, "<a href=\"(?<svc>http://.+?/)(?<path>[^\"]+)?\"", RegexOptions.IgnoreCase);
            foreach (Match orgUrlMatch in m)
            {
                var orgUrl = orgUrlMatch.Result("${svc}");
                var orgUrlPath = orgUrlMatch.Result("${path}");
                if ((isForceResolve || Array.IndexOf(ShortUrlServices, orgUrl) > -1)
                    && !urlList.Contains(orgUrl + orgUrlPath) && orgUrl != "http://twitter.com/")
                {
                    if (!tcoResolve && (orgUrl == "http://t.co/" || orgUrl == "https://t.co"))
                    {
                        continue;
                    }

                    lock (LockObj)
                    {
                        urlList.Add(orgUrl + orgUrlPath);
                    }
                }
            }

            foreach (string orgUrl in urlList)
            {
                if (UrlCache.ContainsKey(orgUrl))
                {
                    try
                    {
                        orgData = orgData.Replace("<a href=\"" + orgUrl + "\"", "<a href=\"" + UrlCache[orgUrl] + "\"");
                    }
                    catch (Exception)
                    {
                        // Through
                    }
                }
                else
                {
                    try
                    {
                        // urlとして生成できない場合があるらしい
                        var tmpurlStr = new Uri(MyCommon.GetUrlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path);
                        var httpVar = new HttpVarious();
                        var retUrlStr = MyCommon.GetUrlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr));
                        if (retUrlStr.StartsWith("http"))
                        {
                            // ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード
                            retUrlStr = retUrlStr.Replace("\"", "%22");
                            orgData = orgData.Replace("<a href=\"" + tmpurlStr, "<a href=\"" + retUrlStr);
                            lock (LockObj)
                            {
                                if (!UrlCache.ContainsKey(orgUrl))
                                {
                                    UrlCache.Add(orgUrl, retUrlStr);
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        // Through
                    }
                }
            }

            return orgData;
        }