#!/usr/bin/perl -w
use strict;
use warnings;
use LWP::UserAgent;
require HTTP::Cookies;
my $argv_size = @ARGV;
if ( $argv_size == 0 )
{
print "usage: perl tube_mp4.pl [url] <[0|1]>\n";
print "[url] : url which has youtube url\n";
print "<[0|1]> : 0:id as filename 1:title as filename\n";
exit;
}
my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
$ua->cookie_jar( HTTP::Cookies->new( file => "$ENV{HOME}/.cookies.txt" ) );
$ua->default_headers->push_header( 'Accept-Language' => "no, jp, en" );
my @list = ();
## get url
{
my $url = $ARGV[0];
my $response = $ua->get($url);
if ( !$response->is_success )
{
warn $response->status_line;
exit;
} else
{
my $content = $response->content;
# print $content;
while ( $content =~
m/(http\:\/\/(www|jp)\.youtube\.com\/watch\?v=[0-9a-zA-Z_-]{11,12})/g )
{
my $youtube_url = $1;
push( @list, $youtube_url );
print $youtube_url . "\n";
}
my $list_size = @list;
if ( $list_size == 0 )
{
warn "no youtube URL.\n";
exit;
}
}
}
## get mp4
while (@list)
{
my $url = pop(@list);
my $response = $ua->get($url);
if ( !$response->is_success )
{
warn $response->status_line;
} else
{
my $content = $response->content;
if ( $content =~ /video_id=(.+?)&.*?&t=(.+?)&/ )
{
my $id = $1;
my $t = $2;
my $mp4_url =
"http://www.youtube.com/get_video?video_id=$id&t=$t&fmt=18";
#warn "downloading mp4 from $mp4_url";
my $title = $id;
## comment out if you don't want the filename changed to same as the title
if ( $argv_size == 1
|| ( ( $argv_size > 2 ) && ( $ARGV[1] eq '1' ) ) )
{
my $pattern = "<title>(.+)</title>";
if ( $content =~ m/$pattern/i )
{
$title = $1;
$title =~ s/[\\\/:\*\?\"<>\|]/-/g;
}
}
## save
$ua->mirror( $mp4_url, "${title}.mp4" );
} else
{
my $msg = '';
{
## get error message
my $error_pattern =
"<div class=\"(errorBox|watch-highlight-racy-box)\">(.+)<\/div>";
if ( $content =~ m/$error_pattern/i )
{
$msg = $1 . ':' . $2;
}
}
$msg =~ s/\r//;
$msg =~ s/\n//;
$msg =~ s/\t//;
$msg =~ s/\ //;
warn "Error $url $msg";
}
}
}