Index: Slim/Control/Jive.pm =================================================================== --- Slim/Control/Jive.pm (revision 28911) +++ Slim/Control/Jive.pm (working copy) @@ -3130,10 +3130,11 @@ sub registerExtensionProvider { my $name = shift; my $provider = shift; + my $weight = shift || 10; - main::INFOLOG && $log->info("adding extension provider $name $provider"); + main::INFOLOG && $log->info("adding extension provider $name $provider weight $weight"); - $extensionProviders{ $name } = $provider; + $extensionProviders{ $name } = { cb => $provider, weight => $weight }; } sub removeExtensionProvider { @@ -3164,13 +3165,13 @@ if (scalar @providers) { - $request->privateData( { remaining => scalar @providers, results => [] } ); + $request->privateData( { remaining => scalar @providers, results => {} } ); $request->setStatusProcessing; for my $provider (@providers) { - $extensionProviders{$provider}->( { + $extensionProviders{$provider}->{'cb'}->( { 'name' => $provider, 'type' => $type, 'target' => $target, @@ -3178,7 +3179,7 @@ 'lang' => $language, 'details'=> 1, 'cb' => \&_extensionsQueryCB, - 'pt' => [ $request ] + 'pt' => [ $request, $extensionProviders{$provider}->{'weight'} ], }); } @@ -3192,16 +3193,37 @@ sub _extensionsQueryCB { my $request= shift; + my $weight = shift; my $res = shift; my $data = $request->privateData; - splice @{$data->{'results'}}, 0, 0, @$res; + $data->{'results'}->{ $weight } ||= []; + splice @{ $data->{'results'}->{ $weight } }, 0, 0, @$res; + if ( ! --$data->{'remaining'} ) { + # create a list of entries with the duplicates removed, favoring higher weighted repos + # if there are duplicates between repos of the same weight then the first entry is used + + my @results; + my $seen = {}; + + for my $wt ( reverse keys %{$data->{'results'}} ) { + + for my $entry ( @{ $data->{'results'}->{ $wt } } ) { + + if (!$seen->{ $entry->{'name'} }) { + + push @results, $entry; + $seen->{ $entry->{'name'} } = 1; + } + } + } + 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); } Index: Slim/Plugin/Extensions/Plugin.pm =================================================================== --- Slim/Plugin/Extensions/Plugin.pm (revision 28911) +++ Slim/Plugin/Extensions/Plugin.pm (working copy) @@ -140,7 +140,7 @@ $class->SUPER::initPlugin; for my $repo (keys %repos) { - Slim::Control::Jive::registerExtensionProvider($repo, \&getExtensions); + Slim::Control::Jive::registerExtensionProvider($repo, \&getExtensions, $repos{$repo}); } if ($prefs->get('otherrepo')) { @@ -185,7 +185,7 @@ main::INFOLOG && $log->info("adding repository $repo weight $weight"); $repos{$repo} = $weight; - Slim::Control::Jive::registerExtensionProvider($repo, \&getExtensions); + Slim::Control::Jive::registerExtensionProvider($repo, \&getExtensions, $weight); } sub removeRepo {