App-get_flash_videos
view release on metacpan or search on metacpan
lib/FlashVideo/Site/Youtube.pm view on Meta::CPAN
}
if ($browser->content =~ m{<span[^>]*>[^<]+Ep\.?\w* ?(\d+)\W*\s*</span>}i) {
$episode = $1;
}
if ($season and $episode) {
$title .= sprintf " S%02dE%02d", $season, $episode;
}
# Need flash URL for SWF verification
my $swf_url;
if ($browser->content =~ /SWF_URL['"] ?: ?.{0,90}?(http:\/\/[^ ]+\.swf)/) {
$swf_url = $1;
} elsif($browser->content =~ /swfConfig\s*=\s*(\{.*?\});/ && (my $swf = from_json($1))) {
$swf_url = $swf->{url};
} elsif($browser->content =~ /src=\\['"]([^'"]+\.swf)/) {
$swf_url = json_unescape($1);
} else {
die "Couldn't extract SWF URL";
}
my $rtmp_url = $info{conn};
if($info{fmt_stream_map}) {
my $fmt_stream_map = parse_youtube_format_url_map($info{fmt_stream_map}, 1);
# Sort by quality...
my $preferred_quality = $prefs->quality->choose(map { $fmt_stream_map->{$_->{id}}
? { resolution => $_->{resolution}, url => $fmt_stream_map->{$_->{id}} }
: () } @formats);
$rtmp_url = $preferred_quality->{url};
}
return {
flv => title_to_filename($title),
rtmp => $rtmp_url,
swfhash($browser, $swf_url)
};
} elsif($info{fmt_url_map}) {
debug "Using fmt_url_map method from info";
return $self->download_fmt_map($prefs, $browser, $title, \%info, $info{fmt_url_map});
}
}
# Try old get_video method, just incase.
return download_get_video($browser, $prefs, $video_id, $title, $t);
}
sub download_fmt_map {
my($self, $prefs, $browser, $title, $info, $fmt_map) = @_;
my $fmt_url_map = parse_youtube_format_url_map($fmt_map);
if (!$title and $browser->uri->as_string =~ m'/user/.*?#') {
# This is a playlist and getting the video title without the ID is
# practically impossible because multiple videos are referenced in the
# page. However, the encrypted (apparently) video ID is included in the
# URL.
my $video_id = (split /\//, $browser->uri->fragment)[-1];
my %info = get_youtube_video_info($browser->clone, $video_id);
$title = $info->{title};
}
# Sort by quality...
my $preferred_quality = $prefs->quality->choose(map { $fmt_url_map->{$_->{id}}
? { resolution => $_->{resolution}, url => $fmt_url_map->{$_->{id}} }
: () } @formats);
$browser->allow_redirects;
return $preferred_quality->{url}, title_to_filename($title, "mp4");
}
sub download_get_video {
my($browser, $prefs, $video_id, $title, $t) = @_;
my $fetcher = sub {
my($url, $filename) = @_;
$url = url_exists($browser->clone, $url, 1);
return $url, $filename if $url;
return;
};
my @formats_to_try = @formats;
while(my $fmt = $prefs->quality->choose(@formats_to_try)) {
# Remove from the list
@formats_to_try = grep { $_ != $fmt } @formats_to_try;
# Try it..
my @ret = $fetcher->("http://www.youtube.com/get_video?fmt=$fmt->{id}&video_id=$video_id&t=$t",
title_to_filename($title, "mp4"));
return @ret if @ret;
}
# Otherwise try without an ID
my @ret = $fetcher->("http://www.youtube.com/get_video?video_id=$video_id&t=$t",
title_to_filename($title));
check_die($browser, "Unable to find video URL") unless @ret;
$browser->allow_redirects;
return @ret;
}
sub check_die {
my($browser, $message) = @_;
if($browser->content =~ m{class="yt-alert-content">([^<]+)}) {
my $alert = $1;
$alert =~ s/(^\s+|\s+$)//g;
$message .= "\nYouTube: $alert";
error $message;
exit 1;
} else {
die "$message\n";
( run in 0.987 second using v1.01-cache-2.11-cpan-b16cb0d3907 )