1 import { omit } from 'lodash'
2 import { pick } from '@shared/core-utils'
10 VideoPlaylistCreateResult,
12 VideoPlaylistElementCreate,
13 VideoPlaylistElementCreateResult,
14 VideoPlaylistElementUpdate,
18 } from '@shared/models'
19 import { unwrapBody } from '../requests'
20 import { AbstractCommand, OverrideCommandOptions } from '../shared'
22 export class PlaylistsCommand extends AbstractCommand {
24 list (options: OverrideCommandOptions & {
29 const path = '/api/v1/video-playlists'
30 const query = pick(options, [ 'start', 'count', 'sort' ])
32 return this.getRequestBody<ResultList<VideoPlaylist>>({
38 defaultExpectedStatus: HttpStatusCode.OK_200
42 listByChannel (options: OverrideCommandOptions & {
48 const path = '/api/v1/video-channels/' + options.handle + '/video-playlists'
49 const query = pick(options, [ 'start', 'count', 'sort' ])
51 return this.getRequestBody<ResultList<VideoPlaylist>>({
57 defaultExpectedStatus: HttpStatusCode.OK_200
61 listByAccount (options: OverrideCommandOptions & {
67 playlistType?: VideoPlaylistType
69 const path = '/api/v1/accounts/' + options.handle + '/video-playlists'
70 const query = pick(options, [ 'start', 'count', 'sort', 'search', 'playlistType' ])
72 return this.getRequestBody<ResultList<VideoPlaylist>>({
78 defaultExpectedStatus: HttpStatusCode.OK_200
82 get (options: OverrideCommandOptions & {
83 playlistId: number | string
85 const { playlistId } = options
86 const path = '/api/v1/video-playlists/' + playlistId
88 return this.getRequestBody<VideoPlaylist>({
93 defaultExpectedStatus: HttpStatusCode.OK_200
97 listVideos (options: OverrideCommandOptions & {
98 playlistId: number | string
101 query?: { nsfw?: BooleanBothQuery }
103 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos'
104 const query = options.query ?? {}
106 return this.getRequestBody<ResultList<VideoPlaylistElement>>({
112 start: options.start,
116 defaultExpectedStatus: HttpStatusCode.OK_200
120 delete (options: OverrideCommandOptions & {
121 playlistId: number | string
123 const path = '/api/v1/video-playlists/' + options.playlistId
125 return this.deleteRequest({
130 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
134 async create (options: OverrideCommandOptions & {
135 attributes: VideoPlaylistCreate
137 const path = '/api/v1/video-playlists'
139 const fields = omit(options.attributes, 'thumbnailfile')
141 const attaches = options.attributes.thumbnailfile
142 ? { thumbnailfile: options.attributes.thumbnailfile }
145 const body = await unwrapBody<{ videoPlaylist: VideoPlaylistCreateResult }>(this.postUploadRequest({
152 defaultExpectedStatus: HttpStatusCode.OK_200
155 return body.videoPlaylist
158 update (options: OverrideCommandOptions & {
159 attributes: VideoPlaylistUpdate
160 playlistId: number | string
162 const path = '/api/v1/video-playlists/' + options.playlistId
164 const fields = omit(options.attributes, 'thumbnailfile')
166 const attaches = options.attributes.thumbnailfile
167 ? { thumbnailfile: options.attributes.thumbnailfile }
170 return this.putUploadRequest({
177 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
181 async addElement (options: OverrideCommandOptions & {
182 playlistId: number | string
183 attributes: VideoPlaylistElementCreate | { videoId: string }
186 ...options.attributes,
188 videoId: await this.server.videos.getId({ ...options, uuid: options.attributes.videoId })
191 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos'
193 const body = await unwrapBody<{ videoPlaylistElement: VideoPlaylistElementCreateResult }>(this.postBodyRequest({
199 defaultExpectedStatus: HttpStatusCode.OK_200
202 return body.videoPlaylistElement
205 updateElement (options: OverrideCommandOptions & {
206 playlistId: number | string
207 elementId: number | string
208 attributes: VideoPlaylistElementUpdate
210 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.elementId
212 return this.putBodyRequest({
216 fields: options.attributes,
218 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
222 removeElement (options: OverrideCommandOptions & {
223 playlistId: number | string
226 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/' + options.elementId
228 return this.deleteRequest({
233 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
237 reorderElements (options: OverrideCommandOptions & {
238 playlistId: number | string
239 attributes: VideoPlaylistReorder
241 const path = '/api/v1/video-playlists/' + options.playlistId + '/videos/reorder'
243 return this.postBodyRequest({
247 fields: options.attributes,
249 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
253 getPrivacies (options: OverrideCommandOptions = {}) {
254 const path = '/api/v1/video-playlists/privacies'
256 return this.getRequestBody<{ [ id: number ]: string }>({
260 implicitToken: false,
261 defaultExpectedStatus: HttpStatusCode.OK_200
265 videosExist (options: OverrideCommandOptions & {
268 const { videoIds } = options
269 const path = '/api/v1/users/me/video-playlists/videos-exist'
271 return this.getRequestBody<VideoExistInPlaylist>({
277 defaultExpectedStatus: HttpStatusCode.OK_200