aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2021-07-08 11:49:38 +0200
committerChocobozzz <me@florianbigard.com>2021-07-20 15:27:17 +0200
commita2470c9f4bfc7f49f4b94de935bacdd53fd54f29 (patch)
treecb6b6b33d1a404fe31547c004241a7eb9743b64e
parente3d15a6a9aed97a004d9dac1b7a6499d794e080a (diff)
downloadPeerTube-a2470c9f4bfc7f49f4b94de935bacdd53fd54f29.tar.gz
PeerTube-a2470c9f4bfc7f49f4b94de935bacdd53fd54f29.tar.zst
PeerTube-a2470c9f4bfc7f49f4b94de935bacdd53fd54f29.zip
Introduce captions command
-rw-r--r--scripts/benchmark.ts5
-rw-r--r--server/tests/api/check-params/video-captions.ts11
-rw-r--r--server/tests/api/search/search-videos.ts9
-rw-r--r--server/tests/api/server/follows.ts16
-rw-r--r--server/tests/api/videos/video-captions.ts77
-rw-r--r--server/tests/api/videos/video-imports.ts33
-rw-r--r--shared/extra-utils/server/servers.ts4
-rw-r--r--shared/extra-utils/videos/captions-command.ts66
-rw-r--r--shared/extra-utils/videos/captions.ts17
-rw-r--r--shared/extra-utils/videos/index.ts3
-rw-r--r--shared/extra-utils/videos/video-captions.ts72
11 files changed, 149 insertions, 164 deletions
diff --git a/scripts/benchmark.ts b/scripts/benchmark.ts
index 0cadb36d9..fcfc67bf7 100644
--- a/scripts/benchmark.ts
+++ b/scripts/benchmark.ts
@@ -5,7 +5,6 @@ import * as autocannon from 'autocannon'
5import { 5import {
6 addVideoCommentReply, 6 addVideoCommentReply,
7 addVideoCommentThread, 7 addVideoCommentThread,
8 createVideoCaption,
9 flushAndRunServer, 8 flushAndRunServer,
10 getVideosList, 9 getVideosList,
11 killallServers, 10 killallServers,
@@ -244,9 +243,7 @@ async function prepare () {
244 } 243 }
245 244
246 for (const caption of [ 'ar', 'fr', 'en', 'zh' ]) { 245 for (const caption of [ 'ar', 'fr', 'en', 'zh' ]) {
247 await createVideoCaption({ 246 await server.captionsCommand.createVideoCaption({
248 url: server.url,
249 accessToken: server.accessToken,
250 language: caption, 247 language: caption,
251 videoId: video.id, 248 videoId: video.id,
252 fixture: 'subtitle-good2.vtt' 249 fixture: 'subtitle-good2.vtt'
diff --git a/server/tests/api/check-params/video-captions.ts b/server/tests/api/check-params/video-captions.ts
index c0595c04d..baab0f276 100644
--- a/server/tests/api/check-params/video-captions.ts
+++ b/server/tests/api/check-params/video-captions.ts
@@ -1,8 +1,7 @@
1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2 2
3import 'mocha' 3import 'mocha'
4import { VideoCreateResult } from '@shared/models' 4import { HttpStatusCode } from '@shared/core-utils'
5import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
6import { 5import {
7 buildAbsoluteFixturePath, 6 buildAbsoluteFixturePath,
8 cleanupTests, 7 cleanupTests,
@@ -15,8 +14,8 @@ import {
15 setAccessTokensToServers, 14 setAccessTokensToServers,
16 uploadVideo, 15 uploadVideo,
17 userLogin 16 userLogin
18} from '../../../../shared/extra-utils' 17} from '@shared/extra-utils'
19import { createVideoCaption } from '../../../../shared/extra-utils/videos/video-captions' 18import { VideoCreateResult } from '@shared/models'
20 19
21describe('Test video captions API validator', function () { 20describe('Test video captions API validator', function () {
22 const path = '/api/v1/videos/' 21 const path = '/api/v1/videos/'
@@ -159,9 +158,7 @@ describe('Test video captions API validator', function () {
159 // }) 158 // })
160 159
161 it('Should succeed with a valid captionfile extension and octet-stream mime type', async function () { 160 it('Should succeed with a valid captionfile extension and octet-stream mime type', async function () {
162 await createVideoCaption({ 161 await server.captionsCommand.createVideoCaption({
163 url: server.url,
164 accessToken: server.accessToken,
165 language: 'zh', 162 language: 'zh',
166 videoId: video.uuid, 163 videoId: video.uuid,
167 fixture: 'subtitle-good.srt', 164 fixture: 'subtitle-good.srt',
diff --git a/server/tests/api/search/search-videos.ts b/server/tests/api/search/search-videos.ts
index a0375fbf0..513538917 100644
--- a/server/tests/api/search/search-videos.ts
+++ b/server/tests/api/search/search-videos.ts
@@ -4,7 +4,6 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createVideoCaption,
8 flushAndRunServer, 7 flushAndRunServer,
9 immutableAssign, 8 immutableAssign,
10 SearchCommand, 9 SearchCommand,
@@ -54,18 +53,14 @@ describe('Test videos search', function () {
54 const videoId = res.body.video.id 53 const videoId = res.body.video.id
55 videoUUID = res.body.video.uuid 54 videoUUID = res.body.video.uuid
56 55
57 await createVideoCaption({ 56 await server.captionsCommand.createVideoCaption({
58 url: server.url,
59 accessToken: server.accessToken,
60 language: 'en', 57 language: 'en',
61 videoId, 58 videoId,
62 fixture: 'subtitle-good2.vtt', 59 fixture: 'subtitle-good2.vtt',
63 mimeType: 'application/octet-stream' 60 mimeType: 'application/octet-stream'
64 }) 61 })
65 62
66 await createVideoCaption({ 63 await server.captionsCommand.createVideoCaption({
67 url: server.url,
68 accessToken: server.accessToken,
69 language: 'aa', 64 language: 'aa',
70 videoId, 65 videoId,
71 fixture: 'subtitle-good2.vtt', 66 fixture: 'subtitle-good2.vtt',
diff --git a/server/tests/api/server/follows.ts b/server/tests/api/server/follows.ts
index 466932d63..520442c6e 100644
--- a/server/tests/api/server/follows.ts
+++ b/server/tests/api/server/follows.ts
@@ -8,7 +8,6 @@ import {
8 cleanupTests, 8 cleanupTests,
9 completeVideoCheck, 9 completeVideoCheck,
10 createUser, 10 createUser,
11 createVideoCaption,
12 dateIsValid, 11 dateIsValid,
13 deleteVideoComment, 12 deleteVideoComment,
14 expectAccountFollows, 13 expectAccountFollows,
@@ -17,7 +16,6 @@ import {
17 getVideoCommentThreads, 16 getVideoCommentThreads,
18 getVideosList, 17 getVideosList,
19 getVideoThreadComments, 18 getVideoThreadComments,
20 listVideoCaptions,
21 rateVideo, 19 rateVideo,
22 ServerInfo, 20 ServerInfo,
23 setAccessTokensToServers, 21 setAccessTokensToServers,
@@ -26,7 +24,7 @@ import {
26 userLogin, 24 userLogin,
27 waitJobs 25 waitJobs
28} from '@shared/extra-utils' 26} from '@shared/extra-utils'
29import { Video, VideoCaption, VideoComment, VideoCommentThreadTree, VideoPrivacy } from '@shared/models' 27import { Video, VideoComment, VideoCommentThreadTree, VideoPrivacy } from '@shared/models'
30 28
31const expect = chai.expect 29const expect = chai.expect
32 30
@@ -385,9 +383,7 @@ describe('Test follows', function () {
385 } 383 }
386 384
387 { 385 {
388 await createVideoCaption({ 386 await servers[2].captionsCommand.createVideoCaption({
389 url: servers[2].url,
390 accessToken: servers[2].accessToken,
391 language: 'ar', 387 language: 'ar',
392 videoId: video4.id, 388 videoId: video4.id,
393 fixture: 'subtitle-good2.vtt' 389 fixture: 'subtitle-good2.vtt'
@@ -543,11 +539,11 @@ describe('Test follows', function () {
543 }) 539 })
544 540
545 it('Should have propagated captions', async function () { 541 it('Should have propagated captions', async function () {
546 const res = await listVideoCaptions(servers[0].url, video4.id) 542 const body = await servers[0].captionsCommand.listVideoCaptions({ videoId: video4.id })
547 expect(res.body.total).to.equal(1) 543 expect(body.total).to.equal(1)
548 expect(res.body.data).to.have.lengthOf(1) 544 expect(body.data).to.have.lengthOf(1)
549 545
550 const caption1: VideoCaption = res.body.data[0] 546 const caption1 = body.data[0]
551 expect(caption1.language.id).to.equal('ar') 547 expect(caption1.language.id).to.equal('ar')
552 expect(caption1.language.label).to.equal('Arabic') 548 expect(caption1.language.label).to.equal('Arabic')
553 expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/.+-ar.vtt$')) 549 expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/.+-ar.vtt$'))
diff --git a/server/tests/api/videos/video-captions.ts b/server/tests/api/videos/video-captions.ts
index 14ecedfa6..83ee809b8 100644
--- a/server/tests/api/videos/video-captions.ts
+++ b/server/tests/api/videos/video-captions.ts
@@ -1,25 +1,20 @@
1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2 2
3import * as chai from 'chai'
4import 'mocha' 3import 'mocha'
4import * as chai from 'chai'
5import { 5import {
6 checkVideoFilesWereRemoved, 6 checkVideoFilesWereRemoved,
7 cleanupTests, 7 cleanupTests,
8 doubleFollow, 8 doubleFollow,
9 flushAndRunMultipleServers, 9 flushAndRunMultipleServers,
10 removeVideo, 10 removeVideo,
11 ServerInfo,
12 setAccessTokensToServers,
13 testCaptionFile,
11 uploadVideo, 14 uploadVideo,
12 wait 15 wait,
13} from '../../../../shared/extra-utils' 16 waitJobs
14import { ServerInfo, setAccessTokensToServers } from '../../../../shared/extra-utils/index' 17} from '@shared/extra-utils'
15import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
16import {
17 createVideoCaption,
18 deleteVideoCaption,
19 listVideoCaptions,
20 testCaptionFile
21} from '../../../../shared/extra-utils/videos/video-captions'
22import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model'
23 18
24const expect = chai.expect 19const expect = chai.expect
25 20
@@ -47,26 +42,22 @@ describe('Test video captions', function () {
47 42
48 it('Should list the captions and return an empty list', async function () { 43 it('Should list the captions and return an empty list', async function () {
49 for (const server of servers) { 44 for (const server of servers) {
50 const res = await listVideoCaptions(server.url, videoUUID) 45 const body = await server.captionsCommand.listVideoCaptions({ videoId: videoUUID })
51 expect(res.body.total).to.equal(0) 46 expect(body.total).to.equal(0)
52 expect(res.body.data).to.have.lengthOf(0) 47 expect(body.data).to.have.lengthOf(0)
53 } 48 }
54 }) 49 })
55 50
56 it('Should create two new captions', async function () { 51 it('Should create two new captions', async function () {
57 this.timeout(30000) 52 this.timeout(30000)
58 53
59 await createVideoCaption({ 54 await servers[0].captionsCommand.createVideoCaption({
60 url: servers[0].url,
61 accessToken: servers[0].accessToken,
62 language: 'ar', 55 language: 'ar',
63 videoId: videoUUID, 56 videoId: videoUUID,
64 fixture: 'subtitle-good1.vtt' 57 fixture: 'subtitle-good1.vtt'
65 }) 58 })
66 59
67 await createVideoCaption({ 60 await servers[0].captionsCommand.createVideoCaption({
68 url: servers[0].url,
69 accessToken: servers[0].accessToken,
70 language: 'zh', 61 language: 'zh',
71 videoId: videoUUID, 62 videoId: videoUUID,
72 fixture: 'subtitle-good2.vtt', 63 fixture: 'subtitle-good2.vtt',
@@ -78,17 +69,17 @@ describe('Test video captions', function () {
78 69
79 it('Should list these uploaded captions', async function () { 70 it('Should list these uploaded captions', async function () {
80 for (const server of servers) { 71 for (const server of servers) {
81 const res = await listVideoCaptions(server.url, videoUUID) 72 const body = await server.captionsCommand.listVideoCaptions({ videoId: videoUUID })
82 expect(res.body.total).to.equal(2) 73 expect(body.total).to.equal(2)
83 expect(res.body.data).to.have.lengthOf(2) 74 expect(body.data).to.have.lengthOf(2)
84 75
85 const caption1: VideoCaption = res.body.data[0] 76 const caption1 = body.data[0]
86 expect(caption1.language.id).to.equal('ar') 77 expect(caption1.language.id).to.equal('ar')
87 expect(caption1.language.label).to.equal('Arabic') 78 expect(caption1.language.label).to.equal('Arabic')
88 expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/' + uuidRegex + '-ar.vtt$')) 79 expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/' + uuidRegex + '-ar.vtt$'))
89 await testCaptionFile(server.url, caption1.captionPath, 'Subtitle good 1.') 80 await testCaptionFile(server.url, caption1.captionPath, 'Subtitle good 1.')
90 81
91 const caption2: VideoCaption = res.body.data[1] 82 const caption2 = body.data[1]
92 expect(caption2.language.id).to.equal('zh') 83 expect(caption2.language.id).to.equal('zh')
93 expect(caption2.language.label).to.equal('Chinese') 84 expect(caption2.language.label).to.equal('Chinese')
94 expect(caption2.captionPath).to.match(new RegExp('^/lazy-static/video-captions/' + uuidRegex + '-zh.vtt$')) 85 expect(caption2.captionPath).to.match(new RegExp('^/lazy-static/video-captions/' + uuidRegex + '-zh.vtt$'))
@@ -99,9 +90,7 @@ describe('Test video captions', function () {
99 it('Should replace an existing caption', async function () { 90 it('Should replace an existing caption', async function () {
100 this.timeout(30000) 91 this.timeout(30000)
101 92
102 await createVideoCaption({ 93 await servers[0].captionsCommand.createVideoCaption({
103 url: servers[0].url,
104 accessToken: servers[0].accessToken,
105 language: 'ar', 94 language: 'ar',
106 videoId: videoUUID, 95 videoId: videoUUID,
107 fixture: 'subtitle-good2.vtt' 96 fixture: 'subtitle-good2.vtt'
@@ -112,11 +101,11 @@ describe('Test video captions', function () {
112 101
113 it('Should have this caption updated', async function () { 102 it('Should have this caption updated', async function () {
114 for (const server of servers) { 103 for (const server of servers) {
115 const res = await listVideoCaptions(server.url, videoUUID) 104 const body = await server.captionsCommand.listVideoCaptions({ videoId: videoUUID })
116 expect(res.body.total).to.equal(2) 105 expect(body.total).to.equal(2)
117 expect(res.body.data).to.have.lengthOf(2) 106 expect(body.data).to.have.lengthOf(2)
118 107
119 const caption1: VideoCaption = res.body.data[0] 108 const caption1 = body.data[0]
120 expect(caption1.language.id).to.equal('ar') 109 expect(caption1.language.id).to.equal('ar')
121 expect(caption1.language.label).to.equal('Arabic') 110 expect(caption1.language.label).to.equal('Arabic')
122 expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/' + uuidRegex + '-ar.vtt$')) 111 expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/' + uuidRegex + '-ar.vtt$'))
@@ -127,9 +116,7 @@ describe('Test video captions', function () {
127 it('Should replace an existing caption with a srt file and convert it', async function () { 116 it('Should replace an existing caption with a srt file and convert it', async function () {
128 this.timeout(30000) 117 this.timeout(30000)
129 118
130 await createVideoCaption({ 119 await servers[0].captionsCommand.createVideoCaption({
131 url: servers[0].url,
132 accessToken: servers[0].accessToken,
133 language: 'ar', 120 language: 'ar',
134 videoId: videoUUID, 121 videoId: videoUUID,
135 fixture: 'subtitle-good.srt' 122 fixture: 'subtitle-good.srt'
@@ -143,11 +130,11 @@ describe('Test video captions', function () {
143 130
144 it('Should have this caption updated and converted', async function () { 131 it('Should have this caption updated and converted', async function () {
145 for (const server of servers) { 132 for (const server of servers) {
146 const res = await listVideoCaptions(server.url, videoUUID) 133 const body = await server.captionsCommand.listVideoCaptions({ videoId: videoUUID })
147 expect(res.body.total).to.equal(2) 134 expect(body.total).to.equal(2)
148 expect(res.body.data).to.have.lengthOf(2) 135 expect(body.data).to.have.lengthOf(2)
149 136
150 const caption1: VideoCaption = res.body.data[0] 137 const caption1 = body.data[0]
151 expect(caption1.language.id).to.equal('ar') 138 expect(caption1.language.id).to.equal('ar')
152 expect(caption1.language.label).to.equal('Arabic') 139 expect(caption1.language.label).to.equal('Arabic')
153 expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/' + uuidRegex + '-ar.vtt$')) 140 expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/' + uuidRegex + '-ar.vtt$'))
@@ -172,18 +159,18 @@ describe('Test video captions', function () {
172 it('Should remove one caption', async function () { 159 it('Should remove one caption', async function () {
173 this.timeout(30000) 160 this.timeout(30000)
174 161
175 await deleteVideoCaption(servers[0].url, servers[0].accessToken, videoUUID, 'ar') 162 await servers[0].captionsCommand.deleteVideoCaption({ videoId: videoUUID, language: 'ar' })
176 163
177 await waitJobs(servers) 164 await waitJobs(servers)
178 }) 165 })
179 166
180 it('Should only list the caption that was not deleted', async function () { 167 it('Should only list the caption that was not deleted', async function () {
181 for (const server of servers) { 168 for (const server of servers) {
182 const res = await listVideoCaptions(server.url, videoUUID) 169 const body = await server.captionsCommand.listVideoCaptions({ videoId: videoUUID })
183 expect(res.body.total).to.equal(1) 170 expect(body.total).to.equal(1)
184 expect(res.body.data).to.have.lengthOf(1) 171 expect(body.data).to.have.lengthOf(1)
185 172
186 const caption: VideoCaption = res.body.data[0] 173 const caption = body.data[0]
187 174
188 expect(caption.language.id).to.equal('zh') 175 expect(caption.language.id).to.equal('zh')
189 expect(caption.language.label).to.equal('Chinese') 176 expect(caption.language.label).to.equal('Chinese')
diff --git a/server/tests/api/videos/video-imports.ts b/server/tests/api/videos/video-imports.ts
index a4a9132b4..14aed604f 100644
--- a/server/tests/api/videos/video-imports.ts
+++ b/server/tests/api/videos/video-imports.ts
@@ -11,7 +11,6 @@ import {
11 getVideo, 11 getVideo,
12 getVideosList, 12 getVideosList,
13 immutableAssign, 13 immutableAssign,
14 listVideoCaptions,
15 ServerInfo, 14 ServerInfo,
16 setAccessTokensToServers, 15 setAccessTokensToServers,
17 testCaptionFile 16 testCaptionFile
@@ -25,7 +24,7 @@ import {
25 getYoutubeVideoUrl, 24 getYoutubeVideoUrl,
26 importVideo 25 importVideo
27} from '../../../../shared/extra-utils/videos/video-imports' 26} from '../../../../shared/extra-utils/videos/video-imports'
28import { VideoCaption, VideoDetails, VideoImport, VideoPrivacy, VideoResolution } from '../../../../shared/models/videos' 27import { VideoDetails, VideoImport, VideoPrivacy, VideoResolution } from '../../../../shared/models/videos'
29 28
30const expect = chai.expect 29const expect = chai.expect
31 30
@@ -36,8 +35,8 @@ describe('Test video imports', function () {
36 35
37 if (areHttpImportTestsDisabled()) return 36 if (areHttpImportTestsDisabled()) return
38 37
39 async function checkVideosServer1 (url: string, idHttp: string, idMagnet: string, idTorrent: string) { 38 async function checkVideosServer1 (server: ServerInfo, idHttp: string, idMagnet: string, idTorrent: string) {
40 const resHttp = await getVideo(url, idHttp) 39 const resHttp = await getVideo(server.url, idHttp)
41 const videoHttp: VideoDetails = resHttp.body 40 const videoHttp: VideoDetails = resHttp.body
42 41
43 expect(videoHttp.name).to.equal('small video - youtube') 42 expect(videoHttp.name).to.equal('small video - youtube')
@@ -55,9 +54,9 @@ describe('Test video imports', function () {
55 expect(originallyPublishedAt.getMonth()).to.equal(0) 54 expect(originallyPublishedAt.getMonth()).to.equal(0)
56 expect(originallyPublishedAt.getFullYear()).to.equal(2019) 55 expect(originallyPublishedAt.getFullYear()).to.equal(2019)
57 56
58 const resMagnet = await getVideo(url, idMagnet) 57 const resMagnet = await getVideo(server.url, idMagnet)
59 const videoMagnet: VideoDetails = resMagnet.body 58 const videoMagnet: VideoDetails = resMagnet.body
60 const resTorrent = await getVideo(url, idTorrent) 59 const resTorrent = await getVideo(server.url, idTorrent)
61 const videoTorrent: VideoDetails = resTorrent.body 60 const videoTorrent: VideoDetails = resTorrent.body
62 61
63 for (const video of [ videoMagnet, videoTorrent ]) { 62 for (const video of [ videoMagnet, videoTorrent ]) {
@@ -73,12 +72,12 @@ describe('Test video imports', function () {
73 expect(videoTorrent.name).to.contain('你好 世界 720p.mp4') 72 expect(videoTorrent.name).to.contain('你好 世界 720p.mp4')
74 expect(videoMagnet.name).to.contain('super peertube2 video') 73 expect(videoMagnet.name).to.contain('super peertube2 video')
75 74
76 const resCaptions = await listVideoCaptions(url, idHttp) 75 const bodyCaptions = await server.captionsCommand.listVideoCaptions({ videoId: idHttp })
77 expect(resCaptions.body.total).to.equal(2) 76 expect(bodyCaptions.total).to.equal(2)
78 } 77 }
79 78
80 async function checkVideoServer2 (url: string, id: number | string) { 79 async function checkVideoServer2 (server: ServerInfo, id: number | string) {
81 const res = await getVideo(url, id) 80 const res = await getVideo(server.url, id)
82 const video: VideoDetails = res.body 81 const video: VideoDetails = res.body
83 82
84 expect(video.name).to.equal('my super name') 83 expect(video.name).to.equal('my super name')
@@ -91,8 +90,8 @@ describe('Test video imports', function () {
91 90
92 expect(video.files).to.have.lengthOf(1) 91 expect(video.files).to.have.lengthOf(1)
93 92
94 const resCaptions = await listVideoCaptions(url, id) 93 const bodyCaptions = await server.captionsCommand.listVideoCaptions({ videoId: id })
95 expect(resCaptions.body.total).to.equal(2) 94 expect(bodyCaptions.total).to.equal(2)
96 } 95 }
97 96
98 before(async function () { 97 before(async function () {
@@ -135,8 +134,8 @@ describe('Test video imports', function () {
135 await testImage(servers[0].url, 'video_import_thumbnail', res.body.video.thumbnailPath) 134 await testImage(servers[0].url, 'video_import_thumbnail', res.body.video.thumbnailPath)
136 await testImage(servers[0].url, 'video_import_preview', res.body.video.previewPath) 135 await testImage(servers[0].url, 'video_import_preview', res.body.video.previewPath)
137 136
138 const resCaptions = await listVideoCaptions(servers[0].url, res.body.video.id) 137 const bodyCaptions = await servers[0].captionsCommand.listVideoCaptions({ videoId: res.body.video.id })
139 const videoCaptions: VideoCaption[] = resCaptions.body.data 138 const videoCaptions = bodyCaptions.data
140 expect(videoCaptions).to.have.lengthOf(2) 139 expect(videoCaptions).to.have.lengthOf(2)
141 140
142 const enCaption = videoCaptions.find(caption => caption.language.id === 'en') 141 const enCaption = videoCaptions.find(caption => caption.language.id === 'en')
@@ -241,7 +240,7 @@ Ajouter un sous-titre est vraiment facile`)
241 expect(res.body.data).to.have.lengthOf(3) 240 expect(res.body.data).to.have.lengthOf(3)
242 241
243 const [ videoHttp, videoMagnet, videoTorrent ] = res.body.data 242 const [ videoHttp, videoMagnet, videoTorrent ] = res.body.data
244 await checkVideosServer1(server.url, videoHttp.uuid, videoMagnet.uuid, videoTorrent.uuid) 243 await checkVideosServer1(server, videoHttp.uuid, videoMagnet.uuid, videoTorrent.uuid)
245 } 244 }
246 }) 245 })
247 246
@@ -273,10 +272,10 @@ Ajouter un sous-titre est vraiment facile`)
273 expect(res.body.total).to.equal(4) 272 expect(res.body.total).to.equal(4)
274 expect(res.body.data).to.have.lengthOf(4) 273 expect(res.body.data).to.have.lengthOf(4)
275 274
276 await checkVideoServer2(server.url, res.body.data[0].uuid) 275 await checkVideoServer2(server, res.body.data[0].uuid)
277 276
278 const [ , videoHttp, videoMagnet, videoTorrent ] = res.body.data 277 const [ , videoHttp, videoMagnet, videoTorrent ] = res.body.data
279 await checkVideosServer1(server.url, videoHttp.uuid, videoMagnet.uuid, videoTorrent.uuid) 278 await checkVideosServer1(server, videoHttp.uuid, videoMagnet.uuid, videoTorrent.uuid)
280 } 279 }
281 }) 280 })
282 281
diff --git a/shared/extra-utils/server/servers.ts b/shared/extra-utils/server/servers.ts
index a4432902f..170360341 100644
--- a/shared/extra-utils/server/servers.ts
+++ b/shared/extra-utils/server/servers.ts
@@ -18,7 +18,7 @@ import { makeGetRequest } from '../requests/requests'
18import { SearchCommand } from '../search' 18import { SearchCommand } from '../search'
19import { SocketIOCommand } from '../socket' 19import { SocketIOCommand } from '../socket'
20import { AccountsCommand, BlocklistCommand, SubscriptionsCommand } from '../users' 20import { AccountsCommand, BlocklistCommand, SubscriptionsCommand } from '../users'
21import { LiveCommand, ServicesCommand, BlacklistCommand } from '../videos' 21import { LiveCommand, ServicesCommand, BlacklistCommand, CaptionsCommand } from '../videos'
22import { ConfigCommand } from './config-command' 22import { ConfigCommand } from './config-command'
23import { ContactFormCommand } from './contact-form-command' 23import { ContactFormCommand } from './contact-form-command'
24import { DebugCommand } from './debug-command' 24import { DebugCommand } from './debug-command'
@@ -103,6 +103,7 @@ interface ServerInfo {
103 liveCommand?: LiveCommand 103 liveCommand?: LiveCommand
104 servicesCommand?: ServicesCommand 104 servicesCommand?: ServicesCommand
105 blacklistCommand?: BlacklistCommand 105 blacklistCommand?: BlacklistCommand
106 captionsCommand?: CaptionsCommand
106} 107}
107 108
108function parallelTests () { 109function parallelTests () {
@@ -331,6 +332,7 @@ async function runServer (server: ServerInfo, configOverrideArg?: any, args = []
331 server.liveCommand = new LiveCommand(server) 332 server.liveCommand = new LiveCommand(server)
332 server.servicesCommand = new ServicesCommand(server) 333 server.servicesCommand = new ServicesCommand(server)
333 server.blacklistCommand = new BlacklistCommand(server) 334 server.blacklistCommand = new BlacklistCommand(server)
335 server.captionsCommand = new CaptionsCommand(server)
334 336
335 res(server) 337 res(server)
336 }) 338 })
diff --git a/shared/extra-utils/videos/captions-command.ts b/shared/extra-utils/videos/captions-command.ts
new file mode 100644
index 000000000..908b6dae6
--- /dev/null
+++ b/shared/extra-utils/videos/captions-command.ts
@@ -0,0 +1,66 @@
1import { ResultList, VideoCaption } from '@shared/models'
2import { HttpStatusCode } from '../../core-utils/miscs/http-error-codes'
3import { buildAbsoluteFixturePath } from '../miscs/miscs'
4import { AbstractCommand, OverrideCommandOptions } from '../shared'
5
6export class CaptionsCommand extends AbstractCommand {
7
8 createVideoCaption (options: OverrideCommandOptions & {
9 videoId: string | number
10 language: string
11 fixture: string
12 mimeType?: string
13 }) {
14 const { videoId, language, fixture, mimeType } = options
15
16 const path = '/api/v1/videos/' + videoId + '/captions/' + language
17
18 const captionfile = buildAbsoluteFixturePath(fixture)
19 const captionfileAttach = mimeType
20 ? [ captionfile, { contentType: mimeType } ]
21 : captionfile
22
23 return this.putUploadRequest({
24 ...options,
25
26 path,
27 fields: {},
28 attaches: {
29 captionfile: captionfileAttach
30 },
31 implicitToken: true,
32 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
33 })
34 }
35
36 listVideoCaptions (options: OverrideCommandOptions & {
37 videoId: string | number
38 }) {
39 const { videoId } = options
40 const path = '/api/v1/videos/' + videoId + '/captions'
41
42 return this.getRequestBody<ResultList<VideoCaption>>({
43 ...options,
44
45 path,
46 implicitToken: false,
47 defaultExpectedStatus: HttpStatusCode.OK_200
48 })
49 }
50
51 deleteVideoCaption (options: OverrideCommandOptions & {
52 videoId: string | number
53 language: string
54 }) {
55 const { videoId, language } = options
56 const path = '/api/v1/videos/' + videoId + '/captions/' + language
57
58 return this.deleteRequest({
59 ...options,
60
61 path,
62 implicitToken: true,
63 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
64 })
65 }
66}
diff --git a/shared/extra-utils/videos/captions.ts b/shared/extra-utils/videos/captions.ts
new file mode 100644
index 000000000..2246bd133
--- /dev/null
+++ b/shared/extra-utils/videos/captions.ts
@@ -0,0 +1,17 @@
1import { expect } from 'chai'
2import * as request from 'supertest'
3import { HttpStatusCode } from '../../core-utils/miscs/http-error-codes'
4
5async function testCaptionFile (url: string, captionPath: string, containsString: string) {
6 const res = await request(url)
7 .get(captionPath)
8 .expect(HttpStatusCode.OK_200)
9
10 expect(res.text).to.contain(containsString)
11}
12
13// ---------------------------------------------------------------------------
14
15export {
16 testCaptionFile
17}
diff --git a/shared/extra-utils/videos/index.ts b/shared/extra-utils/videos/index.ts
index 67f5faf54..03b4756d5 100644
--- a/shared/extra-utils/videos/index.ts
+++ b/shared/extra-utils/videos/index.ts
@@ -1,8 +1,9 @@
1export * from './blacklist-command' 1export * from './blacklist-command'
2export * from './captions'
3export * from './captions-command'
2export * from './live-command' 4export * from './live-command'
3export * from './live' 5export * from './live'
4export * from './services-command' 6export * from './services-command'
5export * from './video-captions'
6export * from './video-change-ownership' 7export * from './video-change-ownership'
7export * from './video-channels' 8export * from './video-channels'
8export * from './video-comments' 9export * from './video-comments'
diff --git a/shared/extra-utils/videos/video-captions.ts b/shared/extra-utils/videos/video-captions.ts
deleted file mode 100644
index 62eec7b90..000000000
--- a/shared/extra-utils/videos/video-captions.ts
+++ /dev/null
@@ -1,72 +0,0 @@
1import { makeDeleteRequest, makeGetRequest, makeUploadRequest } from '../requests/requests'
2import * as request from 'supertest'
3import * as chai from 'chai'
4import { buildAbsoluteFixturePath } from '../miscs/miscs'
5import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
6
7const expect = chai.expect
8
9function createVideoCaption (args: {
10 url: string
11 accessToken: string
12 videoId: string | number
13 language: string
14 fixture: string
15 mimeType?: string
16 statusCodeExpected?: number
17}) {
18 const path = '/api/v1/videos/' + args.videoId + '/captions/' + args.language
19
20 const captionfile = buildAbsoluteFixturePath(args.fixture)
21 const captionfileAttach = args.mimeType ? [ captionfile, { contentType: args.mimeType } ] : captionfile
22
23 return makeUploadRequest({
24 method: 'PUT',
25 url: args.url,
26 path,
27 token: args.accessToken,
28 fields: {},
29 attaches: {
30 captionfile: captionfileAttach
31 },
32 statusCodeExpected: args.statusCodeExpected || HttpStatusCode.NO_CONTENT_204
33 })
34}
35
36function listVideoCaptions (url: string, videoId: string | number) {
37 const path = '/api/v1/videos/' + videoId + '/captions'
38
39 return makeGetRequest({
40 url,
41 path,
42 statusCodeExpected: HttpStatusCode.OK_200
43 })
44}
45
46function deleteVideoCaption (url: string, token: string, videoId: string | number, language: string) {
47 const path = '/api/v1/videos/' + videoId + '/captions/' + language
48
49 return makeDeleteRequest({
50 url,
51 token,
52 path,
53 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
54 })
55}
56
57async function testCaptionFile (url: string, captionPath: string, containsString: string) {
58 const res = await request(url)
59 .get(captionPath)
60 .expect(HttpStatusCode.OK_200)
61
62 expect(res.text).to.contain(containsString)
63}
64
65// ---------------------------------------------------------------------------
66
67export {
68 createVideoCaption,
69 listVideoCaptions,
70 testCaptionFile,
71 deleteVideoCaption
72}