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