diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 9aa4203a9b..a02c3c0122 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
@@ -81,12 +80,6 @@ namespace MediaBrowser.Api.UserLibrary
/// The index by.
public string IndexBy { get; set; }
- ///
- /// The dynamic, localized sort function name
- ///
- /// The dynamic sort by.
- public string DynamicSortBy { get; set; }
-
///
/// What to sort the results by
///
@@ -254,7 +247,7 @@ namespace MediaBrowser.Api.UserLibrary
return ((Folder)item).GetRecursiveChildren(user);
}
- return ((Folder)item).GetChildren(user, request.IndexBy, request.DynamicSortBy, GetSortOrder(request));
+ return ((Folder)item).GetChildren(user, request.IndexBy);
}
///
@@ -266,58 +259,9 @@ namespace MediaBrowser.Api.UserLibrary
/// IEnumerable{BaseItem}.
private IEnumerable ApplySortOrder(GetItems request, IEnumerable items, User user)
{
- var isFirst = true;
- var descending = (GetSortOrder(request) ?? SortOrder.Ascending) == SortOrder.Descending;
+ var orderBy = GetOrderBy(request).ToArray();
- IOrderedEnumerable orderedItems = null;
-
- foreach (var orderBy in GetOrderBy(request).Select(o => GetComparer(o, user)))
- {
- if (isFirst)
- {
- orderedItems = descending ? items.OrderByDescending(i => i, orderBy) : items.OrderBy(i => i, orderBy);
- }
- else
- {
- orderedItems = descending ? orderedItems.ThenByDescending(i => i, orderBy) : orderedItems.ThenBy(i => i, orderBy);
- }
-
- isFirst = false;
- }
-
- return orderedItems ?? items;
- }
-
- ///
- /// Gets the comparer.
- ///
- /// The sort by.
- /// The user.
- /// IComparer{BaseItem}.
- ///
- private IComparer GetComparer(ItemSortBy sortBy, User user)
- {
- switch (sortBy)
- {
- case ItemSortBy.Album:
- return new AlbumComparer();
- case ItemSortBy.AlbumArtist:
- return new AlbumArtistComparer();
- case ItemSortBy.Artist:
- return new ArtistComparer();
- case ItemSortBy.Random:
- return new RandomComparer();
- case ItemSortBy.DateCreated:
- return new DateCreatedComparer();
- case ItemSortBy.SortName:
- return new SortNameComparer();
- case ItemSortBy.PremiereDate:
- return new PremiereDateComparer();
- case ItemSortBy.DatePlayed:
- return new DatePlayedComparer { User = user };
- default:
- throw new ArgumentException();
- }
+ return orderBy.Length == 0 ? items : _libraryManager.Sort(items, user, orderBy, GetSortOrder(request) ?? SortOrder.Ascending);
}
///
@@ -575,16 +519,16 @@ namespace MediaBrowser.Api.UserLibrary
///
/// The request.
/// IEnumerable{ItemSortBy}.
- private IEnumerable GetOrderBy(GetItems request)
+ private IEnumerable GetOrderBy(GetItems request)
{
var val = request.SortBy;
if (string.IsNullOrEmpty(val))
{
- return new ItemSortBy[] { };
+ return new string[] { };
}
- return val.Split(',').Select(v => (ItemSortBy)Enum.Parse(typeof(ItemSortBy), v, true));
+ return val.Split(',');
}
///
@@ -621,201 +565,4 @@ namespace MediaBrowser.Api.UserLibrary
return x.DateCreated.CompareTo(y.DateCreated);
}
}
-
- ///
- /// Class RandomComparer
- ///
- public class RandomComparer : IComparer
- {
- ///
- /// Compares the specified x.
- ///
- /// The x.
- /// The y.
- /// System.Int32.
- public int Compare(BaseItem x, BaseItem y)
- {
- return Guid.NewGuid().CompareTo(Guid.NewGuid());
- }
- }
-
- ///
- /// Class SortNameComparer
- ///
- public class SortNameComparer : IComparer
- {
- ///
- /// Compares the specified x.
- ///
- /// The x.
- /// The y.
- /// System.Int32.
- public int Compare(BaseItem x, BaseItem y)
- {
- return string.Compare(x.SortName, y.SortName, StringComparison.CurrentCultureIgnoreCase);
- }
- }
-
- ///
- /// Class AlbumArtistComparer
- ///
- public class AlbumArtistComparer : IComparer
- {
- ///
- /// Compares the specified x.
- ///
- /// The x.
- /// The y.
- /// System.Int32.
- public int Compare(BaseItem x, BaseItem y)
- {
- return string.Compare(GetValue(x), GetValue(y), StringComparison.CurrentCultureIgnoreCase);
- }
-
- ///
- /// Gets the value.
- ///
- /// The x.
- /// System.String.
- private string GetValue(BaseItem x)
- {
- var audio = x as Audio;
-
- return audio == null ? string.Empty : audio.AlbumArtist;
- }
- }
-
- ///
- /// Class AlbumComparer
- ///
- public class AlbumComparer : IComparer
- {
- ///
- /// Compares the specified x.
- ///
- /// The x.
- /// The y.
- /// System.Int32.
- public int Compare(BaseItem x, BaseItem y)
- {
- return string.Compare(GetValue(x), GetValue(y), StringComparison.CurrentCultureIgnoreCase);
- }
-
- ///
- /// Gets the value.
- ///
- /// The x.
- /// System.String.
- private string GetValue(BaseItem x)
- {
- var audio = x as Audio;
-
- return audio == null ? string.Empty : audio.Album;
- }
- }
-
- ///
- /// Class ArtistComparer
- ///
- public class ArtistComparer : IComparer
- {
- ///
- /// Compares the specified x.
- ///
- /// The x.
- /// The y.
- /// System.Int32.
- public int Compare(BaseItem x, BaseItem y)
- {
- return string.Compare(GetValue(x), GetValue(y), StringComparison.CurrentCultureIgnoreCase);
- }
-
- ///
- /// Gets the value.
- ///
- /// The x.
- /// System.String.
- private string GetValue(BaseItem x)
- {
- var audio = x as Audio;
-
- return audio == null ? string.Empty : audio.Artist;
- }
- }
-
- ///
- /// Class PremiereDateComparer
- ///
- public class PremiereDateComparer : IComparer
- {
- ///
- /// Compares the specified x.
- ///
- /// The x.
- /// The y.
- /// System.Int32.
- public int Compare(BaseItem x, BaseItem y)
- {
- return GetDate(x).CompareTo(GetDate(y));
- }
-
- ///
- /// Gets the date.
- ///
- /// The x.
- /// DateTime.
- private DateTime GetDate(BaseItem x)
- {
- if (x.PremiereDate.HasValue)
- {
- return x.PremiereDate.Value;
- }
-
- if (x.ProductionYear.HasValue)
- {
- return new DateTime(x.ProductionYear.Value, 1, 1, 0, 0, 0, DateTimeKind.Utc);
- }
- return DateTime.MaxValue;
- }
- }
-
- ///
- /// Class DatePlayedComparer
- ///
- public class DatePlayedComparer : IComparer
- {
- ///
- /// Gets or sets the user.
- ///
- /// The user.
- public User User { get; set; }
-
- ///
- /// Compares the specified x.
- ///
- /// The x.
- /// The y.
- /// System.Int32.
- public int Compare(BaseItem x, BaseItem y)
- {
- return GetDate(x).CompareTo(GetDate(y));
- }
-
- ///
- /// Gets the date.
- ///
- /// The x.
- /// DateTime.
- private DateTime GetDate(BaseItem x)
- {
- var userdata = x.GetUserData(User, false);
-
- if (userdata != null && userdata.LastPlayedDate.HasValue)
- {
- return userdata.LastPlayedDate.Value;
- }
-
- return DateTime.MinValue;
- }
- }
}
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index c6f4790298..ef34742df4 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -13,7 +13,6 @@ using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
-using SortOrder = MediaBrowser.Controller.Sorting.SortOrder;
namespace MediaBrowser.Controller.Entities
{
@@ -177,63 +176,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- #region Sorting
-
- ///
- /// The _sort by options
- ///
- private Dictionary> _sortByOptions;
- ///
- /// Dictionary of sort options - consists of a display value (localized) and an IComparer of BaseItem
- ///
- /// The sort by options.
- [IgnoreDataMember]
- public Dictionary> SortByOptions
- {
- get { return _sortByOptions ?? (_sortByOptions = GetSortByOptions()); }
- }
-
- ///
- /// Returns the valid set of sort by options for this folder type.
- /// Override or extend to modify.
- ///
- /// Dictionary{System.StringIComparer{BaseItem}}.
- protected virtual Dictionary> GetSortByOptions()
- {
- return new Dictionary> {
- {LocalizedStrings.Instance.GetString("NameDispPref"), new BaseItemComparer(SortOrder.Name, Logger)},
- {LocalizedStrings.Instance.GetString("DateDispPref"), new BaseItemComparer(SortOrder.Date, Logger)},
- {LocalizedStrings.Instance.GetString("RatingDispPref"), new BaseItemComparer(SortOrder.Rating, Logger)},
- {LocalizedStrings.Instance.GetString("RuntimeDispPref"), new BaseItemComparer(SortOrder.Runtime, Logger)},
- {LocalizedStrings.Instance.GetString("YearDispPref"), new BaseItemComparer(SortOrder.Year, Logger)}
- };
-
- }
-
- ///
- /// Get a sorting comparer by name
- ///
- /// The name.
- /// IComparer{BaseItem}.
- private IComparer GetSortingFunction(string name)
- {
- IComparer sorting;
- SortByOptions.TryGetValue(name ?? "", out sorting);
- return sorting ?? new BaseItemComparer(SortOrder.Name, Logger);
- }
-
- ///
- /// Get the list of sort by choices for this folder (localized).
- ///
- /// The sort by option strings.
- [IgnoreDataMember]
- public IEnumerable SortByOptionStrings
- {
- get { return SortByOptions.Keys; }
- }
-
- #endregion
-
#region Indexing
///
@@ -877,11 +819,9 @@ namespace MediaBrowser.Controller.Entities
///
/// The user.
/// The index by.
- /// The sort by.
- /// The sort order.
/// IEnumerable{BaseItem}.
///
- public virtual IEnumerable GetChildren(User user, string indexBy = null, string sortBy = null, Model.Entities.SortOrder? sortOrder = null)
+ public virtual IEnumerable GetChildren(User user, string indexBy = null)
{
if (user == null)
{
@@ -889,7 +829,7 @@ namespace MediaBrowser.Controller.Entities
}
//the true root should return our users root folder children
- if (IsPhysicalRoot) return user.RootFolder.GetChildren(user, indexBy, sortBy, sortOrder);
+ if (IsPhysicalRoot) return user.RootFolder.GetChildren(user, indexBy);
IEnumerable result = null;
@@ -904,14 +844,7 @@ namespace MediaBrowser.Controller.Entities
result = ActualChildren.Where(c => c.IsVisible(user));
}
- if (string.IsNullOrEmpty(sortBy))
- {
- return result;
- }
-
- return sortOrder.HasValue && sortOrder.Value == Model.Entities.SortOrder.Descending
- ? result.OrderByDescending(i => i, GetSortingFunction(sortBy))
- : result.OrderBy(i => i, GetSortingFunction(sortBy));
+ return result;
}
///
diff --git a/MediaBrowser.Controller/Library/DtoBuilder.cs b/MediaBrowser.Controller/Library/DtoBuilder.cs
index 92a15b117c..bdaa51b6c1 100644
--- a/MediaBrowser.Controller/Library/DtoBuilder.cs
+++ b/MediaBrowser.Controller/Library/DtoBuilder.cs
@@ -373,11 +373,6 @@ namespace MediaBrowser.Controller.Library
{
dto.IndexOptions = folder.IndexByOptionStrings.ToArray();
}
-
- if (fields.Contains(ItemFields.SortOptions))
- {
- dto.SortOptions = folder.SortByOptionStrings.ToArray();
- }
}
// Add audio info
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 3f19302093..40131b6d20 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Resolvers;
+using MediaBrowser.Controller.Sorting;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
@@ -158,7 +159,19 @@ namespace MediaBrowser.Controller.Library
/// The plugin folders.
/// The resolvers.
/// The intro providers.
+ /// The item comparers.
void AddParts(IEnumerable rules, IEnumerable pluginFolders,
- IEnumerable resolvers, IEnumerable introProviders);
+ IEnumerable resolvers, IEnumerable introProviders, IEnumerable itemComparers);
+
+ ///
+ /// Sorts the specified items.
+ ///
+ /// The items.
+ /// The user.
+ /// The sort by.
+ /// The sort order.
+ /// IEnumerable{BaseItem}.
+ IEnumerable Sort(IEnumerable items, User user, IEnumerable sortBy,
+ SortOrder sortOrder);
}
}
\ No newline at end of file
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 5ae6cccac5..9b75290237 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -185,8 +185,8 @@
-
-
+
+
diff --git a/MediaBrowser.Controller/Sorting/BaseItemComparer.cs b/MediaBrowser.Controller/Sorting/BaseItemComparer.cs
deleted file mode 100644
index 94c16775d0..0000000000
--- a/MediaBrowser.Controller/Sorting/BaseItemComparer.cs
+++ /dev/null
@@ -1,248 +0,0 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Collections.Generic;
-
-namespace MediaBrowser.Controller.Sorting {
- ///
- /// Class BaseItemComparer
- ///
- public class BaseItemComparer : IComparer {
- ///
- /// The _order
- ///
- private readonly SortOrder _order;
- ///
- /// The _property name
- ///
- private readonly string _propertyName;
- ///
- /// The _compare culture
- ///
- private readonly StringComparison _compareCulture = StringComparison.CurrentCultureIgnoreCase;
-
- ///
- /// Gets or sets the logger.
- ///
- /// The logger.
- private ILogger Logger { get; set; }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The order.
- /// The logger.
- public BaseItemComparer(SortOrder order, ILogger logger) {
- _order = order;
- Logger = logger;
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The order.
- /// The compare.
- /// The logger.
- public BaseItemComparer(SortOrder order, StringComparison compare, ILogger logger)
- {
- _order = order;
- _compareCulture = compare;
- Logger = logger;
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The property.
- /// The logger.
- public BaseItemComparer(string property, ILogger logger)
- {
- _order = SortOrder.Custom;
- _propertyName = property;
- Logger = logger;
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The property.
- /// The compare.
- /// The logger.
- public BaseItemComparer(string property, StringComparison compare, ILogger logger)
- {
- _order = SortOrder.Custom;
- _propertyName = property;
- _compareCulture = compare;
- Logger = logger;
- }
-
- #region IComparer Members
-
- ///
- /// Compares the specified x.
- ///
- /// The x.
- /// The y.
- /// System.Int32.
- public int Compare(BaseItem x, BaseItem y) {
- int compare = 0;
-
- switch (_order) {
-
- case SortOrder.Date:
- compare = -x.DateCreated.CompareTo(y.DateCreated);
- break;
-
- case SortOrder.Year:
-
- var xProductionYear = x.ProductionYear ?? 0;
- var yProductionYear = y.ProductionYear ?? 0;
-
-
- compare = yProductionYear.CompareTo(xProductionYear);
- break;
-
- case SortOrder.Rating:
-
- var xRating = x.CommunityRating ?? 0;
- var yRating = y.CommunityRating ?? 0;
-
- compare = yRating.CompareTo(xRating);
- break;
-
- case SortOrder.Runtime:
- var xRuntime = x.RunTimeTicks ?? 0;
- var yRuntime = y.RunTimeTicks ?? 0;
-
- compare = xRuntime.CompareTo(yRuntime);
- break;
-
- case SortOrder.Custom:
-
- Logger.Debug("Sorting on custom field " + _propertyName);
- var yProp = y.GetType().GetProperty(_propertyName);
- var xProp = x.GetType().GetProperty(_propertyName);
- if (yProp == null || xProp == null) break;
- var yVal = yProp.GetValue(y, null);
- var xVal = xProp.GetValue(x,null);
- if (yVal == null && xVal == null) break;
- if (yVal == null) return 1;
- if (xVal == null) return -1;
- compare = String.Compare(xVal.ToString(), yVal.ToString(),_compareCulture);
- break;
-
- default:
- compare = 0;
- break;
- }
-
- if (compare == 0) {
-
- var name1 = x.SortName ?? x.Name ?? "";
- var name2 = y.SortName ?? y.Name ?? "";
-
- //if (Config.Instance.EnableAlphanumericSorting)
- compare = AlphaNumericCompare(name1, name2,_compareCulture);
- //else
- // compare = String.Compare(name1,name2,_compareCulture);
- }
-
- return compare;
- }
-
-
- #endregion
-
- ///
- /// Alphas the numeric compare.
- ///
- /// The s1.
- /// The s2.
- /// The compare culture.
- /// System.Int32.
- private int AlphaNumericCompare(string s1, string s2, StringComparison compareCulture) {
- // http://dotnetperls.com/Content/Alphanumeric-Sorting.aspx
-
- int len1 = s1.Length;
- int len2 = s2.Length;
- int marker1 = 0;
- int marker2 = 0;
-
- // Walk through two the strings with two markers.
- while (marker1 < len1 && marker2 < len2) {
- char ch1 = s1[marker1];
- char ch2 = s2[marker2];
-
- // Some buffers we can build up characters in for each chunk.
- var space1 = new char[len1];
- var loc1 = 0;
- var space2 = new char[len2];
- var loc2 = 0;
-
- // Walk through all following characters that are digits or
- // characters in BOTH strings starting at the appropriate marker.
- // Collect char arrays.
- do {
- space1[loc1++] = ch1;
- marker1++;
-
- if (marker1 < len1) {
- ch1 = s1[marker1];
- } else {
- break;
- }
- } while (char.IsDigit(ch1) == char.IsDigit(space1[0]));
-
- do {
- space2[loc2++] = ch2;
- marker2++;
-
- if (marker2 < len2) {
- ch2 = s2[marker2];
- } else {
- break;
- }
- } while (char.IsDigit(ch2) == char.IsDigit(space2[0]));
-
- // If we have collected numbers, compare them numerically.
- // Otherwise, if we have strings, compare them alphabetically.
- var str1 = new string(space1);
- var str2 = new string(space2);
-
- var result = 0;
-
- //biggest int - 2147483647
- if (char.IsDigit(space1[0]) && char.IsDigit(space2[0]) /*&& str1.Length < 10 && str2.Length < 10*/) //this assumed the entire string was a number...
- {
- int thisNumericChunk;
- var isValid = false;
-
- if (int.TryParse(str1.Substring(0, str1.Length > 9 ? 10 : str1.Length), out thisNumericChunk))
- {
- int thatNumericChunk;
-
- if (int.TryParse(str2.Substring(0, str2.Length > 9 ? 10 : str2.Length), out thatNumericChunk))
- {
- isValid = true;
- result = thisNumericChunk.CompareTo(thatNumericChunk);
- }
- }
-
- if (!isValid)
- {
- Logger.Error("Error comparing numeric strings: " + str1 + "/" + str2);
- result = String.Compare(str1, str2, compareCulture);
- }
-
- } else {
- result = String.Compare(str1,str2,compareCulture);
- }
-
- if (result != 0) {
- return result;
- }
- }
- return len1 - len2;
- }
- }
-}
diff --git a/MediaBrowser.Controller/Sorting/IBaseItemComparer.cs b/MediaBrowser.Controller/Sorting/IBaseItemComparer.cs
new file mode 100644
index 0000000000..6d0b95bcb5
--- /dev/null
+++ b/MediaBrowser.Controller/Sorting/IBaseItemComparer.cs
@@ -0,0 +1,17 @@
+using MediaBrowser.Controller.Entities;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Controller.Sorting
+{
+ ///
+ /// Interface IBaseItemComparer
+ ///
+ public interface IBaseItemComparer : IComparer
+ {
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ string Name { get; }
+ }
+}
diff --git a/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs b/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs
new file mode 100644
index 0000000000..b9da1f6a62
--- /dev/null
+++ b/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs
@@ -0,0 +1,16 @@
+using MediaBrowser.Controller.Entities;
+
+namespace MediaBrowser.Controller.Sorting
+{
+ ///
+ /// Represents a BaseItem comparer that requires a User to perform it's comparison
+ ///
+ public interface IUserBaseItemComparer : IBaseItemComparer
+ {
+ ///
+ /// Gets or sets the user.
+ ///
+ /// The user.
+ User User { get; set; }
+ }
+}
diff --git a/MediaBrowser.Controller/Sorting/SortOrder.cs b/MediaBrowser.Controller/Sorting/SortOrder.cs
deleted file mode 100644
index 3152ac67e4..0000000000
--- a/MediaBrowser.Controller/Sorting/SortOrder.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-
-namespace MediaBrowser.Controller.Sorting {
- ///
- /// Enum SortOrder
- ///
- public enum SortOrder {
-
- ///
- /// Sort by name
- ///
- Name,
- ///
- /// Sort by date added to the library
- ///
- Date,
- ///
- /// Sort by community rating
- ///
- Rating,
- ///
- /// Sort by runtime
- ///
- Runtime,
- ///
- /// Sort by year
- ///
- Year,
- ///
- /// Custom sort order added by plugins
- ///
- Custom
- }
-}
diff --git a/MediaBrowser.Model/DTO/BaseItemDto.cs b/MediaBrowser.Model/DTO/BaseItemDto.cs
index 971b0bde74..b1d3f83c23 100644
--- a/MediaBrowser.Model/DTO/BaseItemDto.cs
+++ b/MediaBrowser.Model/DTO/BaseItemDto.cs
@@ -315,13 +315,6 @@ namespace MediaBrowser.Model.Dto
[ProtoMember(52)]
public List AirDays { get; set; }
- ///
- /// Gets or sets the sort options.
- ///
- /// The sort options.
- [ProtoMember(53)]
- public string[] SortOptions { get; set; }
-
///
/// Gets or sets the index options.
///
diff --git a/MediaBrowser.Model/DTO/ItemFields.cs b/MediaBrowser.Model/DTO/ItemFields.cs
index a24c8a8f01..981afe8947 100644
--- a/MediaBrowser.Model/DTO/ItemFields.cs
+++ b/MediaBrowser.Model/DTO/ItemFields.cs
@@ -86,11 +86,6 @@ namespace MediaBrowser.Model.Dto
///
SortName,
- ///
- /// The fields that the server supports sorting on
- ///
- SortOptions,
-
///
/// The studios of the item
///
diff --git a/MediaBrowser.Model/DTO/ItemQuery.cs b/MediaBrowser.Model/DTO/ItemQuery.cs
index 6d64a093bc..085a872b1a 100644
--- a/MediaBrowser.Model/DTO/ItemQuery.cs
+++ b/MediaBrowser.Model/DTO/ItemQuery.cs
@@ -36,7 +36,7 @@ namespace MediaBrowser.Model.Dto
/// What to sort the results by
///
/// The sort by.
- public ItemSortBy[] SortBy { get; set; }
+ public string[] SortBy { get; set; }
///
/// The sort order to return results with
@@ -116,12 +116,6 @@ namespace MediaBrowser.Model.Dto
/// The index by.
public string IndexBy { get; set; }
- ///
- /// The dynamic, localized sort function name
- ///
- /// The dynamic sort by.
- public string DynamicSortBy { get; set; }
-
///
/// Gets or sets the image types.
///
diff --git a/MediaBrowser.Model/DTO/ItemSortBy.cs b/MediaBrowser.Model/DTO/ItemSortBy.cs
index 30cd1c3a45..141690a55a 100644
--- a/MediaBrowser.Model/DTO/ItemSortBy.cs
+++ b/MediaBrowser.Model/DTO/ItemSortBy.cs
@@ -2,41 +2,53 @@
namespace MediaBrowser.Model.Dto
{
///
- /// Enum ItemSortBy
+ /// These represent sort orders that are known by the core
///
- public enum ItemSortBy
+ public static class ItemSortBy
{
///
/// The album
///
- Album,
+ public const string Album = "Album";
///
/// The album artist
///
- AlbumArtist,
+ public const string AlbumArtist = "AlbumArtist";
///
/// The artist
///
- Artist,
+ public const string Artist = "Artist";
///
/// The date created
///
- DateCreated,
+ public const string DateCreated = "DateCreated";
///
/// The date played
///
- DatePlayed,
+ public const string DatePlayed = "DatePlayed";
///
/// The premiere date
///
- PremiereDate,
+ public const string PremiereDate = "PremiereDate";
///
/// The sort name
///
- SortName,
+ public const string SortName = "SortName";
///
/// The random
///
- Random
+ public const string Random = "Random";
+ ///
+ /// The runtime
+ ///
+ public const string Runtime = "Runtime";
+ ///
+ /// The community rating
+ ///
+ public const string CommunityRating = "CommunityRating";
+ ///
+ /// The production year
+ ///
+ public const string ProductionYear = "ProductionYear";
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 78ada14316..6cd46a3100 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -9,6 +9,7 @@ using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Controller.ScheduledTasks;
+using MediaBrowser.Controller.Sorting;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Implementations.Library.Resolvers;
@@ -22,6 +23,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using SortOrder = MediaBrowser.Model.Entities.SortOrder;
namespace MediaBrowser.Server.Implementations.Library
{
@@ -54,6 +56,12 @@ namespace MediaBrowser.Server.Implementations.Library
/// The entity resolvers enumerable.
private IEnumerable EntityResolvers { get; set; }
+ ///
+ /// Gets or sets the comparers.
+ ///
+ /// The comparers.
+ private IEnumerable Comparers { get; set; }
+
#region LibraryChanged Event
///
/// Fires whenever any validation routine adds or removes items. The added and removed items are properties of the args.
@@ -124,12 +132,14 @@ namespace MediaBrowser.Server.Implementations.Library
/// The plugin folders.
/// The resolvers.
/// The intro providers.
- public void AddParts(IEnumerable rules, IEnumerable pluginFolders, IEnumerable resolvers, IEnumerable introProviders)
+ /// The item comparers.
+ public void AddParts(IEnumerable rules, IEnumerable pluginFolders, IEnumerable resolvers, IEnumerable introProviders, IEnumerable itemComparers)
{
EntityResolutionIgnoreRules = rules;
PluginFolderCreators = pluginFolders;
EntityResolvers = resolvers.OrderBy(i => i.Priority).ToArray();
IntroProviders = introProviders;
+ Comparers = itemComparers;
}
///
@@ -702,5 +712,62 @@ namespace MediaBrowser.Server.Implementations.Library
{
return IntroProviders.SelectMany(i => i.GetIntros(item, user));
}
+
+ ///
+ /// Sorts the specified sort by.
+ ///
+ /// The items.
+ /// The user.
+ /// The sort by.
+ /// The sort order.
+ /// IEnumerable{BaseItem}.
+ public IEnumerable Sort(IEnumerable items, User user, IEnumerable sortBy, SortOrder sortOrder)
+ {
+ var isFirst = true;
+
+ IOrderedEnumerable orderedItems = null;
+
+ foreach (var orderBy in sortBy.Select(o => GetComparer(o, user)).Where(c => c != null))
+ {
+ if (isFirst)
+ {
+ orderedItems = sortOrder == SortOrder.Descending ? items.OrderByDescending(i => i, orderBy) : items.OrderBy(i => i, orderBy);
+ }
+ else
+ {
+ orderedItems = sortOrder == SortOrder.Descending ? orderedItems.ThenByDescending(i => i, orderBy) : orderedItems.ThenBy(i => i, orderBy);
+ }
+
+ isFirst = false;
+ }
+
+ return orderedItems ?? items;
+ }
+
+ ///
+ /// Gets the comparer.
+ ///
+ /// The name.
+ /// The user.
+ /// IBaseItemComparer.
+ private IBaseItemComparer GetComparer(string name, User user)
+ {
+ var comparer = Comparers.FirstOrDefault(c => string.Equals(name, c.Name, StringComparison.OrdinalIgnoreCase));
+
+ if (comparer != null)
+ {
+ // If it requires a user, create a new one, and assign the user
+ if (comparer is IUserBaseItemComparer)
+ {
+ var userComparer = (IUserBaseItemComparer)Activator.CreateInstance(comparer.GetType());
+
+ userComparer.User = user;
+
+ return userComparer;
+ }
+ }
+
+ return comparer;
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 0b9f7c7e13..c8a7a2fc18 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -139,6 +139,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MediaBrowser.Server.Implementations/Sorting/AlbumArtistComparer.cs b/MediaBrowser.Server.Implementations/Sorting/AlbumArtistComparer.cs
new file mode 100644
index 0000000000..e045cdfc87
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/AlbumArtistComparer.cs
@@ -0,0 +1,46 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+using System;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class AlbumArtistComparer
+ ///
+ public class AlbumArtistComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return string.Compare(GetValue(x), GetValue(y), StringComparison.CurrentCultureIgnoreCase);
+ }
+
+ ///
+ /// Gets the value.
+ ///
+ /// The x.
+ /// System.String.
+ private string GetValue(BaseItem x)
+ {
+ var audio = x as Audio;
+
+ return audio == null ? string.Empty : audio.AlbumArtist;
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.AlbumArtist; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/AlbumComparer.cs b/MediaBrowser.Server.Implementations/Sorting/AlbumComparer.cs
new file mode 100644
index 0000000000..24e1f40da8
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/AlbumComparer.cs
@@ -0,0 +1,46 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+using System;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class AlbumComparer
+ ///
+ public class AlbumComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return string.Compare(GetValue(x), GetValue(y), StringComparison.CurrentCultureIgnoreCase);
+ }
+
+ ///
+ /// Gets the value.
+ ///
+ /// The x.
+ /// System.String.
+ private string GetValue(BaseItem x)
+ {
+ var audio = x as Audio;
+
+ return audio == null ? string.Empty : audio.Album;
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.Album; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/ArtistComparer.cs b/MediaBrowser.Server.Implementations/Sorting/ArtistComparer.cs
new file mode 100644
index 0000000000..278a397858
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/ArtistComparer.cs
@@ -0,0 +1,46 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+using System;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class ArtistComparer
+ ///
+ public class ArtistComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return string.Compare(GetValue(x), GetValue(y), StringComparison.CurrentCultureIgnoreCase);
+ }
+
+ ///
+ /// Gets the value.
+ ///
+ /// The x.
+ /// System.String.
+ private string GetValue(BaseItem x)
+ {
+ var audio = x as Audio;
+
+ return audio == null ? string.Empty : audio.Artist;
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.Artist; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/CommunityRatingComparer.cs b/MediaBrowser.Server.Implementations/Sorting/CommunityRatingComparer.cs
new file mode 100644
index 0000000000..2e1b73ccff
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/CommunityRatingComparer.cs
@@ -0,0 +1,29 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ public class CommunityRatingComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return (x.CommunityRating ?? 0).CompareTo(y.CommunityRating ?? 0);
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.CommunityRating; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/DateCreatedComparer.cs b/MediaBrowser.Server.Implementations/Sorting/DateCreatedComparer.cs
new file mode 100644
index 0000000000..d340913c94
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/DateCreatedComparer.cs
@@ -0,0 +1,33 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+using System;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class DateCreatedComparer
+ ///
+ public class DateCreatedComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return DateTime.Compare(x.DateCreated, y.DateCreated);
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.DateCreated; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/DatePlayedComparer.cs b/MediaBrowser.Server.Implementations/Sorting/DatePlayedComparer.cs
new file mode 100644
index 0000000000..49e4645594
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/DatePlayedComparer.cs
@@ -0,0 +1,56 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+using System;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class DatePlayedComparer
+ ///
+ public class DatePlayedComparer : IUserBaseItemComparer
+ {
+ ///
+ /// Gets or sets the user.
+ ///
+ /// The user.
+ public User User { get; set; }
+
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return GetDate(x).CompareTo(GetDate(y));
+ }
+
+ ///
+ /// Gets the date.
+ ///
+ /// The x.
+ /// DateTime.
+ private DateTime GetDate(BaseItem x)
+ {
+ var userdata = x.GetUserData(User, false);
+
+ if (userdata != null && userdata.LastPlayedDate.HasValue)
+ {
+ return userdata.LastPlayedDate.Value;
+ }
+
+ return DateTime.MaxValue;
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.DatePlayed; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/PremiereDateComparer.cs b/MediaBrowser.Server.Implementations/Sorting/PremiereDateComparer.cs
new file mode 100644
index 0000000000..2a8d524052
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/PremiereDateComparer.cs
@@ -0,0 +1,52 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+using System;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class PremiereDateComparer
+ ///
+ public class PremiereDateComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return GetDate(x).CompareTo(GetDate(y));
+ }
+
+ ///
+ /// Gets the date.
+ ///
+ /// The x.
+ /// DateTime.
+ private DateTime GetDate(BaseItem x)
+ {
+ if (x.PremiereDate.HasValue)
+ {
+ return x.PremiereDate.Value;
+ }
+
+ if (x.ProductionYear.HasValue)
+ {
+ return new DateTime(x.ProductionYear.Value, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+ }
+ return DateTime.MaxValue;
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.PremiereDate; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/ProductionYearComparer.cs b/MediaBrowser.Server.Implementations/Sorting/ProductionYearComparer.cs
new file mode 100644
index 0000000000..47a03048cc
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/ProductionYearComparer.cs
@@ -0,0 +1,52 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class ProductionYearComparer
+ ///
+ public class ProductionYearComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return GetValue(x).CompareTo(GetValue(y));
+ }
+
+ ///
+ /// Gets the date.
+ ///
+ /// The x.
+ /// DateTime.
+ private int GetValue(BaseItem x)
+ {
+ if (x.ProductionYear.HasValue)
+ {
+ return x.ProductionYear.Value;
+ }
+
+ if (x.PremiereDate.HasValue)
+ {
+ return x.PremiereDate.Value.Year;
+ }
+
+ return 0;
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.ProductionYear; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/RandomComparer.cs b/MediaBrowser.Server.Implementations/Sorting/RandomComparer.cs
new file mode 100644
index 0000000000..e7e98a8a01
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/RandomComparer.cs
@@ -0,0 +1,33 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+using System;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class RandomComparer
+ ///
+ public class RandomComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return Guid.NewGuid().CompareTo(Guid.NewGuid());
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.Random; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/RuntimeComparer.cs b/MediaBrowser.Server.Implementations/Sorting/RuntimeComparer.cs
new file mode 100644
index 0000000000..71893ef316
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/RuntimeComparer.cs
@@ -0,0 +1,32 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class RuntimeComparer
+ ///
+ public class RuntimeComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return (x.RunTimeTicks ?? 0).CompareTo(y.RunTimeTicks ?? 0);
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.Runtime; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Sorting/SortNameComparer.cs b/MediaBrowser.Server.Implementations/Sorting/SortNameComparer.cs
new file mode 100644
index 0000000000..067f8c453e
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Sorting/SortNameComparer.cs
@@ -0,0 +1,33 @@
+using MediaBrowser.Controller.Entities;
+using System;
+using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Dto;
+
+namespace MediaBrowser.Server.Implementations.Sorting
+{
+ ///
+ /// Class SortNameComparer
+ ///
+ public class SortNameComparer : IBaseItemComparer
+ {
+ ///
+ /// Compares the specified x.
+ ///
+ /// The x.
+ /// The y.
+ /// System.Int32.
+ public int Compare(BaseItem x, BaseItem y)
+ {
+ return string.Compare(x.SortName, y.SortName, StringComparison.CurrentCultureIgnoreCase);
+ }
+
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public string Name
+ {
+ get { return ItemSortBy.SortName; }
+ }
+ }
+}
diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs
index c822aae847..e156c465be 100644
--- a/MediaBrowser.ServerApplication/ApplicationHost.cs
+++ b/MediaBrowser.ServerApplication/ApplicationHost.cs
@@ -18,6 +18,7 @@ using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Resolvers;
+using MediaBrowser.Controller.Sorting;
using MediaBrowser.Controller.Updates;
using MediaBrowser.Controller.Weather;
using MediaBrowser.IsoMounter;
@@ -242,7 +243,7 @@ namespace MediaBrowser.ServerApplication
ServerManager.AddWebSocketListeners(GetExports(false));
ServerManager.Start();
- LibraryManager.AddParts(GetExports(), GetExports(), GetExports(), GetExports());
+ LibraryManager.AddParts(GetExports(), GetExports(), GetExports(), GetExports(), GetExports());
ProviderManager.AddMetadataProviders(GetExports().OrderBy(e => e.Priority).ToArray());
}
diff --git a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
index d567a9fd8e..26e0978a34 100644
--- a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
+++ b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
@@ -4,6 +4,7 @@ using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization;
+using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
@@ -78,7 +79,8 @@ namespace MediaBrowser.ServerApplication
Cursor = Cursors.Wait;
await Task.Run(() =>
{
- IEnumerable children = CurrentUser.Name == "Physical" ? _libraryManager.RootFolder.Children.OrderBy(i => i.SortName) : _libraryManager.RootFolder.GetChildren(CurrentUser, sortBy: LocalizedStrings.Instance.GetString("NameDispPref"));
+ IEnumerable children = CurrentUser.Name == "Physical" ? _libraryManager.RootFolder.Children : _libraryManager.RootFolder.GetChildren(CurrentUser);
+ children = OrderByName(children, CurrentUser);
foreach (Folder folder in children)
{
@@ -86,9 +88,12 @@ namespace MediaBrowser.ServerApplication
var currentFolder = folder;
Task.Factory.StartNew(() =>
{
- var prefs = ddlProfile.SelectedItem != null ? currentFolder.GetDisplayPrefs(ddlProfile.SelectedItem as User, false) ?? new DisplayPreferences {SortBy = LocalizedStrings.Instance.GetString("NameDispPref")} : new DisplayPreferences {SortBy = LocalizedStrings.Instance.GetString("NameDispPref")};
+ var prefs = ddlProfile.SelectedItem != null ? currentFolder.GetDisplayPrefs(ddlProfile.SelectedItem as User, false) ?? new DisplayPreferences {SortBy = ItemSortBy.SortName} : new DisplayPreferences {SortBy = ItemSortBy.SortName};
var node = new TreeViewItem { Tag = currentFolder };
- AddChildren(node, currentFolder.GetChildren(CurrentUser, prefs.IndexBy, prefs.SortBy ?? LocalizedStrings.Instance.GetString("NameDispPref")), CurrentUser);
+
+ var subChildren = currentFolder.GetChildren(CurrentUser, prefs.IndexBy);
+ subChildren = OrderByName(subChildren, CurrentUser);
+ AddChildren(node, subChildren, CurrentUser);
node.Header = currentFolder.Name + " (" +
node.Items.Count + ")";
tvwLibrary.Items.Add(node);
@@ -100,6 +105,28 @@ namespace MediaBrowser.ServerApplication
}
+ ///
+ /// Orders the name of the by.
+ ///
+ /// The items.
+ /// The user.
+ /// IEnumerable{BaseItem}.
+ private IEnumerable OrderByName(IEnumerable items, User user)
+ {
+ return OrderBy(items, user, ItemSortBy.SortName);
+ }
+
+ ///
+ /// Orders the name of the by.
+ ///
+ /// The items.
+ /// The user.
+ /// IEnumerable{BaseItem}.
+ private IEnumerable OrderBy(IEnumerable items, User user, string order)
+ {
+ return _libraryManager.Sort(items, user, new[] { order }, SortOrder.Ascending);
+ }
+
///
/// Adds the children.
///
@@ -115,7 +142,7 @@ namespace MediaBrowser.ServerApplication
if (subFolder != null)
{
var prefs = subFolder.GetDisplayPrefs(user, false) ?? new DisplayPreferences {SortBy = LocalizedStrings.Instance.GetString("NameDispPref")};
- AddChildren(node, subFolder.GetChildren(user, sortBy: prefs.SortBy), user);
+ AddChildren(node, OrderBy(subFolder.GetChildren(user), user, prefs.SortBy), user);
node.Header = item.Name + " (" + node.Items.Count + ")";
}
else
@@ -152,14 +179,29 @@ namespace MediaBrowser.ServerApplication
{
lblIndexBy.Visibility = ddlIndexBy.Visibility = ddlSortBy.Visibility = lblSortBy.Visibility = Visibility.Visible;
ddlIndexBy.ItemsSource = folder.IndexByOptionStrings;
- ddlSortBy.ItemsSource = folder.SortByOptionStrings;
+
+ ddlSortBy.ItemsSource = new []
+ {
+ ItemSortBy.SortName,
+ ItemSortBy.Album,
+ ItemSortBy.AlbumArtist,
+ ItemSortBy.Artist,
+ ItemSortBy.CommunityRating,
+ ItemSortBy.DateCreated,
+ ItemSortBy.DatePlayed,
+ ItemSortBy.PremiereDate,
+ ItemSortBy.ProductionYear,
+ ItemSortBy.Random,
+ ItemSortBy.Runtime
+ };
+
var prefs = folder.GetDisplayPrefs(ddlProfile.SelectedItem as User, false);
ddlIndexBy.SelectedItem = prefs != null
? prefs.IndexBy ?? LocalizedStrings.Instance.GetString("NoneDispPref")
: LocalizedStrings.Instance.GetString("NoneDispPref");
ddlSortBy.SelectedItem = prefs != null
- ? prefs.SortBy ?? LocalizedStrings.Instance.GetString("NameDispPref")
- : LocalizedStrings.Instance.GetString("NameDispPref");
+ ? prefs.SortBy ?? ItemSortBy.SortName
+ : ItemSortBy.SortName;
}
else
{
@@ -311,7 +353,7 @@ namespace MediaBrowser.ServerApplication
var folder = treeItem != null
? treeItem.Tag as Folder
: null;
- var prefs = folder != null ? folder.GetDisplayPrefs(CurrentUser, true) : new DisplayPreferences {SortBy = LocalizedStrings.Instance.GetString("NameDispPref")};
+ var prefs = folder != null ? folder.GetDisplayPrefs(CurrentUser, true) : new DisplayPreferences {SortBy = ItemSortBy.SortName};
if (folder != null && prefs.IndexBy != ddlIndexBy.SelectedItem as string)
{
//grab UI context so we can update within the below task
@@ -326,7 +368,7 @@ namespace MediaBrowser.ServerApplication
//re-build the current item's children as an index
prefs.IndexBy = ddlIndexBy.SelectedItem as string;
treeItem.Items.Clear();
- AddChildren(treeItem,folder.GetChildren(CurrentUser, prefs.IndexBy, prefs.SortBy), CurrentUser);
+ AddChildren(treeItem, OrderBy(folder.GetChildren(CurrentUser, prefs.IndexBy), CurrentUser, prefs.SortBy), CurrentUser);
treeItem.Header = folder.Name + "(" +
treeItem.Items.Count + ")";
Cursor = Cursors.Arrow;
@@ -367,7 +409,7 @@ namespace MediaBrowser.ServerApplication
//re-sort
prefs.SortBy = ddlSortBy.SelectedItem as string;
treeItem.Items.Clear();
- AddChildren(treeItem,folder.GetChildren(CurrentUser,prefs.IndexBy, prefs.SortBy ?? LocalizedStrings.Instance.GetString("NameDispPref")), CurrentUser);
+ AddChildren(treeItem, OrderBy(folder.GetChildren(CurrentUser, prefs.IndexBy), CurrentUser, prefs.SortBy ?? ItemSortBy.SortName), CurrentUser);
treeItem.Header = folder.Name + "(" +
treeItem.Items.Count + ")";
Cursor = Cursors.Arrow;
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index ec3137d837..88ef979509 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -76,7 +76,7 @@
- true
+ false
false
@@ -112,6 +112,9 @@
MinimumRecommendedRules.ruleset
true
+
+ LocalIntranet
+
..\packages\Hardcodet.Wpf.TaskbarNotification.1.0.4.0\lib\net40\Hardcodet.Wpf.TaskbarNotification.dll
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication_TemporaryKey.pfx b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication_TemporaryKey.pfx
deleted file mode 100644
index 64676b0546..0000000000
Binary files a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication_TemporaryKey.pfx and /dev/null differ