]> git.ktnx.net Git - mpd-feeder.git/blobdiff - lib/App/MPD/Feeder.pm
exit cleanly on SIGTERM and SIGINT
[mpd-feeder.git] / lib / App / MPD / Feeder.pm
index 4285e7077549ce294e26b6c7b6d75babef7f9da3..c495f9c1a257b992c349959157cfe493d4e14dd6 100644 (file)
@@ -58,6 +58,26 @@ use constant DEFAULT_CONFIG_FILE => '/etc/mpd-feeder/mpd-feeder.conf';
 
         $mpd = Net::Async::MPD->new(%conn);
 
+        $mpd->loop->add(
+            IO::Async::Signal->new(
+                name       => 'TERM',
+                on_receipt => sub {
+                    $log->debug("SIGTERM received. Stopping loop");
+                    $mpd->loop->stop('quit');
+                },
+            )
+        );
+
+        $mpd->loop->add(
+            IO::Async::Signal->new(
+                name       => 'INT',
+                on_receipt => sub {
+                    $log->debug("SIGINT received. Stopping loop");
+                    $mpd->loop->stop('quit');
+                },
+            )
+        );
+
         $mpd->loop->add(
             IO::Async::Signal->new(
                 name       => 'HUP',
@@ -248,7 +268,6 @@ SQL
             $sql =~ s/^SELECT .+$/SELECT COUNT(DISTINCT s.path)/m;
             $sql =~ s/^ORDER BY .+$//m;
             $sql =~ s/^LIMIT .+$//m;
-            $log->debug($sql);
             my $sth = $db->prepare_cached($sql);
             pop @params;
             $sth->execute(@params);
@@ -258,26 +277,22 @@ SQL
             $sth = $db->prepare_cached('SELECT COUNT(*) FROM songs');
             $sth->execute;
             my $total = ($sth->fetchrow_array)[0];
+            $sth->finish;
             $log->debug(
                 sprintf(
                     "Number of songs meeting the criteria: %d out of total %d (%5.2f%%)",
                     $count, $total, 100.0 * $count / $total
                 )
             );
-            $sth->finish;
 
             $sql = <<SQL;
 SELECT COUNT(*)
 FROM songs s
 WHERE (s.last_queued IS NULL OR s.last_queued < CURRENT_TIMESTAMP - (? || ' seconds')::interval)
-UNION
-SELECT COUNT(*)
-FROM songs
 SQL
             $sth = $db->prepare_cached($sql);
             $sth->execute($opt->min_song_interval);
             $count = ($sth->fetchrow_array)[0];
-            $total = ($sth->fetchrow_array)[0];
             $sth->finish;
 
             $log->debug(
@@ -292,41 +307,43 @@ SQL
 SELECT COUNT(*)
 FROM artists ar
 WHERE (ar.last_queued IS NULL OR ar.last_queued < CURRENT_TIMESTAMP - (? || ' seconds')::interval)
-UNION
-SELECT COUNT(*)
-FROM artists
 SQL
             $sth = $db->prepare_cached($sql);
             $sth->execute($opt->min_artist_interval);
             $count = ($sth->fetchrow_array)[0];
+            $sth->finish;
+
+            $sth = $db->prepare_cached('SELECT COUNT(*) FROM artists');
+            $sth->execute;
             $total = ($sth->fetchrow_array)[0];
+            $sth->finish;
             $log->debug(
                 sprintf(
                     "Number of artists not queued soon: %d out of total %d (%5.2f%%)",
                     $count, $total, 100.0 * $count / $total
                 )
             );
-            $sth->finish;
 
             $sql = <<SQL;
 SELECT COUNT(*)
 FROM albums al
 WHERE (al.last_queued IS NULL OR al.last_queued < CURRENT_TIMESTAMP - (? || ' seconds')::interval)
-UNION
-SELECT COUNT(*)
-FROM albums
 SQL
             $sth = $db->prepare_cached($sql);
             $sth->execute($opt->min_album_interval);
             $count = ($sth->fetchrow_array)[0];
+            $sth->finish;
+
+            $sth = $db->prepare_cached('SELECT COUNT(*) FROM albums');
+            $sth->execute;
             $total = ($sth->fetchrow_array)[0];
+            $sth->finish;
             $log->debug(
                 sprintf(
                     "Number of albums not queued soon: %d out of total %d (%5.2f%%)",
                     $count, $total, 100.0 * $count / $total
                 )
             );
-            $sth->finish;
 
             undef $sth;
         }
@@ -500,6 +517,12 @@ SQL
 
                 exec( "$0", '--config', $self->cfg_file, '--skip-db-update' );
             }
+
+            if ( 'quit' eq $result ) {
+                $log->trace("quitting because of 'quit' loop result");
+                $self->stop;
+                exit 0;
+            }
         }
     }
 }