dlna: icons and compatibility improvements
Brings in icons for devices to display. Based on what some other open implementations have done, it's worth having a simple stub implmentation of ConnectionManagerService. Advertise X_MS_MediaReceiverRegistrar as well, which sounds like it is necessary for certain MSFT devices (like the X-Box.)
This commit is contained in:
parent
60bb01b22c
commit
78d38dda56
6 changed files with 200 additions and 3 deletions
26
cmd/serve/dlna/cms.go
Normal file
26
cmd/serve/dlna/cms.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
package dlna
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/anacrolix/dms/upnp"
|
||||||
|
)
|
||||||
|
|
||||||
|
const defaultProtocolInfo = "http-get:*:video/mpeg:*,http-get:*:video/mp4:*,http-get:*:video/vnd.dlna.mpeg-tts:*,http-get:*:video/avi:*,http-get:*:video/x-matroska:*,http-get:*:video/x-ms-wmv:*,http-get:*:video/wtv:*,http-get:*:audio/mpeg:*,http-get:*:audio/mp3:*,http-get:*:audio/mp4:*,http-get:*:audio/x-ms-wma*,http-get:*:audio/wav:*,http-get:*:audio/L16:*,http-get:*image/jpeg:*,http-get:*image/png:*,http-get:*image/gif:*,http-get:*image/tiff:*"
|
||||||
|
|
||||||
|
type connectionManagerService struct {
|
||||||
|
*server
|
||||||
|
upnp.Eventing
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cms *connectionManagerService) Handle(action string, argsXML []byte, r *http.Request) (map[string]string, error) {
|
||||||
|
switch action {
|
||||||
|
case "GetProtocolInfo":
|
||||||
|
return map[string]string{
|
||||||
|
"Source": defaultProtocolInfo,
|
||||||
|
"Sink": "",
|
||||||
|
}, nil
|
||||||
|
default:
|
||||||
|
return nil, upnp.InvalidActionError
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
88
cmd/serve/dlna/data/static/X_MS_MediaReceiverRegistrar.xml
Normal file
88
cmd/serve/dlna/data/static/X_MS_MediaReceiverRegistrar.xml
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
|
||||||
|
<specVersion>
|
||||||
|
<major>1</major>
|
||||||
|
<minor>0</minor>
|
||||||
|
</specVersion>
|
||||||
|
<actionList>
|
||||||
|
<action>
|
||||||
|
<name>IsAuthorized</name>
|
||||||
|
<argumentList>
|
||||||
|
<argument>
|
||||||
|
<name>DeviceID</name>
|
||||||
|
<direction>in</direction>
|
||||||
|
<relatedStateVariable>A_ARG_TYPE_DeviceID</relatedStateVariable>
|
||||||
|
</argument>
|
||||||
|
<argument>
|
||||||
|
<name>Result</name>
|
||||||
|
<direction>out</direction>
|
||||||
|
<relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
|
||||||
|
</argument>
|
||||||
|
</argumentList>
|
||||||
|
</action>
|
||||||
|
<action>
|
||||||
|
<name>RegisterDevice</name>
|
||||||
|
<argumentList>
|
||||||
|
<argument>
|
||||||
|
<name>RegistrationReqMsg</name>
|
||||||
|
<direction>in</direction>
|
||||||
|
<relatedStateVariable>A_ARG_TYPE_RegistrationReqMsg</relatedStateVariable>
|
||||||
|
</argument>
|
||||||
|
<argument>
|
||||||
|
<name>RegistrationRespMsg</name>
|
||||||
|
<direction>out</direction>
|
||||||
|
<relatedStateVariable>A_ARG_TYPE_RegistrationRespMsg</relatedStateVariable>
|
||||||
|
</argument>
|
||||||
|
</argumentList>
|
||||||
|
</action>
|
||||||
|
<action>
|
||||||
|
<name>IsValidated</name>
|
||||||
|
<argumentList>
|
||||||
|
<argument>
|
||||||
|
<name>DeviceID</name>
|
||||||
|
<direction>in</direction>
|
||||||
|
<relatedStateVariable>A_ARG_TYPE_DeviceID</relatedStateVariable>
|
||||||
|
</argument>
|
||||||
|
<argument>
|
||||||
|
<name>Result</name>
|
||||||
|
<direction>out</direction>
|
||||||
|
<relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
|
||||||
|
</argument>
|
||||||
|
</argumentList>
|
||||||
|
</action>
|
||||||
|
</actionList>
|
||||||
|
<serviceStateTable>
|
||||||
|
<stateVariable sendEvents="no">
|
||||||
|
<name>A_ARG_TYPE_DeviceID</name>
|
||||||
|
<dataType>string</dataType>
|
||||||
|
</stateVariable>
|
||||||
|
<stateVariable sendEvents="no">
|
||||||
|
<name>A_ARG_TYPE_Result</name>
|
||||||
|
<dataType>int</dataType>
|
||||||
|
</stateVariable>
|
||||||
|
<stateVariable sendEvents="no">
|
||||||
|
<name>A_ARG_TYPE_RegistrationReqMsg</name>
|
||||||
|
<dataType>bin.base64</dataType>
|
||||||
|
</stateVariable>
|
||||||
|
<stateVariable sendEvents="no">
|
||||||
|
<name>A_ARG_TYPE_RegistrationRespMsg</name>
|
||||||
|
<dataType>bin.base64</dataType>
|
||||||
|
</stateVariable>
|
||||||
|
<stateVariable sendEvents="yes">
|
||||||
|
<name>AuthorizationGrantedUpdateID</name>
|
||||||
|
<dataType>ui4</dataType>
|
||||||
|
</stateVariable>
|
||||||
|
<stateVariable sendEvents="yes">
|
||||||
|
<name>AuthorizationDeniedUpdateID</name>
|
||||||
|
<dataType>ui4</dataType>
|
||||||
|
</stateVariable>
|
||||||
|
<stateVariable sendEvents="yes">
|
||||||
|
<name>ValidationSucceededUpdateID</name>
|
||||||
|
<dataType>ui4</dataType>
|
||||||
|
</stateVariable>
|
||||||
|
<stateVariable sendEvents="yes">
|
||||||
|
<name>ValidationRevokedUpdateID</name>
|
||||||
|
<dataType>ui4</dataType>
|
||||||
|
</stateVariable>
|
||||||
|
</serviceStateTable>
|
||||||
|
</scpd>
|
BIN
cmd/serve/dlna/data/static/rclone-120x120.png
Normal file
BIN
cmd/serve/dlna/data/static/rclone-120x120.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
BIN
cmd/serve/dlna/data/static/rclone-48x48.png
Normal file
BIN
cmd/serve/dlna/data/static/rclone-48x48.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.6 KiB |
|
@ -115,6 +115,9 @@ func newServer(f fs.Fs, opt *dlnaflags.Options) *server {
|
||||||
"ContentDirectory": &contentDirectoryService{
|
"ContentDirectory": &contentDirectoryService{
|
||||||
server: s,
|
server: s,
|
||||||
},
|
},
|
||||||
|
"ConnectionManager": &connectionManagerService{
|
||||||
|
server: s,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
s.RootDeviceUUID = makeDeviceUUID(s.FriendlyName)
|
s.RootDeviceUUID = makeDeviceUUID(s.FriendlyName)
|
||||||
|
|
||||||
|
@ -166,6 +169,22 @@ var rootDescTmpl = template.Must(template.New("rootDesc").Parse(`<?xml version="
|
||||||
<modelURL>https://rclone.org/</modelURL>
|
<modelURL>https://rclone.org/</modelURL>
|
||||||
<serialNumber>00000000</serialNumber>
|
<serialNumber>00000000</serialNumber>
|
||||||
<UDN>{{.RootDeviceUUID}}</UDN>
|
<UDN>{{.RootDeviceUUID}}</UDN>
|
||||||
|
<iconList>
|
||||||
|
<icon>
|
||||||
|
<mimetype>image/png</mimetype>
|
||||||
|
<width>48</width>
|
||||||
|
<height>48</height>
|
||||||
|
<depth>8</depth>
|
||||||
|
<url>/static/rclone-48x48.png</url>
|
||||||
|
</icon>
|
||||||
|
<icon>
|
||||||
|
<mimetype>image/png</mimetype>
|
||||||
|
<width>120</width>
|
||||||
|
<height>120</height>
|
||||||
|
<depth>8</depth>
|
||||||
|
<url>/static/rclone-120x120.png</url>
|
||||||
|
</icon>
|
||||||
|
</iconList>
|
||||||
<serviceList>
|
<serviceList>
|
||||||
<service>
|
<service>
|
||||||
<serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>
|
<serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>
|
||||||
|
@ -181,6 +200,13 @@ var rootDescTmpl = template.Must(template.New("rootDesc").Parse(`<?xml version="
|
||||||
<controlURL>/ctl</controlURL>
|
<controlURL>/ctl</controlURL>
|
||||||
<eventSubURL></eventSubURL>
|
<eventSubURL></eventSubURL>
|
||||||
</service>
|
</service>
|
||||||
|
<service>
|
||||||
|
<serviceType>urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1</serviceType>
|
||||||
|
<serviceId>urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar</serviceId>
|
||||||
|
<SCPDURL>/static/X_MS_MediaReceiverRegistrar.xml</SCPDURL>
|
||||||
|
<controlURL>/ctl</controlURL>
|
||||||
|
<eventSubURL></eventSubURL>
|
||||||
|
</service>
|
||||||
</serviceList>
|
</serviceList>
|
||||||
<presentationURL>/</presentationURL>
|
<presentationURL>/</presentationURL>
|
||||||
</device>
|
</device>
|
||||||
|
@ -348,7 +374,8 @@ func (s *server) ssdpInterface(intf net.Interface) {
|
||||||
"urn:schemas-upnp-org:device:MediaServer:1"},
|
"urn:schemas-upnp-org:device:MediaServer:1"},
|
||||||
Services: []string{
|
Services: []string{
|
||||||
"urn:schemas-upnp-org:service:ContentDirectory:1",
|
"urn:schemas-upnp-org:service:ContentDirectory:1",
|
||||||
"urn:schemas-upnp-org:service:ConnectionManager:1"},
|
"urn:schemas-upnp-org:service:ConnectionManager:1",
|
||||||
|
"urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1"},
|
||||||
Location: advertiseLocationFn,
|
Location: advertiseLocationFn,
|
||||||
Server: serverField,
|
Server: serverField,
|
||||||
UUID: s.RootDeviceUUID,
|
UUID: s.RootDeviceUUID,
|
||||||
|
|
Loading…
Reference in a new issue