X-Git-Url: https://git.draconx.ca/gitweb/mpdhacks.git/blobdiff_plain/e31f68d79d01f8a497ca1e98b3dc1a57198cfba9..f0e74c3a1fc44153fe80961ff7de3b4a0786e5ea:/mpdreload.pl diff --git a/mpdreload.pl b/mpdreload.pl index 3a7e1a1..66bb39d 100755 --- a/mpdreload.pl +++ b/mpdreload.pl @@ -1,6 +1,6 @@ #!/usr/bin/env perl # -# Copyright © 2019-2020 Nick Bowler +# Copyright © 2019-2021 Nick Bowler # # Replace the current MPD play queue with a saved playlist, by rearranging # existing queue entries when possible. This avoids losing the current @@ -130,20 +130,27 @@ my $end_position = (keys %$current); my $num_added = 0; my $add_start; +sub load_tracks($) { + my ($seq) = @_; + + my $start = $add_start // $seq; + my $end = $seq+1; + + my $add_position = $end_position; + MPD::exec("load", $ARGV[0], "$start:$end"); + $end_position += $end - $start; + MPD::exec("move", "$add_position:$end_position", "$start") + if ($add_position != $start); + + undef $add_start; +} + MPD::exec("command_list_begin"); for (my $i = 0; $i < @$target; $i++) { my $f = $target->[$i]; my $id = shift @{ $current->{$f} }; - if (defined $id and defined $add_start) { - my $add_position = $end_position; - - MPD::exec("load", $ARGV[0], "$add_start:$i"); - $end_position += $i - $add_start; - MPD::exec("move", "$add_position:$end_position", "$add_start"); - - undef $add_start; - } + load_tracks($i - 1) if (defined $id and defined $add_start); if (defined $id) { # Try not to move tracks already in the right place. @@ -157,7 +164,8 @@ for (my $i = 0; $i < @$target; $i++) { # Now all unwanted tracks from the original playqueue have been moved to the # end and can be deleted all at once. -my $rem = ($add_start // @$target) - @$target; -MPD::exec("delete", @$target - $rem . ":") if map { @$_ } values %$current; + +my $pos = $add_start // @$target; +MPD::exec("delete", $pos . ":") if map { @$_ } values %$current; MPD::exec("load", $ARGV[0], "$add_start:") if defined $add_start; MPD::run("command_list_end");