|
@@ -1,4 +1,5 @@
|
|
|
-using MediaBrowser.Common.Extensions;
|
|
|
+using System.Globalization;
|
|
|
+using MediaBrowser.Common.Extensions;
|
|
|
using MediaBrowser.Common.IO;
|
|
|
using MediaBrowser.Controller.Channels;
|
|
|
using MediaBrowser.Controller.Configuration;
|
|
@@ -299,8 +300,25 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
|
? null
|
|
|
: _userManager.GetUserById(new Guid(query.UserId));
|
|
|
|
|
|
- var itemsResult = await GetChannelItems(channelProvider, user, query.FolderId, providerStartIndex, providerLimit, cancellationToken)
|
|
|
- .ConfigureAwait(false);
|
|
|
+ ChannelItemSortField? sortField = null;
|
|
|
+ ChannelItemSortField parsedField;
|
|
|
+ if (query.SortBy.Length == 1 &&
|
|
|
+ Enum.TryParse(query.SortBy[0], true, out parsedField))
|
|
|
+ {
|
|
|
+ sortField = parsedField;
|
|
|
+ }
|
|
|
+
|
|
|
+ var sortDescending = query.SortOrder.HasValue && query.SortOrder.Value == SortOrder.Descending;
|
|
|
+
|
|
|
+ var itemsResult = await GetChannelItems(channelProvider,
|
|
|
+ user,
|
|
|
+ query.FolderId,
|
|
|
+ providerStartIndex,
|
|
|
+ providerLimit,
|
|
|
+ sortField,
|
|
|
+ sortDescending,
|
|
|
+ cancellationToken)
|
|
|
+ .ConfigureAwait(false);
|
|
|
|
|
|
var providerTotalRecordCount = providerLimit.HasValue ? itemsResult.TotalRecordCount : null;
|
|
|
|
|
@@ -322,9 +340,16 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
|
}
|
|
|
|
|
|
private readonly SemaphoreSlim _resourcePool = new SemaphoreSlim(1, 1);
|
|
|
- private async Task<ChannelItemResult> GetChannelItems(IChannel channel, User user, string folderId, int? startIndex, int? limit, CancellationToken cancellationToken)
|
|
|
+ private async Task<ChannelItemResult> GetChannelItems(IChannel channel,
|
|
|
+ User user,
|
|
|
+ string folderId,
|
|
|
+ int? startIndex,
|
|
|
+ int? limit,
|
|
|
+ ChannelItemSortField? sortField,
|
|
|
+ bool sortDescending,
|
|
|
+ CancellationToken cancellationToken)
|
|
|
{
|
|
|
- var cachePath = GetChannelDataCachePath(channel, user, folderId);
|
|
|
+ var cachePath = GetChannelDataCachePath(channel, user, folderId, sortField, sortDescending);
|
|
|
|
|
|
try
|
|
|
{
|
|
@@ -376,7 +401,9 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
|
{
|
|
|
User = user,
|
|
|
StartIndex = startIndex,
|
|
|
- Limit = limit
|
|
|
+ Limit = limit,
|
|
|
+ SortBy = sortField,
|
|
|
+ SortDescending = sortDescending
|
|
|
};
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(folderId))
|
|
@@ -415,7 +442,11 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private string GetChannelDataCachePath(IChannel channel, User user, string folderId)
|
|
|
+ private string GetChannelDataCachePath(IChannel channel,
|
|
|
+ User user,
|
|
|
+ string folderId,
|
|
|
+ ChannelItemSortField? sortField,
|
|
|
+ bool sortDescending)
|
|
|
{
|
|
|
var channelId = GetInternalChannelId(channel.Name).ToString("N");
|
|
|
|
|
@@ -423,7 +454,26 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
|
|
|
|
var version = string.IsNullOrWhiteSpace(channel.DataVersion) ? "0" : channel.DataVersion;
|
|
|
|
|
|
- return Path.Combine(_config.ApplicationPaths.CachePath, "channels", channelId, version, folderKey, user.Id.ToString("N") + ".json");
|
|
|
+ var filename = user.Id.ToString("N");
|
|
|
+ var hashfilename = false;
|
|
|
+
|
|
|
+ if (sortField.HasValue)
|
|
|
+ {
|
|
|
+ filename += "-sortField-" + sortField.Value;
|
|
|
+ hashfilename = true;
|
|
|
+ }
|
|
|
+ if (sortDescending)
|
|
|
+ {
|
|
|
+ filename += "-sortDescending";
|
|
|
+ hashfilename = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (hashfilename)
|
|
|
+ {
|
|
|
+ filename = filename.GetMD5().ToString("N");
|
|
|
+ }
|
|
|
+
|
|
|
+ return Path.Combine(_config.ApplicationPaths.CachePath, "channels", channelId, version, folderKey, filename + ".json");
|
|
|
}
|
|
|
|
|
|
private async Task<QueryResult<BaseItemDto>> GetReturnItems(IEnumerable<BaseItem> items, int? totalCountFromProvider, User user, ChannelItemQuery query, CancellationToken cancellationToken)
|