public override ThumbnailInfo GetThumbnailInfo(string url, PostClass post) { var http = new HttpVarious(); var TargetUrl = url; var tmp = http.GetRedirectTo(TargetUrl); while (!TargetUrl.Equals(tmp)) { TargetUrl = tmp; tmp = http.GetRedirectTo(TargetUrl); } var apiUrl = base.ReplaceUrl(url); if (apiUrl == null) return null; var src = ""; string imgurl = null; string errmsg; if (http.GetData(apiUrl, null, out src, 0, out 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 { errmsg = "PostType:" + type; return null; } } catch (Exception) { return null; } return new ThumbnailInfo() { ImageUrl = url, ThumbnailUrl = imgurl, TooltipText = null, }; } return null; }
public override Task<ThumbnailInfo> GetThumbnailInfoAsync(string url, PostClass post, CancellationToken token) { return Task.Run(() => { var match = Tumblr.UrlPatternRegex.Match(url); if (!match.Success) return null; var apiUrl = match.Result("${base}api/read?id=${postID}"); var http = new HttpVarious(); var src = ""; string imgurl = null; string errmsg; if (http.GetData(apiUrl, null, out src, 0, out 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 { errmsg = "PostType:" + type; return null; } } catch (Exception) { return null; } return new ThumbnailInfo { ImageUrl = url, ThumbnailUrl = imgurl, TooltipText = null, }; } return null; }, token); }
public override ThumbnailInfo GetThumbnailInfo(string url, PostClass post) { var apiUrl = base.ReplaceUrl(url); if (apiUrl == null) { return(null); } var http = new HttpVarious(); var src = ""; string imgurl = null; string errmsg; if (http.GetData(apiUrl, null, out src, 0, out 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 { errmsg = "PostType:" + type; return(null); } } catch (Exception) { return(null); } return(new ThumbnailInfo() { ImageUrl = url, ThumbnailUrl = imgurl, TooltipText = null, }); } return(null); }
/// <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 Twimg_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var mc = Regex.Match(args.url.Value, @"^https?://p\.twimg\.com/.*$", RegexOptions.IgnoreCase); if (mc.Success) { var src = ""; var ContentInfo = args.url.Value + ":thumb"; var _img = http.GetImage(ContentInfo, src, 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 false; }
/// <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; }
/// <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 Tinami_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var mc = Regex.Match(args.url.Value, @"^http://www\.tinami\.com/view/(?<ContentId>\d+)$", RegexOptions.IgnoreCase); if (mc.Success) { var src = ""; var ContentInfo = mc.Result("http://api.tinami.com/content/info?api_key=" + ApplicationSettings.TINAMIApiKey + "&cont_id=${ContentId}"); if (http.GetData(ContentInfo, null, out src, 0, out args.errmsg, "")) { var xdoc = new XmlDocument(); var thumbnail_url = ""; try { xdoc.LoadXml(src); var stat = xdoc.SelectSingleNode("/rsp").Attributes.GetNamedItem("stat").InnerText; if (stat == "ok") { if (xdoc.SelectSingleNode("/rsp/content/thumbnails/thumbnail_150x150") != null) { var nd = xdoc.SelectSingleNode("/rsp/content/thumbnails/thumbnail_150x150"); thumbnail_url = nd.Attributes.GetNamedItem("url").InnerText; if (string.IsNullOrEmpty(thumbnail_url)) return false; var _img = http.GetImage(thumbnail_url, args.url.Key); 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; } else { //エラー処理 エラーメッセージが返ってきた場合はここで処理 if (xdoc.SelectSingleNode("/rsp/err") != null) { args.errmsg = xdoc.SelectSingleNode("/rsp/err").Attributes.GetNamedItem("msg").InnerText; } return false; } } else { // TODO rsp stat=failの際のエラーメッセージ返却はAPI拡張待ち(2011/8/2要望済み) // TODO 後日APIレスポンスを確認し修正すること if (xdoc.SelectSingleNode("/rsp/err") != null) { args.errmsg = xdoc.SelectSingleNode("/rsp/err").Attributes.GetNamedItem("msg").InnerText; } else { args.errmsg = "DeletedOrSuspended"; } return false; } } catch(Exception ex) { args.errmsg = ex.Message; return false; } } } return false; }
/// <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 Pixiv_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var src = ""; //illustIDをキャプチャ var mc = Regex.Match(args.url.Value, @"^http://www\.pixiv\.net/(member_illust|index)\.php\?(?=.*mode=(medium|big))(?=.*illust_id=(?<illustId>[0-9]+))(?=.*tag=(?<tag>[^&]+)?)?.*$", RegexOptions.IgnoreCase); if (mc.Groups["tag"].Value == "R-18" || mc.Groups["tag"].Value == "R-18G") { args.errmsg = "NotSupported"; return false; } else { var http = new HttpVarious(); if (http.GetData(Regex.Replace(mc.Groups[0].Value, "amp;", ""), null, out src, 0, out args.errmsg, "")) { var _mc = Regex.Match(src, mc.Result(@"http://i([0-9]+)\.pixiv\.net/.+/${illustId}_[ms]\.([a-zA-Z]+)")); if (_mc.Success) { var _img = http.GetImage(_mc.Value, args.url.Value, 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; } else if (Regex.Match(src, "<span class=//error//>ログインしてください</span>").Success) { args.errmsg = "NotSupported"; } else { args.errmsg = "Pattern NotFound"; } } } return false; }
/// <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 instagram_CreateImage(CreateImageArgs args) { var http = new HttpVarious(); var imgUrl = http.GetRedirectTo(args.url.Value); if (string.IsNullOrEmpty(imgUrl)) return false; var img = http.GetImage(imgUrl, args.url.Key, 10000, out args.errmsg); if (img == null) return false; // 成功した場合はURLに対応する画像、ツールチップテキストを登録 args.pics.Add(new KeyValuePair<string, Image>(args.url.Key, img)); args.tooltipText.Add(new KeyValuePair<string, string>(args.url.Key, "")); return true; }
/// <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 youtube_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します // 参考 // 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 var imgurl = ""; var mcImg = Regex.Match(args.url.Value, @"^http://(?:(www\.youtube\.com)|(youtu\.be))/(watch\?v=)?(?<videoid>([\w\-]+))", RegexOptions.IgnoreCase); if (mcImg.Success) { imgurl = mcImg.Result("http://i.ytimg.com/vi/${videoid}/default.jpg"); } else { return false; } var 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) { var apiurl = "http://gdata.youtube.com/feeds/api/videos/" + mc.Groups["videoid"].Value; var src = ""; if ((new HttpVarious()).GetData(apiurl, null, out src, 5000)) { var sb = new StringBuilder(); var xdoc = new XmlDocument(); try { 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; var tmp = ""; try { tmp = xentry["media:title"].InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.YouTubeInfoText1); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { var sec = 0; if (int.TryParse(xentry["yt:duration"].Attributes["seconds"].Value, out sec)) { sb.Append(Properties.Resources.YouTubeInfoText2); sb.AppendFormat("{0:d}:{1:d2}", sec / 60, sec % 60); sb.AppendLine(); } } catch(Exception) { } try { var tmpdate = new DateTime(); xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry", nsmgr); if (DateTime.TryParse(xentry["published"].InnerText, out tmpdate)) { sb.Append(Properties.Resources.YouTubeInfoText3); sb.Append(tmpdate); sb.AppendLine(); } } catch(Exception) { } try { var count = 0; xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry", nsmgr); tmp = xentry["yt:statistics"].Attributes["viewCount"].Value; if (int.TryParse(tmp, out count)) { sb.Append(Properties.Resources.YouTubeInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { xentry = (XmlElement)xdoc.DocumentElement.SelectSingleNode("/root:entry/app:control", nsmgr); if (xentry != null) { sb.Append(xentry["yt:state"].Attributes["name"].Value); sb.Append(":"); sb.Append(xentry["yt:state"].InnerText); sb.AppendLine(); } } catch(Exception) { } //mc = Regex.Match(videourl, @"^http://www\.youtube\.com/watch\?v=([\w\-]+)", RegexOptions.IgnoreCase) //if (mc.Success) //{ // imgurl = mc.Result("http://i.ytimg.com/vi/${1}/default.jpg"); //} //mc = Regex.Match(videourl, @"^http://youtu\.be/([\w\-]+)", RegexOptions.IgnoreCase) //if (mc.Success) //{ // imgurl = mc.Result("http://i.ytimg.com/vi/${1}/default.jpg"); //} } catch(Exception) { } if (!string.IsNullOrEmpty(imgurl)) { var http = new HttpVarious(); var _img = http.GetImage(imgurl, videourl, 10000, 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, sb.ToString().Trim())); return true; } } } return false; }
/// <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 nicovideo_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var mc = Regex.Match(args.url.Value, @"^http://(?:(www|ext)\.nicovideo\.jp/watch|nico\.ms)/(?<id>(?:sm|nm)?([0-9]+))(\?.+)?$", RegexOptions.IgnoreCase); var apiurl = "http://www.nicovideo.jp/api/getthumbinfo/" + mc.Groups["id"].Value; var src = ""; var imgurl = ""; if ((new HttpVarious()).GetData(apiurl, null, out src, 0, out args.errmsg, MyCommon.GetUserAgentString())) { var sb = new StringBuilder(); var xdoc = new XmlDocument(); try { xdoc.LoadXml(src); var status = xdoc.SelectSingleNode("/nicovideo_thumb_response").Attributes["status"].Value; if (status == "ok") { imgurl = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/thumbnail_url").InnerText; //ツールチップに動画情報をセットする string tmp; try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/title").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText1); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/length").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText2); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { var tm = new DateTime(); tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/first_retrieve").InnerText; if (DateTime.TryParse(tmp, out tm)) { sb.Append(Properties.Resources.NiconicoInfoText3); sb.Append(tm.ToString()); sb.AppendLine(); } } catch(Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/view_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/comment_num").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText5); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/mylist_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText6); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } } else if (status == "fail") { var errcode = xdoc.SelectSingleNode("/nicovideo_thumb_response/error/code").InnerText; args.errmsg = errcode; imgurl = ""; } else { args.errmsg = "UnknownResponse"; imgurl = ""; } } catch(Exception) { imgurl = ""; args.errmsg = "Invalid XML"; } 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, sb.ToString().Trim())); return true; } } return false; }
public override Task<ThumbnailInfo> GetThumbnailInfoAsync(string url, PostClass post, CancellationToken token) { return Task.Run(() => { var match = Nicovideo.UrlPatternRegex.Match(url); if (!match.Success) return null; var apiUrl = "http://www.nicovideo.jp/api/getthumbinfo/" + match.Groups["id"].Value; var http = new HttpVarious(); var src = ""; var imgurl = ""; string errmsg; if (http.GetData(apiUrl, null, out src, 0, out errmsg, Networking.GetUserAgentString())) { var sb = new StringBuilder(); var xdoc = new XmlDocument(); try { xdoc.LoadXml(src); var status = xdoc.SelectSingleNode("/nicovideo_thumb_response").Attributes["status"].Value; if (status == "ok") { imgurl = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/thumbnail_url").InnerText; //ツールチップに動画情報をセットする string tmp; try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/title").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText1); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/length").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText2); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { var tm = new DateTime(); tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/first_retrieve").InnerText; if (DateTime.TryParse(tmp, out tm)) { sb.Append(Properties.Resources.NiconicoInfoText3); sb.Append(tm.ToString()); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/view_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/comment_num").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText5); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/mylist_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText6); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } } else if (status == "fail") { var errcode = xdoc.SelectSingleNode("/nicovideo_thumb_response/error/code").InnerText; errmsg = errcode; imgurl = ""; } else { errmsg = "UnknownResponse"; imgurl = ""; } } catch (Exception) { imgurl = ""; errmsg = "Invalid XML"; } if (!string.IsNullOrEmpty(imgurl)) { return new ThumbnailInfo { ImageUrl = url, ThumbnailUrl = imgurl, TooltipText = sb.ToString().Trim(), IsPlayable = true, }; } } return null; }, token); }
public override Task <ThumbnailInfo> GetThumbnailInfoAsync(string url, PostClass post, CancellationToken token) { return(Task.Run(() => { var match = Nicovideo.UrlPatternRegex.Match(url); if (!match.Success) { return null; } var apiUrl = "http://www.nicovideo.jp/api/getthumbinfo/" + match.Groups["id"].Value; var http = new HttpVarious(); var src = ""; var imgurl = ""; string errmsg; if (http.GetData(apiUrl, null, out src, 0, out errmsg, Networking.GetUserAgentString())) { var sb = new StringBuilder(); var xdoc = new XmlDocument(); try { xdoc.LoadXml(src); var status = xdoc.SelectSingleNode("/nicovideo_thumb_response").Attributes["status"].Value; if (status == "ok") { imgurl = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/thumbnail_url").InnerText; //ツールチップに動画情報をセットする string tmp; try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/title").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText1); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/length").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText2); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { var tm = new DateTime(); tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/first_retrieve").InnerText; if (DateTime.TryParse(tmp, out tm)) { sb.Append(Properties.Resources.NiconicoInfoText3); sb.Append(tm.ToString()); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/view_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/comment_num").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText5); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/mylist_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText6); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } } else if (status == "fail") { var errcode = xdoc.SelectSingleNode("/nicovideo_thumb_response/error/code").InnerText; errmsg = errcode; imgurl = ""; } else { errmsg = "UnknownResponse"; imgurl = ""; } } catch (Exception) { imgurl = ""; errmsg = "Invalid XML"; } if (!string.IsNullOrEmpty(imgurl)) { return new ThumbnailInfo { ImageUrl = url, ThumbnailUrl = imgurl, TooltipText = sb.ToString().Trim() }; } } return null; }, token)); }
public override ThumbnailInfo GetThumbnailInfo(string url, PostClass post) { var apiUrl = base.ReplaceUrl(url); if (apiUrl == null) { return(null); } var http = new HttpVarious(); var src = ""; var imgurl = ""; string errmsg; if ((new HttpVarious()).GetData(apiUrl, null, out src, 0, out errmsg, MyCommon.GetUserAgentString())) { var sb = new StringBuilder(); var xdoc = new XmlDocument(); try { xdoc.LoadXml(src); var status = xdoc.SelectSingleNode("/nicovideo_thumb_response").Attributes["status"].Value; if (status == "ok") { imgurl = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/thumbnail_url").InnerText; //ツールチップに動画情報をセットする string tmp; try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/title").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText1); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/length").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText2); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { var tm = new DateTime(); tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/first_retrieve").InnerText; if (DateTime.TryParse(tmp, out tm)) { sb.Append(Properties.Resources.NiconicoInfoText3); sb.Append(tm.ToString()); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/view_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/comment_num").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText5); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/mylist_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText6); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } } else if (status == "fail") { var errcode = xdoc.SelectSingleNode("/nicovideo_thumb_response/error/code").InnerText; errmsg = errcode; imgurl = ""; } else { errmsg = "UnknownResponse"; imgurl = ""; } } catch (Exception) { imgurl = ""; errmsg = "Invalid XML"; } if (!string.IsNullOrEmpty(imgurl)) { return(new ThumbnailInfo() { ImageUrl = url, ThumbnailUrl = imgurl, TooltipText = sb.ToString().Trim() }); } } return(null); }
/// <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 TwipplePhoto_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var image = new HttpVarious().GetImage(args.url.Value, args.url.Key, 10000, out args.errmsg); if (image == null) return false; // 成功した場合はURLに対応する画像、ツールチップテキストを登録 args.pics.Add(new KeyValuePair<string, Image>(args.url.Key, image)); args.tooltipText.Add(new KeyValuePair<string, string>(args.url.Key, "")); return true; }
/// <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 PathCom_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var src = ""; if (http.GetData(args.url.Key, null, out src, 0, out args.errmsg, "")) { var match = Regex.Match(src, "<meta property=\"og:image\" content=\"(?<img_url>https?://[^\"]+)\" />"); if (match.Success) { var img = http.GetImage(match.Groups["img_url"].Value, 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; } else { args.errmsg = "Pattern NotFound"; } } return false; }
/// <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 Vimeo_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var mc = Regex.Match(args.url.Value, @"http://vimeo\.com/(?<postID>[0-9]+)", RegexOptions.IgnoreCase); var apiurl = "http://vimeo.com/api/v2/video/" + mc.Groups["postID"].Value + ".xml"; var src = ""; string imgurl = null; if (http.GetData(apiurl, null, out src, 0, out args.errmsg, "")) { var xdoc = new XmlDocument(); var sb = new StringBuilder(); try { xdoc.LoadXml(src); try { var tmp = xdoc.SelectSingleNode("videos/video/title").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.VimeoInfoText1); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { var tmpdate = new DateTime(); if (DateTime.TryParse(xdoc.SelectSingleNode("videos/video/upload_date").InnerText, out tmpdate)) { sb.Append(Properties.Resources.VimeoInfoText2); sb.Append(tmpdate); sb.AppendLine(); } } catch(Exception) { } try { var tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_likes").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.VimeoInfoText3); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { var tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_plays").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.VimeoInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { var tmp = xdoc.SelectSingleNode("videos/video/stats_number_of_comments").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.VimeoInfoText5); sb.Append(tmp); sb.AppendLine(); } } catch(Exception) { } try { var sec = 0; if (int.TryParse(xdoc.SelectSingleNode("videos/video/duration").InnerText, out sec)) { sb.Append(Properties.Resources.VimeoInfoText6); sb.AppendFormat("{0:d}:{1:d2}", sec / 60, sec % 60); sb.AppendLine(); } } catch(Exception) { } try { var tmp = xdoc.SelectSingleNode("videos/video/thumbnail_medium").InnerText; if (!string.IsNullOrEmpty(tmp)) { imgurl = tmp; } } catch(Exception) { } } 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, sb.ToString().Trim())); return true; } } return false; }
/// <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 Photozou_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var mc = Regex.Match(args.url.Value, @"^http://photozou\.jp/photo/show/(?<userId>[0-9]+)/(?<photoId>[0-9]+)", RegexOptions.IgnoreCase); if (mc.Success) { var src = ""; var show_info = mc.Result("http://api.photozou.jp/rest/photo_info?photo_id=${photoId}"); if (http.GetData(show_info, null, out src, 0, out args.errmsg, "")) { var xdoc = new XmlDocument(); var thumbnail_url = ""; try { xdoc.LoadXml(src); thumbnail_url = xdoc.SelectSingleNode("/rsp/info/photo/thumbnail_image_url").InnerText; } catch(Exception ex) { args.errmsg = ex.Message; thumbnail_url = ""; } if (string.IsNullOrEmpty(thumbnail_url)) return false; var _img = http.GetImage(thumbnail_url, args.url.Key); 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; }
/// <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 flickr_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します //参考: http://tanarky.blogspot.com/2010/03/flickr-urlunavailable.html アグレッシブエンジニア: flickr の画像URL仕様についてまとめ(Unavailable画像) //画像URL仕様 http://farm{farm}.staticflickr.com/{server}/{id}_{secret}_{size}.{extension} //photostreamなど複数の画像がある場合先頭の一つのみ認識と言うことにする //(二つ目のキャプチャ 一つ目の画像はユーザーアイコン) var src = ""; var mc = Regex.Match(args.url.Value, "^http://www.flickr.com/", RegexOptions.IgnoreCase); var http = new HttpVarious(); if (http.GetData(args.url.Value, null, out src, 0, out args.errmsg, "")) { var _mc = Regex.Matches(src, mc.Result(@"http://farm[0-9]+\.staticflickr\.com/[0-9]+/.+?\.([a-zA-Z]+)")); //二つ以上キャプチャした場合先頭の一つだけ 一つだけの場合はユーザーアイコンしか取れなかった if (_mc.Count > 1) { var _img = http.GetImage(_mc[1].Value, args.url.Value, 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; } else { args.errmsg = "Pattern NotFound"; } } return false; }
/// <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 Piapro_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var mc = Regex.Match(args.url.Value, @"^http://piapro\.jp/(?:content/[0-9a-z]+|t/[0-9a-zA-Z_\-]+)$"); if (mc.Success) { var src = ""; if (http.GetData(args.url.Key, null, out src, 0, out args.errmsg, "")) { var _mc = 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 (_mc.Success) { //各画像には120x120のサムネイルがある(多分)ので、URLを置き換える。元々ページに埋め込まれている画像は500x500 var r = new System.Text.RegularExpressions.Regex(@"_\d{4}_\d{4}"); var min_img_url = r.Replace(_mc.Groups["big_img"].Value, "_0120_0120"); var _img = http.GetImage(min_img_url, 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; } else { args.errmsg = "Pattern NotFound"; } } } return false; }
/// <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 nicoseiga_CreateImage(CreateImageArgs args) { // TODO: サムネイル画像読み込み処理を記述します var http = new HttpVarious(); var mc = Regex.Match(args.url.Value, @"^http://(?:seiga\.nicovideo\.jp/seiga/|nico\.ms/)im(?<id>\d+)"); if (mc.Success) { var _img = http.GetImage("http://lohas.nicoseiga.jp/thumb/" + mc.Groups["id"].Value + "q?", 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 override ThumbnailInfo GetThumbnailInfo(string url, PostClass post) { var apiUrl = base.ReplaceUrl(url); if (apiUrl == null) return null; var http = new HttpVarious(); var src = ""; var imgurl = ""; string errmsg; if ((new HttpVarious()).GetData(apiUrl, null, out src, 0, out errmsg, MyCommon.GetUserAgentString())) { var sb = new StringBuilder(); var xdoc = new XmlDocument(); try { xdoc.LoadXml(src); var status = xdoc.SelectSingleNode("/nicovideo_thumb_response").Attributes["status"].Value; if (status == "ok") { imgurl = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/thumbnail_url").InnerText; //ツールチップに動画情報をセットする string tmp; try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/title").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText1); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/length").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText2); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { var tm = new DateTime(); tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/first_retrieve").InnerText; if (DateTime.TryParse(tmp, out tm)) { sb.Append(Properties.Resources.NiconicoInfoText3); sb.Append(tm.ToString()); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/view_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText4); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/comment_num").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText5); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } try { tmp = xdoc.SelectSingleNode("/nicovideo_thumb_response/thumb/mylist_counter").InnerText; if (!string.IsNullOrEmpty(tmp)) { sb.Append(Properties.Resources.NiconicoInfoText6); sb.Append(tmp); sb.AppendLine(); } } catch (Exception) { } } else if (status == "fail") { var errcode = xdoc.SelectSingleNode("/nicovideo_thumb_response/error/code").InnerText; errmsg = errcode; imgurl = ""; } else { errmsg = "UnknownResponse"; imgurl = ""; } } catch (Exception) { imgurl = ""; errmsg = "Invalid XML"; } if (!string.IsNullOrEmpty(imgurl)) { return new ThumbnailInfo() { ImageUrl = url, ThumbnailUrl = imgurl, TooltipText = sb.ToString().Trim() }; } } return null; }