From ecc6fcfbab7006c7c9bfcf76d329c663a2fa5a2c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 3 Jan 2014 15:32:27 -0500 Subject: [PATCH] add custom collection sort orders to edit page --- MediaBrowser.Api/ItemUpdateService.cs | 6 ++++++ .../Entities/IHasDisplayOrder.cs | 15 +++++++++++++ .../Entities/Movies/BoxSet.cs | 21 ++++++++++++++++++- MediaBrowser.Controller/Entities/TV/Series.cs | 4 +++- MediaBrowser.Controller/Entities/Video.cs | 11 ++++++++-- .../MediaBrowser.Controller.csproj | 1 + .../Providers/BaseItemXmlParser.cs | 15 +++++++++++++ MediaBrowser.Model/Dto/BaseItemDto.cs | 6 ++++++ .../ImagesByName/ImageUtils.cs | 6 +++++- .../Savers/BoxSetXmlSaver.cs | 2 -- .../Savers/XmlSaverHelpers.cs | 7 +++++++ .../Dto/DtoService.cs | 6 ++++++ 12 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 MediaBrowser.Controller/Entities/IHasDisplayOrder.cs diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 6c5b279d00..331c55f174 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -318,6 +318,12 @@ namespace MediaBrowser.Api hasLang.PreferredMetadataCountryCode = request.PreferredMetadataCountryCode; hasLang.PreferredMetadataLanguage = request.PreferredMetadataLanguage; } + + var hasDisplayOrder = item as IHasDisplayOrder; + if (hasDisplayOrder != null) + { + hasDisplayOrder.DisplayOrder = request.DisplayOrder; + } var hasAspectRatio = item as IHasAspectRatio; if (hasAspectRatio != null) diff --git a/MediaBrowser.Controller/Entities/IHasDisplayOrder.cs b/MediaBrowser.Controller/Entities/IHasDisplayOrder.cs new file mode 100644 index 0000000000..5e1ae21798 --- /dev/null +++ b/MediaBrowser.Controller/Entities/IHasDisplayOrder.cs @@ -0,0 +1,15 @@ + +namespace MediaBrowser.Controller.Entities +{ + /// + /// Interface IHasDisplayOrder + /// + public interface IHasDisplayOrder + { + /// + /// Gets or sets the display order. + /// + /// The display order. + string DisplayOrder { get; set; } + } +} diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs index 8623e2ff6c..c0f7570e8e 100644 --- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs +++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs @@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.Entities.Movies /// /// Class BoxSet /// - public class BoxSet : Folder, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage + public class BoxSet : Folder, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage, IHasDisplayOrder { public BoxSet() { @@ -40,6 +40,12 @@ namespace MediaBrowser.Controller.Entities.Movies /// The preferred metadata country code. public string PreferredMetadataCountryCode { get; set; } + /// + /// Gets or sets the display order. + /// + /// The display order. + public string DisplayOrder { get; set; } + protected override bool GetBlockUnratedValue(UserConfiguration config) { return config.BlockUnratedMovies; @@ -49,6 +55,19 @@ namespace MediaBrowser.Controller.Entities.Movies { var children = base.GetChildren(user, includeLinkedChildren); + if (string.Equals(DisplayOrder, "SortName", StringComparison.OrdinalIgnoreCase)) + { + // Sort by name + return LibraryManager.Sort(children, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending); + } + + if (string.Equals(DisplayOrder, "PremiereDate", StringComparison.OrdinalIgnoreCase)) + { + // Sort by release date + return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending); + } + + // Default sorting return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending); } } diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index f7e78ccd40..135547a37d 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -14,7 +14,7 @@ namespace MediaBrowser.Controller.Entities.TV /// /// Class Series /// - public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage + public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage, IHasDisplayOrder { public List SpecialFeatureIds { get; set; } public List SoundtrackIds { get; set; } @@ -45,6 +45,8 @@ namespace MediaBrowser.Controller.Entities.TV public List RemoteTrailers { get; set; } + public string DisplayOrder { get; set; } + /// /// Gets or sets the tags. /// diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 19cad79482..8ca4756509 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -238,7 +238,7 @@ namespace MediaBrowser.Controller.Entities if (string.IsNullOrEmpty(parentPath)) { - throw new ApplicationException("Unable to get parent path info from " + path); + throw new IOException("Unable to get parent path info from " + path); } files = new DirectoryInfo(parentPath) @@ -247,7 +247,14 @@ namespace MediaBrowser.Controller.Entities } else { - files = ResolveArgs.FileSystemChildren.Where(i => + var resolveArgs = ResolveArgs; + + if (resolveArgs == null) + { + throw new IOException("ResolveArgs are null for " + path); + } + + files = resolveArgs.FileSystemChildren.Where(i => { if ((i.Attributes & FileAttributes.Directory) == FileAttributes.Directory) { diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index e083618125..7079971417 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -85,6 +85,7 @@ + diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index 799f339f13..ea21e18b00 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -532,6 +532,21 @@ namespace MediaBrowser.Controller.Providers break; } + case "DisplayOrder": + { + var val = reader.ReadElementContentAsString(); + + var hasDisplayOrder = item as IHasDisplayOrder; + if (hasDisplayOrder != null) + { + if (!string.IsNullOrWhiteSpace(val)) + { + hasDisplayOrder.DisplayOrder = val; + } + } + break; + } + case "Trailers": { using (var subtree = reader.ReadSubtree()) diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs index 9adfcfa993..3bd4d52eec 100644 --- a/MediaBrowser.Model/Dto/BaseItemDto.cs +++ b/MediaBrowser.Model/Dto/BaseItemDto.cs @@ -392,6 +392,12 @@ namespace MediaBrowser.Model.Dto /// The album. public string Album { get; set; } + /// + /// Gets or sets the display order. + /// + /// The display order. + public string DisplayOrder { get; set; } + /// /// Gets or sets the album id. /// diff --git a/MediaBrowser.Providers/ImagesByName/ImageUtils.cs b/MediaBrowser.Providers/ImagesByName/ImageUtils.cs index 82caa420f9..4301c74323 100644 --- a/MediaBrowser.Providers/ImagesByName/ImageUtils.cs +++ b/MediaBrowser.Providers/ImagesByName/ImageUtils.cs @@ -60,7 +60,11 @@ namespace MediaBrowser.Providers.ImagesByName private static string GetComparableName(string name) { - return name.Replace(" ", string.Empty).Replace(".", string.Empty).Replace("&", string.Empty).Replace("!", string.Empty); + return name.Replace(" ", string.Empty) + .Replace(".", string.Empty) + .Replace("&", string.Empty) + .Replace("!", string.Empty) + .Replace(",", string.Empty); } public static IEnumerable GetAvailableImages(string file) diff --git a/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs b/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs index 712276bcd6..5d5624c556 100644 --- a/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs @@ -2,8 +2,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Library; -using MediaBrowser.Providers.Movies; -using System; using System.Collections.Generic; using System.IO; using System.Text; diff --git a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs index dc2d5eddd5..c4bd86a798 100644 --- a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs +++ b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs @@ -31,6 +31,7 @@ namespace MediaBrowser.Providers.Savers "CriticRating", "CriticRatingSummary", "DeathDate", + "DisplayOrder", "EndDate", "Genres", "Genre", @@ -284,6 +285,12 @@ namespace MediaBrowser.Providers.Savers } } + var hasDisplayOrder = item as IHasDisplayOrder; + if (hasDisplayOrder != null && !string.IsNullOrEmpty(hasDisplayOrder.DisplayOrder)) + { + builder.Append("" + SecurityElement.Escape(hasDisplayOrder.DisplayOrder) + ""); + } + var hasBudget = item as IHasBudget; if (hasBudget != null) { diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 932c7ba3fd..4f97a6506d 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -764,6 +764,12 @@ namespace MediaBrowser.Server.Implementations.Dto dto.LocalTrailerCount = hasTrailers.LocalTrailerIds.Count; } + var hasDisplayOrder = item as IHasDisplayOrder; + if (hasDisplayOrder != null) + { + dto.DisplayOrder = hasDisplayOrder.DisplayOrder; + } + if (fields.Contains(ItemFields.RemoteTrailers)) { dto.RemoteTrailers = hasTrailers != null ?