aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/Dlna/DlnaServerService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/Dlna/DlnaServerService.cs')
-rw-r--r--MediaBrowser.Api/Dlna/DlnaServerService.cs96
1 files changed, 88 insertions, 8 deletions
diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs
index 0dd7ee7d1..3ae9ddc63 100644
--- a/MediaBrowser.Api/Dlna/DlnaServerService.cs
+++ b/MediaBrowser.Api/Dlna/DlnaServerService.cs
@@ -1,10 +1,12 @@
-using System;
-using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Dlna;
using ServiceStack;
using ServiceStack.Text.Controller;
using ServiceStack.Web;
+using System;
using System.Collections.Generic;
+using System.Globalization;
using System.IO;
+using System.Linq;
using System.Threading.Tasks;
namespace MediaBrowser.Api.Dlna
@@ -17,21 +19,28 @@ namespace MediaBrowser.Api.Dlna
public string UuId { get; set; }
}
- [Route("/Dlna/contentdirectory.xml", "GET", Summary = "Gets dlna content directory xml")]
- [Route("/Dlna/contentdirectory", "GET", Summary = "Gets dlna content directory xml")]
+ [Route("/Dlna/contentdirectory/contentdirectory.xml", "GET", Summary = "Gets dlna content directory xml")]
+ [Route("/Dlna/contentdirectory/contentdirectory", "GET", Summary = "Gets dlna content directory xml")]
public class GetContentDirectory
{
}
- [Route("/Dlna/{UuId}/control", "POST", Summary = "Processes a control request")]
+ [Route("/Dlna/contentdirectory/{UuId}/control", "POST", Summary = "Processes a control request")]
public class ProcessControlRequest : IRequiresRequestStream
{
[ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
public string UuId { get; set; }
-
+
public Stream RequestStream { get; set; }
}
+ [Route("/Dlna/contentdirectory/{UuId}/events", Summary = "Processes an event subscription request")]
+ public class ProcessEventRequest
+ {
+ [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
+ public string UuId { get; set; }
+ }
+
[Route("/Dlna/icons/{Filename}", "GET", Summary = "Gets a server icon")]
public class GetIcon
{
@@ -72,8 +81,8 @@ namespace MediaBrowser.Api.Dlna
private async Task<ControlResponse> PostAsync(ProcessControlRequest request)
{
var pathInfo = PathInfo.Parse(Request.PathInfo);
- var id = pathInfo.GetArgumentValue<string>(1);
-
+ var id = pathInfo.GetArgumentValue<string>(2);
+
using (var reader = new StreamReader(request.RequestStream))
{
return _dlnaManager.ProcessControlRequest(new ControlRequest
@@ -111,5 +120,76 @@ namespace MediaBrowser.Api.Dlna
}
}
}
+
+ public object Any(ProcessEventRequest request)
+ {
+ var subscriptionId = GetHeader("SID");
+ var notificationType = GetHeader("NT");
+ var callback = GetHeader("CALLBACK");
+ var timeoutString = GetHeader("TIMEOUT");
+
+ var timeout = ParseTimeout(timeoutString) ?? 300;
+
+ if (string.Equals(Request.Verb, "SUBSCRIBE", StringComparison.OrdinalIgnoreCase))
+ {
+ if (string.IsNullOrEmpty(notificationType))
+ {
+ RenewEvent(subscriptionId, timeout);
+ }
+ else
+ {
+ SubscribeToEvent(notificationType, timeout, callback);
+ }
+
+ return GetSubscriptionResponse(request.UuId, timeout);
+ }
+
+ UnsubscribeFromEvent(subscriptionId);
+ return ResultFactory.GetResult("", "text/plain");
+ }
+
+ private void UnsubscribeFromEvent(string subscriptionId)
+ {
+
+ }
+
+ private void SubscribeToEvent(string notificationType, int? timeout, string callback)
+ {
+
+ }
+
+ private void RenewEvent(string subscriptionId, int? timeout)
+ {
+
+ }
+
+ private object GetSubscriptionResponse(string uuid, int timeout)
+ {
+ var headers = new Dictionary<string, string>();
+
+ headers["SID"] = "uuid:" + uuid;
+ headers["TIMEOUT"] = "SECOND-" + timeout.ToString(_usCulture);
+
+ return ResultFactory.GetResult("\r\n", "text/plain", headers);
+ }
+
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+ private int? ParseTimeout(string header)
+ {
+ if (!string.IsNullOrEmpty(header))
+ {
+ // Starts with SECOND-
+ header = header.Split('-').Last();
+
+ int val;
+
+ if (int.TryParse(header, NumberStyles.Any, _usCulture, out val))
+ {
+ return val;
+ }
+ }
+
+ return null;
+ }
}
}