Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

YouTube 技術情報

YoutubeでHD動画がダウンロード可能か判別する方法と、作ったAPIとブックマークレット

投稿日:


YoutubeのHD祭りに乗じて作ったGreasemonkeyが好評価を頂いたようです。
動画を楽しもう!(Youtubeでダウンロード可能なファイル形式が一目瞭然になるGreasemonkey)
はてなブックマーク – 動画を楽しもう!(Youtubeでダウンロード可能なファイル形式が一目瞭然になるGreasemonkey)
毎度ながら、こういったツールは「自分が便利になるもの」を目指して作り始めるのですが、今回のグリモンの場合、「どうやってやっているの?」っていう疑問を持った方が結構いたみたいなのでちょっくら解説などしてみようと思います。

目的のファイルがあるかどうかを判別する方法

Youtubeのダウンロードファイルの在処が分かったとしても、HD画質でアップロードしていない場合は「&fmt=22」の動画ファイルは存在していません(他のフォーマットについても同様でしょう)。しかし、実際にそのURLにアクセスしてみないと存在の確認はできないので、リンクを表示しただけではツールとして不十分です。(ダウンロードしてみたら404ページだったってのはガッカリしすぎです。)
URLは確実に分かっているのですから、URLの存在確認さえできればOKです。つまり、HTTPアクセスしてResponseのステータスコードを見てやれば良いだけなのです。これだけなら、XmlHttpRequest(FirefoxのGreasemonkeyではGM_xmlhttpRequest関数)だけで取得可能に思えるのですが、ここで一つ落とし穴が。存在確認の対象ファイルが数MB〜数十MBもあるメディアファイルのため、ロードし終わるのに非常に時間がかかってしまいます。GM_xmlhttpRequestでは GET | POST でのリクエストしかできないようで、onload時にしかステータスコードを取得できませんでした。だけど、この場合必要なのは HEAD メソッドなのです!

ファイルの存在確認とステータスコードを教えてくれるAPI

という事で、さくっとAPIと作ってみました。
しかも、Google App Engineで!
(はじめてのPythonで苦労した話とかは、また別の機会にします。)
▼使用方法

http://urlcheck.appspot.com/?callback=コールバック関数&url=URLエンコードしたURL

必要なパラメータは1つだけです。
・url : URLエンコードしたURL
これでアクセスすると、JSON形式で「リクエストURL」と「ステータスコード」のセットが返ってきます。対象のURLがリダイレクトされている(ステータスコードが30x)場合は、複数の「URL+ステータスコード」のセットが返ってきます。
いわずもがな、callbackを指定すればJSONPとして使えます。
例題として、Mattの動画で試してみましょう。
HD動画のURLは下記です。(このへんで調べられる)

http://jp.youtube.com/get_video?video_id=zlfKdbWwruY&t=OEgsToPDskIjMnbvd_43Ba-yDsbr4FKe&fmt=22

でAPIへはこのように渡しましてみます。

http://urlcheck.appspot.com/?url=http%3A%2F%2Fjp.youtube.com%2Fget_video%3Fvideo_id%3DzlfKdbWwruY%26t%3DOEgsToPDskIjMnbvd_43Ba-yDsbr4FKe%26fmt%3D22

するとこんなJSONが返ってきました。(見やすくするために改行をいれています)

{'requests':[
{ 'url':'http://jp.youtube.com/get_video?video_id=zlfKdbWwruY&t=OEgsToPDskIjMnbvd_43Ba-yDsbr4FKe&fmt=22',
'status':303},
{ 'url':'http://v12.cache.googlevideo.com/videoplayback?id=ce57ca75b5b0aee6&itag=22&begin=0&len=604800000&ip=66.249.84.69&signature=1939AC64022523F5AEB58BB537A87F53AC8C302F.2D9E18CB9C422015013D3CD825AB7B981ABF5041&sver=2&expire=1227553199&key=yt4&ipbits=0',
'status':200}
]}

リクエストしたyoutubeのサーバからは一度303リダイレクトされて、googleのキャッシュサーバに実ファイルが見つかりました(200)。という事が分かりますね。
このAPIはHEADでリクエストを投げるのでレスポンスボディを取得しません。だから、サイズの大きなファイルでもすばやく結果を取得できます。もちろん、HEADアクセスに対応していないサーバでは有効でないでしょうけどね。

YoutubeでHD動画があるかどうか判別してリンクを表示してくれるBookmarklet

すでに紹介しているGreasemonkeyでも上記APIを使用しているのですが、改めて同じ機能を満たすブックマークレットを作ってみました。
Youtube Downloadable Links
上のリンクをブックマークしておいてください。
Youtubeの再生画面(〜/watch)でブックマークレットを実行するだけで、ダウンロード可能なファイル形式のみリンクが表示されます。
ブックマークレットのソースは別ファイルになってますのでこちらをご確認ください。
http://labs.creazy.net/bookmarklet/youtube_downloadable_links.js

まとめ

多分Greasemonkeyなり、ブックマークレットなりキモになっているのは今回紹介したAPIの方だと思います。まあ、Python赤子レベルのyagerが作ったものなので、サービスで使おうって人はいないと思いますけどね。それなりに用途がたくさんありそうなものなので、リクエストの種類とか、返すレスポンスヘッダーの種類を増やすだとか、バージョンアップはしていきたいなぁと思います。
にしても、みんなYoutube大好きなんですね・・・。

YoutubeのHD動画正式対応で、改めて動画形式をまとめてみる
動画を楽しもう!(Youtube のHD動画を色/サイズをカスタマイズした上でembedできるブックマークレット)
動画を楽しもう!(Youtubeで一覧画面でもダウンロード可能な最高画質が一目瞭然になるGreasemonkey)
Youtube でHD動画に対応しているか確認する裏技見つけた
動画を楽しもう!(Youtubeでダウンロード可能なファイル形式が一目瞭然になるGreasemonkey)
動画を楽しもう!(YoutubeでHD動画など全形式でダウンロードできるブックマークレット)
動画を楽しもう!(YoutubeをMP4でダウンロードするもっと簡単なブックマークレット)
動画を楽しもう!(YoutubeのFLVの在処とダウンロード用ブックマークレット)

-YouTube, 技術情報

執筆者:


  1. 匿名 より:

    こういうのを探してたんです!!
    自分で書き換えようかなぁとも思ったんですが、どだい無理な話でしたw
    でも、参照ソースは、こちらの鯖に置いたままでよろしいんですか?

  2. JJ より:

    Youtube Downloadable Links を使ってみました。
    Firefoxはオッケーなのですが、IE7だと全部 [NG] になっちゃうみたいで(statusが200でなくブランクになる、オイラの環境だけ??)、ちょびっとソースを弄らせてもらいました(すんません問題ありなら削除します)
    修正分ここにおいてあります

    http://jjworkshop.com/scripts/youtube_downloadable_links_ex.js
    変更は、function(json) のローカル変数 status に ver を不可したのと、調査のためNGのときにステータスコードを表示するようにしました
    また、この機能とっても便利なので、オイラのBOLGにて紹介させていただきました。
    http://jjworkshop.com/blog/archives/2008/11/post_574.html

  3. yager より:

    >名無しさん
    ブックマークレット自体は静的ファイルでサイズも小さいのでそんなに負荷にならないです。
    ですのでこのレンサバに置いています。
    >JJさん
    おお、IE7版ありがとうございます。
    IE6では確認したんですけど当方IE7環境を持っていないもので…
    元ファイルへの反映は確認ができてからにしようと思います。(いつになるか…)
    紹介もありがとうございましたー。

comment

メールアドレスが公開されることはありません。

関連記事

ソニーエリクソン製Android端末「Xperia」のタッチ&トライイベントに行ってきた

ちょうど今日の日中に正式にDocomoからの発売が発表されたソニーエリクソン製のAndroid端末「Xperia」ですが、今日一日TwitterのTL上はお祭り騒ぎになっていたようですね。んで、タイミ …

MacBookの暑い夏を冷却台で乗り切る

いやー最近どんどん暑くなってきてたまに30度超えたりしてますよね。 この時期になるとノートPCの熱はマジで殺人的なわけですが、ボクのMacBookユニボディは初めての夏到来にはりきって発熱しております …

no image

速報:Twitter API の日付フォーマットが変わったみたい

※(2007/06/21修正)日付フォーマットが元に戻ったようなのでこのエントリーは不正確な情報となりました。 twitter javascript badge のカスタマイズネタを随分と書いています …

facebookはじめました

Facebook | Takahito Yagami 「冷やし中華はじめました」には少し早いのでfacebookはじめました(嘘 よろしければお気軽に友達登録お願いします。 (小心者なので直接面識のあ …

手書きスケッチの動画を共有できるスケッチキャスト(Sketchcast)が面白い

百式で面白いwebサービスが紹介されていました。 そのままの名前だがSketchcastでは手書き映像+音声を投稿、共有することができる。 via: これからはスケッチキャスティング?手書き映像を投稿 …

スポンサードリンク

スポンサードリンク