]> git.ktnx.net Git - mpd-feeder.git/blobdiff - bin/mpd-feeder
connect to the DB early when in feeder mode
[mpd-feeder.git] / bin / mpd-feeder
index da60df88a227312970e952c9f4506ecebf33ac2b..8644dde79e4b6addcbceaf71695e20f204c38f02 100755 (executable)
@@ -180,6 +180,22 @@ use Net::Async::MPD;
                 },
             )
         );
+
+        $mpd->loop->add(
+            IO::Async::Signal->new(
+                name       => 'USR1',
+                on_receipt => sub {
+                    $log->debug("SIGUSR1 received. Dumping configuration to STDERR");
+                    my $old = select \*STDERR;
+                    try {
+                        $opt->dump;
+                    }
+                    finally {
+                        select $old;
+                    }
+                },
+            )
+        );
     }
 
     method connect_db {
@@ -199,6 +215,8 @@ use Net::Async::MPD;
         my $sth = $db->prepare_cached("select $name from options");
         $sth->execute;
         my @result = $sth->fetchrow_array;
+        $sth->finish;
+        undef $sth;
 
         return $result[0];
     }
@@ -283,7 +301,8 @@ SQL
             foreach my $entry (@$rows) {
                 next unless exists $entry->{file};
                 $self->db_store_song( $entry->{file},
-                    $entry->{Artist}, $entry->{Album} );
+                    $entry->{AlbumArtist} // $entry->{Artist},
+                    $entry->{Album} );
                 $song_count++;
             }
 
@@ -313,11 +332,11 @@ SQL
         $self->update_db;
 
         my @result;
-        my $sth = $db->prepare_cached(<<SQL);
+        my $sql = <<SQL;
 SELECT s.path, s.artist, s.album
 FROM songs s
 JOIN artists ar ON ar.artist=s.artist
-JOIN albums al ON al.album=s.album
+JOIN albums al ON al.album=s.album AND al.artist=s.artist
 WHERE (s.last_queued IS NULL OR s.last_queued < CURRENT_TIMESTAMP - (? || ' seconds')::interval)
   AND (ar.last_queued IS NULL OR ar.last_queued < CURRENT_TIMESTAMP - (? || ' seconds')::interval)
   AND (al.last_queued IS NULL OR al.last_queued < CURRENT_TIMESTAMP - (? || ' seconds')::interval)
@@ -326,16 +345,17 @@ WHERE (s.last_queued IS NULL OR s.last_queued < CURRENT_TIMESTAMP - (? || ' seco
 ORDER BY random()
 LIMIT ?
 SQL
-        $sth->execute(
-            $opt->min_song_interval,
-            $opt->min_artist_interval,
-            $opt->min_album_interval,
-            $num,
+        my @params = (
+            $opt->min_song_interval,  $opt->min_artist_interval,
+            $opt->min_album_interval, $num,
         );
+        my $sth = $db->prepare_cached($sql);
+        $sth->execute(@params);
         while ( my @row = $sth->fetchrow_array ) {
             push @result,
                 { song => $row[0], artist => $row[1], album => $row[2] };
         }
+        undef $sth;
 
         return @result;
     }
@@ -383,7 +403,8 @@ SQL
                 sub {
                     my $present = scalar @{ $_[0] };
 
-                    $log->notice("Playlist contains $present songs");
+                    $log->notice( "Playlist contains $present songs. Wanted: "
+                            . $opt->target_queue_length );
                     if ( $present < $opt->target_queue_length ) {
                         $self->queue_songs(
                             $opt->target_queue_length - $present, $callback );
@@ -550,6 +571,8 @@ if (@ARGV) {
     }
 }
 
+$feeder->connect_db;
+
 for ( ;; ) {
     $feeder->queue_songs( undef, sub { $feeder->run } );