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 を使う