App-get_flash_videos
view release on metacpan or search on metacpan
lib/FlashVideo/Downloader.pm view on Meta::CPAN
if ($offset and !$response->header('Content-Range')) {
error "Resuming failed - please delete $self->{printable_filename} and restart.";
exit 1;
}
else {
$self->{downloaded} = $offset unless $self->{downloaded};
}
my $len = length $data;
if($self->{filter}) {
$data = $self->{filter}->($data);
}
return unless $data;
my $fh = $self->{fh};
print $fh $data || die "Unable to write to '$self->{printable_filename}': $!\n";
if(defined $self->{stream}) {
if($self->{downloaded} > 300_000) {
$self->{stream}->();
}
}
if(!$self->{downloaded} && length $data > 16) {
if(!$self->check_magic($data)) {
error "Sorry, file does not look like a media file, aborting.";
exit 1;
}
}
$self->{downloaded} += $len;
$self->progress;
}, ':read_size_hint' => 16384);
if($browser->response->header("X-Died")) {
error $browser->response->header("X-Died");
}
close $self->{fh} || die "Unable to write to '$self->{printable_filename}': $!";
if ($browser->success) {
return $self->{downloaded} - $offset;
} else {
unlink $file unless -s $file;
error "Couldn't download $url: " . $browser->response->status_line;
return 0;
}
}
sub progress {
my($self) = @_;
return unless -t STDERR;
return if $self->quiet;
my $progress_text;
if ($self->{content_length}) {
my $percent = int(
($self->{downloaded} / $self->{content_length}) * 100
);
if ($percent != $self->{percent} || time != $self->{last_time}) {
my $downloaded_kib = _bytes_to_kib($self->{downloaded});
my $total_kib = _bytes_to_kib($self->{content_length});
$progress_text = ": $percent% ($downloaded_kib / $total_kib KiB)";
$self->{last_time} = time;
$self->{percent} = $percent;
}
} else {
# Handle lame servers that don't tell us how big the file is
my $data_transferred = _bytes_to_kib($self->{downloaded});
if ($data_transferred != $self->{data_transferred}) {
$progress_text = ": $data_transferred KiB";
}
}
if($progress_text) {
my $width = get_terminal_width();
my $filename = $self->{printable_filename};
my $filename_len = $width - length($progress_text);
if($filename_len < length $filename) {
# 3 for "..."
my $rem = 3 + length($filename) - $filename_len;
# Try and chop off somewhere near the end, but not the very end..
my $pos = length($filename) - $rem - 12;
$pos = 0 if $pos < 0;
substr($filename, $pos, $rem) = "...";
}
syswrite STDERR, "\r$filename$progress_text";
}
}
sub _bytes_to_kib {
return sprintf '%0.2f', ($_[0] / 1024)
}
sub replace_filename {
my($self, $string, $filename) = @_;
$string .= " %s" unless $string =~ /%s/;
my $esc = $self->shell_escape($filename);
$string =~ s/['"]?%s['"]?/$esc/g;
return $string;
}
sub shell_escape {
my($self, $file) = @_;
# Shell escape the given filename
$file =~ s/'/'\\''/g;
return "'$file'";
}
sub check_file {
my($self, $file) = @_;
open my $fh, "<", $file;
binmode $fh;
my $data;
read $fh, $data, 16;
return $self->check_magic($data);
}
sub check_magic {
( run in 0.985 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )