fix quoting in AsyncWgetFileGetter again
[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 videosite::FileGetter;
8
9 use videosite::GetterBase;
10 @ISA = qw(videosite::GetterBase);
11
12 use strict;
13 use File::Basename;
14
15 sub new {
16     my $class = shift;
17     my $self = $class->SUPER::new(
18         NAME => 'filegetter',
19         _PARAMS => {
20             MINFREE => ['500000', 'The amount of space that needs to be available on the filesystem before the video is downloaded (in kilobytes)'],
21             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         @_,
24     );
25
26     return bless($self, $class);
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     if (exists($video->{'CONNECTOR'})) {
49         $self->selectconn($video->{'CONNECTOR'});
50     }
51
52
53     $self->_download( $video->{'DLURL'}, $dlfile, $video )
54         or return 0;
55
56     if (exists($video->{'DLURL_AUDIO'})) {
57         $self->_download( $video->{'DLURL_AUDIO'}, $dlfile . '.audio', $video )
58             or return 0;
59     }
60
61     return 1;
62 }
63
64
65 sub _download {
66     my $self = shift;
67     my $dlurl = shift;
68     my $dlfile = shift;
69     my $video = shift;
70     my $res;
71
72     $self->debug('Going to download %s to %s', $dlurl, $dlfile);
73
74     $res = $self->ua()->mirror($dlurl, $dlfile);
75     
76     if (!$res->is_success()) {
77         $self->error('Could not download %s to %s (%s)', $dlurl, $dlfile, $res->code());
78         return 0;
79     }
80
81     return 1;
82 }
83
84 sub _encode {
85     my $self = shift;
86     my $s = shift;
87
88     $s =~ s|[/ ]|_|g;
89
90     return $s;
91 }
92
93 sub _diskfree {
94
95     # poor man's df
96     # if you want it portable, use Filesys::Statvfs
97
98     my $self = shift;
99     my $dir = shift;
100     my $size;
101
102     open DF, "df -P $dir|" or return 0;
103     my $line = <DF>; # skip header
104
105     if ( $line = <DF> ) {
106         if ($line =~ /\s(\d+)\s+\d{1,3}% (\/.*)$/) {
107             $size = $1;
108         }
109     } else {
110         $size = -1; #some error occurred
111     }
112
113     close DF;
114     return $size;
115 }