watch_videos 形式のURL対応
YouTubeにいつの間にか仕様が追加されています。URLに"watch_videos"が付くものがそれで、例えば、<<http://www.youtube.com/watch_videos?more_url=%2F&video_ids=BOjWxqFKA4g....>>の形式です。
YouTubeダウンローダとダウンロードスクリプトでこの対応をしました。このフォーマットのURLのページを開いてみた範囲では、"watch?v=xxx"のURLのページと見た目に違いはありません。このため動作上の違いは分りませんでしたが、いずれにせよ、動画が自動再生されますので、このビデオを取得することになります。
ところで、ソフトウェア的にもこのフォーマットには謎があります。このURLにアクセスすると、<<http://www.youtube.com/watch?v=BOjWxqFKA4g&...>>に転送(リダイレクト)されます。転送先は一見何の変哲もないいつものフォーマットのページのようなのですが、ここから取得した"fmt_url_map"を使うと、直接ダウンロードできないようなのです。取得できるビデオ識別子(watch?v=xxx)を使えばダウンロードできるのですが、実際、見比べてみますと、この2つの"fmt_url_map"は確かに違っているのですが、どう直すのが正解なのか今一不明です。
そこで、ビデオ識別子を使ってページを取得し、その中から"fmt_url_map"を取ることにしました。ビデオ識別子は、"video_ids"パラメタの最初のもののようです。しかし、このフォーマットのURLはサンプルが少ないため確証が持てなかったので、取得できなかった場合はリダイレクトページの中からビデオ識別子を捜すようにしました。
こんな感じです。
#--- YTPid from watch_videos type URL
sub GetYtpidFromWatchVideos
{
my ($url) = @;
my $ytid = "";
my $durl = urldecode($url);
#--- like http://www.youtube.com/watch_videos?more_url=/
#--- &video_ids=BOjWxqFKA4g,yHeiXcg1M5c,Ki4dgped5d0,2D296Xi2FLY
#--- &type=11&feature=featured&no_autoplay=1
if ($durl =~ m![?&]video_ids=([^&,;]+)!) {
$ytid = "http://www.youtube.com/watch?v=${1}";
} else {
$ytid = GetYtpidFromWatchVideosFromWeb($url);
}
Dprint "GetYtpidFromWatchVideos($url)->($ytid)";
return $ytid;
}
sub GetYtpidFromWatchVideosFromWeb
{
my ($url) = @_;
my $ytid = "";
my $opts = "-q -U \'$UAgent\'";
if ($url =~ m!(http://[^/]+/)!) {
$opts .= " --referer=\"${1}\"";
}
my $cmd = "wget $Options -O - \'$url\'";
Dprint "COMMAND: $cmd";
my @pgcontents = `$cmd`;
foreach (@pgcontents) {
# Dprint "pgcontents: $_";
chomp();
if (m!<link rel=\"canonical\" href=\"([^\"]+)\">!) {
$ytid = "http://www.youtube.com$1";
} elsif (m|\'VIDEO_ID\': \'([^\']+)\',|) {
$ytid = "http://www.youtube.com/watch?v=${1}";
}
}
Dprint "GetYtpidFromWatchVideosFromWeb($url)->($ytid)";
return $ytid;
}
これにて、取得に失敗していたビデオが所得できるようになったと思います。
YouTubeの最新仕様に対応昨日、YouTubeダウンローダー&変換サービスでYouTubeのファイルを変換して見ようとして、うまく行かないのがあるのに気付きました。普段あまり見ない映画系のビデオでした。分野に依るのかもしれませんが、ビデオのURLがうまく取れないようでした。調べてみたところ、今迄に実装した形式が一つもなく、以下の3種類の組み合わせだけになっているものでした。
Tracked: 3月 05, 04:05