aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/TV/SeriesPostScanTask.cs
diff options
context:
space:
mode:
authortikuf <admin@nyalindee.com>2014-04-02 08:55:36 +1100
committertikuf <admin@nyalindee.com>2014-04-02 08:55:36 +1100
commit8882925dab080eb236a5cc896f48ed99711d76a8 (patch)
treecbfa2811dfff4c818d34de926f68be2ef8a78948 /MediaBrowser.Providers/TV/SeriesPostScanTask.cs
parent241be6dd93f6e0ec96ef88f0182b8985eb275995 (diff)
parent4afe2c3f731562efbe42147d1bcbdc0a7542cfeb (diff)
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Diffstat (limited to 'MediaBrowser.Providers/TV/SeriesPostScanTask.cs')
-rw-r--r--MediaBrowser.Providers/TV/SeriesPostScanTask.cs59
1 files changed, 53 insertions, 6 deletions
diff --git a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs
index 8c9b8672c7..d350d2fe42 100644
--- a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs
+++ b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Configuration;
+using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
@@ -11,6 +12,11 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.TV
{
+ class SeriesGroup : List<Series>, IGrouping<string, Series>
+ {
+ public string Key { get; set; }
+ }
+
class SeriesPostScanTask : ILibraryPostScanTask, IHasOrder
{
/// <summary>
@@ -39,11 +45,7 @@ namespace MediaBrowser.Providers.TV
.OfType<Series>()
.ToList();
- var seriesGroups = from series in seriesList
- let tvdbId = series.GetProviderId(MetadataProviders.Tvdb)
- where !string.IsNullOrEmpty(tvdbId)
- group series by tvdbId into g
- select g;
+ var seriesGroups = FindSeriesGroups(seriesList).Where(g => !string.IsNullOrEmpty(g.Key)).ToList();
await new MissingEpisodeProvider(_logger, _config, _libraryManager).Run(seriesGroups, cancellationToken).ConfigureAwait(false);
@@ -84,6 +86,51 @@ namespace MediaBrowser.Providers.TV
}
}
+ private IEnumerable<IGrouping<string, Series>> FindSeriesGroups(List<Series> seriesList)
+ {
+ var links = seriesList.ToDictionary(s => s, s => seriesList.Where(c => c != s && ShareProviderId(s, c)).ToList());
+
+ var visited = new HashSet<Series>();
+
+ foreach (var series in seriesList)
+ {
+ if (!visited.Contains(series))
+ {
+ var group = new SeriesGroup();
+ FindAllLinked(series, visited, links, group);
+
+ group.Key = group.Select(s => s.GetProviderId(MetadataProviders.Tvdb)).FirstOrDefault(id => !string.IsNullOrEmpty(id));
+
+ yield return group;
+ }
+ }
+ }
+
+ private void FindAllLinked(Series series, HashSet<Series> visited, IDictionary<Series, List<Series>> linksMap, List<Series> results)
+ {
+ results.Add(series);
+ visited.Add(series);
+
+ var links = linksMap[series];
+
+ foreach (var s in links)
+ {
+ if (!visited.Contains(s))
+ {
+ FindAllLinked(s, visited, linksMap, results);
+ }
+ }
+ }
+
+ private bool ShareProviderId(Series a, Series b)
+ {
+ return a.ProviderIds.Any(id =>
+ {
+ string value;
+ return b.ProviderIds.TryGetValue(id.Key, out value) && id.Value == value;
+ });
+ }
+
public int Order
{
get