1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
3 import * as chai 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 const expect = chai.expect
26 async function createLive (server: PeerTubeServer, permanent: boolean) {
27 const attributes: LiveVideoCreate = {
28 channelId: server.store.channel.id,
29 privacy: VideoPrivacy.PUBLIC,
30 name: 'my super live',
32 permanentLive: permanent
35 const { uuid } = await server.live.create({ fields: attributes })
40 async function checkFiles (files: VideoFile[]) {
41 for (const file of files) {
42 expectStartWith(file.fileUrl, ObjectStorageCommand.getPlaylistBaseUrl())
44 await makeRawRequest(file.fileUrl, HttpStatusCode.OK_200)
48 async function getFiles (server: PeerTubeServer, videoUUID: string) {
49 const video = await server.videos.get({ id: videoUUID })
51 expect(video.files).to.have.lengthOf(0)
52 expect(video.streamingPlaylists).to.have.lengthOf(1)
54 return video.streamingPlaylists[0].files
57 async function streamAndEnd (servers: PeerTubeServer[], liveUUID: string) {
58 const ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveUUID })
59 await waitUntilLivePublishedOnAllServers(servers, liveUUID)
61 const videoLiveDetails = await servers[0].videos.get({ id: liveUUID })
62 const liveDetails = await servers[0].live.get({ videoId: liveUUID })
64 await stopFfmpeg(ffmpegCommand)
66 if (liveDetails.permanentLive) {
67 await waitUntilLiveWaitingOnAllServers(servers, liveUUID)
69 await waitUntilLiveReplacedByReplayOnAllServers(servers, liveUUID)
72 await waitJobs(servers)
74 return { videoLiveDetails, liveDetails }
77 describe('Object storage for lives', function () {
78 if (areObjectStorageTestsDisabled()) return
80 let servers: PeerTubeServer[]
82 before(async function () {
85 await ObjectStorageCommand.prepareDefaultBuckets()
87 servers = await createMultipleServers(2, ObjectStorageCommand.getDefaultConfig())
89 await setAccessTokensToServers(servers)
90 await setDefaultVideoChannel(servers)
91 await doubleFollow(servers[0], servers[1])
93 await servers[0].config.enableTranscoding()
96 describe('Without live transcoding', async function () {
99 before(async function () {
100 await servers[0].config.enableLive({ transcoding: false })
102 videoUUID = await createLive(servers[0], false)
105 it('Should create a live and save the replay on object storage', async function () {
108 await streamAndEnd(servers, videoUUID)
110 for (const server of servers) {
111 const files = await getFiles(server, videoUUID)
112 expect(files).to.have.lengthOf(1)
114 await checkFiles(files)
119 describe('With live transcoding', async function () {
120 let videoUUIDPermanent: string
121 let videoUUIDNonPermanent: string
123 before(async function () {
124 await servers[0].config.enableLive({ transcoding: true })
126 videoUUIDPermanent = await createLive(servers[0], true)
127 videoUUIDNonPermanent = await createLive(servers[0], false)
130 it('Should create a live and save the replay on object storage', async function () {
133 await streamAndEnd(servers, videoUUIDNonPermanent)
135 for (const server of servers) {
136 const files = await getFiles(server, videoUUIDNonPermanent)
137 expect(files).to.have.lengthOf(5)
139 await checkFiles(files)
143 it('Should create a live and save the replay of permanent live on object storage', async function () {
146 const { videoLiveDetails } = await streamAndEnd(servers, videoUUIDPermanent)
148 const replay = await findExternalSavedVideo(servers[0], videoLiveDetails)
150 for (const server of servers) {
151 const files = await getFiles(server, replay.uuid)
152 expect(files).to.have.lengthOf(5)
154 await checkFiles(files)
159 after(async function () {
160 await killallServers(servers)