Move to eslint
[oweals/peertube.git] / server / tests / api / videos / audio-only.ts
1 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2
3 import * as chai from 'chai'
4 import 'mocha'
5 import {
6   cleanupTests,
7   doubleFollow,
8   flushAndRunMultipleServers,
9   getVideo,
10   root,
11   ServerInfo,
12   setAccessTokensToServers,
13   uploadVideo,
14   waitJobs
15 } from '../../../../shared/extra-utils'
16 import { VideoDetails } from '../../../../shared/models/videos'
17 import { join } from 'path'
18 import { audio, getVideoStreamSize } from '@server/helpers/ffmpeg-utils'
19
20 const expect = chai.expect
21
22 describe('Test audio only video transcoding', function () {
23   let servers: ServerInfo[] = []
24   let videoUUID: string
25
26   before(async function () {
27     this.timeout(120000)
28
29     const configOverride = {
30       transcoding: {
31         enabled: true,
32         resolutions: {
33           '0p': true,
34           '240p': true,
35           '360p': false,
36           '480p': false,
37           '720p': false,
38           '1080p': false,
39           '2160p': false
40         },
41         hls: {
42           enabled: true
43         },
44         webtorrent: {
45           enabled: true
46         }
47       }
48     }
49     servers = await flushAndRunMultipleServers(2, configOverride)
50
51     // Get the access tokens
52     await setAccessTokensToServers(servers)
53
54     // Server 1 and server 2 follow each other
55     await doubleFollow(servers[0], servers[1])
56   })
57
58   it('Should upload a video and transcode it', async function () {
59     this.timeout(120000)
60
61     const resUpload = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'audio only' })
62     videoUUID = resUpload.body.video.uuid
63
64     await waitJobs(servers)
65
66     for (const server of servers) {
67       const res = await getVideo(server.url, videoUUID)
68       const video: VideoDetails = res.body
69
70       expect(video.streamingPlaylists).to.have.lengthOf(1)
71
72       for (const files of [ video.files, video.streamingPlaylists[0].files ]) {
73         expect(files).to.have.lengthOf(3)
74         expect(files[0].resolution.id).to.equal(720)
75         expect(files[1].resolution.id).to.equal(240)
76         expect(files[2].resolution.id).to.equal(0)
77       }
78     }
79   })
80
81   it('0p transcoded video should not have video', async function () {
82     const paths = [
83       join(root(), 'test' + servers[0].internalServerNumber, 'videos', videoUUID + '-0.mp4'),
84       join(root(), 'test' + servers[0].internalServerNumber, 'streaming-playlists', 'hls', videoUUID, videoUUID + '-0-fragmented.mp4')
85     ]
86
87     for (const path of paths) {
88       const { audioStream } = await audio.get(path)
89       expect(audioStream['codec_name']).to.be.equal('aac')
90       expect(audioStream['bit_rate']).to.be.at.most(384 * 8000)
91
92       const size = await getVideoStreamSize(path)
93       expect(size.height).to.equal(0)
94       expect(size.width).to.equal(0)
95     }
96   })
97
98   after(async function () {
99     await cleanupTests(servers)
100   })
101 })