diff --git a/core/stream/media_streamer.go b/core/stream/media_streamer.go index 6db2f6338..01b67030a 100644 --- a/core/stream/media_streamer.go +++ b/core/stream/media_streamer.go @@ -147,7 +147,7 @@ func (s *Stream) ContentType() string { return mime.TypeByExtension("." + s.form func (s *Stream) Name() string { return s.mf.Title + "." + s.format } func (s *Stream) ModTime() time.Time { return s.mf.UpdatedAt } func (s *Stream) EstimatedContentLength() int { - return int(s.mf.Duration * float32(s.bitRate) / 8 * 1024) + return int(s.mf.Duration * float32(s.bitRate) / 8 * 1000) } // Serve writes the stream to the HTTP response. For seekable streams it uses http.ServeContent diff --git a/core/stream/media_streamer_test.go b/core/stream/media_streamer_test.go index e06599208..e74fb10d4 100644 --- a/core/stream/media_streamer_test.go +++ b/core/stream/media_streamer_test.go @@ -183,6 +183,18 @@ var _ = Describe("MediaStreamer", func() { _, err = io.ReadAll(resp.Body) Expect(err).To(HaveOccurred()) }) + + It("estimates the content length from a bitrate in kilobits of 1000 bits", func() { + hundredSeconds := *mf + hundredSeconds.Duration = 100 + s := stream.NewStream(&hundredSeconds, "mp3", 128, io.NopCloser(bytes.NewReader(nil))) + w := httptest.NewRecorder() + r := httptest.NewRequest(http.MethodGet, "/?estimateContentLength=true", nil) + + _, _ = s.Serve(ctx, w, r) + + Expect(w.Header().Get("Content-Length")).To(Equal("1600000")) + }) }) })