From a2a01d4c16fdfcf80a887a648a9b489d2ee704fa Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Thu, 11 Nov 2021 12:37:15 +0000 Subject: [PATCH] implement {add,del}-unwanted-artist commands --- bin/mpd-feeder | 83 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/bin/mpd-feeder b/bin/mpd-feeder index be0fc2c..ee17eda 100755 --- a/bin/mpd-feeder +++ b/bin/mpd-feeder @@ -113,7 +113,7 @@ class Feeder { has $opt :reader; has $db; has $db_generation; - has $db_needs_update = 1; + has $db_needs_update :writer = 1; has $mpd :reader; use constant DEFAULT_CONFIG_FILE => '/etc/mpd-feeder/mpd-feeder.conf'; @@ -312,6 +312,42 @@ SQL return @result; } + method db_add_unwanted_artist($artist) { + $self->connect_db; + + try { + $db->do( + <<'SQL', +INSERT INTO unwanted_artists(artist, generation) +VALUES($1, $2) +SQL + undef, $artist, $db_generation + ); + return 1; + } + catch { + my $err = $@; + + $log->debug("PostgreSQL error: $err"); + $log->debug( "SQLSTATE = " . $db->state ); + return 0 if $db->state eq '23505'; + + die $err; + } + } + + method db_del_unwanted_artist($artist) { + $self->connect_db; + + return 1 == $db->do( + <<'SQL', +DELETE FROM unwanted_artists +WHERE artist = $1 +SQL + undef, $artist + ); + } + method queue_songs($num = undef, $callback = undef) { if (!defined $num) { $self->connect_mpd; @@ -410,26 +446,57 @@ SQL my $feeder = Feeder->new(); -sub usage { - die "Usage: mpd-feeder [option...] [command]\n"; -} - if (@ARGV) { - usage if @ARGV > 1; - my $cmd = shift @ARGV; if ($cmd eq 'dump-config') { + die "dump-config command accepts no arguments\n" if @ARGV; + $feeder->opt->dump; exit; } -# FIXME: handle blacklist manipulation + + if ( $cmd eq 'add-unwanted-artist' ) { + die "Missing command arguments\n" unless @ARGV; + $feeder->set_db_needs_update(0); + for my $artist (@ARGV) { + if ( $feeder->db_add_unwanted_artist($artist) ) { + $log->info("Artist '$artist' added to the unwanted list\n"); + } + else { + $log->warn("Artist '$artist' already in the unwanted list\n"); + } + } + exit; + } + + if ( $cmd eq 'del-unwanted-artist' ) { + die "Missing command arguments\n" unless @ARGV; + $feeder->set_db_needs_update(0); + for my $artist (@ARGV) { + if ( $feeder->db_del_unwanted_artist($artist) ) { + $log->info("Artist '$artist' deleted from the unwanted list\n"); + } + else { + $log->warn("Artist '$artist' is not in the unwanted list\n"); + } + } + exit; + } + + if ( $cmd eq 'add-unwanted-album' ) { + die "NOT IMPLEMENTED\n"; + } if ( $cmd eq 'one-shot' ) { + die "one-shot command accepts no arguments\n" if @ARGV; + $feeder->queue_songs(undef, sub { exit }); $feeder->mpd->loop->run; } elsif ( $cmd eq 'single' ) { + die "single command accepts no arguments\n" if @ARGV; + $feeder->queue_songs(1, sub { exit }); $feeder->mpd->loop->run; } -- 2.39.2