2017-09-07 13:27:35 +00:00
|
|
|
import { readFile } from 'fs'
|
|
|
|
import * as parseTorrent from 'parse-torrent'
|
2017-12-28 12:59:22 +00:00
|
|
|
import { isAbsolute, join } from 'path'
|
|
|
|
import * as request from 'supertest'
|
|
|
|
import { getMyUserInformation, makeGetRequest, readFilePromise, ServerInfo } from '../'
|
|
|
|
import { VideoPrivacy } from '../../../../shared/models/videos'
|
2017-09-04 19:21:47 +00:00
|
|
|
|
|
|
|
type VideoAttributes = {
|
|
|
|
name?: string
|
|
|
|
category?: number
|
|
|
|
licence?: number
|
|
|
|
language?: number
|
|
|
|
nsfw?: boolean
|
|
|
|
description?: string
|
|
|
|
tags?: string[]
|
2017-10-24 17:41:30 +00:00
|
|
|
channelId?: number
|
2017-10-31 14:20:35 +00:00
|
|
|
privacy?: VideoPrivacy
|
2017-09-04 19:21:47 +00:00
|
|
|
fixture?: string
|
|
|
|
}
|
|
|
|
|
|
|
|
function getVideoCategories (url: string) {
|
|
|
|
const path = '/api/v1/videos/categories'
|
|
|
|
|
2017-12-28 13:29:57 +00:00
|
|
|
return makeGetRequest({
|
|
|
|
url,
|
|
|
|
path
|
|
|
|
})
|
2017-09-04 19:21:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function getVideoLicences (url: string) {
|
|
|
|
const path = '/api/v1/videos/licences'
|
|
|
|
|
2017-12-28 13:29:57 +00:00
|
|
|
return makeGetRequest({
|
|
|
|
url,
|
|
|
|
path
|
|
|
|
})
|
2017-09-04 19:21:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function getVideoLanguages (url: string) {
|
|
|
|
const path = '/api/v1/videos/languages'
|
|
|
|
|
2017-12-28 13:29:57 +00:00
|
|
|
return makeGetRequest({
|
|
|
|
url,
|
|
|
|
path
|
|
|
|
})
|
2017-09-04 19:21:47 +00:00
|
|
|
}
|
|
|
|
|
2017-10-31 14:20:35 +00:00
|
|
|
function getVideoPrivacies (url: string) {
|
|
|
|
const path = '/api/v1/videos/privacies'
|
|
|
|
|
2017-12-28 13:29:57 +00:00
|
|
|
return makeGetRequest({
|
|
|
|
url,
|
|
|
|
path
|
|
|
|
})
|
2017-10-31 14:20:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function getVideo (url: string, id: number | string, expectedStatus = 200) {
|
2017-09-04 19:21:47 +00:00
|
|
|
const path = '/api/v1/videos/' + id
|
|
|
|
|
|
|
|
return request(url)
|
|
|
|
.get(path)
|
|
|
|
.set('Accept', 'application/json')
|
2017-10-31 14:20:35 +00:00
|
|
|
.expect(expectedStatus)
|
|
|
|
}
|
|
|
|
|
2017-11-30 08:21:11 +00:00
|
|
|
function viewVideo (url: string, id: number | string, expectedStatus = 204) {
|
|
|
|
const path = '/api/v1/videos/' + id + '/views'
|
|
|
|
|
|
|
|
return request(url)
|
|
|
|
.post(path)
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.expect(expectedStatus)
|
|
|
|
}
|
|
|
|
|
2017-10-31 14:20:35 +00:00
|
|
|
function getVideoWithToken (url: string, token: string, id: number | string, expectedStatus = 200) {
|
|
|
|
const path = '/api/v1/videos/' + id
|
|
|
|
|
|
|
|
return request(url)
|
|
|
|
.get(path)
|
|
|
|
.set('Authorization', 'Bearer ' + token)
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.expect(expectedStatus)
|
2017-09-04 19:21:47 +00:00
|
|
|
}
|
|
|
|
|
2017-10-30 09:16:27 +00:00
|
|
|
function getVideoDescription (url: string, descriptionPath: string) {
|
|
|
|
return request(url)
|
|
|
|
.get(descriptionPath)
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.expect(200)
|
|
|
|
.expect('Content-Type', /json/)
|
|
|
|
}
|
|
|
|
|
2017-09-04 19:21:47 +00:00
|
|
|
function getVideosList (url: string) {
|
|
|
|
const path = '/api/v1/videos'
|
|
|
|
|
|
|
|
return request(url)
|
|
|
|
.get(path)
|
|
|
|
.query({ sort: 'name' })
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.expect(200)
|
|
|
|
.expect('Content-Type', /json/)
|
|
|
|
}
|
|
|
|
|
2017-10-31 14:20:35 +00:00
|
|
|
function getMyVideos (url: string, accessToken: string, start: number, count: number, sort?: string) {
|
|
|
|
const path = '/api/v1/users/me/videos'
|
|
|
|
|
|
|
|
const req = request(url)
|
|
|
|
.get(path)
|
|
|
|
.query({ start: start })
|
|
|
|
.query({ count: count })
|
|
|
|
|
|
|
|
if (sort) req.query({ sort })
|
|
|
|
|
|
|
|
return req.set('Accept', 'application/json')
|
|
|
|
.set('Authorization', 'Bearer ' + accessToken)
|
|
|
|
.expect(200)
|
|
|
|
.expect('Content-Type', /json/)
|
|
|
|
}
|
|
|
|
|
2017-09-04 19:21:47 +00:00
|
|
|
function getVideosListPagination (url: string, start: number, count: number, sort?: string) {
|
|
|
|
const path = '/api/v1/videos'
|
|
|
|
|
|
|
|
const req = request(url)
|
|
|
|
.get(path)
|
|
|
|
.query({ start: start })
|
|
|
|
.query({ count: count })
|
|
|
|
|
|
|
|
if (sort) req.query({ sort })
|
|
|
|
|
|
|
|
return req.set('Accept', 'application/json')
|
|
|
|
.expect(200)
|
|
|
|
.expect('Content-Type', /json/)
|
|
|
|
}
|
|
|
|
|
|
|
|
function getVideosListSort (url: string, sort: string) {
|
|
|
|
const path = '/api/v1/videos'
|
|
|
|
|
|
|
|
return request(url)
|
|
|
|
.get(path)
|
|
|
|
.query({ sort: sort })
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.expect(200)
|
|
|
|
.expect('Content-Type', /json/)
|
|
|
|
}
|
|
|
|
|
|
|
|
function removeVideo (url: string, token: string, id: number, expectedStatus = 204) {
|
|
|
|
const path = '/api/v1/videos'
|
|
|
|
|
|
|
|
return request(url)
|
|
|
|
.delete(path + '/' + id)
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.set('Authorization', 'Bearer ' + token)
|
|
|
|
.expect(expectedStatus)
|
|
|
|
}
|
|
|
|
|
2017-12-05 16:46:33 +00:00
|
|
|
function searchVideo (url: string, search: string) {
|
2017-09-04 19:21:47 +00:00
|
|
|
const path = '/api/v1/videos'
|
|
|
|
const req = request(url)
|
2017-12-05 16:46:33 +00:00
|
|
|
.get(path + '/search')
|
|
|
|
.query({ search })
|
|
|
|
.set('Accept', 'application/json')
|
2017-09-04 19:21:47 +00:00
|
|
|
|
|
|
|
return req.expect(200)
|
2017-12-05 16:46:33 +00:00
|
|
|
.expect('Content-Type', /json/)
|
2017-09-04 19:21:47 +00:00
|
|
|
}
|
|
|
|
|
2017-12-05 16:46:33 +00:00
|
|
|
function searchVideoWithPagination (url: string, search: string, start: number, count: number, sort?: string) {
|
2017-09-04 19:21:47 +00:00
|
|
|
const path = '/api/v1/videos'
|
|
|
|
|
|
|
|
const req = request(url)
|
2017-12-05 16:46:33 +00:00
|
|
|
.get(path + '/search')
|
2017-09-04 19:21:47 +00:00
|
|
|
.query({ start })
|
2017-12-05 16:46:33 +00:00
|
|
|
.query({ search })
|
2017-09-04 19:21:47 +00:00
|
|
|
.query({ count })
|
|
|
|
|
|
|
|
if (sort) req.query({ sort })
|
|
|
|
|
|
|
|
return req.set('Accept', 'application/json')
|
|
|
|
.expect(200)
|
|
|
|
.expect('Content-Type', /json/)
|
|
|
|
}
|
|
|
|
|
|
|
|
function searchVideoWithSort (url: string, search: string, sort: string) {
|
|
|
|
const path = '/api/v1/videos'
|
|
|
|
|
|
|
|
return request(url)
|
2017-12-05 16:46:33 +00:00
|
|
|
.get(path + '/search')
|
|
|
|
.query({ search })
|
2017-09-04 19:21:47 +00:00
|
|
|
.query({ sort })
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.expect(200)
|
|
|
|
.expect('Content-Type', /json/)
|
|
|
|
}
|
|
|
|
|
|
|
|
async function testVideoImage (url: string, imageName: string, imagePath: string) {
|
|
|
|
// Don't test images if the node env is not set
|
|
|
|
// Because we need a special ffmpeg version for this test
|
|
|
|
if (process.env['NODE_TEST_IMAGE']) {
|
|
|
|
const res = await request(url)
|
|
|
|
.get(imagePath)
|
|
|
|
.expect(200)
|
|
|
|
|
2017-12-28 13:49:43 +00:00
|
|
|
const data = await readFilePromise(join(__dirname, '..', '..', 'api', 'fixtures', imageName + '.jpg'))
|
2017-09-04 19:21:47 +00:00
|
|
|
|
|
|
|
return data.equals(res.body)
|
|
|
|
} else {
|
|
|
|
console.log('Do not test images. Enable it by setting NODE_TEST_IMAGE env variable.')
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-08 09:08:36 +00:00
|
|
|
async function uploadVideo (url: string, accessToken: string, videoAttributesArg: VideoAttributes, specialStatus = 200) {
|
2017-09-07 19:46:44 +00:00
|
|
|
const path = '/api/v1/videos/upload'
|
2017-10-24 17:41:30 +00:00
|
|
|
let defaultChannelId = '1'
|
|
|
|
|
|
|
|
try {
|
|
|
|
const res = await getMyUserInformation(url, accessToken)
|
|
|
|
defaultChannelId = res.body.videoChannels[0].id
|
|
|
|
} catch (e) { /* empty */ }
|
2017-09-04 19:21:47 +00:00
|
|
|
|
|
|
|
// Default attributes
|
|
|
|
let attributes = {
|
|
|
|
name: 'my super video',
|
|
|
|
category: 5,
|
|
|
|
licence: 4,
|
|
|
|
language: 3,
|
2017-10-24 17:41:30 +00:00
|
|
|
channelId: defaultChannelId,
|
2017-09-04 19:21:47 +00:00
|
|
|
nsfw: true,
|
|
|
|
description: 'my super description',
|
|
|
|
tags: [ 'tag' ],
|
2017-10-31 14:20:35 +00:00
|
|
|
privacy: VideoPrivacy.PUBLIC,
|
2017-09-04 19:21:47 +00:00
|
|
|
fixture: 'video_short.webm'
|
|
|
|
}
|
|
|
|
attributes = Object.assign(attributes, videoAttributesArg)
|
|
|
|
|
|
|
|
const req = request(url)
|
|
|
|
.post(path)
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.set('Authorization', 'Bearer ' + accessToken)
|
|
|
|
.field('name', attributes.name)
|
|
|
|
.field('category', attributes.category.toString())
|
|
|
|
.field('licence', attributes.licence.toString())
|
|
|
|
.field('nsfw', JSON.stringify(attributes.nsfw))
|
|
|
|
.field('description', attributes.description)
|
2017-10-31 14:20:35 +00:00
|
|
|
.field('privacy', attributes.privacy.toString())
|
2017-10-24 17:41:30 +00:00
|
|
|
.field('channelId', attributes.channelId)
|
2017-09-04 19:21:47 +00:00
|
|
|
|
2017-09-07 15:58:09 +00:00
|
|
|
if (attributes.language !== undefined) {
|
|
|
|
req.field('language', attributes.language.toString())
|
|
|
|
}
|
|
|
|
|
2017-09-04 19:21:47 +00:00
|
|
|
for (let i = 0; i < attributes.tags.length; i++) {
|
|
|
|
req.field('tags[' + i + ']', attributes.tags[i])
|
|
|
|
}
|
|
|
|
|
2017-10-09 09:06:13 +00:00
|
|
|
let filePath = ''
|
2017-09-04 19:21:47 +00:00
|
|
|
if (isAbsolute(attributes.fixture)) {
|
2017-10-09 09:06:13 +00:00
|
|
|
filePath = attributes.fixture
|
2017-09-04 19:21:47 +00:00
|
|
|
} else {
|
2017-12-28 13:49:43 +00:00
|
|
|
filePath = join(__dirname, '..', '..', 'api', 'fixtures', attributes.fixture)
|
2017-09-04 19:21:47 +00:00
|
|
|
}
|
|
|
|
|
2017-10-09 09:06:13 +00:00
|
|
|
return req.attach('videofile', filePath)
|
2017-09-04 19:21:47 +00:00
|
|
|
.expect(specialStatus)
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateVideo (url: string, accessToken: string, id: number, attributes: VideoAttributes, specialStatus = 204) {
|
|
|
|
const path = '/api/v1/videos/' + id
|
|
|
|
const body = {}
|
|
|
|
|
|
|
|
if (attributes.name) body['name'] = attributes.name
|
|
|
|
if (attributes.category) body['category'] = attributes.category
|
|
|
|
if (attributes.licence) body['licence'] = attributes.licence
|
|
|
|
if (attributes.language) body['language'] = attributes.language
|
|
|
|
if (attributes.nsfw) body['nsfw'] = attributes.nsfw
|
|
|
|
if (attributes.description) body['description'] = attributes.description
|
|
|
|
if (attributes.tags) body['tags'] = attributes.tags
|
2017-10-31 14:20:35 +00:00
|
|
|
if (attributes.privacy) body['privacy'] = attributes.privacy
|
2017-09-04 19:21:47 +00:00
|
|
|
|
|
|
|
return request(url)
|
|
|
|
.put(path)
|
|
|
|
.send(body)
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.set('Authorization', 'Bearer ' + accessToken)
|
|
|
|
.expect(specialStatus)
|
|
|
|
}
|
|
|
|
|
|
|
|
function rateVideo (url: string, accessToken: string, id: number, rating: string, specialStatus = 204) {
|
|
|
|
const path = '/api/v1/videos/' + id + '/rate'
|
|
|
|
|
|
|
|
return request(url)
|
|
|
|
.put(path)
|
|
|
|
.set('Accept', 'application/json')
|
|
|
|
.set('Authorization', 'Bearer ' + accessToken)
|
|
|
|
.send({ rating })
|
|
|
|
.expect(specialStatus)
|
|
|
|
}
|
|
|
|
|
2017-10-09 09:06:13 +00:00
|
|
|
function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) {
|
2017-09-07 13:27:35 +00:00
|
|
|
return new Promise<any>((res, rej) => {
|
2017-10-09 09:06:13 +00:00
|
|
|
const torrentName = videoUUID + '-' + resolution + '.torrent'
|
2017-12-28 13:49:43 +00:00
|
|
|
const torrentPath = join(__dirname, '..', '..', '..', '..', 'test' + server.serverNumber, 'torrents', torrentName)
|
2017-09-07 13:27:35 +00:00
|
|
|
readFile(torrentPath, (err, data) => {
|
|
|
|
if (err) return rej(err)
|
|
|
|
|
|
|
|
return res(parseTorrent(data))
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2017-09-04 19:21:47 +00:00
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
export {
|
2017-10-30 09:16:27 +00:00
|
|
|
getVideoDescription,
|
2017-09-04 19:21:47 +00:00
|
|
|
getVideoCategories,
|
|
|
|
getVideoLicences,
|
2017-10-31 14:20:35 +00:00
|
|
|
getVideoPrivacies,
|
2017-09-04 19:21:47 +00:00
|
|
|
getVideoLanguages,
|
2017-10-31 14:20:35 +00:00
|
|
|
getMyVideos,
|
2017-09-04 19:21:47 +00:00
|
|
|
getVideo,
|
2017-10-31 14:20:35 +00:00
|
|
|
getVideoWithToken,
|
2017-09-04 19:21:47 +00:00
|
|
|
getVideosList,
|
|
|
|
getVideosListPagination,
|
|
|
|
getVideosListSort,
|
|
|
|
removeVideo,
|
|
|
|
searchVideo,
|
|
|
|
searchVideoWithPagination,
|
|
|
|
searchVideoWithSort,
|
|
|
|
testVideoImage,
|
|
|
|
uploadVideo,
|
|
|
|
updateVideo,
|
2017-09-07 13:27:35 +00:00
|
|
|
rateVideo,
|
2017-11-30 08:21:11 +00:00
|
|
|
viewVideo,
|
2017-09-07 13:27:35 +00:00
|
|
|
parseTorrentVideo
|
2017-09-04 19:21:47 +00:00
|
|
|
}
|