Skip to content

Commit

Permalink
safeguard against starting dpls via CLI commands without required par…
Browse files Browse the repository at this point in the history
…am values
  • Loading branch information
AF-1 committed Jun 14, 2024
1 parent d2e08fc commit 836e2c8
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 21 deletions.
85 changes: 65 additions & 20 deletions DynamicPlaylists4/Plugin.pm
Original file line number Diff line number Diff line change
Expand Up @@ -3248,31 +3248,43 @@ sub cliPlayPlaylist {
}

my $params = $request->getParamsCopy();
main::DEBUGLOG && $log->is_debug && $log->debug('params = '.Data::Dump::dump($params));

my $dplUserReqParamCount = keys %{$playLists->{$playlistId}->{'parameters'}};
main::DEBUGLOG && $log->is_debug && $log->debug('number of user req params = '.$dplUserReqParamCount);

my $providedUserReqParamValues = 0;
for my $k (keys %{$params}) {
if ($k =~ /^dynamicplaylist_parameter_(.*)$/) {
my $parameterId = $1;
if (exists $playLists->{$playlistId}->{'parameters'}->{$1}) {
main::DEBUGLOG && $log->is_debug && $log->debug("Using: $k = ".$params->{$k});
$playLists->{$playlistId}->{'parameters'}->{$1}->{'value'} = $params->{$k};
$providedUserReqParamValues++;
}
} else {
main::DEBUGLOG && $log->is_debug && $log->debug("Got: $k = ".$params->{$k});
}
}

my $masterClient = masterOrSelf($client);
if ($dplUserReqParamCount && $dplUserReqParamCount != $providedUserReqParamValues) {
$request->setStatusDone();
$log->warn('This dynamic playlist requires user input but the CLI command did not provide '.($providedUserReqParamValues == 0 ? 'any' : 'all').' parameter values.');
} else {
my $masterClient = masterOrSelf($client);

# Clear any current mix type in case user is restarting an already playing mix
stateStop($masterClient);
my @players = Slim::Player::Sync::slaves($client);
foreach my $player (@players) {
stateStop($player);
}
# Clear any current mix type in case user is restarting an already playing mix
stateStop($masterClient);
my @players = Slim::Player::Sync::slaves($client);
foreach my $player (@players) {
stateStop($player);
}

playRandom($client, $playlistId, 0, 1);
playRandom($client, $playlistId, 0, 1);

$request->setStatusDone();
main::DEBUGLOG && $log->is_debug && $log->debug('Exiting cliPlayPlaylist');
$request->setStatusDone();
main::DEBUGLOG && $log->is_debug && $log->debug('Exiting cliPlayPlaylist');
}
}

sub cliContinuePlaylist {
Expand Down Expand Up @@ -3305,23 +3317,34 @@ sub cliContinuePlaylist {
}

my $params = $request->getParamsCopy();
main::DEBUGLOG && $log->is_debug && $log->debug('params = '.Data::Dump::dump($params));

my $dplUserReqParamCount = keys %{$playLists->{$playlistId}->{'parameters'}};
main::DEBUGLOG && $log->is_debug && $log->debug('number of user req params = '.$dplUserReqParamCount);

my $providedUserReqParamValues = 0;
for my $k (keys %{$params}) {
if ($k =~ /^dynamicplaylist_parameter_(.*)$/) {
my $parameterId = $1;
if (exists $playLists->{$playlistId}->{'parameters'}->{$1}) {
main::DEBUGLOG && $log->is_debug && $log->debug("Using: $k = ".$params->{$k});
$playLists->{$playlistId}->{'parameters'}->{$1}->{'value'} = $params->{$k};
$providedUserReqParamValues++;
}
} else {
main::DEBUGLOG && $log->is_debug && $log->debug("Got: $k = ".$params->{$k});
}
}

playRandom($client, $playlistId, 0, 1, undef, 1);
if ($dplUserReqParamCount && $dplUserReqParamCount != $providedUserReqParamValues) {
$request->setStatusDone();
$log->warn('This dynamic playlist requires user input but the CLI command did not provide '.($providedUserReqParamValues == 0 ? 'any' : 'all').' parameter values.');
} else {
playRandom($client, $playlistId, 0, 1, undef, 1);

$request->setStatusDone();
main::DEBUGLOG && $log->is_debug && $log->debug('Exiting cliContinuePlaylist');
$request->setStatusDone();
main::DEBUGLOG && $log->is_debug && $log->debug('Exiting cliContinuePlaylist');
}
}

