reimplement AsyncFileGetter
[videosite.git] / videosite / AsyncFileGetter.pm
index 04e8226..1489f88 100644 (file)
@@ -1,5 +1,5 @@
 # (c) 2007 by Ralf Ertzinger <ralf@camperquake.de>
-#     2008 by Christian Garbs <mitch@cgarbs.de>
+#     2015 by Christian Garbs <mitch@cgarbs.de>
 #
 # licensed under GNU GPL v2
 #
@@ -7,50 +7,52 @@
 # in the background
 #
 
-package AsyncFileGetter;
+package videosite::AsyncFileGetter;
 
-use FileGetter;
-@ISA = qw(FileGetter);
+use videosite::FileGetter;
+@ISA = qw(videosite::FileGetter);
 
 use strict;
-use LWP::Simple qw(!get);
-use File::Basename;
 
 sub new {
     my $class = shift;
-    my $self = $class->SUPER::new();
+    my $self = $class->SUPER::new(
+        NAME => 'asyncfilegetter',
+        @_,
+    );
 
-    $self->{'NAME'} = 'asyncfilegetter';
-
-    bless($self, $class);
-    $self->_prepare_parameters();
-
-    return $self;
+    return bless($self, $class);
 }
 
-sub get {
+sub _download {
     my $self = shift;
+    my $dlurl = shift;
+    my $dlfile = 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;
+    my $child_pid;
+
+    # fork to background
+    $child_pid = fork();
+    
+    if ($child_pid) {               # parent
+       $self->debug('parent spawned process %d for download', $child_pid);
+       if (exists $self->{_API}->{wait_for_child}) {
+           $self->debug('calling wait_for_child on %d', $child_pid);
+           $self->{_API}->{wait_for_child}->($child_pid);
+       }
+       Irssi::pidwait_add($child_pid);
+    }
+    elsif (defined $child_pid) {    # child
+        close STDIN;
+        close STDOUT;
+        close STDERR;
+       $self->debug('CHILD: start download');
+       $self->SUPER::_download($dlurl, $dlfile, $video);
+       $self->debug('CHILD: end download');
+       exit;
+       $self->debug('CHILD: AFTER EXIT? WTF!');
     }
-
-    $self->debug('Going to download %s to %s', $video->{'DLURL'}, $dlfile);
-
-    my $cmdline = "GET \"$video->{'DLURL'}\" > \"$dlfile\" &";
-    system($cmdline);
 
     return 1;
 }
+