Add audio upload tests
authorChocobozzz <me@florianbigard.com>
Fri, 17 May 2019 09:56:12 +0000 (11:56 +0200)
committerChocobozzz <me@florianbigard.com>
Fri, 17 May 2019 12:04:54 +0000 (14:04 +0200)
13 files changed:
client/src/app/+my-account/my-account-videos/my-account-videos.component.html
client/src/app/shared/buttons/button.component.ts
client/src/app/shared/buttons/delete-button.component.html
client/src/app/shared/buttons/edit-button.component.html
config/test-2.yaml
server/controllers/api/videos/index.ts
server/initializers/constants.ts
server/tests/api/server/config.ts
server/tests/api/server/jobs.ts
server/tests/api/travis-2.sh
server/tests/api/videos/video-hls.ts
server/tests/api/videos/video-transcoder.ts
server/tests/fixtures/sample.ogg [new file with mode: 0644]

index d7993fdc266b4e8f230004bd1bfb8ccf300ab027..38b48f1d6b78c907cc555d46487a07a0a2169a41 100644 (file)
@@ -19,7 +19,7 @@
     <my-edit-button [routerLink]="[ '/videos', 'update', video.uuid ]"></my-edit-button>
 
     <my-button i18n-label label="Change ownership"
-               className="action-button-change-ownership"
+               className="action-button-change-ownership grey-button"
                icon="im-with-her"
                (click)="changeOwnership($event, video)"
     ></my-button>
