Преглед изворни кода

Merge pull request #1213 from softworkz/RemoteSearchDuplicates

Remote-Search:  Suppress duplicates when agregating results from multiple providers
Luke пре 9 година
родитељ
комит
b82254060d
1 измењених фајлова са 45 додато и 9 уклоњено
  1. 45 9
      MediaBrowser.Providers/Manager/ProviderManager.cs

+ 45 - 9
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -700,7 +700,7 @@ namespace MediaBrowser.Providers.Manager
 
 
                             // Manual edit occurred
                             // Manual edit occurred
                             // Even if save local is off, save locally anyway if the metadata file already exists
                             // Even if save local is off, save locally anyway if the metadata file already exists
-							if (fileSaver == null || !isEnabledFor || !_fileSystem.FileExists(fileSaver.GetSavePath(item)))
+                            if (fileSaver == null || !isEnabledFor || !_fileSystem.FileExists(fileSaver.GetSavePath(item)))
                             {
                             {
                                 return false;
                                 return false;
                             }
                             }
@@ -759,6 +759,8 @@ namespace MediaBrowser.Providers.Manager
             }
             }
 
 
             var resultList = new List<RemoteSearchResult>();
             var resultList = new List<RemoteSearchResult>();
+            var foundProviderIds = new Dictionary<Tuple<string, string>, RemoteSearchResult>();
+            var foundTitleYearStrings = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
 
 
             foreach (var provider in providers)
             foreach (var provider in providers)
             {
             {
@@ -766,16 +768,50 @@ namespace MediaBrowser.Providers.Manager
                 {
                 {
                     var results = await GetSearchResults(provider, searchInfo.SearchInfo, cancellationToken).ConfigureAwait(false);
                     var results = await GetSearchResults(provider, searchInfo.SearchInfo, cancellationToken).ConfigureAwait(false);
 
 
-                    var list = results.ToList();
-
-                    if (list.Count > 0)
+                    foreach (var result in results)
                     {
                     {
-                        resultList.AddRange(list.Take(maxResults - resultList.Count));
-                    }
+                        var bFound = false;
 
 
-                    if (resultList.Count >= maxResults)
-                    {
-                        return resultList;
+                        // This check prevents duplicate search results by comparing provider ids
+                        foreach (var providerId in result.ProviderIds)
+                        {
+                            var idTuple = new Tuple<string, string>(providerId.Key.ToLower(), providerId.Value.ToLower());
+
+                            if (!foundProviderIds.ContainsKey(idTuple))
+                            {
+                                foundProviderIds.Add(idTuple, result);
+                            }
+                            else
+                            {
+                                bFound = true;
+                                var existingResult = foundProviderIds[idTuple];
+                                if (string.IsNullOrEmpty(existingResult.ImageUrl) && !string.IsNullOrEmpty(result.ImageUrl))
+                                {
+                                    existingResult.ImageUrl = result.ImageUrl;
+                                }
+                            }
+                        }
+
+                        // This is a workaround duplicate check for movies, where intersecting provider ids are not always available
+                        if (typeof(TItemType) == typeof(Movie) || typeof(TItemType) == typeof(Series))
+                        {
+                            var titleYearString = string.Format("{0} ({1})", result.Name, result.ProductionYear);
+
+                            if (foundTitleYearStrings.Contains(titleYearString))
+                            {
+                                bFound = true;
+                            }
+                            else
+                            {
+                                foundTitleYearStrings.Add(titleYearString);
+                            }
+
+                        }
+
+                        if (!bFound && resultList.Count < maxResults)
+                        {
+                            resultList.Add(result);
+                        }
                     }
                     }
                 }
                 }
                 catch (Exception ex)
                 catch (Exception ex)