import { expect } from 'chai'
import { createReadStream, stat } from 'fs-extra'
import got, { Response as GotResponse } from 'got'
-import { omit, pick } from 'lodash'
+import { omit } from 'lodash'
import validator from 'validator'
import { buildUUID } from '@server/helpers/uuid'
import { loadLanguages } from '@server/initializers/constants'
+import { pick } from '@shared/core-utils'
import {
HttpStatusCode,
ResultList,
VideoFileMetadata,
VideoPrivacy,
VideosCommonQuery,
- VideosWithSearchCommonQuery
+ VideoTranscodingCreate
} from '@shared/models'
import { buildAbsoluteFixturePath, wait } from '../miscs'
import { unwrapBody } from '../requests'
return id
}
+ async listFiles (options: OverrideCommandOptions & {
+ id: number | string
+ }) {
+ const video = await this.get(options)
+
+ const files = video.files || []
+ const hlsFiles = video.streamingPlaylists[0]?.files || []
+
+ return files.concat(hlsFiles)
+ }
+
// ---------------------------------------------------------------------------
listMyVideos (options: OverrideCommandOptions & {
sort?: string
search?: string
isLive?: boolean
+ channelId?: number
} = {}) {
const path = '/api/v1/users/me/videos'
...options,
path,
- query: pick(options, [ 'start', 'count', 'sort', 'search', 'isLive' ]),
+ query: pick(options, [ 'start', 'count', 'sort', 'search', 'isLive', 'channelId' ]),
implicitToken: true,
defaultExpectedStatus: HttpStatusCode.OK_200
})
})
}
- listByAccount (options: OverrideCommandOptions & VideosWithSearchCommonQuery & {
+ listByAccount (options: OverrideCommandOptions & VideosCommonQuery & {
handle: string
}) {
const { handle, search } = options
})
}
- listByChannel (options: OverrideCommandOptions & VideosWithSearchCommonQuery & {
+ listByChannel (options: OverrideCommandOptions & VideosCommonQuery & {
handle: string
}) {
const { handle } = options
const result = await this.sendResumableChunks({ ...options, pathUploadId, videoFilePath, size })
+ if (result.statusCode === HttpStatusCode.OK_200) {
+ await this.endResumableUpload({ ...options, expectedStatus: HttpStatusCode.NO_CONTENT_204, pathUploadId })
+ }
+
return result.body?.video || result.body as any
}
attributes: VideoEdit
size: number
mimetype: string
+
+ originalName?: string
+ lastModified?: number
}) {
- const { attributes, size, mimetype } = options
+ const { attributes, originalName, lastModified, size, mimetype } = options
const path = '/api/v1/videos/upload-resumable'
'X-Upload-Content-Type': mimetype,
'X-Upload-Content-Length': size.toString()
},
- fields: { filename: attributes.fixture, ...this.buildUploadFields(options.attributes) },
+ fields: {
+ filename: attributes.fixture,
+ originalName,
+ lastModified,
+
+ ...this.buildUploadFields(options.attributes)
+ },
+
// Fixture will be sent later
attaches: this.buildUploadAttaches(omit(options.attributes, 'fixture')),
implicitToken: true,
})
}
+ endResumableUpload (options: OverrideCommandOptions & {
+ pathUploadId: string
+ }) {
+ return this.deleteRequest({
+ ...options,
+
+ path: '/api/v1/videos/upload-resumable',
+ rawQuery: options.pathUploadId,
+ implicitToken: true,
+ defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
+ })
+ }
+
quickUpload (options: OverrideCommandOptions & {
name: string
nsfw?: boolean
// ---------------------------------------------------------------------------
+ removeHLSFiles (options: OverrideCommandOptions & {
+ videoId: number | string
+ }) {
+ const path = '/api/v1/videos/' + options.videoId + '/hls'
+
+ return this.deleteRequest({
+ ...options,
+
+ path,
+ implicitToken: true,
+ defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
+ })
+ }
+
+ removeWebTorrentFiles (options: OverrideCommandOptions & {
+ videoId: number | string
+ }) {
+ const path = '/api/v1/videos/' + options.videoId + '/webtorrent'
+
+ return this.deleteRequest({
+ ...options,
+
+ path,
+ implicitToken: true,
+ defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
+ })
+ }
+
+ runTranscoding (options: OverrideCommandOptions & {
+ videoId: number | string
+ transcodingType: 'hls' | 'webtorrent'
+ }) {
+ const path = '/api/v1/videos/' + options.videoId + '/transcoding'
+
+ const fields: VideoTranscodingCreate = pick(options, [ 'transcodingType' ])
+
+ return this.postBodyRequest({
+ ...options,
+
+ path,
+ fields,
+ implicitToken: true,
+ defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
+ })
+ }
+
+ // ---------------------------------------------------------------------------
+
private buildListQuery (options: VideosCommonQuery) {
return pick(options, [
'start',
'languageOneOf',
'tagsOneOf',
'tagsAllOf',
- 'filter',
+ 'isLocal',
+ 'include',
'skipCount'
])
}