2022-12-20 06:54:02 -09:00
|
|
|
package core_test
|
2020-02-03 07:54:59 -09:00
|
|
|
|
|
|
|
|
import (
|
2020-02-19 10:53:35 -09:00
|
|
|
"context"
|
|
|
|
|
"io"
|
2021-07-20 16:00:58 -08:00
|
|
|
"os"
|
2020-02-03 07:54:59 -09:00
|
|
|
|
2020-07-24 08:42:11 -08:00
|
|
|
"github.com/navidrome/navidrome/conf"
|
2022-12-06 15:41:16 -09:00
|
|
|
"github.com/navidrome/navidrome/conf/configtest"
|
2022-12-20 08:25:47 -09:00
|
|
|
"github.com/navidrome/navidrome/core"
|
2020-02-03 07:54:59 -09:00
|
|
|
"github.com/navidrome/navidrome/log"
|
|
|
|
|
"github.com/navidrome/navidrome/model"
|
2020-10-27 07:01:40 -08:00
|
|
|
"github.com/navidrome/navidrome/tests"
|
2022-07-26 12:47:16 -08:00
|
|
|
. "github.com/onsi/ginkgo/v2"
|
2020-02-03 07:54:59 -09:00
|
|
|
. "github.com/onsi/gomega"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var _ = Describe("MediaStreamer", func() {
|
2022-12-20 08:25:47 -09:00
|
|
|
var streamer core.MediaStreamer
|
2020-02-03 07:54:59 -09:00
|
|
|
var ds model.DataStore
|
2022-12-20 08:25:47 -09:00
|
|
|
ffmpeg := tests.NewMockFFmpeg("fake data")
|
2020-04-26 08:06:38 -08:00
|
|
|
ctx := log.NewContext(context.TODO())
|
2020-02-03 07:54:59 -09:00
|
|
|
|
2020-02-19 10:53:35 -09:00
|
|
|
BeforeEach(func() {
|
2022-12-06 15:41:16 -09:00
|
|
|
DeferCleanup(configtest.SetupConfig())
|
2021-07-20 16:00:58 -08:00
|
|
|
conf.Server.DataFolder, _ = os.MkdirTemp("", "file_caches")
|
2020-07-24 08:42:11 -08:00
|
|
|
conf.Server.TranscodingCacheSize = "100MB"
|
2021-06-08 12:30:19 -08:00
|
|
|
ds = &tests.MockDataStore{MockedTranscoding: &tests.MockTranscodingRepo{}}
|
|
|
|
|
ds.MediaFile(ctx).(*tests.MockMediaFileRepo).SetData(model.MediaFiles{
|
2020-10-27 06:48:37 -08:00
|
|
|
{ID: "123", Path: "tests/fixtures/test.mp3", Suffix: "mp3", BitRate: 128, Duration: 257.0},
|
|
|
|
|
})
|
2022-12-20 08:25:47 -09:00
|
|
|
testCache := core.GetTranscodingCache()
|
2023-01-17 18:04:04 -09:00
|
|
|
Eventually(func() bool { return testCache.Available(context.TODO()) }).Should(BeTrue())
|
2022-12-20 08:25:47 -09:00
|
|
|
streamer = core.NewMediaStreamer(ds, ffmpeg, testCache)
|
2020-02-24 09:31:05 -09:00
|
|
|
})
|
2021-10-28 06:40:31 -08:00
|
|
|
AfterEach(func() {
|
|
|
|
|
_ = os.RemoveAll(conf.Server.DataFolder)
|
|
|
|
|
})
|
2020-02-03 07:54:59 -09:00
|
|
|
|
2020-02-24 10:17:32 -09:00
|
|
|
Context("NewStream", func() {
|
2020-02-24 09:31:05 -09:00
|
|
|
It("returns a seekable stream if format is 'raw'", func() {
|
2020-03-16 10:28:13 -08:00
|
|
|
s, err := streamer.NewStream(ctx, "123", "raw", 0)
|
2020-02-24 09:31:05 -09:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(s.Seekable()).To(BeTrue())
|
|
|
|
|
})
|
|
|
|
|
It("returns a seekable stream if maxBitRate is 0", func() {
|
2020-03-16 10:28:13 -08:00
|
|
|
s, err := streamer.NewStream(ctx, "123", "mp3", 0)
|
2020-02-24 09:31:05 -09:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(s.Seekable()).To(BeTrue())
|
2020-02-03 07:54:59 -09:00
|
|
|
})
|
2020-02-24 09:31:05 -09:00
|
|
|
It("returns a seekable stream if maxBitRate is higher than file bitRate", func() {
|
2020-03-16 10:28:13 -08:00
|
|
|
s, err := streamer.NewStream(ctx, "123", "mp3", 320)
|
2020-02-24 09:31:05 -09:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
Expect(s.Seekable()).To(BeTrue())
|
2020-02-03 07:54:59 -09:00
|
|
|
})
|
2020-02-24 09:31:05 -09:00
|
|
|
It("returns a NON seekable stream if transcode is required", func() {
|
2020-03-16 10:28:13 -08:00
|
|
|
s, err := streamer.NewStream(ctx, "123", "mp3", 64)
|
2020-02-24 09:31:05 -09:00
|
|
|
Expect(err).To(BeNil())
|
|
|
|
|
Expect(s.Seekable()).To(BeFalse())
|
|
|
|
|
Expect(s.Duration()).To(Equal(float32(257.0)))
|
2020-02-03 07:54:59 -09:00
|
|
|
})
|
2020-02-24 09:31:05 -09:00
|
|
|
It("returns a seekable stream if the file is complete in the cache", func() {
|
2020-07-24 08:42:11 -08:00
|
|
|
s, err := streamer.NewStream(ctx, "123", "mp3", 32)
|
|
|
|
|
Expect(err).To(BeNil())
|
2021-07-20 16:00:58 -08:00
|
|
|
_, _ = io.ReadAll(s)
|
2020-07-24 09:30:27 -08:00
|
|
|
_ = s.Close()
|
2022-11-26 11:07:09 -09:00
|
|
|
Eventually(func() bool { return ffmpeg.IsClosed() }, "3s").Should(BeTrue())
|
2020-07-24 08:42:11 -08:00
|
|
|
|
|
|
|
|
s, err = streamer.NewStream(ctx, "123", "mp3", 32)
|
2020-02-19 10:53:35 -09:00
|
|
|
Expect(err).To(BeNil())
|
2020-02-24 09:31:05 -09:00
|
|
|
Expect(s.Seekable()).To(BeTrue())
|
2020-02-04 05:34:26 -09:00
|
|
|
})
|
|
|
|
|
})
|
2020-02-03 07:54:59 -09:00
|
|
|
})
|