diff --git a/package.json b/package.json index 2952bfbfc..ea55c5946 100644 --- a/package.json +++ b/package.json @@ -167,7 +167,7 @@ "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", diff --git a/server/helpers/custom-validators/video-captions.ts b/server/helpers/custom-validators/video-captions.ts index 6a9c6d75c..177e9e86e 100644 --- a/server/helpers/custom-validators/video-captions.ts +++ b/server/helpers/custom-validators/video-captions.ts @@ -1,4 +1,4 @@ -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' @@ -8,7 +8,9 @@ function isVideoCaptionLanguageValid (value: any) { 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) diff --git a/server/helpers/express-utils.ts b/server/helpers/express-utils.ts index f136a4329..b3cc40848 100644 --- a/server/helpers/express-utils.ts +++ b/server/helpers/express-utils.ts @@ -4,6 +4,7 @@ import { CONFIG, REMOTE_SCHEME } from '../initializers' 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 @@ -50,7 +51,7 @@ function createReqFiles ( }, filename: async (req, file, cb) => { - const extension = mimeTypes[ file.mimetype ] + const extension = mimeTypes[ file.mimetype ] || extname(file.originalname) let randomString = '' try { diff --git a/server/tests/api/check-params/video-captions.ts b/server/tests/api/check-params/video-captions.ts index a3d7ac35d..8d46971a1 100644 --- a/server/tests/api/check-params/video-captions.ts +++ b/server/tests/api/check-params/video-captions.ts @@ -15,6 +15,7 @@ import { 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/' @@ -143,6 +144,31 @@ describe('Test video captions API validator', function () { }) }) + // 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') diff --git a/server/tests/api/videos/video-captions.ts b/server/tests/api/videos/video-captions.ts index eb73c5baf..ba9ebbdd6 100644 --- a/server/tests/api/videos/video-captions.ts +++ b/server/tests/api/videos/video-captions.ts @@ -56,7 +56,8 @@ describe('Test video captions', function () { accessToken: servers[0].accessToken, language: 'zh', videoId: videoUUID, - fixture: 'subtitle-good2.vtt' + fixture: 'subtitle-good2.vtt', + mimeType: 'application/octet-stream' }) await waitJobs(servers) diff --git a/server/tests/utils/requests/requests.ts b/server/tests/utils/requests/requests.ts index b88b3ce5b..fc7b38b8c 100644 --- a/server/tests/utils/requests/requests.ts +++ b/server/tests/utils/requests/requests.ts @@ -48,7 +48,7 @@ function makeUploadRequest (options: { 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 @@ -78,7 +78,11 @@ function makeUploadRequest (options: { 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) diff --git a/server/tests/utils/videos/video-captions.ts b/server/tests/utils/videos/video-captions.ts index 207e89632..41e52be07 100644 --- a/server/tests/utils/videos/video-captions.ts +++ b/server/tests/utils/videos/video-captions.ts @@ -10,10 +10,15 @@ function createVideoCaption (args: { 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, @@ -21,9 +26,9 @@ function createVideoCaption (args: { token: args.accessToken, fields: {}, attaches: { - captionfile: buildAbsoluteFixturePath(args.fixture) + captionfile: captionfileAttach }, - statusCodeExpected: 204 + statusCodeExpected: args.statusCodeExpected || 204 }) }