dlna: set more correct mime type

The code currently hardcodes `text/srt` for all subtitles.

`text/srt` is wrong, it seems `application/x-subrip` is the official
extension coming from the official mime database, at least (and still
works with the Samsung TV I tested with). Also add that one to `fs/
mimetype.go`.

Compared to previous iterations of this PR, I dropped tests ensuring
certain mime types are present - as detection still seems to be fairly
platform-specific.
This commit is contained in:
Florian Klink 2023-12-20 12:00:08 +02:00 committed by Nick Craig-Wood
parent 2e007f89c7
commit 00e073df1e
2 changed files with 17 additions and 2 deletions

View File

@ -101,9 +101,24 @@ func (cds *contentDirectoryService) cdsObjectToUpnpavObject(cdsObject object, fi
Host: host, Host: host,
Path: path.Join(resPath, resource.Path()), Path: path.Join(resPath, resource.Path()),
}).String() }).String()
// Read the mime type from the fs.Object if possible,
// otherwise fall back to working out what it is from the file path.
var mimeType string
if o, ok := resource.DirEntry().(fs.Object); ok {
mimeType = fs.MimeType(context.TODO(), o)
// If backend doesn't know what the mime type is then
// try getting it from the file name
if mimeType == "application/octet-stream" {
mimeType = fs.MimeTypeFromName(resource.Name())
}
} else {
mimeType = fs.MimeTypeFromName(resource.Name())
}
item.Res = append(item.Res, upnpav.Resource{ item.Res = append(item.Res, upnpav.Resource{
URL: subtitleURL, URL: subtitleURL,
ProtocolInfo: fmt.Sprintf("http-get:*:%s:*", "text/srt"), ProtocolInfo: fmt.Sprintf("http-get:*:%s:*", mimeType),
}) })
} }

View File

@ -30,7 +30,7 @@ func init() {
{"video/webm", ".webm"}, {"video/webm", ".webm"},
{"video/x-msvideo", ".avi"}, {"video/x-msvideo", ".avi"},
{"video/x-matroska", ".mpv,.mkv"}, {"video/x-matroska", ".mpv,.mkv"},
{"text/srt", ".srt"}, {"application/x-subrip", ".srt"},
} { } {
for _, ext := range strings.Split(t.extensions, ",") { for _, ext := range strings.Split(t.extensions, ",") {
if mime.TypeByExtension(ext) == "" { if mime.TypeByExtension(ext) == "" {