$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',
$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);
$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(
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;
}
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;
+
+ my @exec = ( $0, '--config', $self->cfg_file, '--skip-db-update' );
+ if ( $log->is_trace ) {
+ $log->trace( 'exec '
+ . join( ' ', map { /\s/ ? "'$_'" : $_ } @exec ) );
+ }
+ exec(@exec);
+ }
+
+ if ( 'quit' eq $result ) {
+ $log->trace("quitting because of 'quit' loop result");
+ $self->stop;
+ exit 0;
+ }
+ }
+ }
}