1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2 import { expect } from 'chai'
3 import { completeCheckHlsPlaylist, completeWebVideoFilesCheck, PeerTubeRunnerProcess } from '@server/tests/shared'
4 import { areMockObjectStorageTestsDisabled, getAllFiles, wait } from '@shared/core-utils'
5 import { VideoPrivacy } from '@shared/models'
12 setAccessTokensToServers,
13 setDefaultVideoChannel,
15 } from '@shared/server-commands'
17 describe('Test VOD transcoding in peertube-runner program', function () {
18 let servers: PeerTubeServer[] = []
19 let peertubeRunner: PeerTubeRunnerProcess
21 function runSuite (options: {
22 webtorrentEnabled: boolean
24 objectStorage: boolean
26 const { webtorrentEnabled, hlsEnabled, objectStorage } = options
28 const objectStorageBaseUrlWebTorrent = objectStorage
29 ? ObjectStorageCommand.getMockWebTorrentBaseUrl()
32 const objectStorageBaseUrlHLS = objectStorage
33 ? ObjectStorageCommand.getMockPlaylistBaseUrl()
36 it('Should upload a classic video mp4 and transcode it', async function () {
39 const { uuid } = await servers[0].videos.quickUpload({ name: 'mp4', fixture: 'video_short.mp4' })
41 await waitJobs(servers, { runnerJobs: true })
43 for (const server of servers) {
44 if (webtorrentEnabled) {
45 await completeWebVideoFilesCheck({
47 originServer: servers[0],
48 fixture: 'video_short.mp4',
50 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
63 await completeCheckHlsPlaylist({
64 hlsOnly: !webtorrentEnabled,
67 objectStorageBaseUrl: objectStorageBaseUrlHLS,
68 resolutions: [ 720, 480, 360, 240, 144, 0 ]
74 it('Should upload a webm video and transcode it', async function () {
77 const { uuid } = await servers[0].videos.quickUpload({ name: 'mp4', fixture: 'video_short.webm' })
79 await waitJobs(servers, { runnerJobs: true })
81 for (const server of servers) {
82 if (webtorrentEnabled) {
83 await completeWebVideoFilesCheck({
85 originServer: servers[0],
86 fixture: 'video_short.webm',
88 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
101 await completeCheckHlsPlaylist({
102 hlsOnly: !webtorrentEnabled,
105 objectStorageBaseUrl: objectStorageBaseUrlHLS,
106 resolutions: [ 720, 480, 360, 240, 144, 0 ]
112 it('Should upload an audio only video and transcode it', async function () {
115 const attributes = { name: 'audio_without_preview', fixture: 'sample.ogg' }
116 const { uuid } = await servers[0].videos.upload({ attributes, mode: 'resumable' })
118 await waitJobs(servers, { runnerJobs: true })
120 for (const server of servers) {
121 if (webtorrentEnabled) {
122 await completeWebVideoFilesCheck({
124 originServer: servers[0],
125 fixture: 'sample.ogg',
127 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
139 await completeCheckHlsPlaylist({
140 hlsOnly: !webtorrentEnabled,
143 objectStorageBaseUrl: objectStorageBaseUrlHLS,
144 resolutions: [ 480, 360, 240, 144, 0 ]
150 it('Should upload a private video and transcode it', async function () {
153 const { uuid } = await servers[0].videos.quickUpload({ name: 'mp4', fixture: 'video_short.mp4', privacy: VideoPrivacy.PRIVATE })
155 await waitJobs(servers, { runnerJobs: true })
157 if (webtorrentEnabled) {
158 await completeWebVideoFilesCheck({
160 originServer: servers[0],
161 fixture: 'video_short.mp4',
163 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
176 await completeCheckHlsPlaylist({
177 hlsOnly: !webtorrentEnabled,
178 servers: [ servers[0] ],
180 objectStorageBaseUrl: objectStorageBaseUrlHLS,
181 resolutions: [ 720, 480, 360, 240, 144, 0 ]
186 it('Should transcode videos on manual run', async function () {
189 await servers[0].config.disableTranscoding()
191 const { uuid } = await servers[0].videos.quickUpload({ name: 'manual transcoding', fixture: 'video_short.mp4' })
192 await waitJobs(servers, { runnerJobs: true })
195 const video = await servers[0].videos.get({ id: uuid })
196 expect(getAllFiles(video)).to.have.lengthOf(1)
199 await servers[0].config.enableTranscoding(true, true, true)
201 await servers[0].videos.runTranscoding({ transcodingType: 'webtorrent', videoId: uuid })
202 await waitJobs(servers, { runnerJobs: true })
204 await completeWebVideoFilesCheck({
206 originServer: servers[0],
207 fixture: 'video_short.mp4',
209 objectStorageBaseUrl: objectStorageBaseUrlWebTorrent,
220 await servers[0].videos.runTranscoding({ transcodingType: 'hls', videoId: uuid })
221 await waitJobs(servers, { runnerJobs: true })
223 await completeCheckHlsPlaylist({
225 servers: [ servers[0] ],
227 objectStorageBaseUrl: objectStorageBaseUrlHLS,
228 resolutions: [ 720, 480, 360, 240, 144, 0 ]
233 before(async function () {
234 this.timeout(120_000)
236 servers = await createMultipleServers(2)
238 await setAccessTokensToServers(servers)
239 await setDefaultVideoChannel(servers)
241 await doubleFollow(servers[0], servers[1])
243 await servers[0].config.enableRemoteTranscoding()
245 const registrationToken = await servers[0].runnerRegistrationTokens.getFirstRegistrationToken()
247 peertubeRunner = new PeerTubeRunnerProcess()
248 await peertubeRunner.runServer()
249 await peertubeRunner.registerPeerTubeInstance({ server: servers[0], registrationToken, runnerName: 'runner' })
252 describe('With videos on local filesystem storage', function () {
254 describe('Web video only enabled', function () {
256 before(async function () {
257 await servers[0].config.enableTranscoding(true, false, true)
260 runSuite({ webtorrentEnabled: true, hlsEnabled: false, objectStorage: false })
263 describe('HLS videos only enabled', function () {
265 before(async function () {
266 await servers[0].config.enableTranscoding(false, true, true)
269 runSuite({ webtorrentEnabled: false, hlsEnabled: true, objectStorage: false })
272 describe('Web video & HLS enabled', function () {
274 before(async function () {
275 await servers[0].config.enableTranscoding(true, true, true)
278 runSuite({ webtorrentEnabled: true, hlsEnabled: true, objectStorage: false })
282 describe('With videos on object storage', function () {
283 if (areMockObjectStorageTestsDisabled()) return
285 before(async function () {
286 await ObjectStorageCommand.prepareDefaultMockBuckets()
288 await servers[0].kill()
290 await servers[0].run(ObjectStorageCommand.getDefaultMockConfig())
292 // Wait for peertube runner socket reconnection
296 describe('Web video only enabled', function () {
298 before(async function () {
299 await servers[0].config.enableTranscoding(true, false, true)
302 runSuite({ webtorrentEnabled: true, hlsEnabled: false, objectStorage: true })
305 describe('HLS videos only enabled', function () {
307 before(async function () {
308 await servers[0].config.enableTranscoding(false, true, true)
311 runSuite({ webtorrentEnabled: false, hlsEnabled: true, objectStorage: true })
314 describe('Web video & HLS enabled', function () {
316 before(async function () {
317 await servers[0].config.enableTranscoding(true, true, true)
320 runSuite({ webtorrentEnabled: true, hlsEnabled: true, objectStorage: true })
324 after(async function () {
325 await peertubeRunner.unregisterPeerTubeInstance({ server: servers[0] })
326 peertubeRunner.kill()
328 await cleanupTests(servers)