diff options
3 files changed, 97 insertions, 15 deletions
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index 664fe86da..72a80ffad 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -44,6 +44,12 @@ namespace MediaBrowser.Model.Configuration /// </summary> /// <value>The item by name path.</value> public string ItemsByNamePath { get; set; } + + /// <summary> + /// Gets or sets the display name of the season zero. + /// </summary> + /// <value>The display name of the season zero.</value> + public string SeasonZeroDisplayName { get; set; } /// <summary> /// Gets or sets the weather unit to use when displaying weather @@ -260,6 +266,8 @@ namespace MediaBrowser.Model.Configuration SortReplaceCharacters = new[] { ".", "+", "%" }; SortRemoveCharacters = new[] { ",", "&", "-", "{", "}", "'" }; SortRemoveWords = new[] { "the", "a", "an" }; + + SeasonZeroDisplayName = "Specials"; } } } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index fbf2dfc70..13857a656 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -4,6 +4,7 @@ using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; @@ -159,6 +160,7 @@ namespace MediaBrowser.Server.Implementations.Library /// <param name="resolvers">The resolvers.</param> /// <param name="introProviders">The intro providers.</param> /// <param name="itemComparers">The item comparers.</param> + /// <param name="prescanTasks">The prescan tasks.</param> public void AddParts(IEnumerable<IResolverIgnoreRule> rules, IEnumerable<IVirtualFolderCreator> pluginFolders, IEnumerable<IItemResolver> resolvers, @@ -211,9 +213,11 @@ namespace MediaBrowser.Server.Implementations.Library private bool _internetProvidersEnabled; private bool _peopleImageFetchingEnabled; private string _itemsByNamePath; + private string _seasonZeroDisplayName; private void RecordConfigurationValues(ServerConfiguration configuration) { + _seasonZeroDisplayName = ConfigurationManager.Configuration.SeasonZeroDisplayName; _itemsByNamePath = ConfigurationManager.ApplicationPaths.ItemsByNamePath; _internetProvidersEnabled = configuration.EnableInternetProviders; _peopleImageFetchingEnabled = configuration.InternetProviderExcludeTypes == null || !configuration.InternetProviderExcludeTypes.Contains(typeof(Person).Name, StringComparer.OrdinalIgnoreCase); @@ -239,17 +243,25 @@ namespace MediaBrowser.Server.Implementations.Library refreshPeopleAfterUpdate = newConfigurationFetchesPeopleImages && !_peopleImageFetchingEnabled; } - var ibnPathChanged = !string.Equals(_itemsByNamePath, ConfigurationManager.ApplicationPaths.ItemsByNamePath); + var ibnPathChanged = !string.Equals(_itemsByNamePath, ConfigurationManager.ApplicationPaths.ItemsByNamePath, StringComparison.CurrentCulture); if (ibnPathChanged) { _itemsByName.Clear(); } + var newSeasonZeroName = ConfigurationManager.Configuration.SeasonZeroDisplayName; + var seasonZeroNameChanged = !string.Equals(_seasonZeroDisplayName, newSeasonZeroName, StringComparison.CurrentCulture); + RecordConfigurationValues(config); - Task.Run(() => + Task.Run(async () => { + if (seasonZeroNameChanged) + { + await UpdateSeasonZeroNames(newSeasonZeroName, CancellationToken.None).ConfigureAwait(false); + } + // Any number of configuration settings could change the way the library is refreshed, so do that now _taskManager.CancelIfRunningAndQueue<RefreshMediaLibraryTask>(); @@ -261,6 +273,27 @@ namespace MediaBrowser.Server.Implementations.Library } /// <summary> + /// Updates the season zero names. + /// </summary> + /// <param name="newName">The new name.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + private Task UpdateSeasonZeroNames(string newName, CancellationToken cancellationToken) + { + var seasons = RootFolder.RecursiveChildren + .OfType<Season>() + .Where(i => i.IndexNumber.HasValue && i.IndexNumber.Value == 0 && !string.Equals(i.Name, newName, StringComparison.CurrentCulture)) + .ToList(); + + foreach (var season in seasons) + { + season.Name = newName; + } + + return UpdateItems(seasons, cancellationToken); + } + + /// <summary> /// Creates the library items cache. /// </summary> /// <returns>ConcurrentDictionary{GuidBaseItem}.</returns> @@ -1075,31 +1108,50 @@ namespace MediaBrowser.Server.Implementations.Library } /// <summary> - /// Updates the item. + /// Updates the items. /// </summary> - /// <param name="item">The item.</param> + /// <param name="items">The items.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> - public async Task UpdateItem(BaseItem item, CancellationToken cancellationToken) + private async Task UpdateItems(IEnumerable<BaseItem> items, CancellationToken cancellationToken) { - await ItemRepository.SaveItem(item, cancellationToken).ConfigureAwait(false); + var list = items.ToList(); + + await ItemRepository.SaveItems(list, cancellationToken).ConfigureAwait(false); - UpdateItemInLibraryCache(item); + foreach (var item in list) + { + UpdateItemInLibraryCache(item); + } if (ItemUpdated != null) { - try - { - ItemUpdated(this, new ItemChangeEventArgs { Item = item }); - } - catch (Exception ex) + foreach (var item in list) { - _logger.ErrorException("Error in ItemUpdated event handler", ex); + try + { + ItemUpdated(this, new ItemChangeEventArgs { Item = item }); + } + catch (Exception ex) + { + _logger.ErrorException("Error in ItemUpdated event handler", ex); + } } } } /// <summary> + /// Updates the item. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + public Task UpdateItem(BaseItem item, CancellationToken cancellationToken) + { + return UpdateItems(new[] { item }, cancellationToken); + } + + /// <summary> /// Reports the item removed. /// </summary> /// <param name="item">The item.</param> diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs index 07fb2f486..7ad5d08db 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using System; @@ -10,6 +11,20 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV public class SeasonResolver : FolderResolver<Season> { /// <summary> + /// The _config + /// </summary> + private readonly IServerConfigurationManager _config; + + /// <summary> + /// Initializes a new instance of the <see cref="SeasonResolver"/> class. + /// </summary> + /// <param name="config">The config.</param> + public SeasonResolver(IServerConfigurationManager config) + { + _config = config; + } + + /// <summary> /// Resolves the specified args. /// </summary> /// <param name="args">The args.</param> @@ -18,10 +33,17 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV { if (args.Parent is Series && args.IsDirectory) { - return new Season + var season = new Season { IndexNumber = TVUtils.GetSeasonNumberFromPath(args.Path) }; + + if (season.IndexNumber.HasValue && season.IndexNumber.Value == 0) + { + season.Name = _config.Configuration.SeasonZeroDisplayName; + } + + return season; } return null; |
