# (c) 2007 by Ralf Ertzinger # licensed under GNU GPL v2 # # A getter which will download the media to a local file storage # package videosite::FileGetter; use videosite::GetterBase; @ISA = qw(videosite::GetterBase); use strict; use File::Basename; sub new { my $class = shift; my $self = $class->SUPER::new( NAME => 'filegetter', _PARAMS => { MINFREE => ['500000', 'The amount of space that needs to be available on the filesystem before the video is downloaded (in kilobytes)'], FILEPATTERN => ['/tmp/%s - %s - %s.flv', "The file name to save the file under. This is a string which is passed to a sprintf call later on. The parameters passed to that sprintf call, in order, are:\n- The site the video is from\n- The ID of the video\n- The title of the video\n- The URL of the video file itself\n- The URL of the site the video was taken from\nAll parameters are encoded (space and / replaced by _)"] }, @_, ); return bless($self, $class); } sub get { my $self = shift; my $video = shift; my $dlfile; my $dirname; $dlfile = sprintf($self->_getval('FILEPATTERN'), $self->_encode($video->{'SOURCE'}), $self->_encode($video->{'ID'}), $self->_encode($video->{'TITLE'}), $self->_encode($video->{'DLURL'}), $self->_encode($video)->{'URL'}); $dirname = dirname($dlfile); if ($self->_diskfree($dirname) < $self->_getval('MINFREE')) { $self->error("Not enough free space to download"); return 0; } if (exists($video->{'CONNECTOR'})) { $self->selectconn($video->{'CONNECTOR'}); } $self->_download( $video->{'DLURL'}, $dlfile, $video ) or return 0; if (exists($video->{'DLURL_AUDIO'})) { $self->_download( $video->{'DLURL_AUDIO'}, $dlfile . '.audio', $video ) or return 0; } return 1; } sub _download { my $self = shift; my $dlurl = shift; my $dlfile = shift; my $video = shift; my $res; $self->debug('Going to download %s to %s', $dlurl, $dlfile); $res = $self->ua()->mirror($dlurl, $dlfile); if (!$res->is_success()) { $self->error('Could not download %s to %s (%s)', $dlurl, $dlfile, $res->code()); return 0; } return 1; } sub _encode { my $self = shift; my $s = shift; $s =~ s|[/ ]|_|g; return $s; } sub _diskfree { # poor man's df # if you want it portable, use Filesys::Statvfs my $self = shift; my $dir = shift; my $size; open DF, "df -P $dir|" or return 0; my $line = ; # skip header if ( $line = ) { if ($line =~ /\s(\d+)\s+\d{1,3}% (\/.*)$/) { $size = $1; } } else { $size = -1; #some error occurred } close DF; return $size; }