Moving direct file access under /r/f/ so we can add /r/s/ for streaming

This commit is contained in:
Rob Emery 2025-02-03 16:21:52 +00:00
parent ac04ea3834
commit 0ee848edfe
2 changed files with 41 additions and 30 deletions

View File

@ -84,7 +84,7 @@ func (cds *contentDirectoryService) cdsObjectToUpnpavObject(cdsObject object, is
URL: (&url.URL{
Scheme: "http",
Host: host,
Path: path.Join(resourcePath, cdsObject.Path),
Path: path.Join(resourcePath, resourceFilePath, cdsObject.Path),
}).String(),
ProtocolInfo: fmt.Sprintf("http-get:*:%s:%s", mimeType, dlna.ContentFeatures{
SupportRange: true,
@ -285,13 +285,13 @@ func (cds *contentDirectoryService) doMediaFiles(tracks model.MediaFiles, basePa
}
//TODO replace this with a streaming path
directFileAccessPath := path.Join(resourcePath, strings.TrimPrefix(track.Path, conf.Server.MusicFolder))
//directFileAccessPath := path.Join(resourcePath, resourceFilePath, "Music/Files", strings.TrimPrefix(track.Path, conf.Server.MusicFolder))
streamAccessPath := path.Join(resourcePath, resourceStreamPath, track.ID)
item.Res = append(item.Res, upnpav.Resource{
URL: (&url.URL{
Scheme: "http",
Host: host,
Path: directFileAccessPath,
Path: streamAccessPath,
}).String(),
ProtocolInfo: fmt.Sprintf("http-get:*:%s:%s", mimeType, dlna.ContentFeatures{
SupportRange: false,

View File

@ -33,6 +33,8 @@ const (
serverField = "Linux/3.4 DLNADOC/1.50 UPnP/1.0 DMS/1.0"
rootDescPath = "/rootDesc.xml"
resourcePath = "/r/"
resourceFilePath = "f"
resourceStreamPath = "s"
serviceControlURL = "/ctl"
)
@ -275,35 +277,44 @@ func isAppropriatelyConfigured(intf net.Interface) bool {
func (s *SSDPServer) resourceHandler(w http.ResponseWriter, r *http.Request) {
remotePath := r.URL.Path
localFile, _ := strings.CutPrefix(remotePath, "Music/Files/")
localFilePath := path.Join(conf.Server.MusicFolder, localFile)
components := strings.Split(remotePath, "/")
switch components[0] {
case resourceFilePath:
localFile, _ := strings.CutPrefix(remotePath, path.Join(resourceFilePath,"Music/Files"))
localFilePath := path.Join(conf.Server.MusicFolder, localFile)
log.Info(fmt.Sprintf("resource handler Executed with remote path: %s, localpath: %s", remotePath, localFilePath))
log.Info(fmt.Sprintf("resource handler Executed with remote path: %s, localpath: %s", remotePath, localFilePath))
fileStats, err := os.Stat(localFilePath)
if err != nil {
http.NotFound(w, r)
return
fileStats, err := os.Stat(localFilePath)
if err != nil {
http.NotFound(w, r)
return
}
w.Header().Set("Content-Length", strconv.FormatInt(fileStats.Size(), 10))
// add some DLNA specific headers
if r.Header.Get("getContentFeatures.dlna.org") != "" {
w.Header().Set("contentFeatures.dlna.org", dms_dlna.ContentFeatures{
SupportRange: true,
}.String())
}
w.Header().Set("transferMode.dlna.org", "Streaming")
os.Open(localFilePath)
fileHandle, err := os.Open(localFilePath)
if err != nil {
fmt.Printf("file streaming error: %+v\n", err)
return
}
defer fileHandle.Close()
http.ServeContent(w, r, remotePath, time.Now(), fileHandle)
break;
case resourceStreamPath:
//TODO streaming endpoint
log.Debug(fmt.Sprintf("TODO IMPLEMENT THIS: %+v", r))
break;
}
w.Header().Set("Content-Length", strconv.FormatInt(fileStats.Size(), 10))
// add some DLNA specific headers
if r.Header.Get("getContentFeatures.dlna.org") != "" {
w.Header().Set("contentFeatures.dlna.org", dms_dlna.ContentFeatures{
SupportRange: true,
}.String())
}
w.Header().Set("transferMode.dlna.org", "Streaming")
os.Open(localFilePath)
fileHandle, err := os.Open(localFilePath)
if err != nil {
fmt.Printf("file streaming error: %+v\n", err)
return
}
defer fileHandle.Close()
http.ServeContent(w, r, remotePath, time.Now(), fileHandle)
}
// returns /rootDesc.xml templated