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'
14 function getVideoPlaylistsList (url: string, start: number, count: number, sort?: string) {
15 const path = '/api/v1/video-playlists'
23 return makeGetRequest({
27 statusCodeExpected: 200
31 function getVideoChannelPlaylistsList (url: string, videoChannelName: string, start: number, count: number, sort?: string) {
32 const path = '/api/v1/video-channels/' + videoChannelName + '/video-playlists'
40 return makeGetRequest({
44 statusCodeExpected: 200
48 function getAccountPlaylistsList (url: string, accountName: string, start: number, count: number, sort?: string) {
49 const path = '/api/v1/accounts/' + accountName + '/video-playlists'
57 return makeGetRequest({
61 statusCodeExpected: 200
65 function getAccountPlaylistsListWithToken (
71 playlistType?: VideoPlaylistType
73 const path = '/api/v1/accounts/' + accountName + '/video-playlists'
81 return makeGetRequest({
86 statusCodeExpected: 200
90 function getVideoPlaylist (url: string, playlistId: number | string, statusCodeExpected = 200) {
91 const path = '/api/v1/video-playlists/' + playlistId
93 return makeGetRequest({
100 function getVideoPlaylistWithToken (url: string, token: string, playlistId: number | string, statusCodeExpected = 200) {
101 const path = '/api/v1/video-playlists/' + playlistId
103 return makeGetRequest({
111 function deleteVideoPlaylist (url: string, token: string, playlistId: number | string, statusCodeExpected = 204) {
112 const path = '/api/v1/video-playlists/' + playlistId
114 return makeDeleteRequest({
122 function createVideoPlaylist (options: {
125 playlistAttrs: VideoPlaylistCreate,
126 expectedStatus?: number
128 const path = '/api/v1/video-playlists/'
130 const fields = omit(options.playlistAttrs, 'thumbnailfile')
132 const attaches = options.playlistAttrs.thumbnailfile
133 ? { thumbnailfile: options.playlistAttrs.thumbnailfile }
136 return makeUploadRequest({
140 token: options.token,
143 statusCodeExpected: options.expectedStatus || 200
147 function updateVideoPlaylist (options: {
150 playlistAttrs: VideoPlaylistUpdate,
151 playlistId: number | string,
152 expectedStatus?: number
154 const path = '/api/v1/video-playlists/' + options.playlistId
156 const fields = omit(options.playlistAttrs, 'thumbnailfile')
158 const attaches = options.playlistAttrs.thumbnailfile
159 ? { thumbnailfile: options.playlistAttrs.thumbnailfile }
162 return makeUploadRequest({
166 token: options.token,
169 statusCodeExpected: options.expectedStatus || 204
173 async function addVideoInPlaylist (options: {
176 playlistId: number | string,
177 elementAttrs: VideoPlaylistElementCreate | { videoId: string }
178 expectedStatus?: number
180 options.elementAttrs.videoId = await videoUUIDToId(options.url, options.elementAttrs.videoId)
182 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos'
184 return makePostBodyRequest({
187 token: options.token,
188 fields: options.elementAttrs,
189 statusCodeExpected: options.expectedStatus || 200
193 function updateVideoPlaylistElement (options: {
196 playlistId: number | string,
197 videoId: number | string,
198 elementAttrs: VideoPlaylistElementUpdate,
199 expectedStatus?: number
201 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.videoId
203 return makePutBodyRequest({
206 token: options.token,
207 fields: options.elementAttrs,
208 statusCodeExpected: options.expectedStatus || 204
212 function removeVideoFromPlaylist (options: {
215 playlistId: number | string,
216 videoId: number | string,
217 expectedStatus?: number
219 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.videoId
221 return makeDeleteRequest({
224 token: options.token,
225 statusCodeExpected: options.expectedStatus || 204
229 function reorderVideosPlaylist (options: {
232 playlistId: number | string,
234 startPosition: number,
235 insertAfterPosition: number,
236 reorderLength?: number
238 expectedStatus?: number
240 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/reorder'
242 return makePostBodyRequest({
245 token: options.token,
246 fields: options.elementAttrs,
247 statusCodeExpected: options.expectedStatus || 204
251 async function checkPlaylistFilesWereRemoved (
252 playlistUUID: string,
253 serverNumber: number,
254 directories = [ 'thumbnails' ]
256 const testDirectory = 'test' + serverNumber
258 for (const directory of directories) {
259 const directoryPath = join(root(), testDirectory, directory)
261 const files = await readdir(directoryPath)
262 for (const file of files) {
263 expect(file).to.not.contain(playlistUUID)
268 function getVideoPlaylistPrivacies (url: string) {
269 const path = '/api/v1/video-playlists/privacies'
271 return makeGetRequest({
274 statusCodeExpected: 200
278 // ---------------------------------------------------------------------------
281 getVideoPlaylistPrivacies,
283 getVideoPlaylistsList,
284 getVideoChannelPlaylistsList,
285 getAccountPlaylistsList,
286 getAccountPlaylistsListWithToken,
289 getVideoPlaylistWithToken,
296 updateVideoPlaylistElement,
297 removeVideoFromPlaylist,
299 reorderVideosPlaylist,
301 checkPlaylistFilesWereRemoved