Creazy!

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

YouTube 技術情報

Youtube でHD動画に対応しているか確認する裏技見つけた

投稿日:


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の在処とダウンロード用ブックマークレット)

-YouTube, 技術情報

執筆者:


  1. 匿名 より:

    こんにちは!すばらしいスクリプト感激です。
    ファイル名もつけてもらえれば完璧です。

  2. [Vimperator][Firefox][JavaScript]fetchyoutube を改良

    今回は、外部のAPIを使わずにHD動画の有無を確認する方法を見つけたので紹介します。 キーとなるのはFLVの在処を探し出した時と同様、ページ内にあるJa…

comment

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

関連記事

no image

twignature が beta2 になりました

いい加減 twitter ネタしつこいと思っているアナタ、ごめんなさい。しばらく続くと思われます。そして、このブログの「blog」カテゴリーにポストしていいのかも迷っているんですが・・・。 twign …

Adobe Photoshop Express と Flickr が連携しました

先日β版の公開を紹介したPhotoshop Expressですが、待望のFlickrとの連携機能をスタートしていました。 アドビ システムズは米国時間5月9日、先週予定されていた同社プログラム「Pho …

#古REGZA古MacBook (2)MacBookにリモートアクセスするために画面共有、AFPアクセス可能に設定

#古REGZA古MacBookシリーズの2発目ですが、前回SSD化によって実用可能なパフォーマンスに復活した古いMacBook。サーバ的な使い方をするためにリモートアクセスの設定をします。 まずはIP …

300エントリー突破で考える「クチコミの技術」

7月のランキングをまとめていた時に偶然気がつきました。 いつのまにか累計エントリー数が300を超えていたのです。 (ちなみに300番目は「夜景がキレイ」という気の抜けたminiエントリーだった…)

no image

今度は AirMac Express がお亡くなりになって、FONに苦戦中(泣

少し前から、MacBookを始め身の回りの機器が軒並み調子が悪い状態です。 んで、今度は無線LANルーターとして使っているAirMac Expressの電源が入らなくなっちゃいました>< 3年以上は使 …

スポンサードリンク

スポンサードリンク