]> 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 dbdcafb39494df4a0f2ae796faa57415b3c0d764..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;
         }
@@ -482,5 +499,31 @@ SQL
             undef $db;
         }
     }
+
+    method run_loop {
+        $self->connect_db;
+
+        for ( ;; ) {
+            $self->queue_songs( undef, sub { $self->run } );
+
+            $log->debug("Entering event loop. PID=$$");
+
+            my $result = $mpd->loop->run;
+            $log->trace( "Got loop result of " . ( $result // 'undef' ) );
+
+            if ( 'reload' eq $result ) {
+                $log->notice("disconnecting");
+                $self->stop;
+
+                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;
+            }
+        }
+    }
 }