reimplement AsyncFileGetter
[videosite.git] / videosite / AsyncFileGetter.pm
index c47f9dd..1489f88 100644 (file)
@@ -1,5 +1,5 @@
 # (c) 2007 by Ralf Ertzinger <ralf@camperquake.de>
-#     2008-2009,2011-2012 by Christian Garbs <mitch@cgarbs.de>
+#     2015 by Christian Garbs <mitch@cgarbs.de>
 #
 # licensed under GNU GPL v2
 #
@@ -13,10 +13,6 @@ use videosite::FileGetter;
 @ISA = qw(videosite::FileGetter);
 
 use strict;
-use LWP::Simple qw(!get);
-use File::Basename;
-use File::Temp qw(tempfile);
-use MIME::Base64;
 
 sub new {
     my $class = shift;
@@ -28,55 +24,35 @@ sub new {
     return bless($self, $class);
 }
 
-sub get {
+sub _download {
     my $self = shift;
+    my $dlurl = shift;
+    my $dlfile = shift;
     my $video = shift;
-    my $dlfile;
-    my $dirname;
-    my $cookie = "";
-    my $useragent = "-H \"User-Agent: Mozilla/5.0\"";
+    my $child_pid;
 
-    $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'});
-
-    $dlfile =~ s/([\\"])/\\$1/g;
-
-    $dirname = dirname($dlfile);
-    if ($self->_diskfree($dirname) < $self->_getval('MINFREE')) {
-        $self->error("Not enough free space to download");
-        return 0;
-    }
-
-    $self->debug('Going to download %s to %s', $video->{'DLURL'}, $dlfile);
-
-    my (undef, $tmpfile) = tempfile('videosite.tmp.XXXXXXXXXXXX', DIR => $dirname);
-
-    my %saved_env;
+    # fork to background
+    $child_pid = fork();
     
-    if (exists($video->{'CONNECTOR'})) {
-        my $schemas = $video->{'CONNECTOR'}->{'schemas'};
-        foreach my $schemakey(keys(%{$schemas})) {
-            $self->debug("Setting %s_proxy to %s", $schemakey, $schemas->{$schemakey});
-            my $envkey = $schemakey.'_proxy';
-            $saved_env{ $envkey } = $ENV{ $envkey };
-            $ENV{ $envkey } = $schemas->{$schemakey};
-        }
+    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);
     }
-    
-    $cookie = "-H \"Cookie: $video->{'COOKIE'}\"" if (defined $video->{'COOKIE'});
-    my $cmdline = "( GET $useragent $cookie \"$video->{'DLURL'}\" > \"$tmpfile\" && mv \"$tmpfile\" \"$dlfile\" && chmod =rw \"$dlfile\" || rm -f \"$tmpfile\" ) &";
-    $self->debug(encode_base64($cmdline));
-    system($cmdline);
-
-    # restore environment
-    foreach my $envkey (keys %saved_env) {
-       $self->debug("Restoring environment: %s=%s", $envkey, $saved_env{ $envkey} );
-        $ENV{ $envkey } = $saved_env{ $envkey };
+    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!');
     }
 
     return 1;
 }
+