X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=bin%2Fmpd-feeder;h=be0fc2c073b7e2c0ba466442b535d05afa87dbbe;hb=744b004c547dab563ead08fa0da87dabf6e537e9;hp=5760c751633483dd6f02fe95fe908ae6876e42c1;hpb=77b8cd069f36114e027cb5295bd0b65586bdd04c;p=mpd-feeder.git diff --git a/bin/mpd-feeder b/bin/mpd-feeder index 5760c75..be0fc2c 100755 --- a/bin/mpd-feeder +++ b/bin/mpd-feeder @@ -113,6 +113,7 @@ class Feeder { has $opt :reader; has $db; has $db_generation; + has $db_needs_update = 1; has $mpd :reader; use constant DEFAULT_CONFIG_FILE => '/etc/mpd-feeder/mpd-feeder.conf'; @@ -138,6 +139,8 @@ use Net::Async::MPD; $opt->parse_command_line; + $db_needs_update = 0 if $opt->skip_db_update; + Log::Any::Adapter->set( Stderr => log_level => $opt->log_level ); } @@ -156,12 +159,12 @@ use Net::Async::MPD; $db = DBI->connect( "dbi:Pg:dbname=" . $opt->db_path, $opt->db_user, $opt->db_password, - { RaiseError => 1, AutoCommit => 1 } ); + { RaiseError => 1, PrintError => 0, AutoCommit => 1 } ); $log->info( "Connected to database " . $opt->db_path ); $db_generation = $self->db_get_option('generation'); $log->debug("DB generation is $db_generation"); - $self->update_db unless $opt->skip_db_update; + $self->update_db; } method db_get_option($name) { @@ -231,48 +234,55 @@ SQL )->execute( $item->{artist}, $item->{album} ); } - method update_db() { + method update_db($force = undef) { + if (!$db_needs_update and !$force) { + $log->debug("Skipping DB update"); + return; + } + $log->info('Updating song database'); - $mpd->send('listallinfo')->on_done( - sub { - try { - my $rows = shift; - $db->begin_work; + $self->connect_mpd; + $self->connect_db; - $db_generation++; + my $rows = $mpd->send('listallinfo')->get; + try { + $db->begin_work; - my $song_count; + $db_generation++; - foreach my $entry (@$rows) { - next unless exists $entry->{file}; - $self->db_store_song( $entry->{file}, - $entry->{Artist}, $entry->{Album} ); - $song_count++; - } + my $song_count; - $log->info("Updated data about $song_count songs"); + foreach my $entry (@$rows) { + next unless exists $entry->{file}; + $self->db_store_song( $entry->{file}, + $entry->{Artist}, $entry->{Album} ); + $song_count++; + } - $self->db_remove_stale_entries; + $log->info("Updated data about $song_count songs"); - $self->db_set_option( generation => $db_generation ); + $self->db_remove_stale_entries; - $db->commit; - } - catch { - my $err = $@; + $self->db_set_option( generation => $db_generation ); - $db_generation--; + $db->commit; - $db->rollback; + $db_needs_update = 0; + } + catch { + my $err = $@; - die $err; - } - } - ); + $db_generation--; + + $db->rollback; + + die $err; + } } method db_find_suitable_songs($num) { $self->connect_db; + $self->update_db; my @result; my $sth = $db->prepare_cached(<connect_mpd; if (!defined $num) { + $self->connect_mpd; $mpd->send('playlist')->on_done( sub { my $present = scalar @{ $_[0] }; @@ -350,8 +360,8 @@ SQL for (@paths) { push @commands, [ add => "\"$_\"" ]; } + $self->connect_mpd; my $f = $mpd->send( \@commands ); - warn "here"; $f->on_fail( sub { die @_ } ); $f->on_done( sub { @@ -360,8 +370,6 @@ SQL $callback->(@_) if $callback; } ); - - warn "here"; } method prepare_to_wait_idle { @@ -370,10 +378,9 @@ SQL sub { warn $_ for @_; my $result = shift; - use JSON; warn to_json($result); if ( $result->{changed} eq 'database' ) { - $self->update_db; + $db_needs_update = 1; $self->prepare_to_wait_idle; } elsif ( $result->{changed} eq 'playlist' ) { @@ -431,7 +438,6 @@ if (@ARGV) { } } - $feeder->queue_songs( undef, sub { $feeder->run } ); $feeder->mpd->loop->run;