index 6d34d07f4697ef4db120726c141b088757cc1fa1..cf334e8d59c1d641c4737d67ccff519ff4cb095e 100644 (file)
@@ -9,7 +9,7 @@ import { GlobalIconName } from '@app/shared/images/global-icon.component'
 
 export class ButtonComponent {
   @Input() label = ''
-  @Input() className: 'orange-button' | 'grey-button' = 'grey-button'
+  @Input() className = 'grey-button'
   @Input() icon: GlobalIconName = undefined
   @Input() title: string = undefined
 
index 4d12a84c06f20801b70ba04c2f80d1c1609c1dfa..d278e7015b329307c8a3cb77939d56ca8ed04a2c 100644 (file)
@@ -1,4 +1,4 @@
-<span class="action-button action-button-delete" [title]="getTitle()" role="button">
+<span class="action-button action-button-delete grey-button" [title]="getTitle()" role="button">
   <my-global-icon iconName="delete"></my-global-icon>
 
   <span class="button-label" *ngIf="label">{{ label }}</span>
index da3addbae2a517a91816e12f0afc5f71b9bbee97..3d7cd47803ef3cc591f9e9af238d645d24e7b005 100644 (file)
@@ -1,4 +1,4 @@
-<a class="action-button action-button-edit" [routerLink]="routerLink" i18n-title title="Edit">
+<a class="action-button action-button-edit grey-button" [routerLink]="routerLink" i18n-title title="Edit">
   <my-global-icon iconName="edit"></my-global-icon>
 
   <span class="button-label" *ngIf="label">{{ label }}</span>
index a5515afa4f23d6acd66c2a8db73b9052c58e24a7..de7300366374710800fc4c66409b4db7bb2d8040 100644 (file)
@@ -31,3 +31,4 @@ signup:
 transcoding:
   enabled: true
   allow_additional_extensions: true
+  allow_audio_files: true
index a2a615a797b8bf656ff3fe8d98adcb6e48ffd977..40a2c972b9ccef040387534637d179d15f690637 100644 (file)
@@ -1,12 +1,19 @@
 import * as express from 'express'
 import { extname, join } from 'path'
-import { VideoCreate, VideoPrivacy, VideoResolution, VideoState, VideoUpdate } from '../../../../shared'
+import { VideoCreate, VideoPrivacy, VideoState, VideoUpdate } from '../../../../shared'
 import { getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils'
 import { logger } from '../../../helpers/logger'
 import { auditLoggerFactory, getAuditIdFromRes, VideoAuditView } from '../../../helpers/audit-logger'
 import { getFormattedObjects, getServerActor } from '../../../helpers/utils'
 import { autoBlacklistVideoIfNeeded } from '../../../lib/video-blacklist'
-import { MIMETYPES, VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES, DEFAULT_AUDIO_RESOLUTION } from '../../../initializers/constants'
+import {
+  DEFAULT_AUDIO_RESOLUTION,
+  MIMETYPES,
+  VIDEO_CATEGORIES,
+  VIDEO_LANGUAGES,
+  VIDEO_LICENCES,
+  VIDEO_PRIVACIES
+} from '../../../initializers/constants'
 import {
   changeVideoChannelShare,
   federateVideoIfNeeded,
index 718d0893b117f2f911bd72e6dfb0885778bc6281..8a11101ff020cf08b5ca40ac09aba78a3b8ddda8 100644 (file)
@@ -509,8 +509,8 @@ const THUMBNAILS_SIZE = {
   height: 122
 }
 const PREVIEWS_SIZE = {
-  width: 560,
-  height: 315
+  width: 850,
+  height: 480
 }
 const AVATARS_SIZE = {
   width: 120,
index 2ad477c995756ab69e5df029404edd5e2c07d226..8ea21158ad33212414293fb09a05259caabc2b12 100644 (file)
@@ -15,7 +15,7 @@ import {
   registerUser,
   reRunServer, ServerInfo,
   setAccessTokensToServers,
-  updateCustomConfig
+  updateCustomConfig, uploadVideo
 } from '../../../../shared/extra-utils'
 import { ServerConfig } from '../../../../shared/models'
 
@@ -160,6 +160,9 @@ describe('Test config', function () {
     expect(data.video.file.extensions).to.contain('.webm')
     expect(data.video.file.extensions).to.contain('.ogv')
 
+    await uploadVideo(server.url, server.accessToken, { fixture: 'video_short.mkv' }, 400)
+    await uploadVideo(server.url, server.accessToken, { fixture: 'sample.ogg' }, 400)
+
     expect(data.contactForm.enabled).to.be.true
   })
 
@@ -272,6 +275,12 @@ describe('Test config', function () {
     expect(data.video.file.extensions).to.contain('.ogv')
     expect(data.video.file.extensions).to.contain('.flv')
     expect(data.video.file.extensions).to.contain('.mkv')
+    expect(data.video.file.extensions).to.contain('.mp3')
+    expect(data.video.file.extensions).to.contain('.ogg')
+    expect(data.video.file.extensions).to.contain('.flac')
+
+    await uploadVideo(server.url, server.accessToken, { fixture: 'video_short.mkv' }, 200)
+    await uploadVideo(server.url, server.accessToken, { fixture: 'sample.ogg' }, 200)
   })
 
   it('Should have the configuration updated after a restart', async function () {
index 6346546261a3b12c25fe2b0cdc30737d99b13d1c..3ab2fe1202aca5bff739fa7058113c9c5c482a77 100644 (file)
@@ -26,7 +26,7 @@ describe('Test jobs', function () {
   })
 
   it('Should create some jobs', async function () {
-    this.timeout(30000)
+    this.timeout(60000)
 
     await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video1' })
     await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video2' })
index 82c1864b4069ab741de0f077bfbc61ba9ee1aedb..ba7a061b0f4223b60e418c1be48d3cf7e240fb90 100644 (file)
@@ -5,5 +5,5 @@ set -eu
 serverFiles=$(find server/tests/api/server -type f | grep -v index.ts | xargs echo)
 usersFiles=$(find server/tests/api/users -type f | grep -v index.ts | xargs echo)
 
-MOCHA_PARALLEL=true mocha-parallel-tests --max-parallel $1 --timeout 5000 --exit --require ts-node/register --bail \
+MOCHA_PARALLEL=true mocha --timeout 5000 --exit --require ts-node/register --bail \
     $serverFiles $usersFiles
index 504c50dee006a10d46d935568b45fc9e8cad1aba..eacd9ab79a969e279e1a156b26ee702c129baf88 100644 (file)
@@ -21,12 +21,11 @@ import {
 import { VideoDetails } from '../../../../shared/models/videos'
 import { VideoStreamingPlaylistType } from '../../../../shared/models/videos/video-streaming-playlist.type'
 import { join } from 'path'
+import { DEFAULT_AUDIO_RESOLUTION } from '../../../initializers/constants'
 
 const expect = chai.expect
 
-async function checkHlsPlaylist (servers: ServerInfo[], videoUUID: string) {
-  const resolutions = [ 240, 360, 480, 720 ]
-
+async function checkHlsPlaylist (servers: ServerInfo[], videoUUID: string, resolutions = [ 240, 360, 480, 720 ]) {
   for (const server of servers) {
     const res = await getVideo(server.url, videoUUID)
     const videoDetails: VideoDetails = res.body
@@ -41,9 +40,8 @@ async function checkHlsPlaylist (servers: ServerInfo[], videoUUID: string) {
 
       const masterPlaylist = res2.text
 
-      expect(masterPlaylist).to.contain('#EXT-X-STREAM-INF:BANDWIDTH=55472,RESOLUTION=640x360,FRAME-RATE=25')
-
       for (const resolution of resolutions) {
+        expect(masterPlaylist).to.match(new RegExp('#EXT-X-STREAM-INF:BANDWIDTH=\\d+,RESOLUTION=\\d+x' + resolution + ',FRAME-RATE=\\d+'))
         expect(masterPlaylist).to.contain(`${resolution}.m3u8`)
       }
     }
@@ -70,11 +68,21 @@ async function checkHlsPlaylist (servers: ServerInfo[], videoUUID: string) {
 describe('Test HLS videos', function () {
   let servers: ServerInfo[] = []
   let videoUUID = ''
+  let videoAudioUUID = ''
 
   before(async function () {
     this.timeout(120000)
 
-    servers = await flushAndRunMultipleServers(2, { transcoding: { enabled: true, hls: { enabled: true } } })
+    const configOverride = {
+      transcoding: {
+        enabled: true,
+        allow_audio_files: true,
+        hls: {
+          enabled: true
+        }
+      }
+    }
+    servers = await flushAndRunMultipleServers(2, configOverride)
 
     // Get the access tokens
     await setAccessTokensToServers(servers)
@@ -86,16 +94,25 @@ describe('Test HLS videos', function () {
   it('Should upload a video and transcode it to HLS', async function () {
     this.timeout(120000)
 
-    {
-      const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'video 1', fixture: 'video_short.webm' })
-      videoUUID = res.body.video.uuid
-    }
+    const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'video 1', fixture: 'video_short.webm' })
+    videoUUID = res.body.video.uuid
 
     await waitJobs(servers)
 
     await checkHlsPlaylist(servers, videoUUID)
   })
 
+  it('Should upload an audio file and transcode it to HLS', async function () {
+    this.timeout(120000)
+
+    const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'video audio', fixture: 'sample.ogg' })
+    videoAudioUUID = res.body.video.uuid
+
+    await waitJobs(servers)
+
+    await checkHlsPlaylist(servers, videoAudioUUID, [ DEFAULT_AUDIO_RESOLUTION ])
+  })
+
   it('Should update the video', async function () {
     await updateVideo(servers[0].url, servers[0].accessToken, videoUUID, { name: 'video 1 updated' })
 
@@ -104,13 +121,15 @@ describe('Test HLS videos', function () {
     await checkHlsPlaylist(servers, videoUUID)
   })
 
-  it('Should delete the video', async function () {
+  it('Should delete videos', async function () {
     await removeVideo(servers[0].url, servers[0].accessToken, videoUUID)
+    await removeVideo(servers[0].url, servers[0].accessToken, videoAudioUUID)
 
     await waitJobs(servers)
 
     for (const server of servers) {
       await getVideo(server.url, videoUUID, 404)
+      await getVideo(server.url, videoAudioUUID, 404)
     }
   })
 
index cfd0c8430abd55c63375e26c10243c5b515dedee..90ade16525aa35ae059ad90f7325e255c26420a9 100644 (file)
@@ -14,6 +14,7 @@ import {
   getMyVideos,
   getVideo,
   getVideosList,
+  makeGetRequest,
   root,
   ServerInfo,
   setAccessTokensToServers,
@@ -365,6 +366,56 @@ describe('Test video transcoding', function () {
     expect(await canDoQuickTranscode(buildAbsoluteFixturePath('video_short.webm'))).to.be.false
   })
 
+  it('Should merge an audio file with the preview file', async function () {
+    this.timeout(60000)
+
+    const videoAttributesArg = { name: 'audio_with_preview', previewfile: 'preview.jpg', fixture: 'sample.ogg' }
+    await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, videoAttributesArg)
+
+    await waitJobs(servers)
+
+    for (const server of servers) {
+      const res = await getVideosList(server.url)
+
+      const video = res.body.data.find(v => v.name === 'audio_with_preview')
+      const res2 = await getVideo(server.url, video.id)
+      const videoDetails: VideoDetails = res2.body
+
+      expect(videoDetails.files).to.have.lengthOf(1)
+
+      await makeGetRequest({ url: server.url, path: videoDetails.thumbnailPath, statusCodeExpected: 200 })
+      await makeGetRequest({ url: server.url, path: videoDetails.previewPath, statusCodeExpected: 200 })
+
+      const magnetUri = videoDetails.files[ 0 ].magnetUri
+      expect(magnetUri).to.contain('.mp4')
+    }
+  })
+
+  it('Should upload an audio file and choose a default background image', async function () {
+    this.timeout(60000)
+
+    const videoAttributesArg = { name: 'audio_without_preview', fixture: 'sample.ogg' }
+    await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, videoAttributesArg)
+
+    await waitJobs(servers)
+
+    for (const server of servers) {
+      const res = await getVideosList(server.url)
+
+      const video = res.body.data.find(v => v.name === 'audio_without_preview')
+      const res2 = await getVideo(server.url, video.id)
+      const videoDetails = res2.body
+
+      expect(videoDetails.files).to.have.lengthOf(1)
+
+      await makeGetRequest({ url: server.url, path: videoDetails.thumbnailPath, statusCodeExpected: 200 })
+      await makeGetRequest({ url: server.url, path: videoDetails.previewPath, statusCodeExpected: 200 })
+
+      const magnetUri = videoDetails.files[ 0 ].magnetUri
+      expect(magnetUri).to.contain('.mp4')
+    }
+  })
+
   after(async function () {
     await cleanupTests(servers)
   })
diff --git a/server/tests/fixtures/sample.ogg b/server/tests/fixtures/sample.ogg
new file mode 100644 (file)
index 0000000..0d7f43e
Binary files /dev/null and b/server/tests/fixtures/sample.ogg differ