2021-08-17 08:26:20 +02:00
|
|
|
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
|
|
|
|
|
2022-08-17 15:44:32 +02:00
|
|
|
import { expect } from 'chai'
|
2021-12-17 11:58:15 +01:00
|
|
|
import { expectStartWith } from '@server/tests/shared'
|
|
|
|
import { areObjectStorageTestsDisabled } from '@shared/core-utils'
|
|
|
|
import { HttpStatusCode, LiveVideoCreate, VideoFile, VideoPrivacy } from '@shared/models'
|
2021-08-17 08:26:20 +02:00
|
|
|
import {
|
|
|
|
createMultipleServers,
|
|
|
|
doubleFollow,
|
2022-04-21 09:06:52 +02:00
|
|
|
findExternalSavedVideo,
|
2021-08-17 08:26:20 +02:00
|
|
|
killallServers,
|
|
|
|
makeRawRequest,
|
|
|
|
ObjectStorageCommand,
|
|
|
|
PeerTubeServer,
|
|
|
|
setAccessTokensToServers,
|
|
|
|
setDefaultVideoChannel,
|
|
|
|
stopFfmpeg,
|
|
|
|
waitJobs,
|
|
|
|
waitUntilLivePublishedOnAllServers,
|
2022-04-21 09:06:52 +02:00
|
|
|
waitUntilLiveReplacedByReplayOnAllServers,
|
|
|
|
waitUntilLiveWaitingOnAllServers
|
2021-12-17 09:29:23 +01:00
|
|
|
} from '@shared/server-commands'
|
2021-08-17 08:26:20 +02:00
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
async function createLive (server: PeerTubeServer, permanent: boolean) {
|
2021-08-17 08:26:20 +02:00
|
|
|
const attributes: LiveVideoCreate = {
|
|
|
|
channelId: server.store.channel.id,
|
|
|
|
privacy: VideoPrivacy.PUBLIC,
|
|
|
|
name: 'my super live',
|
2022-04-21 09:06:52 +02:00
|
|
|
saveReplay: true,
|
|
|
|
permanentLive: permanent
|
2021-08-17 08:26:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const { uuid } = await server.live.create({ fields: attributes })
|
|
|
|
|
|
|
|
return uuid
|
|
|
|
}
|
|
|
|
|
|
|
|
async function checkFiles (files: VideoFile[]) {
|
|
|
|
for (const file of files) {
|
|
|
|
expectStartWith(file.fileUrl, ObjectStorageCommand.getPlaylistBaseUrl())
|
|
|
|
|
|
|
|
await makeRawRequest(file.fileUrl, HttpStatusCode.OK_200)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
async function getFiles (server: PeerTubeServer, videoUUID: string) {
|
|
|
|
const video = await server.videos.get({ id: videoUUID })
|
|
|
|
|
|
|
|
expect(video.files).to.have.lengthOf(0)
|
|
|
|
expect(video.streamingPlaylists).to.have.lengthOf(1)
|
|
|
|
|
|
|
|
return video.streamingPlaylists[0].files
|
|
|
|
}
|
|
|
|
|
|
|
|
async function streamAndEnd (servers: PeerTubeServer[], liveUUID: string) {
|
|
|
|
const ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveUUID })
|
|
|
|
await waitUntilLivePublishedOnAllServers(servers, liveUUID)
|
|
|
|
|
|
|
|
const videoLiveDetails = await servers[0].videos.get({ id: liveUUID })
|
|
|
|
const liveDetails = await servers[0].live.get({ videoId: liveUUID })
|
|
|
|
|
|
|
|
await stopFfmpeg(ffmpegCommand)
|
|
|
|
|
|
|
|
if (liveDetails.permanentLive) {
|
|
|
|
await waitUntilLiveWaitingOnAllServers(servers, liveUUID)
|
|
|
|
} else {
|
|
|
|
await waitUntilLiveReplacedByReplayOnAllServers(servers, liveUUID)
|
|
|
|
}
|
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
return { videoLiveDetails, liveDetails }
|
|
|
|
}
|
|
|
|
|
2021-08-17 08:26:20 +02:00
|
|
|
describe('Object storage for lives', function () {
|
|
|
|
if (areObjectStorageTestsDisabled()) return
|
|
|
|
|
|
|
|
let servers: PeerTubeServer[]
|
|
|
|
|
|
|
|
before(async function () {
|
|
|
|
this.timeout(120000)
|
|
|
|
|
|
|
|
await ObjectStorageCommand.prepareDefaultBuckets()
|
|
|
|
|
|
|
|
servers = await createMultipleServers(2, ObjectStorageCommand.getDefaultConfig())
|
|
|
|
|
|
|
|
await setAccessTokensToServers(servers)
|
|
|
|
await setDefaultVideoChannel(servers)
|
|
|
|
await doubleFollow(servers[0], servers[1])
|
|
|
|
|
|
|
|
await servers[0].config.enableTranscoding()
|
|
|
|
})
|
|
|
|
|
|
|
|
describe('Without live transcoding', async function () {
|
2022-04-21 09:06:52 +02:00
|
|
|
let videoUUID: string
|
2021-08-17 08:26:20 +02:00
|
|
|
|
|
|
|
before(async function () {
|
|
|
|
await servers[0].config.enableLive({ transcoding: false })
|
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
videoUUID = await createLive(servers[0], false)
|
2021-08-17 08:26:20 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
it('Should create a live and save the replay on object storage', async function () {
|
|
|
|
this.timeout(220000)
|
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
await streamAndEnd(servers, videoUUID)
|
2021-08-17 08:26:20 +02:00
|
|
|
|
|
|
|
for (const server of servers) {
|
2022-04-21 09:06:52 +02:00
|
|
|
const files = await getFiles(server, videoUUID)
|
|
|
|
expect(files).to.have.lengthOf(1)
|
2021-08-17 08:26:20 +02:00
|
|
|
|
|
|
|
await checkFiles(files)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
describe('With live transcoding', async function () {
|
2022-04-21 09:06:52 +02:00
|
|
|
let videoUUIDPermanent: string
|
|
|
|
let videoUUIDNonPermanent: string
|
2021-08-17 08:26:20 +02:00
|
|
|
|
|
|
|
before(async function () {
|
|
|
|
await servers[0].config.enableLive({ transcoding: true })
|
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
videoUUIDPermanent = await createLive(servers[0], true)
|
|
|
|
videoUUIDNonPermanent = await createLive(servers[0], false)
|
2021-08-17 08:26:20 +02:00
|
|
|
})
|
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
it('Should create a live and save the replay on object storage', async function () {
|
2021-08-17 08:26:20 +02:00
|
|
|
this.timeout(240000)
|
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
await streamAndEnd(servers, videoUUIDNonPermanent)
|
2021-08-17 08:26:20 +02:00
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
for (const server of servers) {
|
|
|
|
const files = await getFiles(server, videoUUIDNonPermanent)
|
|
|
|
expect(files).to.have.lengthOf(5)
|
2021-08-17 08:26:20 +02:00
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
await checkFiles(files)
|
|
|
|
}
|
|
|
|
})
|
2021-08-17 08:26:20 +02:00
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
it('Should create a live and save the replay of permanent live on object storage', async function () {
|
|
|
|
this.timeout(240000)
|
|
|
|
|
|
|
|
const { videoLiveDetails } = await streamAndEnd(servers, videoUUIDPermanent)
|
2021-08-17 08:26:20 +02:00
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
const replay = await findExternalSavedVideo(servers[0], videoLiveDetails)
|
2021-08-17 08:26:20 +02:00
|
|
|
|
2022-04-21 09:06:52 +02:00
|
|
|
for (const server of servers) {
|
|
|
|
const files = await getFiles(server, replay.uuid)
|
2021-11-05 10:23:02 +01:00
|
|
|
expect(files).to.have.lengthOf(5)
|
2021-08-17 08:26:20 +02:00
|
|
|
|
|
|
|
await checkFiles(files)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
after(async function () {
|
|
|
|
await killallServers(servers)
|
|
|
|
})
|
|
|
|
})
|