@@ -278,7 +278,7 @@ func (s *HTTPserver) ServeMediaHandler() http.HandlerFunc {
278278 if strings .HasSuffix (requestPathLower , ".m3u8" ) {
279279 w .Header ().Set ("Content-Type" , "application/vnd.apple.mpegurl" )
280280 } else if strings .HasSuffix (requestPathLower , ".ts" ) {
281- w .Header ().Set ("Content-Type" , "video/mp2t " )
281+ w .Header ().Set ("Content-Type" , "video/mpeg " )
282282 } else if strings .HasSuffix (requestPathLower , ".mp4" ) || strings .HasSuffix (requestPathLower , ".m4s" ) {
283283 w .Header ().Set ("Content-Type" , "video/mp4" )
284284 }
@@ -410,7 +410,7 @@ func (s *HTTPserver) AddHLSHandler(urlPrefix, dir string) {
410410 w .Header ().Set ("Pragma" , "no-cache" )
411411 w .Header ().Set ("Expires" , "0" )
412412 } else if strings .HasSuffix (requestPathLower , ".ts" ) {
413- w .Header ().Set ("Content-Type" , "video/MP2T " )
413+ w .Header ().Set ("Content-Type" , "video/mpeg " )
414414 w .Header ().Set ("Cache-Control" , "no-cache, no-store, must-revalidate" )
415415 w .Header ().Set ("Pragma" , "no-cache" )
416416 w .Header ().Set ("Expires" , "0" )
@@ -458,7 +458,7 @@ func serveContent(w http.ResponseWriter, r *http.Request, tv *soapcalls.TVPayloa
458458 if tv != nil {
459459 isMedia = true
460460 transcode = tv .Transcode
461- mediaType = tv .MediaType
461+ mediaType = utils . DLNAResourceMediaType ( tv .MediaType , transcode )
462462 seek = tv .Seekable
463463 tv .Log ().Debug ("" , "Method" , "DLNAMediaHTTP" , "Action" , "Request" , "HTTP Method" , r .Method , "Path" , r .URL .Path ,
464464 "TimeSeekRange" , r .Header .Get ("TimeSeekRange.dlna.org" ), "Range" , r .Header .Get ("Range" ),
@@ -473,10 +473,9 @@ func serveContent(w http.ResponseWriter, r *http.Request, tv *soapcalls.TVPayloa
473473 mediaType = "video/mp4" // Chromecast transcoding outputs fragmented MP4
474474 }
475475
476- w .Header ()["transferMode.dlna.org" ] = []string {"Interactive" }
476+ w .Header ()["transferMode.dlna.org" ] = []string {utils . DLNATransferMode ( mediaType ) }
477477
478478 if isMedia {
479- w .Header ()["transferMode.dlna.org" ] = []string {"Streaming" }
480479 w .Header ()["realTimeInfo.dlna.org" ] = []string {"DLNA.ORG_TLAG=*" }
481480 w .Header ()["Content-Type" ] = []string {mediaType }
482481 }
@@ -527,13 +526,7 @@ func serveContentBytes(w http.ResponseWriter, r *http.Request, mediaType string,
527526 }
528527
529528 if r .Header .Get ("getcontentFeatures.dlna.org" ) == "1" {
530- contentFeatures , err := utils .BuildContentFeatures (mediaType , "01" , false )
531- if err != nil {
532- http .NotFound (w , r )
533- return
534- }
535-
536- w .Header ()["contentFeatures.dlna.org" ] = []string {contentFeatures }
529+ w .Header ()["contentFeatures.dlna.org" ] = []string {utils .BuildDLNAContentFeatures (utils.DLNAContentFeaturesOptions {ByteSeek : true })}
537530 }
538531
539532 bReader := bytes .NewReader (f )
@@ -545,13 +538,7 @@ func serveContentReadClose(w http.ResponseWriter, r *http.Request, tv *soapcalls
545538 defer f .Close ()
546539
547540 if r .Header .Get ("getcontentFeatures.dlna.org" ) == "1" {
548- contentFeatures , err := utils .BuildContentFeatures (mediaType , "00" , transcode )
549- if err != nil {
550- http .NotFound (w , r )
551- return
552- }
553-
554- w .Header ()["contentFeatures.dlna.org" ] = []string {contentFeatures }
541+ w .Header ()["contentFeatures.dlna.org" ] = []string {utils .BuildDLNAContentFeatures (utils.DLNAContentFeaturesOptions {Converted : transcode })}
555542 }
556543 // In ffmpeg we can emulate seek support for live streams
557544 if transcode && r .Method == http .MethodGet && strings .Contains (mediaType , "video" ) {
@@ -608,18 +595,7 @@ func serveContentSeekCloser(w http.ResponseWriter, r *http.Request, mediaType st
608595 defer f .Close ()
609596
610597 if r .Header .Get ("getcontentFeatures.dlna.org" ) == "1" {
611- seekflag := "00"
612- if seek {
613- seekflag = "01"
614- }
615-
616- contentFeatures , err := utils .BuildContentFeatures (mediaType , seekflag , false )
617- if err != nil {
618- http .NotFound (w , r )
619- return
620- }
621-
622- w .Header ()["contentFeatures.dlna.org" ] = []string {contentFeatures }
598+ w .Header ()["contentFeatures.dlna.org" ] = []string {utils .BuildDLNAContentFeatures (utils.DLNAContentFeaturesOptions {ByteSeek : seek })}
623599 }
624600
625601 name := strings .TrimLeft (r .URL .Path , "/" )
@@ -628,18 +604,10 @@ func serveContentSeekCloser(w http.ResponseWriter, r *http.Request, mediaType st
628604
629605func serveContentCustomType (w http.ResponseWriter , r * http.Request , tv * soapcalls.TVPayload , tcOpts * utils.TranscodeOptions , mediaType string , transcode , seek bool , f osFileType , ff * exec.Cmd ) {
630606 if r .Header .Get ("getcontentFeatures.dlna.org" ) == "1" {
631- seekflag := "00"
632- if seek {
633- seekflag = "01"
634- }
635-
636- contentFeatures , err := utils .BuildContentFeatures (mediaType , seekflag , transcode )
637- if err != nil {
638- http .NotFound (w , r )
639- return
640- }
641-
642- w .Header ()["contentFeatures.dlna.org" ] = []string {contentFeatures }
607+ w .Header ()["contentFeatures.dlna.org" ] = []string {utils .BuildDLNAContentFeatures (utils.DLNAContentFeaturesOptions {
608+ ByteSeek : seek && ! transcode ,
609+ Converted : transcode ,
610+ })}
643611 }
644612 if transcode && r .Method == http .MethodGet && strings .Contains (mediaType , "video" ) {
645613 // Since we're dealing with an io.Reader we can't
0 commit comments