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