diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index 6d332d424..e0b5c52c0 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -67,7 +67,9 @@ private async Task MovieSearch(NewznabRequest request, List searchSpec.Year = request.year; searchSpec.Genre = request.genre; - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private async Task MusicSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) @@ -81,7 +83,9 @@ private async Task MusicSearch(NewznabRequest request, List searchSpec.Track = request.track; searchSpec.Year = request.year; - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private async Task TvSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) @@ -102,7 +106,9 @@ private async Task TvSearch(NewznabRequest request, List in searchSpec.Year = request.year; searchSpec.Genre = request.genre; - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private async Task BookSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) @@ -115,14 +121,18 @@ private async Task BookSearch(NewznabRequest request, List searchSpec.Year = request.year; searchSpec.Genre = request.genre; - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private async Task BasicSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) { var searchSpec = Get(request, indexerIds, interactiveSearch); - return new NewznabResults { Releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec) }; + var releases = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + + return new NewznabResults { Releases = DeDupeReleases(releases) }; } private TSpec Get(NewznabRequest query, List indexerIds, bool interactiveSearch) @@ -265,5 +275,13 @@ private async Task> DispatchIndexer(Func(); } + + private List DeDupeReleases(IList releases) + { + // De-dupe reports by guid so duplicate results aren't returned. Pick the one with the higher indexer priority. + return releases.GroupBy(r => r.Guid) + .Select(r => r.OrderBy(v => v.IndexerPriority).First()) + .ToList(); + } } }