]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/utils/videos/video-playlists.ts
Add/update/delete/list my playlists
[github/Chocobozzz/PeerTube.git] / shared / utils / videos / video-playlists.ts
CommitLineData
418d092a
C
1import { makeDeleteRequest, makeGetRequest, makePostBodyRequest, makePutBodyRequest, makeUploadRequest } from '../requests/requests'
2import { VideoPlaylistCreate } from '../../models/videos/playlist/video-playlist-create.model'
3import { omit } from 'lodash'
4import { VideoPlaylistUpdate } from '../../models/videos/playlist/video-playlist-update.model'
5import { VideoPlaylistElementCreate } from '../../models/videos/playlist/video-playlist-element-create.model'
6import { VideoPlaylistElementUpdate } from '../../models/videos/playlist/video-playlist-element-update.model'
df0b219d
C
7import { videoUUIDToId } from './videos'
8import { join } from 'path'
9import { root } from '..'
10import { readdir } from 'fs-extra'
11import { expect } from 'chai'
12import { VideoPlaylistType } from '../../models/videos/playlist/video-playlist-type.model'
09209296 13
418d092a
C
14function 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,
df0b219d
C
26 query,
27 statusCodeExpected: 200
28 })
29}
30
31function 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
48function 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
65function 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
418d092a 87 })
09209296
C
88}
89
418d092a
C
90function 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 })
09209296
C
98}
99
df0b219d
C
100function 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
07b1a18a 111function deleteVideoPlaylist (url: string, token: string, playlistId: number | string, statusCodeExpected = 204) {
418d092a
C
112 const path = '/api/v1/video-playlists/' + playlistId
113
114 return makeDeleteRequest({
115 url,
116 path,
117 token,
118 statusCodeExpected
119 })
09209296
C
120}
121
418d092a
C
122function createVideoPlaylist (options: {
123 url: string,
124 token: string,
125 playlistAttrs: VideoPlaylistCreate,
07b1a18a 126 expectedStatus?: number
418d092a
C
127}) {
128 const path = '/api/v1/video-playlists/'
129
130 const fields = omit(options.playlistAttrs, 'thumbnailfile')
4c280004 131
418d092a
C
132 const attaches = options.playlistAttrs.thumbnailfile
133 ? { thumbnailfile: options.playlistAttrs.thumbnailfile }
134 : {}
4c280004 135
418d092a
C
136 return makeUploadRequest({
137 method: 'POST',
138 url: options.url,
139 path,
140 token: options.token,
141 fields,
142 attaches,
07b1a18a 143 statusCodeExpected: options.expectedStatus || 200
418d092a
C
144 })
145}
4c280004 146
418d092a
C
147function updateVideoPlaylist (options: {
148 url: string,
149 token: string,
150 playlistAttrs: VideoPlaylistUpdate,
07b1a18a
C
151 playlistId: number | string,
152 expectedStatus?: number
418d092a 153}) {
07b1a18a 154 const path = '/api/v1/video-playlists/' + options.playlistId
4c280004 155
418d092a 156 const fields = omit(options.playlistAttrs, 'thumbnailfile')
4c280004 157
418d092a
C
158 const attaches = options.playlistAttrs.thumbnailfile
159 ? { thumbnailfile: options.playlistAttrs.thumbnailfile }
160 : {}
4c280004 161
418d092a
C
162 return makeUploadRequest({
163 method: 'PUT',
164 url: options.url,
165 path,
166 token: options.token,
167 fields,
168 attaches,
07b1a18a 169 statusCodeExpected: options.expectedStatus || 204
418d092a
C
170 })
171}
172
df0b219d 173async function addVideoInPlaylist (options: {
418d092a
C
174 url: string,
175 token: string,
176 playlistId: number | string,
df0b219d 177 elementAttrs: VideoPlaylistElementCreate | { videoId: string }
07b1a18a 178 expectedStatus?: number
418d092a 179}) {
df0b219d
C
180 options.elementAttrs.videoId = await videoUUIDToId(options.url, options.elementAttrs.videoId)
181
418d092a
C
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,
07b1a18a 189 statusCodeExpected: options.expectedStatus || 200
418d092a
C
190 })
191}
192
193function updateVideoPlaylistElement (options: {
194 url: string,
195 token: string,
196 playlistId: number | string,
197 videoId: number | string,
198 elementAttrs: VideoPlaylistElementUpdate,
07b1a18a 199 expectedStatus?: number
418d092a
C
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,
07b1a18a 208 statusCodeExpected: options.expectedStatus || 204
418d092a
C
209 })
210}
211
212function removeVideoFromPlaylist (options: {
213 url: string,
214 token: string,
215 playlistId: number | string,
216 videoId: number | string,
df0b219d 217 expectedStatus?: number
418d092a
C
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,
07b1a18a 225 statusCodeExpected: options.expectedStatus || 204
418d092a
C
226 })
227}
228
229function reorderVideosPlaylist (options: {
230 url: string,
231 token: string,
232 playlistId: number | string,
233 elementAttrs: {
234 startPosition: number,
07b1a18a 235 insertAfterPosition: number,
418d092a
C
236 reorderLength?: number
237 },
df0b219d 238 expectedStatus?: number
418d092a 239}) {
07b1a18a 240 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/reorder'
418d092a 241
07b1a18a 242 return makePostBodyRequest({
418d092a
C
243 url: options.url,
244 path,
245 token: options.token,
246 fields: options.elementAttrs,
df0b219d 247 statusCodeExpected: options.expectedStatus || 204
418d092a 248 })
4c280004
C
249}
250
df0b219d
C
251async 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
830b4faf
C
268function 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
09209296
C
278// ---------------------------------------------------------------------------
279
280export {
830b4faf
C
281 getVideoPlaylistPrivacies,
282
418d092a 283 getVideoPlaylistsList,
df0b219d
C
284 getVideoChannelPlaylistsList,
285 getAccountPlaylistsList,
286 getAccountPlaylistsListWithToken,
287
418d092a 288 getVideoPlaylist,
df0b219d 289 getVideoPlaylistWithToken,
418d092a
C
290
291 createVideoPlaylist,
292 updateVideoPlaylist,
293 deleteVideoPlaylist,
294
295 addVideoInPlaylist,
07b1a18a 296 updateVideoPlaylistElement,
418d092a
C
297 removeVideoFromPlaylist,
298
df0b219d
C
299 reorderVideosPlaylist,
300
301 checkPlaylistFilesWereRemoved
09209296 302}