YouTube仕様変更に合わせてダウンローダーを変更
最近、私のYouTuneダウンローダでダウンロードエラーしているファイルがボチボチあったので、YouTubeの仕様の変更が行なわれているのには気が付いていました。それでも大多数はダウンロードできていたので後まわしにしていたところ、昨日8/13の朝から一切ダウンロードできなくなりました。先方の都合に文句を言う筋合もありませんので早速対応しました。
仕様変更の中身
以前はビデオが表示されるURL(<http://www.youtube.com/watch?v=KONKcBvRHt8>の形式)の中身(1)を読み、"fullscreenUrl"のラインから"video_id"を取得して、"http://youtube.com/get_video?"のメソッドに食わせてやるというものでした。この方法で多くのツールが配布されています。しかし、実際に試してみると、既に"fullscreenUrl"は中身がなくなっているのです。
var fullscreenUrl = '/watch_popup?v=KONKcBvRHt8';
結局、紆余曲折(後述)ありましたが、結果的には以下のような方法で取得できました。
"fmt_url_map": "18|http://v8.lscache5.c.youtube.com/videoplayback?ip=0.0.0.0
&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Cburst%2Cfactor&itag=18
&ipbits=0&signature=3A8EBA32B0EAA348DCD88E6B6C5C9EE49C7D2426.
D625798CCDFC5E387F3619BB38C7E2D7546BC66A&sver=3&expire=1250164800&key=yt1
&factor=1.25&burst=40&id=28e34a701bd11edf,
5|http://v24.lscache4.c.youtube.com/videoplayback?ip=0.0.0.0
&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Cburst%2Cfactor&itag=5&ipbits=0
&signature=A04868771D8CBFA2E06877F239F8F1BCA3D7CAFC.
5BE656AA96CA12BA393BFFF66E6610CDA9F0BC0E&sver=3&expire=1250164800
&key=yt1&factor=1.25&burst=40&id=28e34a701bd11edf"
さてここまで分ったので、早速CGIを修正しました。実はこの方法は、従来のものを含めて第3の方法です。第2のもの(後述)を含めてサポートするようにしましたが、実際、8/13以降は全て上記の第3の方法でダウンロードされているように観察されます。
これにて、サービスのページと、ソフトウェアのページをアップデートしました。
紆余曲折と第2の方法
実際には、すんなりは分りませんでした。第2の方法というべきものがあり、2008年の後半から一部のビデオファイルでサポートされていたようです。ググって発見したこの方法をやってみて、"動かん動かん"と唸っていました。
朝から動いていないのが分ったので、早速自作のproxyでブラウザとYouTubeのやりとりを眺めてみると、怪しいのは以下のリクエストです。
GET http://www.youtube.com/get_video?video_id=KONKcBvRHt8
&t=vjVQa1PpcFOzSS_W1S9nYCgQRFX1fmzXF4c5pwVJcsI=
&el=detailpage&ps=&fmt=5&noflv=1 HTTP/1.1
お馴染の"get_video"メソッドですのでログを grep してすぐ見つかりました。従来と違うのは、"t"という呪文パラメタが追加されています。さて、これを更にググってみると、外人が概ね以下のようなことを書いていました。
- これからは"t"を付けないとダウンロードできないぜ。
- このパラメタは"get_video_info"メソッドで獲得できるよ。
- また、他のサイトには、"api2_rest"メソッドで獲得できるよ、とも書いてありました。
これを実装してみましたが、うまくダウンロードできません。このときのエラーコードが微妙に変化するのと、自作proxyではどうした訳かブラウザからの視聴も失敗してしまうため、中々理由が分りませんでした。疑心暗鬼になって、「さては小細工されたかぁ」と思い、GET メソッドのパラメタやUserAgentなんかもいじったりしてしまいました。
もう一回ログに戻ってみると、"get_video"の直前に、怪しいリクエストがあります。
GET http://v24.lscache4.c.youtube.com/videoplayback?ip=0.0.0.0
&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Cburst%2Cfactor
&itag=5&ipbits=0&signature=090D8EF6C4AB9EC77FEE02047C76BCDB5E8BD0DF.
16AD199B8BA8257D7F9F5A89F2B55A6A6DAD42EE&sver=3&expire=1250161200
&key=yt1&factor=1.25&burst=40&id=28e34a701bd11edf HTTP/1.1
"videoplayback"でググってみると、どうやら、これで取得できるっぽいです。それで探ってみると、"swfArgs"の中にありました。フラッシュプレイヤーに渡すパラメタのようです。パイプの前の数字はビデオ解像度のパラメタとして見覚えがありますので、後のURLがその解像度のURLということになるでしょう。これで実装すると、ファイルがダウンロードできました。
結局のところYouTube側は、むしろ直ダウンロードし易い形に仕様変更してくれたようです。実際、分り難くすることも含めて第2の方法を採用したが、アクセスが1回増えるのも無駄だし、ということで第3の方法にしたのかもしれません。まだ、仕様を詳細に解析していませんが、使い易くしていただいてありがたいことだ、と思っていて良いように思います。