pldb: Remove a list when incrementing or decrementing out of range.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 11 Feb 2023 23:05:12 +0000 (23:05 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 11 Feb 2023 23:05:12 +0000 (23:05 +0000)
This typically means that you've finished watching the playlist.

pldb

diff --git a/pldb b/pldb
index 73fb31d..b988145 100755 (executable)
--- a/pldb
+++ b/pldb
@@ -123,7 +123,7 @@ defcmd "edit GROUP LIST[[+|-]=POS]|-LIST ...", sub {
   my $st_del = $DB->prepare
     ("DELETE FROM playlist_position WHERE group_name = ? AND list_name = ?");
 
-  for my $op (@ops) {
+  OP: for my $op (@ops) {
     if ($op =~ /^ - (.++) $/x) {
       my ($list) = ($1);
       must_list $list; must_member $group, $list;
@@ -143,8 +143,10 @@ defcmd "edit GROUP LIST[[+|-]=POS]|-LIST ...", sub {
        @r or die "`$list' is not a member of `$group'";
        my ($cur) = @r; $st_getpos->finish;
 
-       if ($rel eq "+") { $pos = $cur + $pos; }
-       elsif ($rel eq "-") { $pos = $cur - $pos; }
+       my $end;
+       if ($rel eq "+") { $pos = $cur + $pos; $end = $n; }
+       elsif ($rel eq "-") { $pos = $cur - $pos; $end = 0; }
+       if ($pos == $end) { $st_del->execute($group, $list); next OP; }
       }
       0 <= $pos && $pos < $n
        or die "`$list' position $pos out of range 0 .. $n";