Index: Slim/Plugin/Extensions/Settings.pm =================================================================== --- Slim/Plugin/Extensions/Settings.pm (revision 29003) +++ Slim/Plugin/Extensions/Settings.pm (working copy) @@ -151,7 +151,7 @@ my $plugins = Slim::Utils::PluginManager->allPlugins; my $states = preferences('plugin.state'); - my $seen = {}; + my $hide = {}; my $current = {}; # create entries for built in plugins and those already installed @@ -190,7 +190,7 @@ push @inactive, $entry; } - $seen->{$plugin} = 1; + $hide->{$plugin} = 1; } my @results = sort { $a->{'weight'} != $b->{'weight'} ? @@ -236,16 +236,28 @@ Slim::Utils::PluginManager->message(undef); - # prune out duplicate entries, favour repos later in the list so that entries get pruned from the 3rd party and other repos + # prune out duplicate entries, favour favour higher version numbers + + # pass 1 - find the higher version numbers + my $max = {}; - for my $repo (reverse @results) { + for my $repo (@results) { + for my $entry (@{$repo->{'entries'}}) { + my $name = $entry->{'name'}; + if (!defined $max->{$name} || Slim::Utils::Versions->compareVersions($entry->{'version'}, $max->{$name}) > 0) { + $max->{$name} = $entry->{'version'}; + } + } + } + + # pass 2 - prune out lower versions or entries which are hidden as they are shown in enabled plugins + for my $repo (@results) { my $i = 0; while (my $entry = $repo->{'entries'}->[$i]) { - if ($seen->{$entry->{'name'}}) { + if ($hide->{$entry->{'name'}} || $max->{$entry->{'name'}} ne $entry->{'version'}) { splice @{$repo->{'entries'}}, $i, 1; next; } - $seen->{$entry->{'name'}} = 1; $i++; } } Index: Slim/Control/Jive.pm =================================================================== --- Slim/Control/Jive.pm (revision 29003) +++ Slim/Control/Jive.pm (working copy) @@ -3199,9 +3199,39 @@ if ( ! --$data->{'remaining'} ) { + # create a list of entries with the duplicates removed, favoring higher version numbers + + # pass 1 - find max versions + my $max = {}; + + for my $entry (@{$data->{'results'}}) { + + my $name = $entry->{'name'}; + + if (!defined $max->{$name} || Slim::Utils::Versions->compareVersions($entry->{'version'}, $max->{$name}) > 0) { + + $max->{$name} = $entry->{'version'}; + } + } + + # pass 2 - build list containing single entry for per extension + my @results = (); + + for my $entry (@{$data->{'results'}}) { + + my $name = $entry->{'name'}; + + if (defined $max->{$name} && $max->{$name} eq $entry->{'version'}) { + + push @results, $entry; + + delete $max->{$name}; + } + } + my $cnt = 0; - for my $entry ( sort { $a->{'title'} cmp $b->{'title'} } @{$data->{'results'}} ) { + for my $entry ( sort { $a->{'title'} cmp $b->{'title'} } @results ) { $request->setResultLoopHash('item_loop', $cnt++, $entry); }