1 import { omit, pick } from '@shared/core-utils'
9 VideoPlaylistCreateResult,
11 VideoPlaylistElementCreate,
12 VideoPlaylistElementCreateResult,
13 VideoPlaylistElementUpdate,
17 } from '@shared/models'
18 import { unwrapBody } from '../requests'
19 import { AbstractCommand, OverrideCommandOptions } from '../shared'
21 export class PlaylistsCommand extends AbstractCommand {
23 list (options: OverrideCommandOptions & {
27 playlistType?: VideoPlaylistType
29 const path = '/api/v1/video-playlists'
30 const query = pick(options, [ 'start', 'count', 'sort', 'playlistType' ])
32 return this.getRequestBody<ResultList<VideoPlaylist>>({
38 defaultExpectedStatus: HttpStatusCode.OK_200
42 listByChannel (options: OverrideCommandOptions & {
47 playlistType?: VideoPlaylistType
49 const path = '/api/v1/video-channels/' + options.handle + '/video-playlists'
50 const query = pick(options, [ 'start', 'count', 'sort', 'playlistType' ])
52 return this.getRequestBody<ResultList<VideoPlaylist>>({
58 defaultExpectedStatus: HttpStatusCode.OK_200
62 listByAccount (options: OverrideCommandOptions & {
68 playlistType?: VideoPlaylistType
70 const path = '/api/v1/accounts/' + options.handle + '/video-playlists'
71 const query = pick(options, [ 'start', 'count', 'sort', 'search', 'playlistType' ])
73 return this.getRequestBody<ResultList<VideoPlaylist>>({
79 defaultExpectedStatus: HttpStatusCode.OK_200
83 get (options: OverrideCommandOptions & {
84 playlistId: number | string
86 const { playlistId } = options
87 const path = '/api/v1/video-playlists/' + playlistId
89 return this.getRequestBody<VideoPlaylist>({
94 defaultExpectedStatus: HttpStatusCode.OK_200
98 listVideos (options: OverrideCommandOptions & {
99 playlistId: number | string
102 query?: { nsfw?: BooleanBothQuery }
104 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos'
105 const query = options.query ?? {}
107 return this.getRequestBody<ResultList<VideoPlaylistElement>>({
113 start: options.start,
117 defaultExpectedStatus: HttpStatusCode.OK_200
121 delete (options: OverrideCommandOptions & {
122 playlistId: number | string
124 const path = '/api/v1/video-playlists/' + options.playlistId
126 return this.deleteRequest({
131 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
135 async create (options: OverrideCommandOptions & {
136 attributes: VideoPlaylistCreate
138 const path = '/api/v1/video-playlists'
140 const fields = omit(options.attributes, [ 'thumbnailfile' ])
142 const attaches = options.attributes.thumbnailfile
143 ? { thumbnailfile: options.attributes.thumbnailfile }
146 const body = await unwrapBody<{ videoPlaylist: VideoPlaylistCreateResult }>(this.postUploadRequest({
153 defaultExpectedStatus: HttpStatusCode.OK_200
156 return body.videoPlaylist
159 update (options: OverrideCommandOptions & {
160 attributes: VideoPlaylistUpdate
161 playlistId: number | string
163 const path = '/api/v1/video-playlists/' + options.playlistId
165 const fields = omit(options.attributes, [ 'thumbnailfile' ])
167 const attaches = options.attributes.thumbnailfile
168 ? { thumbnailfile: options.attributes.thumbnailfile }
171 return this.putUploadRequest({
178 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
182 async addElement (options: OverrideCommandOptions & {
183 playlistId: number | string
184 attributes: VideoPlaylistElementCreate | { videoId: string }
187 ...options.attributes,
189 videoId: await this.server.videos.getId({ ...options, uuid: options.attributes.videoId })
192 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos'
194 const body = await unwrapBody<{ videoPlaylistElement: VideoPlaylistElementCreateResult }>(this.postBodyRequest({
200 defaultExpectedStatus: HttpStatusCode.OK_200
203 return body.videoPlaylistElement
206 updateElement (options: OverrideCommandOptions & {
207 playlistId: number | string
208 elementId: number | string
209 attributes: VideoPlaylistElementUpdate
211 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.elementId
213 return this.putBodyRequest({
217 fields: options.attributes,
219 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
223 removeElement (options: OverrideCommandOptions & {
224 playlistId: number | string
227 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.elementId
229 return this.deleteRequest({
234 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
238 reorderElements (options: OverrideCommandOptions & {
239 playlistId: number | string
240 attributes: VideoPlaylistReorder
242 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/reorder'
244 return this.postBodyRequest({
248 fields: options.attributes,
250 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
254 getPrivacies (options: OverrideCommandOptions = {}) {
255 const path = '/api/v1/video-playlists/privacies'
257 return this.getRequestBody<{ [ id: number ]: string }>({
261 implicitToken: false,
262 defaultExpectedStatus: HttpStatusCode.OK_200
266 videosExist (options: OverrideCommandOptions & {
269 const { videoIds } = options
270 const path = '/api/v1/users/me/video-playlists/videos-exist'
272 return this.getRequestBody<VideoExistInPlaylist>({
278 defaultExpectedStatus: HttpStatusCode.OK_200