diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2015-01-13 23:20:30 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2015-01-13 23:20:30 -0500 |
| commit | a2bb9ca624d0e19f9c59f895790e5717576d27e6 (patch) | |
| tree | efb7e65f3bbee02dd66e0dc6f6acd9930dd26c61 | |
| parent | 7771b89c6ad9f7496006ab0e9e82a8d127872ec3 (diff) | |
rework stub seasons
6 files changed, 140 insertions, 98 deletions
diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 6ac1ab84e..2df8f8e3c 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/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" /> diff --git a/MediaBrowser.Providers/TV/DummySeasonProvider.cs b/MediaBrowser.Providers/TV/DummySeasonProvider.cs new file mode 100644 index 000000000..294c7e20f --- /dev/null +++ b/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; + } + } +} diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs index 0b52956de..707fa6e21 100644 --- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs +++ b/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) { @@ -161,55 +155,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> /// <param name="series">The series.</param> @@ -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); @@ -472,39 +418,6 @@ namespace MediaBrowser.Providers.TV } /// <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> /// <param name="existingEpisodes">The existing episodes.</param> @@ -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); diff --git a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs index 17a219f52..222438485 100644 --- a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs +++ b/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); diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 4c0767b08..96ae281b9 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/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) { diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 7bd42507d..35d58837c 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/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:", |
