From 4e8e15b2fb82f66cdc69d9e7417df17900840f0b Mon Sep 17 00:00:00 2001
From: Alexandre Morignot <erdnaxeli@cervoi.se>
Date: Sun, 14 Jun 2015 11:40:56 +0200
Subject: [PATCH] set download on a queue

---
 lib/sessions/downloader.pm     |  5 ++++-
 lib/sessions/downloader/ddl.pm | 34 ++++++++++++++++++++++++++++------
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/lib/sessions/downloader.pm b/lib/sessions/downloader.pm
index bdc831c..0195c5e 100644
--- a/lib/sessions/downloader.pm
+++ b/lib/sessions/downloader.pm
@@ -18,13 +18,16 @@ POE::Session->create(
         filename        => \&sessions::downloader::ddl::filename,
         signal_filename => \&sessions::downloader::ddl::signal_filename,
         signal_ddl      => \&sessions::downloader::ddl::signal_ddl,
+        end_task        => \&sessions::downloader::ddl::end_task,
     },
 );
 
 
 sub on_start {
-    my $kernel = $_[KERNEL];
+    my ($kernel, $heap) = @_[KERNEL, HEAP];
     $kernel->alias_set('downloader');
+    $heap->{ddl}->{tasks} = [];
+
     $log->info("session started");
 }
 
diff --git a/lib/sessions/downloader/ddl.pm b/lib/sessions/downloader/ddl.pm
index 57aa461..05bb268 100644
--- a/lib/sessions/downloader/ddl.pm
+++ b/lib/sessions/downloader/ddl.pm
@@ -27,6 +27,14 @@ sub exec {
     return if (not $id or not $url);
     $log->debug("DDL '$id' '$url' ");
 
+    # is there already a task running ?
+    if ($heap->{ddl}->{running}) {
+        push $heap->{ddl}->{tasks}, [$id, $url];
+        return;
+    }
+
+    $heap->{ddl}->{running} = 1;
+
     # first we need to got filename
     my $child = POE::Wheel::Run->new(
         Program     => [
@@ -75,6 +83,7 @@ sub signal_filename {
         $log->error("error getting filename for $id : $status");
         $heap->{ddl}->{pb}->{$id}->{child} = undef;
 
+        $kernel->yield("end_task");
         return;
     }
 
@@ -103,7 +112,7 @@ sub signal_filename {
 
 sub signal_ddl {
     $log->debug("DDL");
-    my ($heap, $pid, $status) = @_[HEAP, ARG1, ARG2];
+    my ($kernel, $heap, $pid, $status) = @_[KERNEL, HEAP, ARG1, ARG2];
 
     my $child   = delete $heap->{ddl}->{pid}->{$pid};
     my $id      = delete $heap->{ddl}->{wid}->{$child->ID};
@@ -111,13 +120,26 @@ sub signal_ddl {
 
     if ($status ne "0") {
         $log->error("error downloading $id : $status");
-        return;
+    }
+    else {
+        eval {
+            utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename});
+        };
+        $log->error($@) if ($@);
     }
 
-    eval {
-        utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename});
-    };
-    $log->error($@) if ($@);
+    $kernel->yield("end_task");
+}
+
+sub end_task {
+    my ($kernel, $heap) = @_[KERNEL, HEAP];
+
+    $heap->{ddl}->{running} = 0;
+
+    if (@{ $heap->{ddl}->{tasks} }) {
+        my $task = shift $heap->{ddl}->{tasks};
+        $kernel->yield(ddl => $task->[0], $task->[1]);
+    }
 }
 
 1;
-- 
GitLab