diff options
author | Chocobozzz <me@florianbigard.com> | 2021-12-17 09:29:23 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2021-12-17 09:29:23 +0100 |
commit | bf54587a3e2ad9c2c186828f2a5682b91ee2cc00 (patch) | |
tree | 54b40aaf01bae210632473285c3c7571d51e4f89 /shared/server-commands/videos/playlists-command.ts | |
parent | 6b5f72beda96d8b7e4d6329c4001827334de27dd (diff) | |
download | PeerTube-bf54587a3e2ad9c2c186828f2a5682b91ee2cc00.tar.gz PeerTube-bf54587a3e2ad9c2c186828f2a5682b91ee2cc00.tar.zst PeerTube-bf54587a3e2ad9c2c186828f2a5682b91ee2cc00.zip |
shared/ typescript types dir server-commands
Diffstat (limited to 'shared/server-commands/videos/playlists-command.ts')
-rw-r--r-- | shared/server-commands/videos/playlists-command.ts | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/shared/server-commands/videos/playlists-command.ts b/shared/server-commands/videos/playlists-command.ts new file mode 100644 index 000000000..ce23900d3 --- /dev/null +++ b/shared/server-commands/videos/playlists-command.ts | |||
@@ -0,0 +1,280 @@ | |||
1 | import { omit } from 'lodash' | ||
2 | import { pick } from '@shared/core-utils' | ||
3 | import { | ||
4 | BooleanBothQuery, | ||
5 | HttpStatusCode, | ||
6 | ResultList, | ||
7 | VideoExistInPlaylist, | ||
8 | VideoPlaylist, | ||
9 | VideoPlaylistCreate, | ||
10 | VideoPlaylistCreateResult, | ||
11 | VideoPlaylistElement, | ||
12 | VideoPlaylistElementCreate, | ||
13 | VideoPlaylistElementCreateResult, | ||
14 | VideoPlaylistElementUpdate, | ||
15 | VideoPlaylistReorder, | ||
16 | VideoPlaylistType, | ||
17 | VideoPlaylistUpdate | ||
18 | } from '@shared/models' | ||
19 | import { unwrapBody } from '../requests' | ||
20 | import { AbstractCommand, OverrideCommandOptions } from '../shared' | ||
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 this.server.videos.getId({ ...options, uuid: 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 | } | ||