aboutsummaryrefslogtreecommitdiff
path: root/Emby.Dlna
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Dlna')
-rw-r--r--Emby.Dlna/Api/DlnaServerService.cs108
-rw-r--r--Emby.Dlna/ContentDirectory/ContentDirectory.cs5
-rw-r--r--Emby.Dlna/ContentDirectory/ControlHandler.cs31
3 files changed, 95 insertions, 49 deletions
diff --git a/Emby.Dlna/Api/DlnaServerService.cs b/Emby.Dlna/Api/DlnaServerService.cs
index 7ddcaf7e6..a451bbcf9 100644
--- a/Emby.Dlna/Api/DlnaServerService.cs
+++ b/Emby.Dlna/Api/DlnaServerService.cs
@@ -1,7 +1,5 @@
using System;
-using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Emby.Dlna.Main;
@@ -195,7 +193,7 @@ namespace Emby.Dlna.Api
private ControlResponse PostAsync(Stream requestStream, IUpnpService service)
{
- var id = GetPathValue(2);
+ var id = GetPathValue(2).ToString();
return service.ProcessControlRequest(new ControlRequest
{
@@ -206,51 +204,99 @@ namespace Emby.Dlna.Api
});
}
- protected string GetPathValue(int index)
+ // Copied from MediaBrowser.Api/BaseApiService.cs
+ // TODO: Remove code duplication
+ /// <summary>
+ /// Gets the path segment at the specified index.
+ /// </summary>
+ /// <param name="index">The index of the path segment.</param>
+ /// <returns>The path segment at the specified index.</returns>
+ /// <exception cref="IndexOutOfRangeException" >Path doesn't contain enough segments.</exception>
+ /// <exception cref="InvalidDataException" >Path doesn't start with the base url.</exception>
+ protected internal ReadOnlySpan<char> GetPathValue(int index)
{
- var pathInfo = Parse(Request.PathInfo);
- var first = pathInfo[0];
+ static void ThrowIndexOutOfRangeException()
+ => throw new IndexOutOfRangeException("Path doesn't contain enough segments.");
- string baseUrl = _configurationManager.Configuration.BaseUrl;
+ static void ThrowInvalidDataException()
+ => throw new InvalidDataException("Path doesn't start with the base url.");
+
+ ReadOnlySpan<char> path = Request.PathInfo;
- // backwards compatibility
- if (baseUrl.Length == 0)
+ // Remove the protocol part from the url
+ int pos = path.LastIndexOf("://");
+ if (pos != -1)
{
- if (string.Equals(first, "mediabrowser", StringComparison.OrdinalIgnoreCase)
- || string.Equals(first, "emby", StringComparison.OrdinalIgnoreCase))
- {
- index++;
- }
+ path = path.Slice(pos + 3);
}
- else if (string.Equals(first, baseUrl.Remove(0, 1)))
+
+ // Remove the query string
+ pos = path.LastIndexOf('?');
+ if (pos != -1)
{
- index++;
- var second = pathInfo[1];
- if (string.Equals(second, "mediabrowser", StringComparison.OrdinalIgnoreCase)
- || string.Equals(second, "emby", StringComparison.OrdinalIgnoreCase))
+ path = path.Slice(0, pos);
+ }
+
+ // Remove the domain
+ pos = path.IndexOf('/');
+ if (pos != -1)
+ {
+ path = path.Slice(pos);
+ }
+
+ // Remove base url
+ string baseUrl = _configurationManager.Configuration.BaseUrl;
+ int baseUrlLen = baseUrl.Length;
+ if (baseUrlLen != 0)
+ {
+ if (path.StartsWith(baseUrl, StringComparison.OrdinalIgnoreCase))
{
- index++;
+ path = path.Slice(baseUrlLen);
+ }
+ else
+ {
+ // The path doesn't start with the base url,
+ // how did we get here?
+ ThrowInvalidDataException();
}
}
- return pathInfo[index];
- }
+ // Remove leading /
+ path = path.Slice(1);
- private static string[] Parse(string pathUri)
- {
- var actionParts = pathUri.Split(new[] { "://" }, StringSplitOptions.None);
+ // Backwards compatibility
+ const string Emby = "emby/";
+ if (path.StartsWith(Emby, StringComparison.OrdinalIgnoreCase))
+ {
+ path = path.Slice(Emby.Length);
+ }
- var pathInfo = actionParts[actionParts.Length - 1];
+ const string MediaBrowser = "mediabrowser/";
+ if (path.StartsWith(MediaBrowser, StringComparison.OrdinalIgnoreCase))
+ {
+ path = path.Slice(MediaBrowser.Length);
+ }
- var optionsPos = pathInfo.LastIndexOf('?');
- if (optionsPos != -1)
+ // Skip segments until we are at the right index
+ for (int i = 0; i < index; i++)
{
- pathInfo = pathInfo.Substring(0, optionsPos);
+ pos = path.IndexOf('/');
+ if (pos == -1)
+ {
+ ThrowIndexOutOfRangeException();
+ }
+
+ path = path.Slice(pos + 1);
}
- var args = pathInfo.Split('/');
+ // Remove the rest
+ pos = path.IndexOf('/');
+ if (pos != -1)
+ {
+ path = path.Slice(0, pos);
+ }
- return args.Skip(1).ToArray();
+ return path;
}
public object Get(GetIcon request)
diff --git a/Emby.Dlna/ContentDirectory/ContentDirectory.cs b/Emby.Dlna/ContentDirectory/ContentDirectory.cs
index 5175898ab..78d69b338 100644
--- a/Emby.Dlna/ContentDirectory/ContentDirectory.cs
+++ b/Emby.Dlna/ContentDirectory/ContentDirectory.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using Emby.Dlna.Service;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
@@ -104,7 +103,7 @@ namespace Emby.Dlna.ContentDirectory
{
if (!string.IsNullOrEmpty(profile.UserId))
{
- var user = _userManager.GetUserById(profile.UserId);
+ var user = _userManager.GetUserById(Guid.Parse(profile.UserId));
if (user != null)
{
@@ -116,7 +115,7 @@ namespace Emby.Dlna.ContentDirectory
if (!string.IsNullOrEmpty(userId))
{
- var user = _userManager.GetUserById(userId);
+ var user = _userManager.GetUserById(Guid.Parse(userId));
if (user != null)
{
diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs
index d22fc2177..4f74bb222 100644
--- a/Emby.Dlna/ContentDirectory/ControlHandler.cs
+++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs
@@ -425,10 +425,10 @@ namespace Emby.Dlna.ContentDirectory
{
var folder = (Folder)item;
- var sortOrders = new List<string>();
+ var sortOrders = new List<(string, SortOrder)>();
if (!folder.IsPreSorted)
{
- sortOrders.Add(ItemSortBy.SortName);
+ sortOrders.Add((ItemSortBy.SortName, sort.SortOrder));
}
var mediaTypes = new List<string>();
@@ -464,7 +464,7 @@ namespace Emby.Dlna.ContentDirectory
{
Limit = limit,
StartIndex = startIndex,
- OrderBy = sortOrders.Select(i => new ValueTuple<string, SortOrder>(i, sort.SortOrder)).ToArray(),
+ OrderBy = sortOrders,
User = user,
Recursive = true,
IsMissing = false,
@@ -872,10 +872,10 @@ namespace Emby.Dlna.ContentDirectory
query.Parent = parent;
query.SetUser(user);
- query.OrderBy = new ValueTuple<string, SortOrder>[]
+ query.OrderBy = new[]
{
- new ValueTuple<string, SortOrder> (ItemSortBy.DatePlayed, SortOrder.Descending),
- new ValueTuple<string, SortOrder> (ItemSortBy.SortName, SortOrder.Ascending)
+ (ItemSortBy.DatePlayed, SortOrder.Descending),
+ (ItemSortBy.SortName, SortOrder.Ascending)
};
query.IsResumable = true;
@@ -1121,7 +1121,7 @@ namespace Emby.Dlna.ContentDirectory
private QueryResult<ServerItem> GetMusicLatest(BaseItem parent, User user, InternalItemsQuery query)
{
- query.OrderBy = new ValueTuple<string, SortOrder>[] { };
+ query.OrderBy = Array.Empty<(string, SortOrder)>();
var items = _userViewManager.GetLatestItems(new LatestItemsQuery
{
@@ -1138,7 +1138,7 @@ namespace Emby.Dlna.ContentDirectory
private QueryResult<ServerItem> GetNextUp(BaseItem parent, User user, InternalItemsQuery query)
{
- query.OrderBy = new ValueTuple<string, SortOrder>[] { };
+ query.OrderBy = Array.Empty<(string, SortOrder)>();
var result = _tvSeriesManager.GetNextUp(new NextUpQuery
{
@@ -1153,7 +1153,7 @@ namespace Emby.Dlna.ContentDirectory
private QueryResult<ServerItem> GetTvLatest(BaseItem parent, User user, InternalItemsQuery query)
{
- query.OrderBy = new ValueTuple<string, SortOrder>[] { };
+ query.OrderBy = Array.Empty<(string, SortOrder)>();
var items = _userViewManager.GetLatestItems(new LatestItemsQuery
{
@@ -1170,7 +1170,7 @@ namespace Emby.Dlna.ContentDirectory
private QueryResult<ServerItem> GetMovieLatest(BaseItem parent, User user, InternalItemsQuery query)
{
- query.OrderBy = new ValueTuple<string, SortOrder>[] { };
+ query.OrderBy = Array.Empty<(string, SortOrder)>();
var items = _userViewManager.GetLatestItems(new LatestItemsQuery
{
@@ -1274,13 +1274,14 @@ namespace Emby.Dlna.ContentDirectory
private void SetSorting(InternalItemsQuery query, SortCriteria sort, bool isPreSorted)
{
- var sortOrders = new List<string>();
- if (!isPreSorted)
+ if (isPreSorted)
{
- sortOrders.Add(ItemSortBy.SortName);
+ query.OrderBy = Array.Empty<(string, SortOrder)>();
+ }
+ else
+ {
+ query.OrderBy = new[] { (ItemSortBy.SortName, sort.SortOrder) };
}
-
- query.OrderBy = sortOrders.Select(i => new ValueTuple<string, SortOrder>(i, sort.SortOrder)).ToArray();
}
private QueryResult<ServerItem> ApplyPaging(QueryResult<ServerItem> result, int? startIndex, int? limit)