浏览代码

rework stub seasons

Luke Pulverenti 10 年之前
父节点
当前提交
a2bb9ca624

+ 1 - 0
MediaBrowser.Providers/MediaBrowser.Providers.csproj

@@ -162,6 +162,7 @@
     <Compile Include="Subtitles\ConfigurationExtension.cs" />
     <Compile Include="Subtitles\OpenSubtitleDownloader.cs" />
     <Compile Include="Subtitles\SubtitleManager.cs" />
+    <Compile Include="TV\DummySeasonProvider.cs" />
     <Compile Include="TV\EpisodeMetadataService.cs" />
     <Compile Include="TV\FanArtTvUpdatesPostScanTask.cs" />
     <Compile Include="TV\FanArtSeasonProvider.cs" />

+ 121 - 0
MediaBrowser.Providers/TV/DummySeasonProvider.cs

@@ -0,0 +1,121 @@
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Globalization;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Providers.TV
+{
+    public class DummySeasonProvider
+    {
+        private readonly IServerConfigurationManager _config;
+        private readonly ILogger _logger;
+        private readonly ILocalizationManager _localization;
+
+        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+        public DummySeasonProvider(IServerConfigurationManager config, ILogger logger, ILocalizationManager localization)
+        {
+            _config = config;
+            _logger = logger;
+            _localization = localization;
+        }
+
+        public async Task Run(Series series, CancellationToken cancellationToken)
+        {
+            var hasNewSeasons = await AddDummySeasonFolders(series, cancellationToken).ConfigureAwait(false);
+
+            if (hasNewSeasons)
+            {
+                var directoryService = new DirectoryService();
+
+                //await series.RefreshMetadata(new MetadataRefreshOptions(directoryService), cancellationToken).ConfigureAwait(false);
+
+                //await series.ValidateChildren(new Progress<double>(), cancellationToken, new MetadataRefreshOptions(directoryService))
+                //    .ConfigureAwait(false);
+            }
+        }
+
+        private async Task<bool> AddDummySeasonFolders(Series series, CancellationToken cancellationToken)
+        {
+            var episodesInSeriesFolder = series.RecursiveChildren
+                .OfType<Episode>()
+                .Where(i => !i.IsInSeasonFolder)
+                .ToList();
+
+            var hasChanges = false;
+
+            // Loop through the unique season numbers
+            foreach (var seasonNumber in episodesInSeriesFolder.Select(i => i.ParentIndexNumber ?? -1)
+                .Where(i => i >= 0)
+                .Distinct()
+                .ToList())
+            {
+                var hasSeason = series.Children.OfType<Season>()
+                    .Any(i => i.IndexNumber.HasValue && i.IndexNumber.Value == seasonNumber);
+
+                if (!hasSeason)
+                {
+                    await AddSeason(series, seasonNumber, cancellationToken).ConfigureAwait(false);
+
+                    hasChanges = true;
+                }
+            }
+
+            // Unknown season - create a dummy season to put these under
+            if (episodesInSeriesFolder.Any(i => !i.ParentIndexNumber.HasValue))
+            {
+                var hasSeason = series.Children.OfType<Season>()
+                    .Any(i => !i.IndexNumber.HasValue);
+
+                if (!hasSeason)
+                {
+                    await AddSeason(series, null, cancellationToken).ConfigureAwait(false);
+
+                    hasChanges = true;
+                }
+            }
+
+            return hasChanges;
+        }
+
+        /// <summary>
+        /// Adds the season.
+        /// </summary>
+        /// <param name="series">The series.</param>
+        /// <param name="seasonNumber">The season number.</param>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <returns>Task{Season}.</returns>
+        public async Task<Season> AddSeason(Series series,
+            int? seasonNumber,
+            CancellationToken cancellationToken)
+        {
+            var seasonName = seasonNumber == 0 ?
+                _config.Configuration.SeasonZeroDisplayName :
+                (seasonNumber.HasValue ? string.Format(_localization.GetLocalizedString("NameSeasonNumber"), seasonNumber.Value.ToString(_usCulture)) : _localization.GetLocalizedString("NameSeasonUnknown"));
+
+            _logger.Info("Creating Season {0} entry for {1}", seasonName, series.Name);
+
+            var season = new Season
+            {
+                Name = seasonName,
+                IndexNumber = seasonNumber,
+                Parent = series,
+                DisplayMediaType = typeof(Season).Name,
+                Id = (series.Id + (seasonNumber ?? -1).ToString(_usCulture) + seasonName).GetMBId(typeof(Season))
+            };
+
+            await series.AddChild(season, cancellationToken).ConfigureAwait(false);
+
+            await season.RefreshMetadata(new MetadataRefreshOptions(), cancellationToken).ConfigureAwait(false);
+
+            return season;
+        }
+    }
+}

