diff --git a/dlna/dlnaserver.go b/dlna/dlnaserver.go
index 486dfccf8..cd5704104 100644
--- a/dlna/dlnaserver.go
+++ b/dlna/dlnaserver.go
@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"crypto/md5"
+ "embed"
"encoding/xml"
"fmt"
"io"
@@ -13,8 +14,8 @@ import (
"net/url"
"strconv"
"strings"
- "time"
"text/template"
+ "time"
dms_dlna "github.com/anacrolix/dms/dlna"
"github.com/anacrolix/dms/soap"
@@ -30,6 +31,8 @@ const (
resPath = "/r/"
serviceControlURL = "/ctl"
)
+//go:embed static/*
+var staticContent embed.FS
type DLNAServer struct {
ds model.DataStore
@@ -88,10 +91,11 @@ func New(ds model.DataStore, broker events.Broker) *DLNAServer {
//setup dedicated HTTP server for UPNP
r := http.NewServeMux()
r.Handle(resPath, http.StripPrefix(resPath, http.HandlerFunc(s.ssdp.resourceHandler)))
-
+
+ r.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticContent))))
r.HandleFunc(rootDescPath, s.ssdp.rootDescHandler)
r.HandleFunc(serviceControlURL, s.ssdp.serviceControlHandler)
-
+
s.ssdp.handler = r
return s
diff --git a/dlna/static/ConnectionManager.xml b/dlna/static/ConnectionManager.xml
new file mode 100644
index 000000000..97a52f152
--- /dev/null
+++ b/dlna/static/ConnectionManager.xml
@@ -0,0 +1,182 @@
+
+
+
+ 1
+ 0
+
+
+
+ GetProtocolInfo
+
+
+ Source
+ out
+ SourceProtocolInfo
+
+
+ Sink
+ out
+ SinkProtocolInfo
+
+
+
+
+ PrepareForConnection
+
+
+ RemoteProtocolInfo
+ in
+ A_ARG_TYPE_ProtocolInfo
+
+
+ PeerConnectionManager
+ in
+ A_ARG_TYPE_ConnectionManager
+
+
+ PeerConnectionID
+ in
+ A_ARG_TYPE_ConnectionID
+
+
+ Direction
+ in
+ A_ARG_TYPE_Direction
+
+
+ ConnectionID
+ out
+ A_ARG_TYPE_ConnectionID
+
+
+ AVTransportID
+ out
+ A_ARG_TYPE_AVTransportID
+
+
+ RcsID
+ out
+ A_ARG_TYPE_RcsID
+
+
+
+
+ ConnectionComplete
+
+
+ ConnectionID
+ in
+ A_ARG_TYPE_ConnectionID
+
+
+
+
+ GetCurrentConnectionIDs
+
+
+ ConnectionIDs
+ out
+ CurrentConnectionIDs
+
+
+
+
+ GetCurrentConnectionInfo
+
+
+ ConnectionID
+ in
+ A_ARG_TYPE_ConnectionID
+
+
+ RcsID
+ out
+ A_ARG_TYPE_RcsID
+
+
+ AVTransportID
+ out
+ A_ARG_TYPE_AVTransportID
+
+
+ ProtocolInfo
+ out
+ A_ARG_TYPE_ProtocolInfo
+
+
+ PeerConnectionManager
+ out
+ A_ARG_TYPE_ConnectionManager
+
+
+ PeerConnectionID
+ out
+ A_ARG_TYPE_ConnectionID
+
+
+ Direction
+ out
+ A_ARG_TYPE_Direction
+
+
+ Status
+ out
+ A_ARG_TYPE_ConnectionStatus
+
+
+
+
+
+
+ SourceProtocolInfo
+ string
+
+
+ SinkProtocolInfo
+ string
+
+
+ CurrentConnectionIDs
+ string
+
+
+ A_ARG_TYPE_ConnectionStatus
+ string
+
+ OK
+ ContentFormatMismatch
+ InsufficientBandwidth
+ UnreliableChannel
+ Unknown
+
+
+
+ A_ARG_TYPE_ConnectionManager
+ string
+
+
+ A_ARG_TYPE_Direction
+ string
+
+ Input
+ Output
+
+
+
+ A_ARG_TYPE_ProtocolInfo
+ string
+
+
+ A_ARG_TYPE_ConnectionID
+ i4
+
+
+ A_ARG_TYPE_AVTransportID
+ i4
+
+
+ A_ARG_TYPE_RcsID
+ i4
+
+
+
\ No newline at end of file
diff --git a/dlna/static/ContentDirectory.xml b/dlna/static/ContentDirectory.xml
new file mode 100644
index 000000000..12fddb98d
--- /dev/null
+++ b/dlna/static/ContentDirectory.xml
@@ -0,0 +1,504 @@
+
+
+
+ 1
+ 0
+
+
+
+ GetSearchCapabilities
+
+
+ SearchCaps
+ out
+ SearchCapabilities
+
+
+
+
+ GetSortCapabilities
+
+
+ SortCaps
+ out
+ SortCapabilities
+
+
+
+
+ GetSortExtensionCapabilities
+
+
+ SortExtensionCaps
+ out
+ SortExtensionCapabilities
+
+
+
+
+ GetFeatureList
+
+
+ FeatureList
+ out
+ FeatureList
+
+
+
+
+ GetSystemUpdateID
+
+
+ Id
+ out
+ SystemUpdateID
+
+
+
+
+ Browse
+
+
+ ObjectID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ BrowseFlag
+ in
+ A_ARG_TYPE_BrowseFlag
+
+
+ Filter
+ in
+ A_ARG_TYPE_Filter
+
+
+ StartingIndex
+ in
+ A_ARG_TYPE_Index
+
+
+ RequestedCount
+ in
+ A_ARG_TYPE_Count
+
+
+ SortCriteria
+ in
+ A_ARG_TYPE_SortCriteria
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+ NumberReturned
+ out
+ A_ARG_TYPE_Count
+
+
+ TotalMatches
+ out
+ A_ARG_TYPE_Count
+
+
+ UpdateID
+ out
+ A_ARG_TYPE_UpdateID
+
+
+
+
+ Search
+
+
+ ContainerID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ SearchCriteria
+ in
+ A_ARG_TYPE_SearchCriteria
+
+
+ Filter
+ in
+ A_ARG_TYPE_Filter
+
+
+ StartingIndex
+ in
+ A_ARG_TYPE_Index
+
+
+ RequestedCount
+ in
+ A_ARG_TYPE_Count
+
+
+ SortCriteria
+ in
+ A_ARG_TYPE_SortCriteria
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+ NumberReturned
+ out
+ A_ARG_TYPE_Count
+
+
+ TotalMatches
+ out
+ A_ARG_TYPE_Count
+
+
+ UpdateID
+ out
+ A_ARG_TYPE_UpdateID
+
+
+
+
+ CreateObject
+
+
+ ContainerID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ Elements
+ in
+ A_ARG_TYPE_Result
+
+
+ ObjectID
+ out
+ A_ARG_TYPE_ObjectID
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+
+
+ DestroyObject
+
+
+ ObjectID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+
+
+ UpdateObject
+
+
+ ObjectID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ CurrentTagValue
+ in
+ A_ARG_TYPE_TagValueList
+
+
+ NewTagValue
+ in
+ A_ARG_TYPE_TagValueList
+
+
+
+
+ MoveObject
+
+
+ ObjectID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ NewParentID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ NewObjectID
+ out
+ A_ARG_TYPE_ObjectID
+
+
+
+
+ ImportResource
+
+
+ SourceURI
+ in
+ A_ARG_TYPE_URI
+
+
+ DestinationURI
+ in
+ A_ARG_TYPE_URI
+
+
+ TransferID
+ out
+ A_ARG_TYPE_TransferID
+
+
+
+
+ ExportResource
+
+
+ SourceURI
+ in
+ A_ARG_TYPE_URI
+
+
+ DestinationURI
+ in
+ A_ARG_TYPE_URI
+
+
+ TransferID
+ out
+ A_ARG_TYPE_TransferID
+
+
+
+
+ StopTransferResource
+
+
+ TransferID
+ in
+ A_ARG_TYPE_TransferID
+
+
+
+
+ DeleteResource
+
+
+ ResourceURI
+ in
+ A_ARG_TYPE_URI
+
+
+
+
+ GetTransferProgress
+
+
+ TransferID
+ in
+ A_ARG_TYPE_TransferID
+
+
+ TransferStatus
+ out
+ A_ARG_TYPE_TransferStatus
+
+
+ TransferLength
+ out
+ A_ARG_TYPE_TransferLength
+
+
+ TransferTotal
+ out
+ A_ARG_TYPE_TransferTotal
+
+
+
+
+ CreateReference
+
+
+ ContainerID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ ObjectID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ NewID
+ out
+ A_ARG_TYPE_ObjectID
+
+
+
+
+ X_GetFeatureList
+
+
+ FeatureList
+ out
+ A_ARG_TYPE_Featurelist
+
+
+
+
+ X_SetBookmark
+
+
+ CategoryType
+ in
+ A_ARG_TYPE_CategoryType
+
+
+ RID
+ in
+ A_ARG_TYPE_RID
+
+
+ ObjectID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ PosSecond
+ in
+ A_ARG_TYPE_PosSec
+
+
+
+
+
+
+ SearchCapabilities
+ string
+
+
+ SortCapabilities
+ string
+
+
+ SortExtensionCapabilities
+ string
+
+
+ SystemUpdateID
+ ui4
+
+
+ ContainerUpdateIDs
+ string
+
+
+ TransferIDs
+ string
+
+
+ FeatureList
+ string
+
+
+ A_ARG_TYPE_ObjectID
+ string
+
+
+ A_ARG_TYPE_Result
+ string
+
+
+ A_ARG_TYPE_SearchCriteria
+ string
+
+
+ A_ARG_TYPE_BrowseFlag
+ string
+
+ BrowseMetadata
+ BrowseDirectChildren
+
+
+
+ A_ARG_TYPE_Filter
+ string
+
+
+ A_ARG_TYPE_SortCriteria
+ string
+
+
+ A_ARG_TYPE_Index
+ ui4
+
+
+ A_ARG_TYPE_Count
+ ui4
+
+
+ A_ARG_TYPE_UpdateID
+ ui4
+
+
+ A_ARG_TYPE_TransferID
+ ui4
+
+
+ A_ARG_TYPE_TransferStatus
+ string
+
+ COMPLETED
+ ERROR
+ IN_PROGRESS
+ STOPPED
+
+
+
+ A_ARG_TYPE_TransferLength
+ string
+
+
+ A_ARG_TYPE_TransferTotal
+ string
+
+
+ A_ARG_TYPE_TagValueList
+ string
+
+
+ A_ARG_TYPE_URI
+ uri
+
+
+ A_ARG_TYPE_CategoryType
+ ui4
+
+
+
+ A_ARG_TYPE_RID
+ ui4
+
+
+
+ A_ARG_TYPE_PosSec
+ ui4
+
+
+
+ A_ARG_TYPE_Featurelist
+ string
+
+
+
+
\ No newline at end of file
diff --git a/dlna/static/X_MS_MediaReceiverRegistrar.xml b/dlna/static/X_MS_MediaReceiverRegistrar.xml
new file mode 100644
index 000000000..4aecdff00
--- /dev/null
+++ b/dlna/static/X_MS_MediaReceiverRegistrar.xml
@@ -0,0 +1,88 @@
+
+
+
+ 1
+ 0
+
+
+
+ IsAuthorized
+
+
+ DeviceID
+ in
+ A_ARG_TYPE_DeviceID
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+
+
+ RegisterDevice
+
+
+ RegistrationReqMsg
+ in
+ A_ARG_TYPE_RegistrationReqMsg
+
+
+ RegistrationRespMsg
+ out
+ A_ARG_TYPE_RegistrationRespMsg
+
+
+
+
+ IsValidated
+
+
+ DeviceID
+ in
+ A_ARG_TYPE_DeviceID
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+
+
+
+
+ A_ARG_TYPE_DeviceID
+ string
+
+
+ A_ARG_TYPE_Result
+ int
+
+
+ A_ARG_TYPE_RegistrationReqMsg
+ bin.base64
+
+
+ A_ARG_TYPE_RegistrationRespMsg
+ bin.base64
+
+
+ AuthorizationGrantedUpdateID
+ ui4
+
+
+ AuthorizationDeniedUpdateID
+ ui4
+
+
+ ValidationSucceededUpdateID
+ ui4
+
+
+ ValidationRevokedUpdateID
+ ui4
+
+
+
\ No newline at end of file