/// <summary> /// BackgroundWorkerから呼び出されるサムネイル画像作成デリゲート /// </summary> /// <param name="args">class CreateImageArgs /// KeyValuePair<string, string> url 元URLとサムネイルURLのKeyValuePair /// List<KeyValuePair<string, Image>> pics 元URLとサムネイル画像のKeyValuePair /// List<KeyValuePair<string, string>> tooltiptext 元URLとツールチップテキストのKeyValuePair /// string errmsg 取得に失敗した際のエラーメッセージ /// </param> /// <returns>サムネイル画像作成に成功した場合はTrue,失敗した場合はFalse /// なお失敗した場合はargs.errmsgにエラーを表す文字列がセットされる</returns> /// <remarks></remarks> private bool Tumblr_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var TargetUrl = args.url.Value; var tmp = http.GetRedirectTo(TargetUrl); while (!TargetUrl.Equals(tmp)) { TargetUrl = tmp; tmp = http.GetRedirectTo(TargetUrl); } var mc = Regex.Match(TargetUrl, @"(?<base>http://.+?\.tumblr\.com/)post/(?<postID>[0-9]+)(/(?<subject>.+?)/)?", RegexOptions.IgnoreCase); var apiurl = mc.Groups["base"].Value + "api/read?id=" + mc.Groups["postID"].Value; var src = ""; string imgurl = null; if (http.GetData(apiurl, null, out src, 0, out args.errmsg, "")) { var xdoc = new XmlDocument(); try { xdoc.LoadXml(src); var 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 = ""; } } catch(Exception) { imgurl = ""; } if (!string.IsNullOrEmpty(imgurl)) { var _img = http.GetImage(imgurl, args.url.Key, 0, out args.errmsg); if (_img == null) return false; args.pics.Add(new KeyValuePair<string, Image>(args.url.Key, _img)); args.tooltipText.Add(new KeyValuePair<string, string>(args.url.Key, "")); return true; } } return false; }
public static string ResolveMedia(string orgData, bool tcoResolve) { if (!_isresolve) return orgData; lock (_lockObj) { if (urlCache.Count > 500) urlCache.Clear(); //定期的にリセット } Match m = Regex.Match(orgData, "(?<svc>https?://.+?/)(?<path>[^\"]+)?", RegexOptions.IgnoreCase); if (m.Success) { string orgUrl = m.Result("${svc}"); string orgUrlPath = m.Result("${path}"); if (Array.IndexOf(_ShortUrlService, 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]); } else { try { //urlとして生成できない場合があるらしい //string urlstr = new Uri(urlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path); string retUrlStr = ""; string tmpurlStr = new Uri(MyCommon.urlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path); HttpVarious httpVar = new HttpVarious(); retUrlStr = MyCommon.urlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr)); if (retUrlStr.StartsWith("http")) { retUrlStr = retUrlStr.Replace("\"", "%22"); //ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード 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(); //定期的にリセット } } Match m = Regex.Match(orgData, "(?<svc>https?://.+?/)(?<path>[^\"]+)?", RegexOptions.IgnoreCase); if (m.Success) { string orgUrl = m.Result("${svc}"); string orgUrlPath = m.Result("${path}"); if ((_isForceResolve || Array.IndexOf(_ShortUrlService, 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])); } else { try { //urlとして生成できない場合があるらしい //string urlstr = new Uri(urlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path); string retUrlStr = ""; string tmpurlStr = new Uri(MyCommon.urlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path); HttpVarious httpVar = new HttpVarious(); retUrlStr = MyCommon.urlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr)); if (retUrlStr.StartsWith("http")) { retUrlStr = retUrlStr.Replace("\"", "%22"); //ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード 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(); //定期的にリセット } } List<string> urlList = new List<string>(); MatchCollection m = Regex.Matches(orgData, "<a href=\"(?<svc>http://.+?/)(?<path>[^\"]+)?\"", RegexOptions.IgnoreCase); foreach (Match orgUrlMatch in m) { string orgUrl = orgUrlMatch.Result("${svc}"); string orgUrlPath = orgUrlMatch.Result("${path}"); if (Array.IndexOf(_ShortUrlService, 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として生成できない場合があるらしい //string urlstr = new Uri(urlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path); string retUrlStr = ""; string tmpurlStr = new Uri(MyCommon.urlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path); HttpVarious httpVar = new HttpVarious(); retUrlStr = MyCommon.urlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr)); if (retUrlStr.StartsWith("http")) { retUrlStr = retUrlStr.Replace("\"", "%22"); //ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード 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 Resolve(string orgData, bool tcoResolve) { if (!_isresolve) { return(orgData); } lock (_lockObj) { if (urlCache.Count > 500) { urlCache.Clear(); //定期的にリセット } } List <string> urlList = new List <string>(); MatchCollection m = Regex.Matches(orgData, "<a href=\"(?<svc>http://.+?/)(?<path>[^\"]+)?\"", RegexOptions.IgnoreCase); foreach (Match orgUrlMatch in m) { string orgUrl = orgUrlMatch.Result("${svc}"); string orgUrlPath = orgUrlMatch.Result("${path}"); if ((_isForceResolve || Array.IndexOf(_ShortUrlService, 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として生成できない場合があるらしい //string urlstr = new Uri(urlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path); string retUrlStr = ""; string tmpurlStr = new Uri(MyCommon.urlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path); HttpVarious httpVar = new HttpVarious(); retUrlStr = MyCommon.urlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr)); if (retUrlStr.StartsWith("http")) { retUrlStr = retUrlStr.Replace("\"", "%22"); //ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード orgData = orgData.Replace("<a href=\"" + tmpurlStr, "<a href=\"" + retUrlStr); lock (_lockObj) { if (!urlCache.ContainsKey(orgUrl)) { urlCache.Add(orgUrl, retUrlStr); } } } } catch (Exception) { //Through } } } return(orgData); }