- Initial checkin
[videosite.git] / videosite / FileGetter.pm
1 package FileGetter;
2
3 use GetterBase;
4 @ISA = qw(GetterBase);
5
6 use strict;
7 use LWP::Simple qw(!get);
8 use File::Basename;
9
10 sub new {
11     my $class = shift;
12     my $self = $class->SUPER::new();
13
14     $self->{'NAME'} = 'filegetter';
15     $self->{'_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 _)"]};
16
17     bless($self, $class);
18     $self->_prepare_parameters();
19
20     return $self;
21 }
22
23 sub get {
24     my $self = shift;
25     my $video = shift;
26     my $dlfile;
27     my $dirname;
28
29     $dlfile = sprintf($self->_getval('FILEPATTERN'),
30         $self->_encode($video->{'TYPE'}),
31         $self->_encode($video->{'ID'}),
32         $self->_encode($video->{'TITLE'}),
33         $self->_encode($video->{'DLURL'}),
34         $self->_encode($video)->{'URL'});
35
36     $dirname = dirname($dlfile);
37     if ($self->_diskfree($dirname) < $self->_getval('MINFREE')) {
38         $self->error("Not enough free space to download");
39         return 0;
40     }
41
42     $self->debug('Going to download %s to %s', $video->{'DLURL'}, $dlfile);
43
44     if (200 != LWP::Simple::mirror($video->{'DLURL'}, $dlfile)) {
45         $self->error('Could not download %s to %s', $video->{'DLURL'}, $dlfile);
46         return 0;
47     }
48
49     return 1;
50 }
51
52
53 sub _encode {
54     my $self = shift;
55     my $s = shift;
56
57     $s =~ s|[/ ]|_|g;
58
59     return $s;
60 }
61
62 sub _diskfree {
63
64     # poor man's df
65     # if you want it portable, use Filesys::Statvfs
66
67     my $self = shift;
68     my $dir = shift;
69     my $size;
70
71     open DF, "df -P $dir|" or return 0;
72     my $line = <DF>; # skip header
73
74     if ( $line = <DF> ) {
75         if ($line =~ /\s(\d+)\s+\d{1,3}% (\/.*)$/) {
76             $size = $1;
77         }
78     } else {
79         $size = -1; #some error occurred
80     }
81
82     close DF;
83     return $size;
84 }