1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
3 import { expect } from 'chai'
4 import { expectStartWith } from '@server/tests/shared'
5 import { areObjectStorageTestsDisabled } from '@shared/core-utils'
6 import { HttpStatusCode, LiveVideoCreate, VideoFile, VideoPrivacy } from '@shared/models'
10 findExternalSavedVideo,
15 setAccessTokensToServers,
16 setDefaultVideoChannel,
19 waitUntilLivePublishedOnAllServers,
20 waitUntilLiveReplacedByReplayOnAllServers,
21 waitUntilLiveWaitingOnAllServers
22 } from '@shared/server-commands'
24 async function createLive (server: PeerTubeServer, permanent: boolean) {
25 const attributes: LiveVideoCreate = {
26 channelId: server.store.channel.id,
27 privacy: VideoPrivacy.PUBLIC,
28 name: 'my super live',
30 permanentLive: permanent
33 const { uuid } = await server.live.create({ fields: attributes })
38 async function checkFiles (files: VideoFile[]) {
39 for (const file of files) {
40 expectStartWith(file.fileUrl, ObjectStorageCommand.getPlaylistBaseUrl())
42 await makeRawRequest(file.fileUrl, HttpStatusCode.OK_200)
46 async function getFiles (server: PeerTubeServer, videoUUID: string) {
47 const video = await server.videos.get({ id: videoUUID })
49 expect(video.files).to.have.lengthOf(0)
50 expect(video.streamingPlaylists).to.have.lengthOf(1)
52 return video.streamingPlaylists[0].files
55 async function streamAndEnd (servers: PeerTubeServer[], liveUUID: string) {
56 const ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveUUID })
57 await waitUntilLivePublishedOnAllServers(servers, liveUUID)
59 const videoLiveDetails = await servers[0].videos.get({ id: liveUUID })
60 const liveDetails = await servers[0].live.get({ videoId: liveUUID })
62 await stopFfmpeg(ffmpegCommand)
64 if (liveDetails.permanentLive) {
65 await waitUntilLiveWaitingOnAllServers(servers, liveUUID)
67 await waitUntilLiveReplacedByReplayOnAllServers(servers, liveUUID)
70 await waitJobs(servers)
72 return { videoLiveDetails, liveDetails }
75 describe('Object storage for lives', function () {
76 if (areObjectStorageTestsDisabled()) return
78 let servers: PeerTubeServer[]
80 before(async function () {
83 await ObjectStorageCommand.prepareDefaultBuckets()
85 servers = await createMultipleServers(2, ObjectStorageCommand.getDefaultConfig())
87 await setAccessTokensToServers(servers)
88 await setDefaultVideoChannel(servers)
89 await doubleFollow(servers[0], servers[1])
91 await servers[0].config.enableTranscoding()
94 describe('Without live transcoding', async function () {
97 before(async function () {
98 await servers[0].config.enableLive({ transcoding: false })
100 videoUUID = await createLive(servers[0], false)
103 it('Should create a live and save the replay on object storage', async function () {
106 await streamAndEnd(servers, videoUUID)
108 for (const server of servers) {
109 const files = await getFiles(server, videoUUID)
110 expect(files).to.have.lengthOf(1)
112 await checkFiles(files)
117 describe('With live transcoding', async function () {
118 let videoUUIDPermanent: string
119 let videoUUIDNonPermanent: string
121 before(async function () {
122 await servers[0].config.enableLive({ transcoding: true })
124 videoUUIDPermanent = await createLive(servers[0], true)
125 videoUUIDNonPermanent = await createLive(servers[0], false)
128 it('Should create a live and save the replay on object storage', async function () {
131 await streamAndEnd(servers, videoUUIDNonPermanent)
133 for (const server of servers) {
134 const files = await getFiles(server, videoUUIDNonPermanent)
135 expect(files).to.have.lengthOf(5)
137 await checkFiles(files)
141 it('Should create a live and save the replay of permanent live on object storage', async function () {
144 const { videoLiveDetails } = await streamAndEnd(servers, videoUUIDPermanent)
146 const replay = await findExternalSavedVideo(servers[0], videoLiveDetails)
148 for (const server of servers) {
149 const files = await getFiles(server, replay.uuid)
150 expect(files).to.have.lengthOf(5)
152 await checkFiles(files)
157 after(async function () {
158 await killallServers(servers)