From bff9b06d5df06984fc9dae14b5ec5dbf739e9128 Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Thu, 25 May 2023 06:47:51 +0300 Subject: [PATCH] Add support filename query param for mp4 files --- internal/mp4/mp4.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/internal/mp4/mp4.go b/internal/mp4/mp4.go index a791fd76..70dccd42 100644 --- a/internal/mp4/mp4.go +++ b/internal/mp4/mp4.go @@ -38,7 +38,8 @@ func handlerKeyframe(w http.ResponseWriter, r *http.Request) { } } - src := r.URL.Query().Get("src") + query := r.URL.Query() + src := query.Get("src") stream := streams.GetOrNew(src) if stream == nil { http.Error(w, api.StreamNotFound, http.StatusNotFound) @@ -69,8 +70,13 @@ func handlerKeyframe(w http.ResponseWriter, r *http.Request) { stream.RemoveConsumer(cons) // Apple Safari won't show frame without length - w.Header().Set("Content-Length", strconv.Itoa(len(data))) - w.Header().Set("Content-Type", cons.MimeType) + header := w.Header() + header.Set("Content-Length", strconv.Itoa(len(data))) + header.Set("Content-Type", cons.MimeType) + + if filename := query.Get("filename"); filename != "" { + header.Set("Content-Disposition", `attachment; filename="`+filename+`"`) + } if _, err := w.Write(data); err != nil { log.Error().Err(err).Caller().Send() @@ -132,8 +138,6 @@ func handlerMP4(w http.ResponseWriter, r *http.Request) { defer stream.RemoveConsumer(cons) - w.Header().Set("Content-Type", cons.MimeType()) - data, err := cons.Init() if err != nil { log.Error().Err(err).Caller().Send() @@ -141,6 +145,13 @@ func handlerMP4(w http.ResponseWriter, r *http.Request) { return } + header := w.Header() + header.Set("Content-Type", cons.MimeType()) + + if filename := query.Get("filename"); filename != "" { + header.Set("Content-Disposition", `attachment; filename="`+filename+`"`) + } + if _, err = w.Write(data); err != nil { log.Error().Err(err).Caller().Send() http.Error(w, err.Error(), http.StatusInternalServerError)