]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - shared/utils/videos/video-playlists.ts
b84b21623521cdea912a98722a03b18e79f95aef
[github/Chocobozzz/PeerTube.git] / shared / utils / videos / video-playlists.ts
1 import { makeDeleteRequest, makeGetRequest, makePostBodyRequest, makePutBodyRequest, makeUploadRequest } from '../requests/requests'
2 import { VideoPlaylistCreate } from '../../models/videos/playlist/video-playlist-create.model'
3 import { omit } from 'lodash'
4 import { VideoPlaylistUpdate } from '../../models/videos/playlist/video-playlist-update.model'
5 import { VideoPlaylistElementCreate } from '../../models/videos/playlist/video-playlist-element-create.model'
6 import { VideoPlaylistElementUpdate } from '../../models/videos/playlist/video-playlist-element-update.model'
7 import { videoUUIDToId } from './videos'
8 import { join } from 'path'
9 import { root } from '..'
10 import { readdir } from 'fs-extra'
11 import { expect } from 'chai'
12 import { VideoPlaylistType } from '../../models/videos/playlist/video-playlist-type.model'
13
14 function getVideoPlaylistsList (url: string, start: number, count: number, sort?: string) {
15 const path = '/api/v1/video-playlists'
16
17 const query = {
18 start,
19 count,
20 sort
21 }
22
23 return makeGetRequest({
24 url,
25 path,
26 query,
27 statusCodeExpected: 200
28 })
29 }
30
31 function getVideoChannelPlaylistsList (url: string, videoChannelName: string, start: number, count: number, sort?: string) {
32 const path = '/api/v1/video-channels/' + videoChannelName + '/video-playlists'
33
34 const query = {
35 start,
36 count,
37 sort
38 }
39
40 return makeGetRequest({
41 url,
42 path,
43 query,
44 statusCodeExpected: 200
45 })
46 }
47
48 function getAccountPlaylistsList (url: string, accountName: string, start: number, count: number, sort?: string) {
49 const path = '/api/v1/accounts/' + accountName + '/video-playlists'
50
51 const query = {
52 start,
53 count,
54 sort
55 }
56
57 return makeGetRequest({
58 url,
59 path,
60 query,
61 statusCodeExpected: 200
62 })
63 }
64
65 function getAccountPlaylistsListWithToken (
66 url: string,
67 token: string,
68 accountName: string,
69 start: number,
70 count: number,
71 playlistType?: VideoPlaylistType
72 ) {
73 const path = '/api/v1/accounts/' + accountName + '/video-playlists'
74
75 const query = {
76 start,
77 count,
78 playlistType
79 }
80
81 return makeGetRequest({
82 url,
83 token,
84 path,
85 query,
86 statusCodeExpected: 200
87 })
88 }
89
90 function getVideoPlaylist (url: string, playlistId: number | string, statusCodeExpected = 200) {
91 const path = '/api/v1/video-playlists/' + playlistId
92
93 return makeGetRequest({
94 url,
95 path,
96 statusCodeExpected
97 })
98 }
99
100 function getVideoPlaylistWithToken (url: string, token: string, playlistId: number | string, statusCodeExpected = 200) {
101 const path = '/api/v1/video-playlists/' + playlistId
102
103 return makeGetRequest({
104 url,
105 token,
106 path,
107 statusCodeExpected
108 })
109 }
110
111 function deleteVideoPlaylist (url: string, token: string, playlistId: number | string, statusCodeExpected = 204) {
112 const path = '/api/v1/video-playlists/' + playlistId
113
114 return makeDeleteRequest({
115 url,
116 path,
117 token,
118 statusCodeExpected
119 })
120 }
121
122 function createVideoPlaylist (options: {
123 url: string,
124 token: string,
125 playlistAttrs: VideoPlaylistCreate,
126 expectedStatus?: number
127 }) {
128 const path = '/api/v1/video-playlists/'
129
130 const fields = omit(options.playlistAttrs, 'thumbnailfile')
131
132 const attaches = options.playlistAttrs.thumbnailfile
133 ? { thumbnailfile: options.playlistAttrs.thumbnailfile }
134 : {}
135
136 return makeUploadRequest({
137 method: 'POST',
138 url: options.url,
139 path,
140 token: options.token,
141 fields,
142 attaches,
143 statusCodeExpected: options.expectedStatus || 200
144 })
145 }
146
147 function updateVideoPlaylist (options: {
148 url: string,
149 token: string,
150 playlistAttrs: VideoPlaylistUpdate,
151 playlistId: number | string,
152 expectedStatus?: number
153 }) {
154 const path = '/api/v1/video-playlists/' + options.playlistId
155
156 const fields = omit(options.playlistAttrs, 'thumbnailfile')
157
158 const attaches = options.playlistAttrs.thumbnailfile
159 ? { thumbnailfile: options.playlistAttrs.thumbnailfile }
160 : {}
161
162 return makeUploadRequest({
163 method: 'PUT',
164 url: options.url,
165 path,
166 token: options.token,
167 fields,
168 attaches,
169 statusCodeExpected: options.expectedStatus || 204
170 })
171 }
172
173 async function addVideoInPlaylist (options: {
174 url: string,
175 token: string,
176 playlistId: number | string,
177 elementAttrs: VideoPlaylistElementCreate | { videoId: string }
178 expectedStatus?: number
179 }) {
180 options.elementAttrs.videoId = await videoUUIDToId(options.url, options.elementAttrs.videoId)
181
182 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos'
183
184 return makePostBodyRequest({
185 url: options.url,
186 path,
187 token: options.token,
188 fields: options.elementAttrs,
189 statusCodeExpected: options.expectedStatus || 200
190 })
191 }
192
193 function updateVideoPlaylistElement (options: {
194 url: string,
195 token: string,
196 playlistId: number | string,
197 videoId: number | string,
198 elementAttrs: VideoPlaylistElementUpdate,
199 expectedStatus?: number
200 }) {
201 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.videoId
202
203 return makePutBodyRequest({
204 url: options.url,
205 path,
206 token: options.token,
207 fields: options.elementAttrs,
208 statusCodeExpected: options.expectedStatus || 204
209 })
210 }
211
212 function removeVideoFromPlaylist (options: {
213 url: string,
214 token: string,
215 playlistId: number | string,
216 videoId: number | string,
217 expectedStatus?: number
218 }) {
219 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.videoId
220
221 return makeDeleteRequest({
222 url: options.url,
223 path,
224 token: options.token,
225 statusCodeExpected: options.expectedStatus || 204
226 })
227 }
228
229 function reorderVideosPlaylist (options: {
230 url: string,
231 token: string,
232 playlistId: number | string,
233 elementAttrs: {
234 startPosition: number,
235 insertAfterPosition: number,
236 reorderLength?: number
237 },
238 expectedStatus?: number
239 }) {
240 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/reorder'
241
242 return makePostBodyRequest({
243 url: options.url,
244 path,
245 token: options.token,
246 fields: options.elementAttrs,
247 statusCodeExpected: options.expectedStatus || 204
248 })
249 }
250
251 async function checkPlaylistFilesWereRemoved (
252 playlistUUID: string,
253 serverNumber: number,
254 directories = [ 'thumbnails' ]
255 ) {
256 const testDirectory = 'test' + serverNumber
257
258 for (const directory of directories) {
259 const directoryPath = join(root(), testDirectory, directory)
260
261 const files = await readdir(directoryPath)
262 for (const file of files) {
263 expect(file).to.not.contain(playlistUUID)
264 }
265 }
266 }
267
268 function getVideoPlaylistPrivacies (url: string) {
269 const path = '/api/v1/video-playlists/privacies'
270
271 return makeGetRequest({
272 url,
273 path,
274 statusCodeExpected: 200
275 })
276 }
277
278 // ---------------------------------------------------------------------------
279
280 export {
281 getVideoPlaylistPrivacies,
282
283 getVideoPlaylistsList,
284 getVideoChannelPlaylistsList,
285 getAccountPlaylistsList,
286 getAccountPlaylistsListWithToken,
287
288 getVideoPlaylist,
289 getVideoPlaylistWithToken,
290
291 createVideoPlaylist,
292 updateVideoPlaylist,
293 deleteVideoPlaylist,
294
295 addVideoInPlaylist,
296 updateVideoPlaylistElement,
297 removeVideoFromPlaylist,
298
299 reorderVideosPlaylist,
300
301 checkPlaylistFilesWereRemoved
302 }