Bläddra i källkod

fixes #289 - Rename "Season 0" to "Specials"?

Luke Pulverenti 12 år sedan
förälder
incheckning
1141fcc374

+ 8 - 0
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";
         }
     }
 }

+ 65 - 13
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>();
 
@@ -260,6 +272,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>
@@ -1075,30 +1108,49 @@ 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>

+ 24 - 2
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;
 
@@ -9,6 +10,20 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
     /// </summary>
     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>
@@ -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;