Youtube好きなみなさんこんにちは。しつこくHDネタ続きます。
(今回技術的な要素が多いため、「動画を楽しもう!」シリーズではありません)
前回、HEADリクエストでHTTPステータスを取得し、動画ファイルの存在を確認する方法を紹介しました。
YoutubeでHD動画がダウンロード可能か判別する方法と、作ったAPIとブックマークレット
今回は、外部のAPIを使わずにHD動画の有無を確認する方法を見つけたので紹介します。
キーとなるのはFLVの在処を探し出した時と同様、ページ内にあるJavaScript変数「swfArgs」になります。
実はこのswfArgs変数の中に「fmt_map」という気になる要素が入っているのですが暗号めいていて意味までは分かりませんでした。しかし、HD動画を見るための「&fmt=22」を加えたページで見てみたところこれが動画フォーマットに関連する値である事は間違いないようなのです。
[2008/11/28:追記]
miyagawaさんがすでに言及されていたみたいです。気づくの遅すぎました。
How to know if YouTube video has HD version: GET the page with ?fmt=22 and look for “fmt_map”: “22/2000000/9/0/115” in its HTML.
via: Twitter / Tatsuhiko Miyagawa: How to know if YouTube vid …
というタイミングで@miyagawaさんをフォローしてみた 🙂
HD動画に対応しているか確認する簡単な方法
ソースを見るのが面倒なので簡単なブックマークレットで確認します。
「&fmt=22」を加えた閲覧ページ(例えばMattの動画)で下記ブックマークレットを実行してみてください。
(下のコードをコピーしてブラウザのアドレスバーに貼付けて実行)
javascript:alert(swfArgs['fmt_map']);
たったコレだけです。
HD動画に対応している場合は下記のようなアラートが出ます。
22/2000000/9/0/115
そうです、HD動画のフォーマット番号と一致する「22」から始まる文字列が入っているのです。
HD動画に対応していないページ(例えばコレ)で実行すると値は空っぽです。
という事は、「&fmt=22」が付いたページのswfArgs変数が取得できれば判別可能という事です。
存在する一番高画質な動画フォーマットをダウンロードするブックマークレット
上記ふまえ、ブックマークレットを作ってみました。
Youtube Easy HD Downloader
上記リンクをブックマークに登録してください。
Youtube動画閲覧画面(/watch?v={video_id}、「&fmt=22」はなくてもよい)で、ブックマークレットを実行してください。
その動画がHD動画に対応してれば、
Found HD file! Download it?
というダイアログが出ていますので「OK」を押すとHD動画がダウンロード開始します。
その動画がHD動画に対応していない場合は、
Can't find HD file! Download MP4 HQ?
というダイアログが出ていますので「OK」を押すとMP4(&fmt=18)動画がダウンロード開始します。
以前のブックマークレットではFLVも合わせて4種類のリンクを表示していましたが、ダウンロードするならMP4だけでいいですよね?Greasemonkeyで見ているところほとんどの動画が&fmt=18のMP4に対応しているので&fmt=18の動画はノーチェックでリクエストしています。
一応ソースも載っけておきます。
XmlHttpRequestで「&fmt=22」ページを取得し、正規表現でswfArgs関数部分を抜き出すってことをやっています。
var d = document; var w = window; function createXHR() { if ( w.ActiveXObject ) { try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { return null; } } } else if ( w.XMLHttpRequest ) { return new XMLHttpRequest(); } else { return null; } } checkURL(swfArgs['video_id']); /** * Checking */ function checkURL(video_id) { var url = 'http://'+location.host+'/watch' + '?v='+video_id + '&fmt=22'; var XHR = createXHR(); XHR.open( 'GET', url, true ); XHR.onreadystatechange = function() { if (XHR.readyState==4) { if ( match = XHR.responseText.match(/var swfArgs = ({.*})/) ) { json = eval('('+RegExp.$1+')'); if ( json['fmt_map'] == '22/2000000/9/0/115' ) { if ( confirm("Found HD file! Download it?") ) { location.href = '/get_video?video_id='+swfArgs['video_id']+'&t='+swfArgs['t']+'&fmt=22'; } } else { if ( confirm("Can't find HD file! Download MP4 HQ?") ) { location.href = '/get_video?video_id='+swfArgs['video_id']+'&t='+swfArgs['t']+'&fmt=18'; } } } } } XHR.send(''); }
まとめ
Youtubeは最近16:9に表示を変更したり、動きも激しいので今回紹介した方法が今後も使えるかは分かりません。しかし、外部のAPIに頼らずに判別できる方法があるならその方が良いかなと思っています。
実際、Youtubeでダウンロード可能なファイル形式が一目瞭然になるGreasemonkeyで使っているAPIへのアクセス数が想像以上になっているので、この方法に変更したGreasemonakeyも作ろうかなと思っています。
という事でグリモン書きたいところなんだけどいっぱいいっぱいすぎる…。
関連エントリー
・YoutubeのHD動画正式対応で、改めて動画形式をまとめてみる
・動画を楽しもう!(Youtube のHD動画を色/サイズをカスタマイズした上でembedできるブックマークレット)
・動画を楽しもう!(Youtubeで一覧画面でもダウンロード可能な最高画質が一目瞭然になるGreasemonkey)
・YoutubeでHD動画がダウンロード可能か判別する方法と、作ったAPIとブックマークレット
・動画を楽しもう!(Youtubeでダウンロード可能なファイル形式が一目瞭然になるGreasemonkey)
・動画を楽しもう!(YoutubeでHD動画など全形式でダウンロードできるブックマークレット)
・動画を楽しもう!(YoutubeをMP4でダウンロードするもっと簡単なブックマークレット)
・動画を楽しもう!(YoutubeのFLVの在処とダウンロード用ブックマークレット)
こんにちは!すばらしいスクリプト感激です。
ファイル名もつけてもらえれば完璧です。
[Vimperator][Firefox][JavaScript]fetchyoutube を改良
今回は、外部のAPIを使わずにHD動画の有無を確認する方法を見つけたので紹介します。 キーとなるのはFLVの在処を探し出した時と同様、ページ内にあるJa…