だるろぐ

明日できることは、今日しない。

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