diff options
author | Chocobozzz <me@florianbigard.com> | 2021-07-08 15:54:39 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2021-07-20 15:27:18 +0200 |
commit | e6346d59e63135cf012ed18c102d3b0179ef565f (patch) | |
tree | e65259adb50daa6376c9878abeef051d99191328 /shared | |
parent | 72cbfc5695ec5ebdb9721d3648218f63feeaeac5 (diff) | |
download | PeerTube-e6346d59e63135cf012ed18c102d3b0179ef565f.tar.gz PeerTube-e6346d59e63135cf012ed18c102d3b0179ef565f.tar.zst PeerTube-e6346d59e63135cf012ed18c102d3b0179ef565f.zip |
Introduce playlist command
Diffstat (limited to 'shared')
-rw-r--r-- | shared/extra-utils/server/servers.ts | 4 | ||||
-rw-r--r-- | shared/extra-utils/videos/index.ts | 3 | ||||
-rw-r--r-- | shared/extra-utils/videos/playlists-command.ts | 280 | ||||
-rw-r--r-- | shared/extra-utils/videos/playlists.ts | 25 | ||||
-rw-r--r-- | shared/extra-utils/videos/video-playlists.ts | 320 | ||||
-rw-r--r-- | shared/extra-utils/videos/videos.ts | 23 | ||||
-rw-r--r-- | shared/models/videos/playlist/index.ts | 1 | ||||
-rw-r--r-- | shared/models/videos/playlist/video-playlist-element-create-result.model.ts | 3 |
8 files changed, 314 insertions, 345 deletions
diff --git a/shared/extra-utils/server/servers.ts b/shared/extra-utils/server/servers.ts index 33f558414..78b3be9c7 100644 --- a/shared/extra-utils/server/servers.ts +++ b/shared/extra-utils/server/servers.ts | |||
@@ -18,7 +18,7 @@ import { makeGetRequest } from '../requests/requests' | |||
18 | import { SearchCommand } from '../search' | 18 | import { SearchCommand } from '../search' |
19 | import { SocketIOCommand } from '../socket' | 19 | import { SocketIOCommand } from '../socket' |
20 | import { AccountsCommand, BlocklistCommand, SubscriptionsCommand } from '../users' | 20 | import { AccountsCommand, BlocklistCommand, SubscriptionsCommand } from '../users' |
21 | import { BlacklistCommand, CaptionsCommand, ChangeOwnershipCommand, LiveCommand, ServicesCommand } from '../videos' | 21 | import { BlacklistCommand, CaptionsCommand, ChangeOwnershipCommand, LiveCommand, PlaylistsCommand, ServicesCommand } from '../videos' |
22 | import { ConfigCommand } from './config-command' | 22 | import { ConfigCommand } from './config-command' |
23 | import { ContactFormCommand } from './contact-form-command' | 23 | import { ContactFormCommand } from './contact-form-command' |
24 | import { DebugCommand } from './debug-command' | 24 | import { DebugCommand } from './debug-command' |
@@ -105,6 +105,7 @@ interface ServerInfo { | |||
105 | blacklistCommand?: BlacklistCommand | 105 | blacklistCommand?: BlacklistCommand |
106 | captionsCommand?: CaptionsCommand | 106 | captionsCommand?: CaptionsCommand |
107 | changeOwnershipCommand?: ChangeOwnershipCommand | 107 | changeOwnershipCommand?: ChangeOwnershipCommand |
108 | playlistsCommand?: PlaylistsCommand | ||
108 | } | 109 | } |
109 | 110 | ||
110 | function parallelTests () { | 111 | function parallelTests () { |
@@ -335,6 +336,7 @@ async function runServer (server: ServerInfo, configOverrideArg?: any, args = [] | |||
335 | server.blacklistCommand = new BlacklistCommand(server) | 336 | server.blacklistCommand = new BlacklistCommand(server) |
336 | server.captionsCommand = new CaptionsCommand(server) | 337 | server.captionsCommand = new CaptionsCommand(server) |
337 | server.changeOwnershipCommand = new ChangeOwnershipCommand(server) | 338 | server.changeOwnershipCommand = new ChangeOwnershipCommand(server) |
339 | server.playlistsCommand = new PlaylistsCommand(server) | ||
338 | 340 | ||
339 | res(server) | 341 | res(server) |
340 | }) | 342 | }) |
diff --git a/shared/extra-utils/videos/index.ts b/shared/extra-utils/videos/index.ts index 815c7f944..1f6241d7e 100644 --- a/shared/extra-utils/videos/index.ts +++ b/shared/extra-utils/videos/index.ts | |||
@@ -4,11 +4,12 @@ export * from './captions-command' | |||
4 | export * from './change-ownership-command' | 4 | export * from './change-ownership-command' |
5 | export * from './live-command' | 5 | export * from './live-command' |
6 | export * from './live' | 6 | export * from './live' |
7 | export * from './playlists-command' | ||
8 | export * from './playlists' | ||
7 | export * from './services-command' | 9 | export * from './services-command' |
8 | export * from './video-channels' | 10 | export * from './video-channels' |
9 | export * from './video-comments' | 11 | export * from './video-comments' |
10 | export * from './video-history' | 12 | export * from './video-history' |
11 | export * from './video-imports' | 13 | export * from './video-imports' |
12 | export * from './video-playlists' | ||
13 | export * from './video-streaming-playlists' | 14 | export * from './video-streaming-playlists' |
14 | export * from './videos' | 15 | export * from './videos' |
diff --git a/shared/extra-utils/videos/playlists-command.ts b/shared/extra-utils/videos/playlists-command.ts new file mode 100644 index 000000000..f77decc1a --- /dev/null +++ b/shared/extra-utils/videos/playlists-command.ts | |||
@@ -0,0 +1,280 @@ | |||
1 | import { omit, pick } from 'lodash' | ||
2 | import { | ||
3 | BooleanBothQuery, | ||
4 | ResultList, | ||
5 | VideoExistInPlaylist, | ||
6 | VideoPlaylist, | ||
7 | VideoPlaylistCreateResult, | ||
8 | VideoPlaylistElement, | ||
9 | VideoPlaylistElementCreateResult, | ||
10 | VideoPlaylistReorder | ||
11 | } from '@shared/models' | ||
12 | import { HttpStatusCode } from '../../core-utils/miscs/http-error-codes' | ||
13 | import { VideoPlaylistCreate } from '../../models/videos/playlist/video-playlist-create.model' | ||
14 | import { VideoPlaylistElementCreate } from '../../models/videos/playlist/video-playlist-element-create.model' | ||
15 | import { VideoPlaylistElementUpdate } from '../../models/videos/playlist/video-playlist-element-update.model' | ||
16 | import { VideoPlaylistType } from '../../models/videos/playlist/video-playlist-type.model' | ||
17 | import { VideoPlaylistUpdate } from '../../models/videos/playlist/video-playlist-update.model' | ||
18 | import { unwrapBody } from '../requests' | ||
19 | import { AbstractCommand, OverrideCommandOptions } from '../shared' | ||
20 | import { videoUUIDToId } from './videos' | ||
21 | |||
22 | export class PlaylistsCommand extends AbstractCommand { | ||
23 | |||
24 | list (options: OverrideCommandOptions & { | ||
25 | start?: number | ||
26 | count?: number | ||
27 | sort?: string | ||
28 | }) { | ||
29 | const path = '/api/v1/video-playlists' | ||
30 | const query = pick(options, [ 'start', 'count', 'sort' ]) | ||
31 | |||
32 | return this.getRequestBody<ResultList<VideoPlaylist>>({ | ||
33 | ...options, | ||
34 | |||
35 | path, | ||
36 | query, | ||
37 | implicitToken: false, | ||
38 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
39 | }) | ||
40 | } | ||
41 | |||
42 | listByChannel (options: OverrideCommandOptions & { | ||
43 | handle: string | ||
44 | start?: number | ||
45 | count?: number | ||
46 | sort?: string | ||
47 | }) { | ||
48 | const path = '/api/v1/video-channels/' + options.handle + '/video-playlists' | ||
49 | const query = pick(options, [ 'start', 'count', 'sort' ]) | ||
50 | |||
51 | return this.getRequestBody<ResultList<VideoPlaylist>>({ | ||
52 | ...options, | ||
53 | |||
54 | path, | ||
55 | query, | ||
56 | implicitToken: false, | ||
57 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
58 | }) | ||
59 | } | ||
60 | |||
61 | listByAccount (options: OverrideCommandOptions & { | ||
62 | handle: string | ||
63 | start?: number | ||
64 | count?: number | ||
65 | sort?: string | ||
66 | search?: string | ||
67 | playlistType?: VideoPlaylistType | ||
68 | }) { | ||
69 | const path = '/api/v1/accounts/' + options.handle + '/video-playlists' | ||
70 | const query = pick(options, [ 'start', 'count', 'sort', 'search', 'playlistType' ]) | ||
71 | |||
72 | return this.getRequestBody<ResultList<VideoPlaylist>>({ | ||
73 | ...options, | ||
74 | |||
75 | path, | ||
76 | query, | ||
77 | implicitToken: false, | ||
78 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
79 | }) | ||
80 | } | ||
81 | |||
82 | get (options: OverrideCommandOptions & { | ||
83 | playlistId: number | string | ||
84 | }) { | ||
85 | const { playlistId } = options | ||
86 | const path = '/api/v1/video-playlists/' + playlistId | ||
87 | |||
88 | return this.getRequestBody<VideoPlaylist>({ | ||
89 | ...options, | ||
90 | |||
91 | path, | ||
92 | implicitToken: false, | ||
93 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
94 | }) | ||
95 | } | ||
96 | |||
97 | listVideos (options: OverrideCommandOptions & { | ||
98 | playlistId: number | string | ||
99 | start?: number | ||
100 | count?: number | ||
101 | query?: { nsfw?: BooleanBothQuery } | ||
102 | }) { | ||
103 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos' | ||
104 | const query = options.query ?? {} | ||
105 | |||
106 | return this.getRequestBody<ResultList<VideoPlaylistElement>>({ | ||
107 | ...options, | ||
108 | |||
109 | path, | ||
110 | query: { | ||
111 | ...query, | ||
112 | start: options.start, | ||
113 | count: options.count | ||
114 | }, | ||
115 | implicitToken: true, | ||
116 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
117 | }) | ||
118 | } | ||
119 | |||
120 | delete (options: OverrideCommandOptions & { | ||
121 | playlistId: number | string | ||
122 | }) { | ||
123 | const path = '/api/v1/video-playlists/' + options.playlistId | ||
124 | |||
125 | return this.deleteRequest({ | ||
126 | ...options, | ||
127 | |||
128 | path, | ||
129 | implicitToken: true, | ||
130 | defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
131 | }) | ||
132 | } | ||
133 | |||
134 | async create (options: OverrideCommandOptions & { | ||
135 | attributes: VideoPlaylistCreate | ||
136 | }) { | ||
137 | const path = '/api/v1/video-playlists' | ||
138 | |||
139 | const fields = omit(options.attributes, 'thumbnailfile') | ||
140 | |||
141 | const attaches = options.attributes.thumbnailfile | ||
142 | ? { thumbnailfile: options.attributes.thumbnailfile } | ||
143 | : {} | ||
144 | |||
145 | const body = await unwrapBody<{ videoPlaylist: VideoPlaylistCreateResult }>(this.postUploadRequest({ | ||
146 | ...options, | ||
147 | |||
148 | path, | ||
149 | fields, | ||
150 | attaches, | ||
151 | implicitToken: true, | ||
152 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
153 | })) | ||
154 | |||
155 | return body.videoPlaylist | ||
156 | } | ||
157 | |||
158 | update (options: OverrideCommandOptions & { | ||
159 | attributes: VideoPlaylistUpdate | ||
160 | playlistId: number | string | ||
161 | }) { | ||
162 | const path = '/api/v1/video-playlists/' + options.playlistId | ||
163 | |||
164 | const fields = omit(options.attributes, 'thumbnailfile') | ||
165 | |||
166 | const attaches = options.attributes.thumbnailfile | ||
167 | ? { thumbnailfile: options.attributes.thumbnailfile } | ||
168 | : {} | ||
169 | |||
170 | return this.putUploadRequest({ | ||
171 | ...options, | ||
172 | |||
173 | path, | ||
174 | fields, | ||
175 | attaches, | ||
176 | implicitToken: true, | ||
177 | defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
178 | }) | ||
179 | } | ||
180 | |||
181 | async addElement (options: OverrideCommandOptions & { | ||
182 | playlistId: number | string | ||
183 | attributes: VideoPlaylistElementCreate | { videoId: string } | ||
184 | }) { | ||
185 | const attributes = { | ||
186 | ...options.attributes, | ||
187 | |||
188 | videoId: await videoUUIDToId(this.server.url, options.attributes.videoId) | ||
189 | } | ||
190 | |||
191 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos' | ||
192 | |||
193 | const body = await unwrapBody<{ videoPlaylistElement: VideoPlaylistElementCreateResult }>(this.postBodyRequest({ | ||
194 | ...options, | ||
195 | |||
196 | path, | ||
197 | fields: attributes, | ||
198 | implicitToken: true, | ||
199 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
200 | })) | ||
201 | |||
202 | return body.videoPlaylistElement | ||
203 | } | ||
204 | |||
205 | updateElement (options: OverrideCommandOptions & { | ||
206 | playlistId: number | string | ||
207 | elementId: number | string | ||
208 | attributes: VideoPlaylistElementUpdate | ||
209 | }) { | ||
210 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.elementId | ||
211 | |||
212 | return this.putBodyRequest({ | ||
213 | ...options, | ||
214 | |||
215 | path, | ||
216 | fields: options.attributes, | ||
217 | implicitToken: true, | ||
218 | defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
219 | }) | ||
220 | } | ||
221 | |||
222 | removeElement (options: OverrideCommandOptions & { | ||
223 | playlistId: number | string | ||
224 | elementId: number | ||
225 | }) { | ||
226 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.elementId | ||
227 | |||
228 | return this.deleteRequest({ | ||
229 | ...options, | ||
230 | |||
231 | path, | ||
232 | implicitToken: true, | ||
233 | defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
234 | }) | ||
235 | } | ||
236 | |||
237 | reorderElements (options: OverrideCommandOptions & { | ||
238 | playlistId: number | string | ||
239 | attributes: VideoPlaylistReorder | ||
240 | }) { | ||
241 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/reorder' | ||
242 | |||
243 | return this.postBodyRequest({ | ||
244 | ...options, | ||
245 | |||
246 | path, | ||
247 | fields: options.attributes, | ||
248 | implicitToken: true, | ||
249 | defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
250 | }) | ||
251 | } | ||
252 | |||
253 | getPrivacies (options: OverrideCommandOptions = {}) { | ||
254 | const path = '/api/v1/video-playlists/privacies' | ||
255 | |||
256 | return this.getRequestBody<{ [ id: number ]: string }>({ | ||
257 | ...options, | ||
258 | |||
259 | path, | ||
260 | implicitToken: false, | ||
261 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
262 | }) | ||
263 | } | ||
264 | |||
265 | videosExist (options: OverrideCommandOptions & { | ||
266 | videoIds: number[] | ||
267 | }) { | ||
268 | const { videoIds } = options | ||
269 | const path = '/api/v1/users/me/video-playlists/videos-exist' | ||
270 | |||
271 | return this.getRequestBody<VideoExistInPlaylist>({ | ||
272 | ...options, | ||
273 | |||
274 | path, | ||
275 | query: { videoIds }, | ||
276 | implicitToken: true, | ||
277 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
278 | }) | ||
279 | } | ||
280 | } | ||
diff --git a/shared/extra-utils/videos/playlists.ts b/shared/extra-utils/videos/playlists.ts new file mode 100644 index 000000000..023333c87 --- /dev/null +++ b/shared/extra-utils/videos/playlists.ts | |||
@@ -0,0 +1,25 @@ | |||
1 | import { expect } from 'chai' | ||
2 | import { readdir } from 'fs-extra' | ||
3 | import { join } from 'path' | ||
4 | import { root } from '../' | ||
5 | |||
6 | async function checkPlaylistFilesWereRemoved ( | ||
7 | playlistUUID: string, | ||
8 | internalServerNumber: number, | ||
9 | directories = [ 'thumbnails' ] | ||
10 | ) { | ||
11 | const testDirectory = 'test' + internalServerNumber | ||
12 | |||
13 | for (const directory of directories) { | ||
14 | const directoryPath = join(root(), testDirectory, directory) | ||
15 | |||
16 | const files = await readdir(directoryPath) | ||
17 | for (const file of files) { | ||
18 | expect(file).to.not.contain(playlistUUID) | ||
19 | } | ||
20 | } | ||
21 | } | ||
22 | |||
23 | export { | ||
24 | checkPlaylistFilesWereRemoved | ||
25 | } | ||
diff --git a/shared/extra-utils/videos/video-playlists.ts b/shared/extra-utils/videos/video-playlists.ts deleted file mode 100644 index c6f799e5d..000000000 --- a/shared/extra-utils/videos/video-playlists.ts +++ /dev/null | |||
@@ -1,320 +0,0 @@ | |||
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 | import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes' | ||
14 | |||
15 | function getVideoPlaylistsList (url: string, start: number, count: number, sort?: string) { | ||
16 | const path = '/api/v1/video-playlists' | ||
17 | |||
18 | const query = { | ||
19 | start, | ||
20 | count, | ||
21 | sort | ||
22 | } | ||
23 | |||
24 | return makeGetRequest({ | ||
25 | url, | ||
26 | path, | ||
27 | query, | ||
28 | statusCodeExpected: HttpStatusCode.OK_200 | ||
29 | }) | ||
30 | } | ||
31 | |||
32 | function getVideoChannelPlaylistsList (url: string, videoChannelName: string, start: number, count: number, sort?: string) { | ||
33 | const path = '/api/v1/video-channels/' + videoChannelName + '/video-playlists' | ||
34 | |||
35 | const query = { | ||
36 | start, | ||
37 | count, | ||
38 | sort | ||
39 | } | ||
40 | |||
41 | return makeGetRequest({ | ||
42 | url, | ||
43 | path, | ||
44 | query, | ||
45 | statusCodeExpected: HttpStatusCode.OK_200 | ||
46 | }) | ||
47 | } | ||
48 | |||
49 | function getAccountPlaylistsList (url: string, accountName: string, start: number, count: number, sort?: string, search?: string) { | ||
50 | const path = '/api/v1/accounts/' + accountName + '/video-playlists' | ||
51 | |||
52 | const query = { | ||
53 | start, | ||
54 | count, | ||
55 | sort, | ||
56 | search | ||
57 | } | ||
58 | |||
59 | return makeGetRequest({ | ||
60 | url, | ||
61 | path, | ||
62 | query, | ||
63 | statusCodeExpected: HttpStatusCode.OK_200 | ||
64 | }) | ||
65 | } | ||
66 | |||
67 | function getAccountPlaylistsListWithToken ( | ||
68 | url: string, | ||
69 | token: string, | ||
70 | accountName: string, | ||
71 | start: number, | ||
72 | count: number, | ||
73 | playlistType?: VideoPlaylistType, | ||
74 | sort?: string | ||
75 | ) { | ||
76 | const path = '/api/v1/accounts/' + accountName + '/video-playlists' | ||
77 | |||
78 | const query = { | ||
79 | start, | ||
80 | count, | ||
81 | playlistType, | ||
82 | sort | ||
83 | } | ||
84 | |||
85 | return makeGetRequest({ | ||
86 | url, | ||
87 | token, | ||
88 | path, | ||
89 | query, | ||
90 | statusCodeExpected: HttpStatusCode.OK_200 | ||
91 | }) | ||
92 | } | ||
93 | |||
94 | function getVideoPlaylist (url: string, playlistId: number | string, statusCodeExpected = HttpStatusCode.OK_200) { | ||
95 | const path = '/api/v1/video-playlists/' + playlistId | ||
96 | |||
97 | return makeGetRequest({ | ||
98 | url, | ||
99 | path, | ||
100 | statusCodeExpected | ||
101 | }) | ||
102 | } | ||
103 | |||
104 | function getVideoPlaylistWithToken (url: string, token: string, playlistId: number | string, statusCodeExpected = HttpStatusCode.OK_200) { | ||
105 | const path = '/api/v1/video-playlists/' + playlistId | ||
106 | |||
107 | return makeGetRequest({ | ||
108 | url, | ||
109 | token, | ||
110 | path, | ||
111 | statusCodeExpected | ||
112 | }) | ||
113 | } | ||
114 | |||
115 | function deleteVideoPlaylist (url: string, token: string, playlistId: number | string, statusCodeExpected = HttpStatusCode.NO_CONTENT_204) { | ||
116 | const path = '/api/v1/video-playlists/' + playlistId | ||
117 | |||
118 | return makeDeleteRequest({ | ||
119 | url, | ||
120 | path, | ||
121 | token, | ||
122 | statusCodeExpected | ||
123 | }) | ||
124 | } | ||
125 | |||
126 | function createVideoPlaylist (options: { | ||
127 | url: string | ||
128 | token: string | ||
129 | playlistAttrs: VideoPlaylistCreate | ||
130 | expectedStatus?: number | ||
131 | }) { | ||
132 | const path = '/api/v1/video-playlists' | ||
133 | |||
134 | const fields = omit(options.playlistAttrs, 'thumbnailfile') | ||
135 | |||
136 | const attaches = options.playlistAttrs.thumbnailfile | ||
137 | ? { thumbnailfile: options.playlistAttrs.thumbnailfile } | ||
138 | : {} | ||
139 | |||
140 | return makeUploadRequest({ | ||
141 | method: 'POST', | ||
142 | url: options.url, | ||
143 | path, | ||
144 | token: options.token, | ||
145 | fields, | ||
146 | attaches, | ||
147 | statusCodeExpected: options.expectedStatus || HttpStatusCode.OK_200 | ||
148 | }) | ||
149 | } | ||
150 | |||
151 | function updateVideoPlaylist (options: { | ||
152 | url: string | ||
153 | token: string | ||
154 | playlistAttrs: VideoPlaylistUpdate | ||
155 | playlistId: number | string | ||
156 | expectedStatus?: number | ||
157 | }) { | ||
158 | const path = '/api/v1/video-playlists/' + options.playlistId | ||
159 | |||
160 | const fields = omit(options.playlistAttrs, 'thumbnailfile') | ||
161 | |||
162 | const attaches = options.playlistAttrs.thumbnailfile | ||
163 | ? { thumbnailfile: options.playlistAttrs.thumbnailfile } | ||
164 | : {} | ||
165 | |||
166 | return makeUploadRequest({ | ||
167 | method: 'PUT', | ||
168 | url: options.url, | ||
169 | path, | ||
170 | token: options.token, | ||
171 | fields, | ||
172 | attaches, | ||
173 | statusCodeExpected: options.expectedStatus || HttpStatusCode.NO_CONTENT_204 | ||
174 | }) | ||
175 | } | ||
176 | |||
177 | async function addVideoInPlaylist (options: { | ||
178 | url: string | ||
179 | token: string | ||
180 | playlistId: number | string | ||
181 | elementAttrs: VideoPlaylistElementCreate | { videoId: string } | ||
182 | expectedStatus?: number | ||
183 | }) { | ||
184 | options.elementAttrs.videoId = await videoUUIDToId(options.url, options.elementAttrs.videoId) | ||
185 | |||
186 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos' | ||
187 | |||
188 | return makePostBodyRequest({ | ||
189 | url: options.url, | ||
190 | path, | ||
191 | token: options.token, | ||
192 | fields: options.elementAttrs, | ||
193 | statusCodeExpected: options.expectedStatus || HttpStatusCode.OK_200 | ||
194 | }) | ||
195 | } | ||
196 | |||
197 | function updateVideoPlaylistElement (options: { | ||
198 | url: string | ||
199 | token: string | ||
200 | playlistId: number | string | ||
201 | playlistElementId: number | string | ||
202 | elementAttrs: VideoPlaylistElementUpdate | ||
203 | expectedStatus?: number | ||
204 | }) { | ||
205 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.playlistElementId | ||
206 | |||
207 | return makePutBodyRequest({ | ||
208 | url: options.url, | ||
209 | path, | ||
210 | token: options.token, | ||
211 | fields: options.elementAttrs, | ||
212 | statusCodeExpected: options.expectedStatus || HttpStatusCode.NO_CONTENT_204 | ||
213 | }) | ||
214 | } | ||
215 | |||
216 | function removeVideoFromPlaylist (options: { | ||
217 | url: string | ||
218 | token: string | ||
219 | playlistId: number | string | ||
220 | playlistElementId: number | ||
221 | expectedStatus?: number | ||
222 | }) { | ||
223 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.playlistElementId | ||
224 | |||
225 | return makeDeleteRequest({ | ||
226 | url: options.url, | ||
227 | path, | ||
228 | token: options.token, | ||
229 | statusCodeExpected: options.expectedStatus || HttpStatusCode.NO_CONTENT_204 | ||
230 | }) | ||
231 | } | ||
232 | |||
233 | function reorderVideosPlaylist (options: { | ||
234 | url: string | ||
235 | token: string | ||
236 | playlistId: number | string | ||
237 | elementAttrs: { | ||
238 | startPosition: number | ||
239 | insertAfterPosition: number | ||
240 | reorderLength?: number | ||
241 | } | ||
242 | expectedStatus?: number | ||
243 | }) { | ||
244 | const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/reorder' | ||
245 | |||
246 | return makePostBodyRequest({ | ||
247 | url: options.url, | ||
248 | path, | ||
249 | token: options.token, | ||
250 | fields: options.elementAttrs, | ||
251 | statusCodeExpected: options.expectedStatus || HttpStatusCode.NO_CONTENT_204 | ||
252 | }) | ||
253 | } | ||
254 | |||
255 | async function checkPlaylistFilesWereRemoved ( | ||
256 | playlistUUID: string, | ||
257 | internalServerNumber: number, | ||
258 | directories = [ 'thumbnails' ] | ||
259 | ) { | ||
260 | const testDirectory = 'test' + internalServerNumber | ||
261 | |||
262 | for (const directory of directories) { | ||
263 | const directoryPath = join(root(), testDirectory, directory) | ||
264 | |||
265 | const files = await readdir(directoryPath) | ||
266 | for (const file of files) { | ||
267 | expect(file).to.not.contain(playlistUUID) | ||
268 | } | ||
269 | } | ||
270 | } | ||
271 | |||
272 | function getVideoPlaylistPrivacies (url: string) { | ||
273 | const path = '/api/v1/video-playlists/privacies' | ||
274 | |||
275 | return makeGetRequest({ | ||
276 | url, | ||
277 | path, | ||
278 | statusCodeExpected: HttpStatusCode.OK_200 | ||
279 | }) | ||
280 | } | ||
281 | |||
282 | function doVideosExistInMyPlaylist (url: string, token: string, videoIds: number[]) { | ||
283 | const path = '/api/v1/users/me/video-playlists/videos-exist' | ||
284 | |||
285 | return makeGetRequest({ | ||
286 | url, | ||
287 | token, | ||
288 | path, | ||
289 | query: { videoIds }, | ||
290 | statusCodeExpected: HttpStatusCode.OK_200 | ||
291 | }) | ||
292 | } | ||
293 | |||
294 | // --------------------------------------------------------------------------- | ||
295 | |||
296 | export { | ||
297 | getVideoPlaylistPrivacies, | ||
298 | |||
299 | getVideoPlaylistsList, | ||
300 | getVideoChannelPlaylistsList, | ||
301 | getAccountPlaylistsList, | ||
302 | getAccountPlaylistsListWithToken, | ||
303 | |||
304 | getVideoPlaylist, | ||
305 | getVideoPlaylistWithToken, | ||
306 | |||
307 | createVideoPlaylist, | ||
308 | updateVideoPlaylist, | ||
309 | deleteVideoPlaylist, | ||
310 | |||
311 | addVideoInPlaylist, | ||
312 | updateVideoPlaylistElement, | ||
313 | removeVideoFromPlaylist, | ||
314 | |||
315 | reorderVideosPlaylist, | ||
316 | |||
317 | checkPlaylistFilesWereRemoved, | ||
318 | |||
319 | doVideosExistInMyPlaylist | ||
320 | } | ||
diff --git a/shared/extra-utils/videos/videos.ts b/shared/extra-utils/videos/videos.ts index a45c0402a..920c93072 100644 --- a/shared/extra-utils/videos/videos.ts +++ b/shared/extra-utils/videos/videos.ts | |||
@@ -262,28 +262,6 @@ function getVideoChannelVideos ( | |||
262 | }) | 262 | }) |
263 | } | 263 | } |
264 | 264 | ||
265 | function getPlaylistVideos ( | ||
266 | url: string, | ||
267 | accessToken: string, | ||
268 | playlistId: number | string, | ||
269 | start: number, | ||
270 | count: number, | ||
271 | query: { nsfw?: boolean } = {} | ||
272 | ) { | ||
273 | const path = '/api/v1/video-playlists/' + playlistId + '/videos' | ||
274 | |||
275 | return makeGetRequest({ | ||
276 | url, | ||
277 | path, | ||
278 | query: immutableAssign(query, { | ||
279 | start, | ||
280 | count | ||
281 | }), | ||
282 | token: accessToken, | ||
283 | statusCodeExpected: HttpStatusCode.OK_200 | ||
284 | }) | ||
285 | } | ||
286 | |||
287 | function getVideosListPagination (url: string, start: number, count: number, sort?: string, skipCount?: boolean) { | 265 | function getVideosListPagination (url: string, start: number, count: number, sort?: string, skipCount?: boolean) { |
288 | const path = '/api/v1/videos' | 266 | const path = '/api/v1/videos' |
289 | 267 | ||
@@ -871,7 +849,6 @@ export { | |||
871 | getLocalVideos, | 849 | getLocalVideos, |
872 | completeVideoCheck, | 850 | completeVideoCheck, |
873 | checkVideoFilesWereRemoved, | 851 | checkVideoFilesWereRemoved, |
874 | getPlaylistVideos, | ||
875 | getMyVideosWithFilter, | 852 | getMyVideosWithFilter, |
876 | uploadVideoAndGetId, | 853 | uploadVideoAndGetId, |
877 | getLocalIdByUUID, | 854 | getLocalIdByUUID, |
diff --git a/shared/models/videos/playlist/index.ts b/shared/models/videos/playlist/index.ts index f11a4bd28..a9e8ce496 100644 --- a/shared/models/videos/playlist/index.ts +++ b/shared/models/videos/playlist/index.ts | |||
@@ -1,6 +1,7 @@ | |||
1 | export * from './video-exist-in-playlist.model' | 1 | export * from './video-exist-in-playlist.model' |
2 | export * from './video-playlist-create-result.model' | 2 | export * from './video-playlist-create-result.model' |
3 | export * from './video-playlist-create.model' | 3 | export * from './video-playlist-create.model' |
4 | export * from './video-playlist-element-create-result.model' | ||
4 | export * from './video-playlist-element-create.model' | 5 | export * from './video-playlist-element-create.model' |
5 | export * from './video-playlist-element-update.model' | 6 | export * from './video-playlist-element-update.model' |
6 | export * from './video-playlist-element.model' | 7 | export * from './video-playlist-element.model' |
diff --git a/shared/models/videos/playlist/video-playlist-element-create-result.model.ts b/shared/models/videos/playlist/video-playlist-element-create-result.model.ts new file mode 100644 index 000000000..dc475e7d8 --- /dev/null +++ b/shared/models/videos/playlist/video-playlist-element-create-result.model.ts | |||
@@ -0,0 +1,3 @@ | |||
1 | export interface VideoPlaylistElementCreateResult { | ||
2 | id: number | ||
3 | } | ||