Browse Source

dlna fixes

Luke Pulverenti 10 years ago
parent
commit
54c5e88b87

+ 25 - 13
MediaBrowser.Api/Dlna/DlnaServerService.cs

@@ -18,25 +18,31 @@ namespace MediaBrowser.Api.Dlna
         public string UuId { get; set; }
     }
 
-    [Route("/Dlna/contentdirectory/contentdirectory.xml", "GET", Summary = "Gets dlna content directory xml")]
-    [Route("/Dlna/contentdirectory/contentdirectory", "GET", Summary = "Gets dlna content directory xml")]
+    [Route("/Dlna/{UuId}/contentdirectory/contentdirectory.xml", "GET", Summary = "Gets dlna content directory xml")]
+    [Route("/Dlna/{UuId}/contentdirectory/contentdirectory", "GET", Summary = "Gets dlna content directory xml")]
     public class GetContentDirectory
     {
+        [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
+        public string UuId { get; set; }
     }
 
-    [Route("/Dlna/connectionmanager/connectionmanager.xml", "GET", Summary = "Gets dlna connection manager xml")]
-    [Route("/Dlna/connectionmanager/connectionmanager", "GET", Summary = "Gets dlna connection manager xml")]
+    [Route("/Dlna/{UuId}/connectionmanager/connectionmanager.xml", "GET", Summary = "Gets dlna connection manager xml")]
+    [Route("/Dlna/{UuId}/connectionmanager/connectionmanager", "GET", Summary = "Gets dlna connection manager xml")]
     public class GetConnnectionManager
     {
+        [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
+        public string UuId { get; set; }
     }
 
-    [Route("/Dlna/mediareceiverregistrar/mediareceiverregistrar.xml", "GET", Summary = "Gets dlna mediareceiverregistrar xml")]
-    [Route("/Dlna/mediareceiverregistrar/mediareceiverregistrar", "GET", Summary = "Gets dlna mediareceiverregistrar xml")]
+    [Route("/Dlna/{UuId}/mediareceiverregistrar/mediareceiverregistrar.xml", "GET", Summary = "Gets dlna mediareceiverregistrar xml")]
+    [Route("/Dlna/{UuId}/mediareceiverregistrar/mediareceiverregistrar", "GET", Summary = "Gets dlna mediareceiverregistrar xml")]
     public class GetMediaReceiverRegistrar
     {
+        [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
+        public string UuId { get; set; }
     }
 
-    [Route("/Dlna/contentdirectory/{UuId}/control", "POST", Summary = "Processes a control request")]
+    [Route("/Dlna/{UuId}/contentdirectory/control", "POST", Summary = "Processes a control request")]
     public class ProcessContentDirectoryControlRequest : IRequiresRequestStream
     {
         [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
@@ -45,7 +51,7 @@ namespace MediaBrowser.Api.Dlna
         public Stream RequestStream { get; set; }
     }
 
-    [Route("/Dlna/connectionmanager/{UuId}/control", "POST", Summary = "Processes a control request")]
+    [Route("/Dlna/{UuId}/connectionmanager/control", "POST", Summary = "Processes a control request")]
     public class ProcessConnectionManagerControlRequest : IRequiresRequestStream
     {
         [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
@@ -54,7 +60,7 @@ namespace MediaBrowser.Api.Dlna
         public Stream RequestStream { get; set; }
     }
 
-    [Route("/Dlna/mediareceiverregistrar/{UuId}/control", "POST", Summary = "Processes a control request")]
+    [Route("/Dlna/{UuId}/mediareceiverregistrar/control", "POST", Summary = "Processes a control request")]
     public class ProcessMediaReceiverRegistrarControlRequest : IRequiresRequestStream
     {
         [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
@@ -63,30 +69,34 @@ namespace MediaBrowser.Api.Dlna
         public Stream RequestStream { get; set; }
     }
 
-    [Route("/Dlna/mediareceiverregistrar/{UuId}/events", Summary = "Processes an event subscription request")]
+    [Route("/Dlna/{UuId}/mediareceiverregistrar/events", Summary = "Processes an event subscription request")]
     public class ProcessMediaReceiverRegistrarEventRequest
     {
         [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
         public string UuId { get; set; }
     }
 
-    [Route("/Dlna/contentdirectory/{UuId}/events", Summary = "Processes an event subscription request")]
+    [Route("/Dlna/{UuId}/contentdirectory/events", Summary = "Processes an event subscription request")]
     public class ProcessContentDirectoryEventRequest
     {
         [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
         public string UuId { get; set; }
     }
 
-    [Route("/Dlna/connectionmanager/{UuId}/events", Summary = "Processes an event subscription request")]
+    [Route("/Dlna/{UuId}/connectionmanager/events", Summary = "Processes an event subscription request")]
     public class ProcessConnectionManagerEventRequest
     {
         [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
         public string UuId { get; set; }
     }
 
+    [Route("/Dlna/{UuId}/icons/{Filename}", "GET", Summary = "Gets a server icon")]
     [Route("/Dlna/icons/{Filename}", "GET", Summary = "Gets a server icon")]
     public class GetIcon
     {
+        [ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
+        public string UuId { get; set; }
+        
         [ApiMember(Name = "Filename", Description = "The icon filename", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
         public string Filename { get; set; }
     }
@@ -108,7 +118,9 @@ namespace MediaBrowser.Api.Dlna
 
         public object Get(GetDescriptionXml request)
         {
-            var xml = _dlnaManager.GetServerDescriptionXml(GetRequestHeaders(), request.UuId);
+            var url = Request.AbsoluteUri;
+            var serverAddress = url.Substring(0, url.IndexOf("/dlna/", StringComparison.OrdinalIgnoreCase));
+            var xml = _dlnaManager.GetServerDescriptionXml(GetRequestHeaders(), request.UuId, serverAddress);
 
             return ResultFactory.GetResult(xml, "text/xml");
         }

+ 2 - 1
MediaBrowser.Controller/Dlna/IDlnaManager.cs

@@ -62,8 +62,9 @@ namespace MediaBrowser.Controller.Dlna
         /// </summary>
         /// <param name="headers">The headers.</param>
         /// <param name="serverUuId">The server uu identifier.</param>
+        /// <param name="serverAddress">The server address.</param>
         /// <returns>System.String.</returns>
-        string GetServerDescriptionXml(IDictionary<string, string> headers, string serverUuId);
+        string GetServerDescriptionXml(IDictionary<string, string> headers, string serverUuId, string serverAddress);
 
         /// <summary>
         /// Gets the icon.

+ 2 - 2
MediaBrowser.Dlna/DlnaManager.cs

@@ -475,12 +475,12 @@ namespace MediaBrowser.Dlna
             internal string Path { get; set; }
         }
 
-        public string GetServerDescriptionXml(IDictionary<string, string> headers, string serverUuId)
+        public string GetServerDescriptionXml(IDictionary<string, string> headers, string serverUuId, string serverAddress)
         {
             var profile = GetProfile(headers) ??
                           GetDefaultProfile();
 
-            return new DescriptionXmlBuilder(profile, serverUuId, "").GetXml();
+            return new DescriptionXmlBuilder(profile, serverUuId, serverAddress).GetXml();
         }
 
         public ImageStream GetIcon(string filename)

+ 5 - 5
MediaBrowser.Dlna/MediaReceiverRegistrar/ServiceActionListBuilder.cs

@@ -11,11 +11,11 @@ namespace MediaBrowser.Dlna.MediaReceiverRegistrar
             {
                 GetIsValidated(),
                 GetIsAuthorized(),
-                //GetRegisterDevice(),
-                //GetGetAuthorizationDeniedUpdateID(),
-                //GetGetAuthorizationGrantedUpdateID(),
-                //GetGetValidationRevokedUpdateID(),
-                //GetGetValidationSucceededUpdateID()
+                GetRegisterDevice(),
+                GetGetAuthorizationDeniedUpdateID(),
+                GetGetAuthorizationGrantedUpdateID(),
+                GetGetValidationRevokedUpdateID(),
+                GetGetValidationSucceededUpdateID()
             };
 
             return list;

+ 41 - 21
MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs

@@ -23,6 +23,11 @@ namespace MediaBrowser.Dlna.Server
                 throw new ArgumentNullException("serverUdn");
             }
 
+            if (string.IsNullOrWhiteSpace(serverAddress))
+            {
+                throw new ArgumentNullException("serverAddress");
+            }
+
             _profile = profile;
             _serverUdn = serverUdn;
             _serverAddress = serverAddress;
@@ -81,8 +86,8 @@ namespace MediaBrowser.Dlna.Server
             builder.Append("<modelURL>" + SecurityElement.Escape(_profile.ModelUrl ?? string.Empty) + "</modelURL>");
             builder.Append("<serialNumber>" + SecurityElement.Escape(_profile.SerialNumber ?? string.Empty) + "</serialNumber>");
 
-            //builder.Append("<URLBase>" + SecurityElement.Escape(_serverAddress) + "</URLBase>");
-            
+            builder.Append("<URLBase>" + SecurityElement.Escape(_serverAddress) + "</URLBase>");
+
             if (!string.IsNullOrWhiteSpace(_profile.SonyAggregationFlags))
             {
                 builder.Append("<av:aggregationFlags xmlns:av=\"urn:schemas-sony-com:av\">" + SecurityElement.Escape(_profile.SonyAggregationFlags) + "</av:aggregationFlags>");
@@ -101,7 +106,7 @@ namespace MediaBrowser.Dlna.Server
                 builder.Append("<width>" + SecurityElement.Escape(icon.Width.ToString(_usCulture)) + "</width>");
                 builder.Append("<height>" + SecurityElement.Escape(icon.Height.ToString(_usCulture)) + "</height>");
                 builder.Append("<depth>" + SecurityElement.Escape(icon.Depth ?? string.Empty) + "</depth>");
-                builder.Append("<url>" + SecurityElement.Escape(icon.Url ?? string.Empty) + "</url>");
+                builder.Append("<url>" + BuildUrl(icon.Url) + "</url>");
 
                 builder.Append("</icon>");
             }
@@ -119,9 +124,9 @@ namespace MediaBrowser.Dlna.Server
 
                 builder.Append("<serviceType>" + SecurityElement.Escape(service.ServiceType ?? string.Empty) + "</serviceType>");
                 builder.Append("<serviceId>" + SecurityElement.Escape(service.ServiceId ?? string.Empty) + "</serviceId>");
-                builder.Append("<SCPDURL>" + SecurityElement.Escape(service.ScpdUrl ?? string.Empty) + "</SCPDURL>");
-                builder.Append("<controlURL>" + SecurityElement.Escape(service.ControlUrl ?? string.Empty) + "</controlURL>");
-                builder.Append("<eventSubURL>" + SecurityElement.Escape(service.EventSubUrl ?? string.Empty) + "</eventSubURL>");
+                builder.Append("<SCPDURL>" + BuildUrl(service.ScpdUrl) + "</SCPDURL>");
+                builder.Append("<controlURL>" + BuildUrl(service.ControlUrl) + "</controlURL>");
+                builder.Append("<eventSubURL>" + BuildUrl(service.EventSubUrl) + "</eventSubURL>");
 
                 builder.Append("</service>");
             }
@@ -129,6 +134,21 @@ namespace MediaBrowser.Dlna.Server
             builder.Append("</serviceList>");
         }
 
+        private string BuildUrl(string url)
+        {
+            if (string.IsNullOrWhiteSpace(url))
+            {
+                return string.Empty;
+            }
+
+            url = url.TrimStart('/');
+
+            url = "/dlna/" + _serverUdn + "/" + url;
+            //url = _serverAddress.TrimEnd('/') + url;
+
+            return SecurityElement.Escape(url);
+        }
+
         private IEnumerable<DeviceIcon> GetIcons()
         {
             var list = new List<DeviceIcon>();
@@ -139,7 +159,7 @@ namespace MediaBrowser.Dlna.Server
                 Depth = "24",
                 Width = 240,
                 Height = 240,
-                Url = "/dlna/icons/logo240.png"
+                Url = "icons/logo240.png"
             });
 
             list.Add(new DeviceIcon
@@ -148,7 +168,7 @@ namespace MediaBrowser.Dlna.Server
                 Depth = "24",
                 Width = 240,
                 Height = 240,
-                Url = "/dlna/icons/logo240.jpg"
+                Url = "icons/logo240.jpg"
             });
 
             list.Add(new DeviceIcon
@@ -157,7 +177,7 @@ namespace MediaBrowser.Dlna.Server
                 Depth = "24",
                 Width = 120,
                 Height = 120,
-                Url = "/dlna/icons/logo120.png"
+                Url = "icons/logo120.png"
             });
 
             list.Add(new DeviceIcon
@@ -166,7 +186,7 @@ namespace MediaBrowser.Dlna.Server
                 Depth = "24",
                 Width = 120,
                 Height = 120,
-                Url = "/dlna/icons/logo120.jpg"
+                Url = "icons/logo120.jpg"
             });
 
             list.Add(new DeviceIcon
@@ -175,7 +195,7 @@ namespace MediaBrowser.Dlna.Server
                 Depth = "24",
                 Width = 48,
                 Height = 48,
-                Url = "/dlna/icons/logo48.png"
+                Url = "icons/logo48.png"
             });
 
             list.Add(new DeviceIcon
@@ -184,7 +204,7 @@ namespace MediaBrowser.Dlna.Server
                 Depth = "24",
                 Width = 48,
                 Height = 48,
-                Url = "/dlna/icons/logo48.jpg"
+                Url = "icons/logo48.jpg"
             });
 
             return list;
@@ -198,27 +218,27 @@ namespace MediaBrowser.Dlna.Server
             {
                 ServiceType = "urn:schemas-upnp-org:service:ContentDirectory:1",
                 ServiceId = "urn:upnp-org:serviceId:ContentDirectory",
-                ScpdUrl = "/dlna/contentdirectory/contentdirectory.xml",
-                ControlUrl = "/dlna/contentdirectory/" + _serverUdn + "/control",
-                EventSubUrl = "/dlna/contentdirectory/" + _serverUdn + "/events"
+                ScpdUrl = "contentdirectory/contentdirectory.xml",
+                ControlUrl = "contentdirectory/control",
+                EventSubUrl = "contentdirectory/events"
             });
 
             list.Add(new DeviceService
             {
                 ServiceType = "urn:schemas-upnp-org:service:ConnectionManager:1",
                 ServiceId = "urn:upnp-org:serviceId:ConnectionManager",
-                ScpdUrl = "/dlna/connectionmanager/connectionmanager.xml",
-                ControlUrl = "/dlna/connectionmanager/" + _serverUdn + "/control",
-                EventSubUrl = "/dlna/connectionmanager/" + _serverUdn + "/events"
+                ScpdUrl = "connectionmanager/connectionmanager.xml",
+                ControlUrl = "connectionmanager/control",
+                EventSubUrl = "connectionmanager/events"
             });
 
             list.Add(new DeviceService
             {
                 ServiceType = "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1",
                 ServiceId = "urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar",
-                ScpdUrl = "/dlna/mediareceiverregistrar/mediareceiverregistrar.xml",
-                ControlUrl = "/dlna/mediareceiverregistrar/" + _serverUdn + "/control",
-                EventSubUrl = "/dlna/mediareceiverregistrar/" + _serverUdn + "/events"
+                ScpdUrl = "mediareceiverregistrar/mediareceiverregistrar.xml",
+                ControlUrl = "mediareceiverregistrar/control",
+                EventSubUrl = "mediareceiverregistrar/events"
             });
 
             return list;