infoHash: videoToCreateData.infoHash,
category: videoToCreateData.category,
licence: videoToCreateData.licence,
+ language: videoToCreateData.language,
nsfw: videoToCreateData.nsfw,
description: videoToCreateData.description,
authorId: author.id,
videoInstance.set('name', videoAttributesToUpdate.name)
videoInstance.set('category', videoAttributesToUpdate.category)
videoInstance.set('licence', videoAttributesToUpdate.licence)
+ videoInstance.set('language', videoAttributesToUpdate.language)
videoInstance.set('nsfw', videoAttributesToUpdate.nsfw)
videoInstance.set('description', videoAttributesToUpdate.description)
videoInstance.set('infoHash', videoAttributesToUpdate.infoHash)
router.get('/categories', listVideoCategories)
router.get('/licences', listVideoLicences)
+router.get('/languages', listVideoLanguages)
router.get('/abuse',
oAuth.authenticate,
res.json(constants.VIDEO_LICENCES)
}
+function listVideoLanguages (req, res, next) {
+ res.json(constants.VIDEO_LANGUAGES)
+}
+
function rateVideoRetryWrapper (req, res, next) {
const options = {
arguments: [ req, res ],
extname: path.extname(videoFile.filename),
category: videoInfos.category,
licence: videoInfos.licence,
+ language: videoInfos.language,
nsfw: videoInfos.nsfw,
description: videoInfos.description,
duration: videoFile.duration,
if (videoInfosToUpdate.name) videoInstance.set('name', videoInfosToUpdate.name)
if (videoInfosToUpdate.category) videoInstance.set('category', videoInfosToUpdate.category)
if (videoInfosToUpdate.licence) videoInstance.set('licence', videoInfosToUpdate.licence)
+ if (videoInfosToUpdate.language) videoInstance.set('language', videoInfosToUpdate.language)
if (videoInfosToUpdate.nsfw) videoInstance.set('nsfw', videoInfosToUpdate.nsfw)
if (videoInfosToUpdate.description) videoInstance.set('description', videoInfosToUpdate.description)
videosValidators.isVideoDateValid(video.updatedAt) &&
videosValidators.isVideoCategoryValid(video.category) &&
videosValidators.isVideoLicenceValid(video.licence) &&
+ videosValidators.isVideoLanguageValid(video.language) &&
videosValidators.isVideoNSFWValid(video.nsfw) &&
videosValidators.isVideoDescriptionValid(video.description) &&
videosValidators.isVideoDurationValid(video.duration) &&
isVideoDateValid,
isVideoCategoryValid,
isVideoLicenceValid,
+ isVideoLanguageValid,
isVideoNSFWValid,
isVideoDescriptionValid,
isVideoDurationValid,
return constants.VIDEO_LICENCES[value] !== undefined
}
+function isVideoLanguageValid (value) {
+ return constants.VIDEO_LANGUAGES[value] !== undefined
+}
+
function isVideoNSFWValid (value) {
return validator.isBoolean(value)
}
// ---------------------------------------------------------------------------
-const LAST_MIGRATION_VERSION = 45
+const LAST_MIGRATION_VERSION = 50
// ---------------------------------------------------------------------------
7: 'Public Domain Dedication'
}
+// See https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers#Nationalencyklopedin
+const VIDEO_LANGUAGES = {
+ 1: 'English',
+ 2: 'Spanish',
+ 3: 'Mandarin',
+ 4: 'Hindi',
+ 5: 'Arabic',
+ 6: 'Portuguese',
+ 7: 'Bengali',
+ 8: 'Russian',
+ 9: 'Japanese',
+ 10: 'Punjabi',
+ 11: 'German',
+ 12: 'Korean',
+ 13: 'French',
+ 14: 'Italien'
+}
+
// ---------------------------------------------------------------------------
// Score a pod has when we create it as a friend
THUMBNAILS_SIZE,
USER_ROLES,
VIDEO_CATEGORIES,
+ VIDEO_LANGUAGES,
VIDEO_LICENCES,
VIDEO_RATE_TYPES
}
--- /dev/null
+'use strict'
+
+// utils = { transaction, queryInterface, sequelize, Sequelize }
+exports.up = function (utils, finalCallback) {
+ const q = utils.queryInterface
+ const Sequelize = utils.Sequelize
+
+ const data = {
+ type: Sequelize.INTEGER,
+ allowNull: true,
+ defaultValue: null
+ }
+
+ q.addColumn('Videos', 'language', data, { transaction: utils.transaction }).asCallback(finalCallback)
+}
+
+exports.down = function (options, callback) {
+ throw new Error('Not implemented.')
+}
req.checkBody('name', 'Should have a valid name').isVideoNameValid()
req.checkBody('category', 'Should have a valid category').isVideoCategoryValid()
req.checkBody('licence', 'Should have a valid licence').isVideoLicenceValid()
+ req.checkBody('language', 'Should have a valid language').optional().isVideoLanguageValid()
req.checkBody('nsfw', 'Should have a valid NSFW attribute').isVideoNSFWValid()
req.checkBody('description', 'Should have a valid description').isVideoDescriptionValid()
req.checkBody('tags', 'Should have correct tags').optional().isVideoTagsValid()
req.checkBody('name', 'Should have a valid name').optional().isVideoNameValid()
req.checkBody('category', 'Should have a valid category').optional().isVideoCategoryValid()
req.checkBody('licence', 'Should have a valid licence').optional().isVideoLicenceValid()
+ req.checkBody('language', 'Should have a valid language').optional().isVideoLanguageValid()
req.checkBody('nsfw', 'Should have a valid NSFW attribute').optional().isVideoNSFWValid()
req.checkBody('description', 'Should have a valid description').optional().isVideoDescriptionValid()
req.checkBody('tags', 'Should have correct tags').optional().isVideoTagsValid()
licence: {
type: DataTypes.INTEGER,
allowNull: false,
+ defaultValue: null,
validate: {
licenceValid: function (value) {
const res = customVideosValidators.isVideoLicenceValid(value)
}
}
},
+ language: {
+ type: DataTypes.INTEGER,
+ allowNull: true,
+ validate: {
+ languageValid: function (value) {
+ const res = customVideosValidators.isVideoLanguageValid(value)
+ if (res === false) throw new Error('Video language is not valid.')
+ }
+ }
+ },
nsfw: {
type: DataTypes.BOOLEAN,
allowNull: false,
let licenceLabel = constants.VIDEO_LICENCES[this.licence]
if (!licenceLabel) licenceLabel = 'Unknown'
+ // Language is an optional attribute
+ let languageLabel = constants.VIDEO_LANGUAGES[this.language]
+ if (!languageLabel) languageLabel = 'Unknown'
+
const json = {
id: this.id,
name: this.name,
categoryLabel,
licence: this.licence,
licenceLabel,
+ language: this.language,
+ languageLabel,
nsfw: this.nsfw,
description: this.description,
podHost,
name: self.name,
category: self.category,
licence: self.licence,
+ language: self.language,
nsfw: self.nsfw,
description: self.description,
infoHash: self.infoHash,
name: this.name,
category: this.category,
licence: this.licence,
+ language: this.language,
nsfw: this.nsfw,
description: this.description,
infoHash: this.infoHash,
const data = {
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'My very very very very very very very very very very very very very very very very long name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
const data = {
name: 'my super name',
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 125,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
const data = {
name: 'my super name',
category: 5,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 125,
+ language: 6,
+ nsfw: false,
+ description: 'my super description',
+ tags: [ 'tag1', 'tag2' ]
+ }
+ const attach = {
+ 'videofile': pathUtils.join(__dirname, '..', 'fixtures', 'video_short.webm')
+ }
+ requestsUtils.makePostUploadRequest(server.url, path, server.accessToken, data, attach, done)
+ })
+
+ it('Should fail with a bad language', function (done) {
+ const data = {
+ name: 'my super name',
+ category: 5,
+ licence: 4,
+ language: 563,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 4,
+ language: 6,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
}
name: 'my super name',
category: 5,
licence: 4,
+ language: 6,
nsfw: 2,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
tags: [ 'tag1', 'tag2' ]
}
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description which is very very very very very very very very very very very very very very' +
'very very very very very very very very very very very very very very very very very very very very very' +
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2', 'tag3', 'tag4' ]
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 't' ]
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'mysupertagtoolong', 'tag1' ]
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 1,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
const data = {
category: 5,
licence: 2,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
const data = {
category: 5,
licence: 2,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'My very very very very very very very very very very very very very very very very long name',
category: 5,
licence: 2,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 128,
licence: 2,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 128,
+ language: 6,
+ nsfw: false,
+ description: 'my super description',
+ tags: [ 'tag1', 'tag2' ]
+ }
+ requestsUtils.makePutBodyRequest(server.url, path + videoId, server.accessToken, data, done)
+ })
+
+ it('Should fail with a bad language', function (done) {
+ const data = {
+ name: 'my super name',
+ category: 5,
+ licence: 3,
+ language: 896,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 5,
+ language: 6,
nsfw: -4,
description: 'my super description',
tags: [ 'tag1', 'tag2' ]
name: 'my super name',
category: 5,
licence: 2,
+ language: 6,
nsfw: false,
description: 'my super description which is very very very very very very very very very very very very very very' +
'very very very very very very very very very very very very very very very very very very very very very' +
name: 'my super name',
category: 5,
licence: 2,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 'tag2', 'tag3', 'tag4' ]
name: 'my super name',
category: 5,
licence: 2,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'tag1', 't' ]
name: 'my super name',
category: 5,
licence: 2,
+ language: 6,
nsfw: false,
description: 'my super description',
tags: [ 'mysupertagtoolong', 'tag1' ]
name: 'my super name for pod 1',
category: 5,
licence: 4,
+ language: 9,
nsfw: true,
description: 'my super description for pod 1',
tags: [ 'tag1p1', 'tag2p1' ],
expect(video.categoryLabel).to.equal('Sports')
expect(video.licence).to.equal(4)
expect(video.licenceLabel).to.equal('Attribution - Non Commercial')
+ expect(video.language).to.equal(9)
+ expect(video.languageLabel).to.equal('Japanese')
expect(video.nsfw).to.be.truthy
expect(video.description).to.equal('my super description for pod 1')
expect(video.podHost).to.equal('localhost:9001')
name: 'my super name for pod 2',
category: 4,
licence: 3,
+ language: 11,
nsfw: true,
description: 'my super description for pod 2',
tags: [ 'tag1p2', 'tag2p2', 'tag3p2' ],
expect(video.categoryLabel).to.equal('Art')
expect(video.licence).to.equal(3)
expect(video.licenceLabel).to.equal('Attribution - No Derivatives')
+ expect(video.language).to.equal(11)
+ expect(video.languageLabel).to.equal('German')
expect(video.nsfw).to.be.falsy
expect(video.description).to.equal('my super description for pod 2')
expect(video.podHost).to.equal('localhost:9002')
name: 'my super name for pod 3',
category: 6,
licence: 5,
+ language: 11,
nsfw: true,
description: 'my super description for pod 3',
tags: [ 'tag1p3' ],
name: 'my super name for pod 3-2',
category: 7,
licence: 6,
+ language: 12,
nsfw: false,
description: 'my super description for pod 3-2',
tags: [ 'tag2p3', 'tag3p3', 'tag4p3' ],
expect(video1.categoryLabel).to.equal('Travels')
expect(video1.licence).to.equal(5)
expect(video1.licenceLabel).to.equal('Attribution - Non Commercial - Share Alike')
+ expect(video1.language).to.equal(11)
+ expect(video1.languageLabel).to.equal('German')
expect(video1.nsfw).to.be.truthy
expect(video1.description).to.equal('my super description for pod 3')
expect(video1.podHost).to.equal('localhost:9003')
expect(video2.categoryLabel).to.equal('Gaming')
expect(video2.licence).to.equal(6)
expect(video2.licenceLabel).to.equal('Attribution - Non Commercial - No Derivatives')
+ expect(video2.language).to.equal(12)
+ expect(video2.languageLabel).to.equal('Korean')
expect(video2.nsfw).to.be.falsy
expect(video2.description).to.equal('my super description for pod 3-2')
expect(video2.podHost).to.equal('localhost:9003')
name: 'my super video updated',
category: 10,
licence: 7,
+ language: 13,
nsfw: true,
description: 'my super description updated',
tags: [ 'tagup1', 'tagup2' ]
expect(videoUpdated.categoryLabel).to.equal('Entertainment')
expect(videoUpdated.licence).to.equal(7)
expect(videoUpdated.licenceLabel).to.equal('Public Domain Dedication')
+ expect(videoUpdated.language).to.equal(13)
+ expect(videoUpdated.languageLabel).to.equal('French')
expect(videoUpdated.nsfw).to.be.truthy
expect(videoUpdated.description).to.equal('my super description updated')
expect(videoUpdated.tags).to.deep.equal([ 'tagup1', 'tagup2' ])
})
})
+ it('Should list video languages', function (done) {
+ videosUtils.getVideoLanguages(server.url, function (err, res) {
+ if (err) throw err
+
+ const languages = res.body
+ expect(Object.keys(languages)).to.have.length.above(5)
+
+ expect(languages[3]).to.equal('Mandarin')
+
+ done()
+ })
+ })
+
it('Should not have videos', function (done) {
videosUtils.getVideosList(server.url, function (err, res) {
if (err) throw err
expect(video.categoryLabel).to.equal('Films')
expect(video.licence).to.equal(6)
expect(video.licenceLabel).to.equal('Attribution - Non Commercial - No Derivatives')
+ expect(video.language).to.equal(3)
+ expect(video.languageLabel).to.equal('Mandarin')
expect(video.nsfw).to.be.truthy
expect(video.description).to.equal('my super description')
expect(video.podHost).to.equal('localhost:9001')
expect(video.categoryLabel).to.equal('Films')
expect(video.licence).to.equal(6)
expect(video.licenceLabel).to.equal('Attribution - Non Commercial - No Derivatives')
+ expect(video.language).to.equal(3)
+ expect(video.languageLabel).to.equal('Mandarin')
expect(video.nsfw).to.be.truthy
expect(video.description).to.equal('my super description')
expect(video.podHost).to.equal('localhost:9001')
expect(video.categoryLabel).to.equal('Films')
expect(video.licence).to.equal(6)
expect(video.licenceLabel).to.equal('Attribution - Non Commercial - No Derivatives')
+ expect(video.language).to.equal(3)
+ expect(video.languageLabel).to.equal('Mandarin')
expect(video.nsfw).to.be.truthy
expect(video.description).to.equal('my super description')
expect(video.podHost).to.equal('localhost:9001')
expect(video.categoryLabel).to.equal('Films')
expect(video.licence).to.equal(6)
expect(video.licenceLabel).to.equal('Attribution - Non Commercial - No Derivatives')
+ expect(video.language).to.equal(3)
+ expect(video.languageLabel).to.equal('Mandarin')
expect(video.nsfw).to.be.truthy
expect(video.description).to.equal('my super description')
expect(video.podHost).to.equal('localhost:9001')
description: video + ' description',
category: 2,
licence: 1,
+ language: 1,
nsfw: true,
tags: [ 'tag1', 'tag2', 'tag3' ],
fixture: video
name: 'my super video updated',
category: 4,
licence: 2,
+ language: 5,
nsfw: false,
description: 'my super description updated',
tags: [ 'tagup1', 'tagup2' ]
expect(video.categoryLabel).to.equal('Art')
expect(video.licence).to.equal(2)
expect(video.licenceLabel).to.equal('Attribution - Share Alike')
+ expect(video.language).to.equal(5)
+ expect(video.languageLabel).to.equal('Arabic')
expect(video.nsfw).to.be.truthy
expect(video.description).to.equal('my super description updated')
expect(video.podHost).to.equal('localhost:9001')
expect(video.categoryLabel).to.equal('Art')
expect(video.licence).to.equal(2)
expect(video.licenceLabel).to.equal('Attribution - Share Alike')
+ expect(video.language).to.equal(5)
+ expect(video.languageLabel).to.equal('Arabic')
expect(video.nsfw).to.be.truthy
expect(video.description).to.equal('my super description updated')
expect(video.podHost).to.equal('localhost:9001')
expect(video.categoryLabel).to.equal('Art')
expect(video.licence).to.equal(2)
expect(video.licenceLabel).to.equal('Attribution - Share Alike')
+ expect(video.language).to.equal(5)
+ expect(video.languageLabel).to.equal('Arabic')
expect(video.nsfw).to.be.truthy
expect(video.description).to.equal('hello everybody')
expect(video.podHost).to.equal('localhost:9001')
.option('-u, --update [weight]', 'Weight for updating videos')
.option('-v, --view [weight]', 'Weight for viewing videos')
.option('-l, --like [weight]', 'Weight for liking videos')
- .option('-s --dislike [weight]', 'Weight for disliking videos')
+ .option('-s, --dislike [weight]', 'Weight for disliking videos')
.option('-p, --pods [n]', 'Number of pods to run (3 or 6)', /^3|6$/, 3)
.option('-a, --action [interval]', 'Interval in ms for an action')
.option('-i, --integrity [interval]', 'Interval in ms for an integrity check')
category: 4,
nsfw: false,
licence: 2,
+ language: 1,
description: Date.now() + ' description',
tags: [ Date.now().toString().substring(0, 5) + 't1', Date.now().toString().substring(0, 5) + 't2' ],
fixture: 'video_short1.webm'
.option('-x, --nsfw', 'Video is Not Safe For Work')
.option('-c, --category <category number>', 'Category number')
.option('-l, --licence <licence number>', 'Licence number')
+ .option('-g, --language <language number>', 'Language number')
.option('-d, --description <description>', 'Video description')
.option('-t, --tags <tags>', 'Video tags', list)
.option('-f, --file <file>', 'Video absolute file path')
!program.name ||
!program.category ||
!program.licence ||
+ !program.language ||
!program.nsfw ||
!program.description ||
!program.tags ||
program.name,
program.category,
program.licence,
+ program.language,
program.nsfw,
program.description,
program.tags,
return val.split(',')
}
-function upload (url, accessToken, name, category, licence, nsfw, description, tags, fixture) {
+function upload (url, accessToken, name, category, licence, language, nsfw, description, tags, fixture) {
console.log('Uploading %s video...', program.name)
const videoAttributes = {
name,
category,
licence,
+ language,
nsfw,
description,
tags,
const videosUtils = {
getVideoCategories,
getVideoLicences,
+ getVideoLanguages,
getAllVideosListBy,
getVideo,
getVideosList,
.end(end)
}
+function getVideoLanguages (url, end) {
+ const path = '/api/v1/videos/languages'
+
+ request(url)
+ .get(path)
+ .set('Accept', 'application/json')
+ .expect(200)
+ .expect('Content-Type', /json/)
+ .end(end)
+}
+
function getAllVideosListBy (url, end) {
const path = '/api/v1/videos'
name: 'my super video',
category: 5,
licence: 4,
+ language: 3,
nsfw: true,
description: 'my super description',
tags: [ 'tag' ],
.field('name', attributes.name)
.field('category', attributes.category)
.field('licence', attributes.licence)
+ .field('language', attributes.language)
.field('nsfw', attributes.nsfw)
.field('description', attributes.description)
if (attributes.name) req.field('name', attributes.name)
if (attributes.category) req.field('category', attributes.category)
if (attributes.licence) req.field('licence', attributes.licence)
+ if (attributes.language) req.field('language', attributes.language)
if (attributes.nsfw) req.field('nsfw', attributes.nsfw)
if (attributes.description) req.field('description', attributes.description)