#!/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";
		}
	}
}
