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 & {
28 const path = '/api/v1/video-playlists'
29 const query = pick(options, [ 'start', 'count', 'sort' ])
31 return this.getRequestBody<ResultList<VideoPlaylist>>({
37 defaultExpectedStatus: HttpStatusCode.OK_200
41 listByChannel (options: OverrideCommandOptions & {
47 const path = '/api/v1/video-channels/' + options.handle + '/video-playlists'
48 const query = pick(options, [ 'start', 'count', 'sort' ])
50 return this.getRequestBody<ResultList<VideoPlaylist>>({
56 defaultExpectedStatus: HttpStatusCode.OK_200
60 listByAccount (options: OverrideCommandOptions & {
66 playlistType?: VideoPlaylistType
68 const path = '/api/v1/accounts/' + options.handle + '/video-playlists'
69 const query = pick(options, [ 'start', 'count', 'sort', 'search', 'playlistType' ])
71 return this.getRequestBody<ResultList<VideoPlaylist>>({
77 defaultExpectedStatus: HttpStatusCode.OK_200
81 get (options: OverrideCommandOptions & {
82 playlistId: number | string
84 const { playlistId } = options
85 const path = '/api/v1/video-playlists/' + playlistId
87 return this.getRequestBody<VideoPlaylist>({
92 defaultExpectedStatus: HttpStatusCode.OK_200
96 listVideos (options: OverrideCommandOptions & {
97 playlistId: number | string
100 query?: { nsfw?: BooleanBothQuery }
102 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos'
103 const query = options.query ?? {}
105 return this.getRequestBody<ResultList<VideoPlaylistElement>>({
111 start: options.start,
115 defaultExpectedStatus: HttpStatusCode.OK_200
119 delete (options: OverrideCommandOptions & {
120 playlistId: number | string
122 const path = '/api/v1/video-playlists/' + options.playlistId
124 return this.deleteRequest({
129 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
133 async create (options: OverrideCommandOptions & {
134 attributes: VideoPlaylistCreate
136 const path = '/api/v1/video-playlists'
138 const fields = omit(options.attributes, [ 'thumbnailfile' ])
140 const attaches = options.attributes.thumbnailfile
141 ? { thumbnailfile: options.attributes.thumbnailfile }
144 const body = await unwrapBody<{ videoPlaylist: VideoPlaylistCreateResult }>(this.postUploadRequest({
151 defaultExpectedStatus: HttpStatusCode.OK_200
154 return body.videoPlaylist
157 update (options: OverrideCommandOptions & {
158 attributes: VideoPlaylistUpdate
159 playlistId: number | string
161 const path = '/api/v1/video-playlists/' + options.playlistId
163 const fields = omit(options.attributes, [ 'thumbnailfile' ])
165 const attaches = options.attributes.thumbnailfile
166 ? { thumbnailfile: options.attributes.thumbnailfile }
169 return this.putUploadRequest({
176 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
180 async addElement (options: OverrideCommandOptions & {
181 playlistId: number | string
182 attributes: VideoPlaylistElementCreate | { videoId: string }
185 ...options.attributes,
187 videoId: await this.server.videos.getId({ ...options, uuid: options.attributes.videoId })
190 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos'
192 const body = await unwrapBody<{ videoPlaylistElement: VideoPlaylistElementCreateResult }>(this.postBodyRequest({
198 defaultExpectedStatus: HttpStatusCode.OK_200
201 return body.videoPlaylistElement
204 updateElement (options: OverrideCommandOptions & {
205 playlistId: number | string
206 elementId: number | string
207 attributes: VideoPlaylistElementUpdate
209 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.elementId
211 return this.putBodyRequest({
215 fields: options.attributes,
217 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
221 removeElement (options: OverrideCommandOptions & {
222 playlistId: number | string
225 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.elementId
227 return this.deleteRequest({
232 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
236 reorderElements (options: OverrideCommandOptions & {
237 playlistId: number | string
238 attributes: VideoPlaylistReorder
240 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/reorder'
242 return this.postBodyRequest({
246 fields: options.attributes,
248 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
252 getPrivacies (options: OverrideCommandOptions = {}) {
253 const path = '/api/v1/video-playlists/privacies'
255 return this.getRequestBody<{ [ id: number ]: string }>({
259 implicitToken: false,
260 defaultExpectedStatus: HttpStatusCode.OK_200
264 videosExist (options: OverrideCommandOptions & {
267 const { videoIds } = options
268 const path = '/api/v1/users/me/video-playlists/videos-exist'
270 return this.getRequestBody<VideoExistInPlaylist>({
276 defaultExpectedStatus: HttpStatusCode.OK_200