]> git.ktnx.net Git - mpd-feeder.git/blobdiff - bin/mpd-feeder
fix filling album information
[mpd-feeder.git] / bin / mpd-feeder
index b671b369d1fd473796ef4759c355ee443ee07d52..42e3f7bb4516f55e8259ed36a001a89c17bb349a 100755 (executable)
@@ -4,11 +4,12 @@ use v5.32;
 
 use Getopt::Long ();
 use Log::Any qw($log);
-use Log::Any::Adapter Stderr => log_level => 'trace';
+use Log::Any::Adapter Stderr => log_level => 'error';
 use Object::Pad;
 use Syntax::Keyword::Try;
 
 class Options {
+    use Log::Any qw($log);
     use Time::Duration qw(duration_exact);
     use Time::Duration::Parse qw(parse_duration);
     has $log_level           :reader = 'warn';
@@ -27,12 +28,14 @@ class Options {
         Getopt::Long::GetOptions(
             'log-level=s'               => \$log_level,
             'skip-db-update!'           => \$skip_db_update,
-            'tql|target-queue-length=n' => \$target_queue_length,
-            'mpd-host=s'                => \$mpd_host,
-            'mpd-port=s'                => \$mpd_port,
-            'db-path=s'                 => \$db_path,
-            'db-user=s'                 => \$db_user,
-            'min-album-interval=s'      => sub {
+            'tql|target-queue-length=n' => sub {
+                $target_queue_length = parse_integer(pop);
+            },
+            'mpd-host=s'           => \$mpd_host,
+            'mpd-port=s'           => \$mpd_port,
+            'db-path=s'            => \$db_path,
+            'db-user=s'            => \$db_user,
+            'min-album-interval=s' => sub {
                 $min_album_interval = parse_duration(pop);
             },
             'min-sing-interval=s' => sub {
@@ -54,6 +57,8 @@ class Options {
         $value = $converter->($value) if $converter;
 
         $$target_ref = $value;
+
+        $log->trace("Option $section.$option = $value");
     }
 
     method dump {
@@ -63,7 +68,6 @@ class Options {
         say "[mpd]";
         say "host = " . ( $mpd_host // '' );
         say "port = " . ( $mpd_port // '' );
-        say "target-queue-length = $target_queue_length";
         say "";
         say "[queue]";
         say "target-length = $target_queue_length";
@@ -77,7 +81,14 @@ class Options {
         say "password = " . ( $db_password // '' );
     }
 
+    sub parse_integer($input) {
+        die "Invalid integer value '$input'" unless $input =~ /^\+?\d{1,18}$/;
+        return $input + 0;
+    }
+
     method parse_config_file($path) {
+        $log->trace("Parsing configuration file $path");
+
         use Config::INI::Reader;
         my $ini = Config::INI::Reader->read_file($path);
 
@@ -87,7 +98,9 @@ class Options {
         handle_config_option( $ini => 'mpd-feeder' => log_level => \$log_level );
 
         handle_config_option(
-            $ini => queue => 'target-length' => \$target_queue_length );
+            $ini => queue => 'target-length' => \$target_queue_length,
+            \&parse_integer
+        );
         handle_config_option(
             $ini => queue => 'min-song-interval' => \$min_song_interval,
             \&parse_duration
@@ -167,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 {
@@ -270,7 +299,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++;
             }
 
@@ -370,7 +400,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 );