"chai-json-schema": "^1.5.0",
"chai-xml": "^0.3.2",
"husky": "^1.0.0-rc.4",
- "libxmljs": "0.19.1",
+ "libxmljs": "0.19.0",
"lint-staged": "^7.1.0",
"maildev": "^1.0.0-rc3",
"mocha": "^5.0.0",
-import { CONSTRAINTS_FIELDS, VIDEO_CAPTIONS_MIMETYPE_EXT, VIDEO_LANGUAGES, VIDEO_MIMETYPE_EXT } from '../../initializers'
+import { CONSTRAINTS_FIELDS, VIDEO_CAPTIONS_MIMETYPE_EXT, VIDEO_LANGUAGES } from '../../initializers'
import { exists, isFileValid } from './misc'
import { Response } from 'express'
import { VideoModel } from '../../models/video/video'
return exists(value) && VIDEO_LANGUAGES[ value ] !== undefined
}
-const videoCaptionTypes = Object.keys(VIDEO_CAPTIONS_MIMETYPE_EXT).map(m => `(${m})`)
+const videoCaptionTypes = Object.keys(VIDEO_CAPTIONS_MIMETYPE_EXT)
+ .concat([ 'application/octet-stream' ]) // MacOS sends application/octet-stream ><
+ .map(m => `(${m})`)
const videoCaptionTypesRegex = videoCaptionTypes.join('|')
function isVideoCaptionFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
return isFileValid(files, videoCaptionTypesRegex, field, CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max)
import { logger } from './logger'
import { User } from '../../shared/models/users'
import { generateRandomString } from './utils'
+import { extname } from 'path'
function buildNSFWFilter (res: express.Response, paramNSFW?: string) {
if (paramNSFW === 'true') return true
},
filename: async (req, file, cb) => {
- const extension = mimeTypes[ file.mimetype ]
+ const extension = mimeTypes[ file.mimetype ] || extname(file.originalname)
let randomString = ''
try {
userLogin
} from '../../utils'
import { join } from 'path'
+import { createVideoCaption } from '../../utils/videos/video-captions'
describe('Test video captions API validator', function () {
const path = '/api/v1/videos/'
})
})
+ // We don't check the extension yet
+ // it('Should fail with an invalid captionfile extension and octet-stream mime type', async function () {
+ // await createVideoCaption({
+ // url: server.url,
+ // accessToken: server.accessToken,
+ // language: 'zh',
+ // videoId: videoUUID,
+ // fixture: 'subtitle-bad.txt',
+ // mimeType: 'application/octet-stream',
+ // statusCodeExpected: 400
+ // })
+ // })
+
+ it('Should succeed with a valid captionfile extension and octet-stream mime type', async function () {
+ await createVideoCaption({
+ url: server.url,
+ accessToken: server.accessToken,
+ language: 'zh',
+ videoId: videoUUID,
+ fixture: 'subtitle-good.srt',
+ mimeType: 'application/octet-stream'
+ })
+ })
+
+ // We don't check the file validity yet
// it('Should fail with an invalid captionfile srt', async function () {
// const attaches = {
// 'captionfile': join(__dirname, '..', '..', 'fixtures', 'subtitle-bad.srt')
accessToken: servers[0].accessToken,
language: 'zh',
videoId: videoUUID,
- fixture: 'subtitle-good2.vtt'
+ fixture: 'subtitle-good2.vtt',
+ mimeType: 'application/octet-stream'
})
await waitJobs(servers)
path: string,
token?: string,
fields: { [ fieldName: string ]: any },
- attaches: { [ attachName: string ]: any },
+ attaches: { [ attachName: string ]: any | any[] },
statusCodeExpected?: number
}) {
if (!options.statusCodeExpected) options.statusCodeExpected = 400
Object.keys(options.attaches).forEach(attach => {
const value = options.attaches[attach]
- req.attach(attach, buildAbsoluteFixturePath(value))
+ if (Array.isArray(value)) {
+ req.attach(attach, buildAbsoluteFixturePath(value[0]), value[1])
+ } else {
+ req.attach(attach, buildAbsoluteFixturePath(value))
+ }
})
return req.expect(options.statusCodeExpected)
accessToken: string
videoId: string | number
language: string
- fixture: string
+ fixture: string,
+ mimeType?: string,
+ statusCodeExpected?: number
}) {
const path = '/api/v1/videos/' + args.videoId + '/captions/' + args.language
+ const captionfile = buildAbsoluteFixturePath(args.fixture)
+ const captionfileAttach = args.mimeType ? [ captionfile, { contentType: args.mimeType } ] : captionfile
+
return makeUploadRequest({
method: 'PUT',
url: args.url,
token: args.accessToken,
fields: {},
attaches: {
- captionfile: buildAbsoluteFixturePath(args.fixture)
+ captionfile: captionfileAttach
},
- statusCodeExpected: 204
+ statusCodeExpected: args.statusCodeExpected || 204
})
}