+ 9 - 96
MediaBrowser.Providers/TV/MissingEpisodeProvider.cs

@@ -25,7 +25,7 @@ namespace MediaBrowser.Providers.TV
         private readonly ILibraryManager _libraryManager;
         private readonly ILocalizationManager _localization;
 
-        private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
+        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
 
         public MissingEpisodeProvider(ILogger logger, IServerConfigurationManager config, ILibraryManager libraryManager, ILocalizationManager localization)
         {
@@ -78,11 +78,11 @@ namespace MediaBrowser.Providers.TV
                     {
                         int seasonNumber;
 
-                        if (int.TryParse(parts[1], NumberStyles.Integer, UsCulture, out seasonNumber))
+                        if (int.TryParse(parts[1], NumberStyles.Integer, _usCulture, out seasonNumber))
                         {
                             int episodeNumber;
 
-                            if (int.TryParse(parts[2], NumberStyles.Integer, UsCulture, out episodeNumber))
+                            if (int.TryParse(parts[2], NumberStyles.Integer, _usCulture, out episodeNumber))
                             {
                                 return new Tuple<int, int>(seasonNumber, episodeNumber);
                             }
@@ -103,12 +103,6 @@ namespace MediaBrowser.Providers.TV
                 .ConfigureAwait(false);
 
             var hasNewEpisodes = false;
-            var hasNewSeasons = false;
-
-            foreach (var series in group)
-            {
-                hasNewSeasons = await AddDummySeasonFolders(series, cancellationToken).ConfigureAwait(false);
-            }
 
             if (_config.Configuration.EnableInternetProviders)
             {
@@ -121,7 +115,7 @@ namespace MediaBrowser.Providers.TV
                 }
             }
 
-            if (hasNewSeasons || hasNewEpisodes || anySeasonsRemoved || anyEpisodesRemoved)
+            if (hasNewEpisodes || anySeasonsRemoved || anyEpisodesRemoved)
             {
                 foreach (var series in group)
                 {
@@ -160,55 +154,6 @@ namespace MediaBrowser.Providers.TV
                    });
         }
 
-        /// <summary>
-        /// For series with episodes directly under the series folder, this adds dummy seasons to enable regular browsing and metadata
-        /// </summary>
-        /// <param name="series"></param>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        private async Task<bool> AddDummySeasonFolders(Series series, CancellationToken cancellationToken)
-        {
-            var episodesInSeriesFolder = series.RecursiveChildren
-                .OfType<Episode>()
-                .Where(i => !i.IsInSeasonFolder)
-                .ToList();
-
-            var hasChanges = false;
-
-            // Loop through the unique season numbers
-            foreach (var seasonNumber in episodesInSeriesFolder.Select(i => i.ParentIndexNumber ?? -1)
-                .Where(i => i >= 0)
-                .Distinct()
-                .ToList())
-            {
-                var hasSeason = series.Children.OfType<Season>()
-                    .Any(i => i.IndexNumber.HasValue && i.IndexNumber.Value == seasonNumber);
-
-                if (!hasSeason)
-                {
-                    await AddSeason(series, seasonNumber, cancellationToken).ConfigureAwait(false);
-
-                    hasChanges = true;
-                }
-            }
-
-            // Unknown season - create a dummy season to put these under
-            if (episodesInSeriesFolder.Any(i => !i.ParentIndexNumber.HasValue))
-            {
-                var hasSeason = series.Children.OfType<Season>()
-                    .Any(i => !i.IndexNumber.HasValue);
-
-                if (!hasSeason)
-                {
-                    await AddSeason(series, null, cancellationToken).ConfigureAwait(false);
-
-                    hasChanges = true;
-                }
-            }
-
-            return hasChanges;
-        }
-
         /// <summary>
         /// Adds the missing episodes.
         /// </summary>
@@ -449,10 +394,11 @@ namespace MediaBrowser.Providers.TV
 
             if (season == null)
             {
-                season = await AddSeason(series, seasonNumber, cancellationToken).ConfigureAwait(false);
+                var provider = new DummySeasonProvider(_config, _logger, _localization);
+                season = await provider.AddSeason(series, seasonNumber, cancellationToken).ConfigureAwait(false);
             }
 
-            var name = string.Format("Episode {0}", episodeNumber.ToString(UsCulture));
+            var name = string.Format("Episode {0}", episodeNumber.ToString(_usCulture));
 
             var episode = new Episode
             {
@@ -461,7 +407,7 @@ namespace MediaBrowser.Providers.TV
                 ParentIndexNumber = seasonNumber,
                 Parent = season,
                 DisplayMediaType = typeof(Episode).Name,
-                Id = (series.Id + seasonNumber.ToString(UsCulture) + name).GetMBId(typeof(Episode))
+                Id = (series.Id + seasonNumber.ToString(_usCulture) + name).GetMBId(typeof(Episode))
             };
 
             await season.AddChild(episode, cancellationToken).ConfigureAwait(false);
@@ -471,39 +417,6 @@ namespace MediaBrowser.Providers.TV
             }, cancellationToken).ConfigureAwait(false);
         }
 
