YouTube の URL を動画タグへ変換する(oEmbed)
Flickr の URL を画像タグへ変換する(oEmbed) - だるろぐ のYoutube版も作ってみた。
Youtube も oEmbed に対応しているのだけれど、画像ではなく動画なので、リンクを作る場合は url ではなく html (objectタグ)を使うのが、Flickr の写真の場合と少し違うところ*1。type には、ほかに rich だの link だのがあるっぽい。
詳しくは oEmbed に全部書いてあるので参照のこと。
private static readonly string SERVICE_ENDPOINT = @"http://www.youtube.com/oembed"; private static readonly string FORMAT_URL = @"{0}?url={1}&maxwidth={2}&maxheight={3}&format={4}"; public static string FORMAT_HTML_VIDEO_TAG = @" <blockquote class='youtube youtube-video'> <p>{0}<p> <p><small>{1} by <a href='{3}'>{2}</a></small><p> </blockquote> "; public static string FORMAT_ERROR = @"<p class='error'>{0}</p>"; public static string GetHtml(string url, string max_width = "500", string max_height = "500") { try { return GetHtml(url, int.Parse(max_width), int.Parse(max_height)); } catch (Exception e) { return string.Format(FORMAT_ERROR, e.Message); } } public static string GetHtml( string url, int max_width, int max_height) { try { if (url.StartsWith("http://youtu.be/")) url = url.Replace( "http://youtu.be/", "http://www.youtube.com/watch?v="); var format = "json"; var address = string.Format( FORMAT_URL, SERVICE_ENDPOINT, url, max_width, max_height, format); using (var client = new WebClient()) { var response = client.DownloadString(address); var info = DynamicJson.Parse(response); switch (info.type as string) { case "video": return string.Format(FORMAT_HTML_VIDEO_TAG, info.html, info.title, info.author_name, info.author_url); default: throw new Exception("Unknown media type."); } } } catch (Exception e) { return string.Format(FORMAT_ERROR, e.Message); } }
YouTube の短縮URLはドメイン部分を置換しただけみたい。実装も楽だし、開発者も楽だし、多少リンクが長くなる以外はなかなかイケていると思う。
*1:Flickr も動画に対応しているのだけど、type=="video" の場合はやっぱり url ではなく html を使う