]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Fix caption upload on Mac OS
authorChocobozzz <me@florianbigard.com>
Mon, 6 Aug 2018 09:45:24 +0000 (11:45 +0200)
committerChocobozzz <me@florianbigard.com>
Mon, 6 Aug 2018 09:45:24 +0000 (11:45 +0200)
package.json
server/helpers/custom-validators/video-captions.ts
server/helpers/express-utils.ts
server/tests/api/check-params/video-captions.ts
server/tests/api/videos/video-captions.ts
server/tests/utils/requests/requests.ts
server/tests/utils/videos/video-captions.ts

index 2952bfbfc6b3121c59ce7739bb3718ec5225a597..ea55c594601b29fc6786add34c8fdea6b389334b 100644 (file)
     "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",
index 6a9c6d75ce5492dc84926c31a3c80a1c8f668edd..177e9e86ed45b475e1e9f007bb3ad2c091a00023 100644 (file)
@@ -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)
index f136a4329b67da2033ecb7dc2c3cebd1a85cbaf2..b3cc4084892402dcb2883177092a000f55c1e57d 100644 (file)
@@ -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 {
index a3d7ac35dbc7fab1ff86e18ce2c854ad331b4755..8d46971a16c37bf3977cef6acc1ab41f1d5483fa 100644 (file)
@@ -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')
index eb73c5baf8aa6185a2ff2fbdfad7d4589d7f6311..ba9ebbdd62471c05ccae7b3a193dbf2b2a3df6b6 100644 (file)
@@ -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)
index b88b3ce5b4270c640a26c203350f212e03aa9211..fc7b38b8c3047f654d9be5763d547065ad3ea217 100644 (file)
@@ -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)
index 207e89632ba2c359a02c5554cee51eb6d18326f4..41e52be0702fcf97244cc3b6b67aca54964c29f6 100644 (file)
@@ -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
   })
 }