-        /// <summary>
-        /// Adds the season.
-        /// </summary>
-        /// <param name="series">The series.</param>
-        /// <param name="seasonNumber">The season number.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{Season}.</returns>
-        private async Task<Season> AddSeason(Series series, 
-            int? seasonNumber, 
-            CancellationToken cancellationToken)
-        {
-            var seasonName = seasonNumber == 0 ? 
-                _config.Configuration.SeasonZeroDisplayName :
-                (seasonNumber.HasValue ? string.Format(_localization.GetLocalizedString("NameSeasonNumber"), seasonNumber.Value.ToString(UsCulture)) : _localization.GetLocalizedString("NameSeasonUnknown"));
-
-            _logger.Info("Creating Season {0} entry for {1}", seasonName, series.Name);
-
-            var season = new Season
-            {
-                Name = seasonName,
-                IndexNumber = seasonNumber,
-                Parent = series,
-                DisplayMediaType = typeof(Season).Name,
-                Id = (series.Id + (seasonNumber ?? -1).ToString(UsCulture) + seasonName).GetMBId(typeof(Season))
-            };
-
-            await series.AddChild(season, cancellationToken).ConfigureAwait(false);
-
-            await season.RefreshMetadata(new MetadataRefreshOptions(), cancellationToken).ConfigureAwait(false);
-
-            return season;
-        }
-
         /// <summary>
         /// Gets the existing episode.
         /// </summary>
@@ -551,7 +464,7 @@ namespace MediaBrowser.Providers.TV
         private DateTime? GetAirDate(string seriesDataPath, int seasonNumber, int episodeNumber)
         {
             // First open up the tvdb xml file and make sure it has valid data
-            var filename = string.Format("episode-{0}-{1}.xml", seasonNumber.ToString(UsCulture), episodeNumber.ToString(UsCulture));
+            var filename = string.Format("episode-{0}-{1}.xml", seasonNumber.ToString(_usCulture), episodeNumber.ToString(_usCulture));
 
             var xmlPath = Path.Combine(seriesDataPath, filename);
 

+ 7 - 0
MediaBrowser.Providers/TV/SeriesPostScanTask.cs

@@ -48,6 +48,13 @@ namespace MediaBrowser.Providers.TV
                 .OfType<Series>()
                 .ToList();
 
+            var provider = new DummySeasonProvider(_config, _logger, _localization);
+            
+            foreach (var series in seriesList)
+            {
+                await provider.Run(series, cancellationToken).ConfigureAwait(false);
+            }
+
             var seriesGroups = FindSeriesGroups(seriesList).Where(g => !string.IsNullOrEmpty(g.Key)).ToList();
 
             await new MissingEpisodeProvider(_logger, _config, _libraryManager, _localization).Run(seriesGroups, cancellationToken).ConfigureAwait(false);

+ 1 - 1
MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs

@@ -125,7 +125,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
                 Items = videos
             };
 
-            var isInMixedFolder = resolverResult.Count > 0;
+            var isInMixedFolder = resolverResult.Count > 1;
 
             foreach (var video in resolverResult)
             {

+ 1 - 1
MediaBrowser.Server.Implementations/Localization/Server/server.json

@@ -300,7 +300,7 @@
     "LabelCachePath": "Cache path:",
     "LabelCachePathHelp": "Specify a custom location for server cache files, such as images.",
     "LabelImagesByNamePath": "Images by name path:",
-    "LabelImagesByNamePathHelp": "Specify a custom location for downloaded actor, artist, genre and studio images.",
+    "LabelImagesByNamePathHelp": "Specify a custom location for downloaded actor, genre and studio images.",
     "LabelMetadataPath": "Metadata path:",
     "LabelMetadataPathHelp": "Specify a custom location for downloaded artwork and metadata, if not saving within media folders.",
     "LabelTranscodingTempPath": "Transcoding temporary path:",