X-Git-Url: https://git.draconx.ca/gitweb/mpdhacks.git/blobdiff_plain/8a39a0fd4ed8d545759e07937fa4c66f5d324987..f1a45f3dd740c5b55cd44ff09548d49791191863:/mpdreload.pl?ds=sidebyside diff --git a/mpdreload.pl b/mpdreload.pl index c852a2b..c82353e 100755 --- a/mpdreload.pl +++ b/mpdreload.pl @@ -26,8 +26,8 @@ use MPDHacks; my $sock; -# Returns a hash reference containing all tracks in the current play queue. -# The hash keys are filenames. +# Returns a hash reference mapping filenames to an array reference listing +# the queue IDs for that file in the current play queue. sub get_tracks_in_play_queue { my %matches; my $entry; @@ -39,18 +39,9 @@ sub get_tracks_in_play_queue { if (/^(\w+): (.*)$/) { if ($1 eq "file") { - if (exists($matches{$2})) { - $entry = $matches{$2}; - } else { - $entry = {}; - $matches{$2} = $entry; - } - } - - if (exists($entry->{$1})) { - $entry->{$1}->{$2} = 1; - } else { - $entry->{$1} = { $2 => 1 } + $entry = $matches{$2} //= []; + } elsif ($1 eq "Id") { + push @$entry, $2; } } } @@ -129,19 +120,14 @@ if (@ARGV != 1) { $sock = MPD::connect(); # Retrieve the current play queue and target play queue. +MPD::run("tagtypes", "clear"); my $current = get_tracks_in_play_queue(); my $target = get_playlist_files($ARGV[0]); MPD::exec("command_list_begin"); for (my $i = 0; $i < @$target; $i++) { my $f = $target->[$i]; - my $ids = $current->{$f}->{Id}; - - my $id = (keys %$ids)[0]; - delete $ids->{$id}; - - # Remove tracks with no unused queue IDs - delete $current->{$f} unless (keys %$ids > 0); + my $id = shift @{ $current->{$f} }; if (defined $id) { MPD::exec("moveid", $id, $i); @@ -151,15 +137,5 @@ for (my $i = 0; $i < @$target; $i++) { } # Remove any tracks left from the old play queue. -foreach (keys %$current) { - my $ids = $current->{$_}->{Id}; - foreach (keys %$ids) { - MPD::exec("deleteid", $_); - } -} - -MPD::exec("command_list_end"); -while (<$sock>) { - last if /^OK$/; - die($_) if /^ACK/; -} +MPD::exec("deleteid", $_) foreach (map { @$_ } values %$current); +MPD::run("command_list_end");