/// <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); }
/// <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; }
/// <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); }
/// <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; }
/// <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; }
/// <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; }
/// <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); }
private void GetImage(KeyValuePair <string, Action <Image> > downloadAsyncInfo) { Image callbackImage = null; lock (_lockObject) { if (_innerDictionary[downloadAsyncInfo.Key] != null) { callbackImage = (Image)_innerDictionary[downloadAsyncInfo.Key]; } } if (callbackImage != null) { if (downloadAsyncInfo.Value != null) { downloadAsyncInfo.Value.Invoke(callbackImage); } _netSemaphore.Release(); return; } var hv = new HttpVarious(); Image image = hv.GetImage(downloadAsyncInfo.Key, 10000); lock (_lockObject) { if (_innerDictionary[downloadAsyncInfo.Key] == null) { if (image != null) { _innerDictionary.Add(downloadAsyncInfo.Key, image, _cachePolicy); callbackImage = image; } } else { callbackImage = (Image)_innerDictionary[downloadAsyncInfo.Key]; } } if (downloadAsyncInfo.Value != null) { downloadAsyncInfo.Value.Invoke(callbackImage); } _netSemaphore.Release(); }
/// <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); }
/// <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); }
/// <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); }
/// <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; }
/// <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); }
/// <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); }
/// <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; } }
/// <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); } }
/// <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 Youtube_CreateImage(CreateImageArgs args) { // 参考 // http://code.google.com/intl/ja/apis/youtube/2.0/developers_guide_protocol_video_entries.html // デベロッパー ガイド: Data API プロトコル - 単独の動画情報の取得 - YouTube の API とツール - Google Code // http://code.google.com/intl/ja/apis/youtube/2.0/developers_guide_protocol_understanding_video_feeds.html#Understanding_Feeds_and_Entries // デベロッパー ガイド: Data API プロトコル - 動画のフィードとエントリについて - YouTube の API とツール - Google Code Match mcimg = Regex.Match(args.Url.Value, "^http://(?:(www\\.youtube\\.com)|(youtu\\.be))/(watch\\?v=)?(?<videoid>([\\w\\-]+))", RegexOptions.IgnoreCase); if (!mcimg.Success) { return(false); } string imgurl = mcimg.Result("http://i.ytimg.com/vi/${videoid}/default.jpg"); if (string.IsNullOrEmpty(imgurl)) { return(false); } string videourl = (new HttpVarious()).GetRedirectTo(args.Url.Value); var mc = Regex.Match(videourl, "^http://(?:(www\\.youtube\\.com)|(youtu\\.be))/(watch\\?v=)?(?<videoid>([\\w\\-]+))", RegexOptions.IgnoreCase); if (videourl.StartsWith("http://www.youtube.com/index?ytsession=")) { videourl = args.Url.Value; mc = Regex.Match(videourl, "^http://(?:(www\\.youtube\\.com)|(youtu\\.be))/(watch\\?v=)?(?<videoid>([\\w\\-]+))", RegexOptions.IgnoreCase); } if (!mc.Success) { return(false); } string apiurl = "http://gdata.youtube.com/feeds/api/videos/" + mc.Groups["videoid"].Value; string src = string.Empty; if (!(new HttpVarious()).GetData(apiurl, null, ref src, 5000)) { return(false); } var sb = new StringBuilder(); try { var xdoc = new XmlDocument(); xdoc.LoadXml(src); var nsmgr = new XmlNamespaceManager(xdoc.NameTable); nsmgr.AddNamespace("root", "http://www.w3.org/2005/Atom"); nsmgr.AddNamespace("app", "http://purl.org/atom/app#"); nsmgr.AddNamespace("media", "http://search.yahoo.com/mrss/"); var xentryNode = xdoc.DocumentElement.SelectSingleNode("/root:entry/media:group", nsmgr); var xentry = (XmlElement)xentryNode; string tmp; try { tmp = xentry["media:title"].InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.AppendLine(R.YouTubeInfoText1 + tmp); } } catch (Exception) { } try { int sec; if (int.TryParse(xentry["yt:duration"].Attributes["seconds"].Value, out sec)) { sb.Append(R.YouTubeInfoText2); sb.Append(string.Format("{0:d}:{1:d2}", sec / 60, sec % 60)); sb.AppendLine(); } } catch (Exception) { } try { DateTime tmpdate; xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry", nsmgr); if (DateTime.TryParse(xentry["published"].InnerText, out tmpdate)) { sb.Append(R.YouTubeInfoText3); sb.Append(tmpdate); sb.AppendLine(); } } catch (Exception) { } try { int count; xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry", nsmgr); tmp = xentry["yt:statistics"].Attributes["viewCount"].Value; if (int.TryParse(tmp, out count)) { sb.Append(R.YouTubeInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry/app:control", nsmgr); if (xentry != null) { sb.AppendLine(string.Format("{0}:{1}", xentry["yt:state"].Attributes["name"].Value, xentry["yt:state"].InnerText)); } } catch (Exception) { } } catch (Exception) { } var http = new HttpVarious(); Image img = http.GetImage(imgurl, videourl, 10000, ref args.Errmsg); if (img == null) { return(false); } args.AddTooltipInfo(args.Url.Key, sb.ToString().Trim(), img); return(true); }
/// <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 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; }
/// <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; }
/// <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 Youtube_CreateImage(CreateImageArgs args) { // 参考 // http://code.google.com/intl/ja/apis/youtube/2.0/developers_guide_protocol_video_entries.html // デベロッパー ガイド: Data API プロトコル - 単独の動画情報の取得 - YouTube の API とツール - Google Code // http://code.google.com/intl/ja/apis/youtube/2.0/developers_guide_protocol_understanding_video_feeds.html#Understanding_Feeds_and_Entries // デベロッパー ガイド: Data API プロトコル - 動画のフィードとエントリについて - YouTube の API とツール - Google Code Match mcimg = Regex.Match(args.Url.Value, "^http://(?:(www\\.youtube\\.com)|(youtu\\.be))/(watch\\?v=)?(?<videoid>([\\w\\-]+))", RegexOptions.IgnoreCase); if (!mcimg.Success) { return false; } string imgurl = mcimg.Result("http://i.ytimg.com/vi/${videoid}/default.jpg"); if (string.IsNullOrEmpty(imgurl)) { return false; } string videourl = (new HttpVarious()).GetRedirectTo(args.Url.Value); var mc = Regex.Match(videourl, "^http://(?:(www\\.youtube\\.com)|(youtu\\.be))/(watch\\?v=)?(?<videoid>([\\w\\-]+))", RegexOptions.IgnoreCase); if (videourl.StartsWith("http://www.youtube.com/index?ytsession=")) { videourl = args.Url.Value; mc = Regex.Match(videourl, "^http://(?:(www\\.youtube\\.com)|(youtu\\.be))/(watch\\?v=)?(?<videoid>([\\w\\-]+))", RegexOptions.IgnoreCase); } if (!mc.Success) { return false; } string apiurl = "http://gdata.youtube.com/feeds/api/videos/" + mc.Groups["videoid"].Value; string src = string.Empty; if (!(new HttpVarious()).GetData(apiurl, null, ref src, 5000)) { return false; } var sb = new StringBuilder(); try { var xdoc = new XmlDocument(); xdoc.LoadXml(src); var nsmgr = new XmlNamespaceManager(xdoc.NameTable); nsmgr.AddNamespace("root", "http://www.w3.org/2005/Atom"); nsmgr.AddNamespace("app", "http://purl.org/atom/app#"); nsmgr.AddNamespace("media", "http://search.yahoo.com/mrss/"); var xentryNode = xdoc.DocumentElement.SelectSingleNode("/root:entry/media:group", nsmgr); var xentry = (XmlElement)xentryNode; string tmp; try { tmp = xentry["media:title"].InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.AppendLine(R.YouTubeInfoText1 + tmp); } } catch (Exception) { } try { int sec; if (int.TryParse(xentry["yt:duration"].Attributes["seconds"].Value, out sec)) { sb.Append(R.YouTubeInfoText2); sb.Append(string.Format("{0:d}:{1:d2}", sec / 60, sec % 60)); sb.AppendLine(); } } catch (Exception) { } try { DateTime tmpdate; xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry", nsmgr); if (DateTime.TryParse(xentry["published"].InnerText, out tmpdate)) { sb.Append(R.YouTubeInfoText3); sb.Append(tmpdate); sb.AppendLine(); } } catch (Exception) { } try { int count; xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry", nsmgr); tmp = xentry["yt:statistics"].Attributes["viewCount"].Value; if (int.TryParse(tmp, out count)) { sb.Append(R.YouTubeInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry/app:control", nsmgr); if (xentry != null) { sb.AppendLine(string.Format("{0}:{1}", xentry["yt:state"].Attributes["name"].Value, xentry["yt:state"].InnerText)); } } catch (Exception) { } } catch (Exception) { } var http = new HttpVarious(); Image img = http.GetImage(imgurl, videourl, 10000, ref args.Errmsg); if (img == null) { return false; } args.AddTooltipInfo(args.Url.Key, sb.ToString().Trim(), img); return true; }