2020-01-31 09:56:52 -06:00
|
|
|
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2022-10-12 09:09:02 -05:00
|
|
|
import { join } from 'path'
|
|
|
|
import { checkDirectoryIsEmpty, checkTmpIsEmpty, completeCheckHlsPlaylist } from '@server/tests/shared'
|
2022-10-19 03:43:53 -05:00
|
|
|
import { areMockObjectStorageTestsDisabled } from '@shared/core-utils'
|
2022-10-12 09:09:02 -05:00
|
|
|
import { HttpStatusCode } from '@shared/models'
|
2021-12-17 04:58:15 -06:00
|
|
|
import {
|
2019-04-25 10:14:49 -05:00
|
|
|
cleanupTests,
|
2021-07-16 02:47:51 -05:00
|
|
|
createMultipleServers,
|
2021-07-16 07:27:30 -05:00
|
|
|
doubleFollow,
|
2021-08-17 01:26:20 -05:00
|
|
|
ObjectStorageCommand,
|
2021-07-16 02:47:51 -05:00
|
|
|
PeerTubeServer,
|
2020-01-31 09:56:52 -06:00
|
|
|
setAccessTokensToServers,
|
2022-10-12 09:09:02 -05:00
|
|
|
waitJobs
|
2021-12-17 02:29:23 -06:00
|
|
|
} from '@shared/server-commands'
|
2019-05-17 04:56:12 -05:00
|
|
|
import { DEFAULT_AUDIO_RESOLUTION } from '../../../initializers/constants'
|
2019-01-29 01:37:25 -06:00
|
|
|
|
|
|
|
describe('Test HLS videos', function () {
|
2021-07-16 02:47:51 -05:00
|
|
|
let servers: PeerTubeServer[] = []
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2021-08-17 01:26:20 -05:00
|
|
|
function runTestSuite (hlsOnly: boolean, objectStorageBaseUrl?: string) {
|
2022-10-12 09:09:02 -05:00
|
|
|
const videoUUIDs: string[] = []
|
2021-07-09 09:23:01 -05:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
it('Should upload a video and transcode it to HLS', async function () {
|
|
|
|
this.timeout(120000)
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
const { uuid } = await servers[0].videos.upload({ attributes: { name: 'video 1', fixture: 'video_short.webm' } })
|
2022-10-12 09:09:02 -05:00
|
|
|
videoUUIDs.push(uuid)
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
await waitJobs(servers)
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2022-10-12 09:09:02 -05:00
|
|
|
await completeCheckHlsPlaylist({ servers, videoUUID: uuid, hlsOnly, objectStorageBaseUrl })
|
2019-11-15 08:06:03 -06:00
|
|
|
})
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
it('Should upload an audio file and transcode it to HLS', async function () {
|
|
|
|
this.timeout(120000)
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
const { uuid } = await servers[0].videos.upload({ attributes: { name: 'video audio', fixture: 'sample.ogg' } })
|
2022-10-12 09:09:02 -05:00
|
|
|
videoUUIDs.push(uuid)
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
await waitJobs(servers)
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2022-10-12 09:09:02 -05:00
|
|
|
await completeCheckHlsPlaylist({
|
2021-08-17 01:26:20 -05:00
|
|
|
servers,
|
2022-10-12 09:09:02 -05:00
|
|
|
videoUUID: uuid,
|
2021-08-17 01:26:20 -05:00
|
|
|
hlsOnly,
|
|
|
|
resolutions: [ DEFAULT_AUDIO_RESOLUTION, 360, 240 ],
|
|
|
|
objectStorageBaseUrl
|
|
|
|
})
|
2019-11-15 08:06:03 -06:00
|
|
|
})
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
it('Should update the video', async function () {
|
2021-08-18 03:00:57 -05:00
|
|
|
this.timeout(30000)
|
2019-05-17 04:56:12 -05:00
|
|
|
|
2022-10-12 09:09:02 -05:00
|
|
|
await servers[0].videos.update({ id: videoUUIDs[0], attributes: { name: 'video 1 updated' } })
|
2019-05-17 04:56:12 -05:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
await waitJobs(servers)
|
2019-05-17 04:56:12 -05:00
|
|
|
|
2022-10-12 09:09:02 -05:00
|
|
|
await completeCheckHlsPlaylist({ servers, videoUUID: videoUUIDs[0], hlsOnly, objectStorageBaseUrl })
|
2019-11-15 08:06:03 -06:00
|
|
|
})
|
2019-05-17 04:56:12 -05:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
it('Should delete videos', async function () {
|
2022-10-12 09:09:02 -05:00
|
|
|
for (const uuid of videoUUIDs) {
|
|
|
|
await servers[0].videos.remove({ id: uuid })
|
|
|
|
}
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
await waitJobs(servers)
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
for (const server of servers) {
|
2022-10-12 09:09:02 -05:00
|
|
|
for (const uuid of videoUUIDs) {
|
|
|
|
await server.videos.get({ id: uuid, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
|
|
|
|
}
|
2019-11-15 08:06:03 -06:00
|
|
|
}
|
|
|
|
})
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
it('Should have the playlists/segment deleted from the disk', async function () {
|
|
|
|
for (const server of servers) {
|
2022-10-12 09:09:02 -05:00
|
|
|
await checkDirectoryIsEmpty(server, 'videos', [ 'private' ])
|
|
|
|
await checkDirectoryIsEmpty(server, join('videos', 'private'))
|
|
|
|
|
|
|
|
await checkDirectoryIsEmpty(server, join('streaming-playlists', 'hls'), [ 'private' ])
|
|
|
|
await checkDirectoryIsEmpty(server, join('streaming-playlists', 'hls', 'private'))
|
2019-11-15 08:06:03 -06:00
|
|
|
}
|
|
|
|
})
|
2019-05-17 08:51:42 -05:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
it('Should have an empty tmp directory', async function () {
|
|
|
|
for (const server of servers) {
|
|
|
|
await checkTmpIsEmpty(server)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
before(async function () {
|
|
|
|
this.timeout(120000)
|
2019-01-29 01:37:25 -06:00
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
const configOverride = {
|
|
|
|
transcoding: {
|
|
|
|
enabled: true,
|
|
|
|
allow_audio_files: true,
|
|
|
|
hls: {
|
|
|
|
enabled: true
|
|
|
|
}
|
|
|
|
}
|
2019-01-29 01:37:25 -06:00
|
|
|
}
|
2021-07-16 02:47:51 -05:00
|
|
|
servers = await createMultipleServers(2, configOverride)
|
2019-11-15 08:06:03 -06:00
|
|
|
|
|
|
|
// Get the access tokens
|
|
|
|
await setAccessTokensToServers(servers)
|
|
|
|
|
|
|
|
// Server 1 and server 2 follow each other
|
|
|
|
await doubleFollow(servers[0], servers[1])
|
2019-01-29 01:37:25 -06:00
|
|
|
})
|
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
describe('With WebTorrent & HLS enabled', function () {
|
|
|
|
runTestSuite(false)
|
2019-01-29 01:37:25 -06:00
|
|
|
})
|
|
|
|
|
2019-11-15 08:06:03 -06:00
|
|
|
describe('With only HLS enabled', function () {
|
|
|
|
|
|
|
|
before(async function () {
|
2021-07-16 02:04:35 -05:00
|
|
|
await servers[0].config.updateCustomSubConfig({
|
2021-07-07 04:51:09 -05:00
|
|
|
newConfig: {
|
|
|
|
transcoding: {
|
|
|
|
enabled: true,
|
|
|
|
allowAudioFiles: true,
|
|
|
|
resolutions: {
|
2021-11-05 04:23:02 -05:00
|
|
|
'144p': false,
|
2021-07-07 04:51:09 -05:00
|
|
|
'240p': true,
|
|
|
|
'360p': true,
|
|
|
|
'480p': true,
|
|
|
|
'720p': true,
|
|
|
|
'1080p': true,
|
|
|
|
'1440p': true,
|
|
|
|
'2160p': true
|
|
|
|
},
|
|
|
|
hls: {
|
|
|
|
enabled: true
|
|
|
|
},
|
|
|
|
webtorrent: {
|
|
|
|
enabled: false
|
|
|
|
}
|
2019-11-15 08:06:03 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
runTestSuite(true)
|
2019-01-29 01:37:25 -06:00
|
|
|
})
|
|
|
|
|
2021-08-17 01:26:20 -05:00
|
|
|
describe('With object storage enabled', function () {
|
2022-10-19 03:43:53 -05:00
|
|
|
if (areMockObjectStorageTestsDisabled()) return
|
2021-08-17 01:26:20 -05:00
|
|
|
|
2023-05-23 03:49:45 -05:00
|
|
|
const objectStorage = new ObjectStorageCommand()
|
|
|
|
|
2021-08-17 01:26:20 -05:00
|
|
|
before(async function () {
|
|
|
|
this.timeout(120000)
|
|
|
|
|
2023-05-23 03:49:45 -05:00
|
|
|
const configOverride = objectStorage.getDefaultMockConfig()
|
|
|
|
await objectStorage.prepareDefaultMockBuckets()
|
2021-08-17 01:26:20 -05:00
|
|
|
|
|
|
|
await servers[0].kill()
|
|
|
|
await servers[0].run(configOverride)
|
|
|
|
})
|
|
|
|
|
2023-05-23 03:49:45 -05:00
|
|
|
runTestSuite(true, objectStorage.getMockPlaylistBaseUrl())
|
|
|
|
|
|
|
|
after(async function () {
|
|
|
|
await objectStorage.cleanupMock()
|
|
|
|
})
|
2021-08-17 01:26:20 -05:00
|
|
|
})
|
|
|
|
|
2019-04-24 08:10:37 -05:00
|
|
|
after(async function () {
|
|
|
|
await cleanupTests(servers)
|
2019-01-29 01:37:25 -06:00
|
|
|
})
|
|
|
|
})
|