/// <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); }
/// <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; }
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); }
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); }
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; }
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; }