From 9c5cc501335b9f7dba4aa492b8fda68d4881d28d Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 2 Jun 2023 15:18:39 +0200 Subject: Add script to generate storyboards --- .../lib/job-queue/handlers/generate-storyboard.ts | 5 + server/tests/cli/create-generate-storyboard-job.ts | 120 +++++++++++++++++++++ server/tests/cli/index.ts | 1 + 3 files changed, 126 insertions(+) create mode 100644 server/tests/cli/create-generate-storyboard-job.ts (limited to 'server') diff --git a/server/lib/job-queue/handlers/generate-storyboard.ts b/server/lib/job-queue/handlers/generate-storyboard.ts index 652cac272..09b746a3e 100644 --- a/server/lib/job-queue/handlers/generate-storyboard.ts +++ b/server/lib/job-queue/handlers/generate-storyboard.ts @@ -43,6 +43,11 @@ async function processGenerateStoryboard (job: Job): Promise { const destination = join(CONFIG.STORAGE.STORYBOARDS_DIR, filename) const totalSprites = buildTotalSprites(video) + if (totalSprites === 0) { + logger.info('Do not generate a storyboard of %s because the video is not long enough', payload.videoUUID, lTags) + return + } + const spriteDuration = Math.round(video.duration / totalSprites) const spritesCount = findGridSize({ diff --git a/server/tests/cli/create-generate-storyboard-job.ts b/server/tests/cli/create-generate-storyboard-job.ts new file mode 100644 index 000000000..02a4be8ae --- /dev/null +++ b/server/tests/cli/create-generate-storyboard-job.ts @@ -0,0 +1,120 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ + +import { expect } from 'chai' +import { readdir, remove } from 'fs-extra' +import { join } from 'path' +import { HttpStatusCode } from '@shared/models' +import { + cleanupTests, + createMultipleServers, + doubleFollow, + makeGetRequest, + PeerTubeServer, + setAccessTokensToServers, + waitJobs +} from '@shared/server-commands' +import { SQLCommand } from '../shared' + +function listStoryboardFiles (server: PeerTubeServer) { + const storage = server.getDirectoryPath('storyboards') + + return readdir(storage) +} + +describe('Test create generate storyboard job', function () { + let servers: PeerTubeServer[] = [] + const uuids: string[] = [] + let sql: SQLCommand + let existingStoryboardName: string + + before(async function () { + this.timeout(120000) + + // Run server 2 to have transcoding enabled + servers = await createMultipleServers(2) + await setAccessTokensToServers(servers) + + await doubleFollow(servers[0], servers[1]) + + for (let i = 0; i < 3; i++) { + const { uuid } = await servers[0].videos.quickUpload({ name: 'video ' + i }) + uuids.push(uuid) + } + + await waitJobs(servers) + + const storage = servers[0].getDirectoryPath('storyboards') + for (const storyboard of await listStoryboardFiles(servers[0])) { + await remove(join(storage, storyboard)) + } + + sql = new SQLCommand(servers[0]) + await sql.deleteAll('storyboard') + + const { uuid } = await servers[0].videos.quickUpload({ name: 'video 4' }) + uuids.push(uuid) + + await waitJobs(servers) + + const storyboards = await listStoryboardFiles(servers[0]) + existingStoryboardName = storyboards[0] + }) + + it('Should create a storyboard of a video', async function () { + this.timeout(120000) + + for (const uuid of [ uuids[0], uuids[3] ]) { + const command = `npm run create-generate-storyboard-job -- -v ${uuid}` + await servers[0].cli.execWithEnv(command) + } + + await waitJobs(servers) + + { + const storyboards = await listStoryboardFiles(servers[0]) + expect(storyboards).to.have.lengthOf(2) + expect(storyboards).to.not.include(existingStoryboardName) + + existingStoryboardName = storyboards[0] + } + + for (const server of servers) { + for (const uuid of [ uuids[0], uuids[3] ]) { + const { storyboards } = await server.storyboard.list({ id: uuid }) + expect(storyboards).to.have.lengthOf(1) + + await makeGetRequest({ url: server.url, path: storyboards[0].storyboardPath, expectedStatus: HttpStatusCode.OK_200 }) + } + } + }) + + it('Should create missing storyboards', async function () { + this.timeout(120000) + + const command = `npm run create-generate-storyboard-job -- -a` + await servers[0].cli.execWithEnv(command) + + await waitJobs(servers) + + { + const storyboards = await listStoryboardFiles(servers[0]) + expect(storyboards).to.have.lengthOf(4) + expect(storyboards).to.include(existingStoryboardName) + } + + for (const server of servers) { + for (const uuid of uuids) { + const { storyboards } = await server.storyboard.list({ id: uuid }) + expect(storyboards).to.have.lengthOf(1) + + await makeGetRequest({ url: server.url, path: storyboards[0].storyboardPath, expectedStatus: HttpStatusCode.OK_200 }) + } + } + }) + + after(async function () { + await sql.cleanup() + + await cleanupTests(servers) + }) +}) diff --git a/server/tests/cli/index.ts b/server/tests/cli/index.ts index 8579be39c..94444ace3 100644 --- a/server/tests/cli/index.ts +++ b/server/tests/cli/index.ts @@ -1,5 +1,6 @@ // Order of the tests we want to execute import './create-import-video-file-job' +import './create-generate-storyboard-job' import './create-move-video-storage-job' import './peertube' import './plugins' -- cgit v1.2.3