BuzzSongs に FLV ファイルのダウンロード機能を追加 の方法で YouTube の動画 FLV ファイルがダウンロードできなくなっていた(YouTube内部の仕様変更)ので、YouTube の動画をダウンロードするためのURLを取得する Java コード とか google videoやyoutubeとかの動画を落として保存。 のやりかたを踏襲して、ダウンロード機能を修正した。

BuzzSongs

BuzzSongs

ついでに BuzzTube のほうも同様に修正。

BuzzTube

BuzzTube

あと、以下のページが参考になった。

色々探した結果、下記の様に origin=youtube.com (cache のある domain) を query_string に追加すれば良い様だ。

http://cache.googlevideo.com/get_video?video_id=_u-iru8OmkM&origin=youtube.com

※cache のある domain で無い場合は flie が存在しない事になります。

完全な解決では無い、これからどうするか!?

(中略)

CPAN の WWW::YouTube::VideoURI を使う事で解決。

YouTube の flv の取得 - TeahousePhantomProgramDiary

WWW::YouTube::VideoURI - a module to determine the URI of a Flash Video file on YouTube.com - search.cpan.org のソースコード(get_video_uri サブルーチン)も参考になる。


sub get_video_uri {
  my ($self, $uri_s) = @_;
  my $uri = URI->new($uri_s);
  my %params = $uri->query_form;
  croak("Malformed URL or missing parameter") if ($params{v} eq '');
 
  my $new_uri = sprintf(
    'http://www.youtube.com/v/%s',
    uri_escape($params{v})
  );
  my $req = GET($new_uri);
  my $res = $self->{ua}->request($req);
 
  croak($res->status_line) if ($res->is_error);
 
  my $target = URI->new_abs($res->header('Location'), $new_uri);
  my %target_params = $target->query_form;
 
  return sprintf(
    'http://www.youtube.com/get_video.php?video_id=%s&t=%s',
    uri_escape($params{v}),
    uri_escape($target_params{t})
  );
}


tags: zlashdot Movie BuzzSongs BuzzTube YouTube

Posted by NI-Lab. (@nilab)