sub cliAddPlaylist {
Expand Down Expand Up @@ -3354,23 +3377,34 @@ sub cliAddPlaylist {
}

my $params = $request->getParamsCopy();
main::DEBUGLOG && $log->is_debug && $log->debug('params = '.Data::Dump::dump($params));

my $dplUserReqParamCount = keys %{$playLists->{$playlistId}->{'parameters'}};
main::DEBUGLOG && $log->is_debug && $log->debug('number of user req params = '.$dplUserReqParamCount);

my $providedUserReqParamValues = 0;
for my $k (keys %{$params}) {
if ($k =~ /^dynamicplaylist_parameter_(.*)$/) {
my $parameterId = $1;
if (exists $playLists->{$playlistId}->{'parameters'}->{$1}) {
main::DEBUGLOG && $log->is_debug && $log->debug("Using: $k = ".$params->{$k});
$playLists->{$playlistId}->{'parameters'}->{$1}->{'value'} = $params->{$k};
$providedUserReqParamValues++;
}
} else {
main::DEBUGLOG && $log->is_debug && $log->debug("Got: $k = ".$params->{$k});
}
}

playRandom($client, $playlistId, 1, 1, 1);
if ($dplUserReqParamCount && $dplUserReqParamCount != $providedUserReqParamValues) {
$request->setStatusDone();
$log->warn('This dynamic playlist requires user input but the CLI command did not provide '.($providedUserReqParamValues == 0 ? 'any' : 'all').' parameter values.');
} else {
playRandom($client, $playlistId, 1, 1, 1);

$request->setStatusDone();
main::DEBUGLOG && $log->is_debug && $log->debug('Exiting cliAddPlaylist');
$request->setStatusDone();
main::DEBUGLOG && $log->is_debug && $log->debug('Exiting cliAddPlaylist');
}
}

sub cliDstmSeedListPlay {
Expand Down Expand Up @@ -3403,23 +3437,34 @@ sub cliDstmSeedListPlay {
}

my $params = $request->getParamsCopy();
main::DEBUGLOG && $log->is_debug && $log->debug('params = '.Data::Dump::dump($params));

my $dplUserReqParamCount = keys %{$playLists->{$playlistId}->{'parameters'}};
main::DEBUGLOG && $log->is_debug && $log->debug('number of user req params = '.$dplUserReqParamCount);

my $providedUserReqParamValues = 0;
for my $k (keys %{$params}) {
if ($k =~ /^dynamicplaylist_parameter_(.*)$/) {
my $parameterId = $1;
if (exists $playLists->{$playlistId}->{'parameters'}->{$1}) {
main::DEBUGLOG && $log->is_debug && $log->debug("Using: $k = ".$params->{$k});
$playLists->{$playlistId}->{'parameters'}->{$1}->{'value'} = $params->{$k};
$providedUserReqParamValues++;
}
} else {
main::DEBUGLOG && $log->is_debug && $log->debug("Got: $k = ".$params->{$k});
}
}

playRandom($client, $playlistId, 2, 1, 1);
if ($dplUserReqParamCount && $dplUserReqParamCount != $providedUserReqParamValues) {
$request->setStatusDone();
$log->warn('This dynamic playlist requires user input but the CLI command did not provide '.($providedUserReqParamValues == 0 ? 'any' : 'all').' parameter values.');
} else {
playRandom($client, $playlistId, 2, 1, 1);

$request->setStatusDone();
main::DEBUGLOG && $log->is_debug && $log->debug('Exiting cliDstmSeedListPlay');
$request->setStatusDone();
main::DEBUGLOG && $log->is_debug && $log->debug('Exiting cliDstmSeedListPlay');
}
}

sub cliQueuePlaylist {
Expand Down Expand Up @@ -5382,7 +5427,7 @@ sub _preselectionMenuJive {
my $selectedItem = $preselectionList->{$itemID};
my $itemName = $selectedItem->{'name'};
my $itemArtistName = $selectedItem->{'artistname'};
my $text = $objectType eq 'artist' ? $itemName : $itemName.' -- '.$client->string('PLUGIN_DYNAMICPLAYLISTS4_PRESELECTION_INFO_BY').' '.$itemArtistName;
my $text = $objectType eq 'artist' ? $itemName : $itemName.' -- '.$client->string('PLUGIN_DYNAMICPLAYLISTS4_PRESELECTION_INFO_BY').' '.$itemArtistName;
my %itemParams = (
'objecttype' => $objectType,
'removeid' => $itemID,
Expand Down
2 changes: 1 addition & 1 deletion DynamicPlaylists4/install.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<id>affc5872-2bcb-abee-35eb-56cb5ce1e125</id>
<name>PLUGIN_DYNAMICPLAYLISTS4</name>
<module>Plugins::DynamicPlaylists4::Plugin</module>
<version>4.4.2</version>
<version>4.4.3</version>
<description>PLUGIN_DYNAMICPLAYLISTS4_DESC</description>
<creator>AF</creator>
<optionsURL>plugins/DynamicPlaylists4/settings/basic.html</optionsURL>
Expand Down

0 comments on commit 836e2c8

Please sign in to comment.