Add audio upload tests
This commit is contained in:
		
							parent
							
								
									7b992a86b1
								
							
						
					
					
						commit
						b345a8047b
					
				
					 13 changed files with 109 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,3 +31,4 @@ signup:
 | 
			
		|||
transcoding:
 | 
			
		||||
  enabled: true
 | 
			
		||||
  allow_additional_extensions: true
 | 
			
		||||
  allow_audio_files: true
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 () {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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' })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
  })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										
											BIN
										
									
								
								server/tests/fixtures/sample.ogg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								server/tests/fixtures/sample.ogg
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue