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の在処とダウンロード用ブックマークレット)
こういうのを探してたんです!!
自分で書き換えようかなぁとも思ったんですが、どだい無理な話でしたw
でも、参照ソースは、こちらの鯖に置いたままでよろしいんですか?
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
>名無しさん
ブックマークレット自体は静的ファイルでサイズも小さいのでそんなに負荷にならないです。
ですのでこのレンサバに置いています。
>JJさん
おお、IE7版ありがとうございます。
IE6では確認したんですけど当方IE7環境を持っていないもので…
元ファイルへの反映は確認ができてからにしようと思います。(いつになるか…)
紹介もありがとうございましたー。