]> git.ktnx.net Git - mpd-feeder.git/commitdiff
implement unwanted album list manipulation
authorDamyan Ivanov <dmn@debian.org>
Tue, 16 Nov 2021 06:25:22 +0000 (06:25 +0000)
committerDamyan Ivanov <dmn@debian.org>
Tue, 16 Nov 2021 06:25:22 +0000 (06:25 +0000)
lib/App/MPD/Feeder/Command.pm
lib/App/MPD/Feeder/DB.pm

index 9a425be023bb419fc5952b7fb7fc7c22de0f3492..d2c4130a5691a9373d2db1ee35a90ad09bd30d77 100644 (file)
@@ -3,7 +3,7 @@ package App::MPD::Feeder::Command;
 use strict;
 use warnings;
 use utf8;
-use feature 'say';
+use feature qw(fc say);
 
 use Log::Any qw($log);
 use Object::Pad;
@@ -65,7 +65,53 @@ isa App::MPD::Feeder {
         }
 
         if ( $cmd eq 'add-unwanted-album' ) {
-            die "NOT IMPLEMENTED\n";
+            die
+                "Syntax: mpd-feeder add-unwanted-album «album name» by «artist name»\n"
+                unless @args == 3 and $args[1] =~ /^by$/i;
+            $self->set_db_needs_update(0);
+            my ( $album, $artist ) = @args[ 0, 2 ];
+            if ( $self->db->add_unwanted_album( $album, $artist ) ) {
+                $log->info(
+                    "Album «$album» by «$artist» added to the unwanted list\n"
+                );
+            }
+            else {
+                $log->warn(
+                    "Album «$album» by «$artist» already in the unwanted list\n"
+                );
+            }
+
+            return 0;
+        }
+
+        if ( $cmd eq 'del-unwanted-album' ) {
+            die
+                "Syntax: mpd-feeder del-unwanted-album «album name» by «artist name»\n"
+                unless @args == 3 and $args[1] =~ /^by$/i;
+            $self->set_db_needs_update(0);
+            my ( $album, $artist ) = @args[ 0, 2 ];
+            if ( $self->db->del_unwanted_album( $album, $artist ) ) {
+                $log->info(
+                    "Album «$album» by «$artist» deleted from the unwanted list\n"
+                );
+            }
+            else {
+                $log->warn(
+                    "Album «$album» by «$artist» is not in the unwanted list\n"
+                );
+            }
+
+            return 0;
+        }
+
+        if ( $cmd eq 'list-unwanted-albums' ) {
+            die "This command has no arguments\n" if @args;
+            $self->set_db_needs_update(0);
+            my $count = $self->db->walk_unwanted_albums(
+                sub ( $album, $artist ) { say "«$album» by «$artist»" } );
+            say "Total unwanted albums: $count";
+
+            return 0;
         }
 
         if ( $cmd eq 'one-shot' ) {
index 62164364e167f6415d4c0538d0443cd2b8240687..5ba1dde2c8a87e35634a2f7dc4abaafc7fc9fd08 100644 (file)
@@ -293,6 +293,59 @@ SQL
         return $count;
     }
 
+    method add_unwanted_album($album, $artist) {
+        $self->connect;
+
+        try {
+            $db->do(
+                <<'SQL',
+INSERT INTO unwanted_albums(album, artist, generation)
+VALUES($1, $2, $3)
+SQL
+                undef, $album, $artist, $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 del_unwanted_album($album, $artist) {
+        $self->connect;
+
+        return 1 == $db->do(
+            <<'SQL',
+DELETE FROM unwanted_albums
+WHERE album = $1 AND artist = $2
+SQL
+            undef, $album, $artist
+        );
+    }
+
+    method walk_unwanted_albums($callback) {
+        $self->connect;
+
+        my $count = 0;
+
+        my $sth = $db->prepare('SELECT album, artist FROM unwanted_albums ORDER BY 2, 1');
+        my ( $album, $artist );
+        $sth->execute;
+        $sth->bind_columns( \$album, \$artist );
+        while ( $sth->fetchrow_arrayref ) {
+            $count++;
+            $callback->($album, $artist);
+        }
+
+        return $count;
+    }
+
     method disconnect {
         return unless $db;