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 ?