From 1ef65f4c034cc53ab5d55417e52d60e1f7fc1ddb Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 17 Sep 2020 10:00:46 +0200 Subject: Refactor video creation --- server/lib/video.ts | 68 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 6 deletions(-) (limited to 'server/lib/video.ts') diff --git a/server/lib/video.ts b/server/lib/video.ts index a28f31529..6df41e6cd 100644 --- a/server/lib/video.ts +++ b/server/lib/video.ts @@ -1,9 +1,12 @@ - +import { Transaction } from 'sequelize/types' +import { TagModel } from '@server/models/video/tag' import { VideoModel } from '@server/models/video/video' import { FilteredModelAttributes } from '@server/types' -import { VideoCreate, VideoPrivacy, VideoState } from '@shared/models' +import { MTag, MThumbnail, MVideoTag, MVideoThumbnail } from '@server/types/models' +import { ThumbnailType, VideoCreate, VideoPrivacy } from '@shared/models' +import { createVideoMiniatureFromExisting } from './thumbnail' -function buildLocalVideoFromCreate (videoInfo: VideoCreate, channelId: number): FilteredModelAttributes { +function buildLocalVideoFromReq (videoInfo: VideoCreate, channelId: number): FilteredModelAttributes { return { name: videoInfo.name, remote: false, @@ -13,19 +16,72 @@ function buildLocalVideoFromCreate (videoInfo: VideoCreate, channelId: number): commentsEnabled: videoInfo.commentsEnabled !== false, // If the value is not "false", the default is "true" downloadEnabled: videoInfo.downloadEnabled !== false, waitTranscoding: videoInfo.waitTranscoding || false, - state: VideoState.WAITING_FOR_LIVE, nsfw: videoInfo.nsfw || false, description: videoInfo.description, support: videoInfo.support, privacy: videoInfo.privacy || VideoPrivacy.PRIVATE, - duration: 0, channelId: channelId, originallyPublishedAt: videoInfo.originallyPublishedAt } } +async function buildVideoThumbnailsFromReq (options: { + video: MVideoThumbnail + files: { [fieldname: string]: Express.Multer.File[] } | Express.Multer.File[] + fallback: (type: ThumbnailType) => Promise + automaticallyGenerated?: boolean +}) { + const { video, files, fallback, automaticallyGenerated } = options + + const promises = [ + { + type: ThumbnailType.MINIATURE, + fieldName: 'thumbnailfile' + }, + { + type: ThumbnailType.PREVIEW, + fieldName: 'previewfile' + } + ].map(p => { + const fields = files?.[p.fieldName] + + if (fields) { + return createVideoMiniatureFromExisting({ + inputPath: fields[0].path, + video, + type: p.type, + automaticallyGenerated: automaticallyGenerated || false + }) + } + + return fallback(p.type) + }) + + return Promise.all(promises) +} + +async function setVideoTags (options: { + video: MVideoTag + tags: string[] + transaction?: Transaction + defaultValue?: MTag[] +}) { + const { video, tags, transaction, defaultValue } = options + // Set tags to the video + if (tags) { + const tagInstances = await TagModel.findOrCreateTags(tags, transaction) + + await video.$set('Tags', tagInstances, { transaction }) + video.Tags = tagInstances + } else { + video.Tags = defaultValue || [] + } +} + // --------------------------------------------------------------------------- export { - buildLocalVideoFromCreate + buildLocalVideoFromReq, + buildVideoThumbnailsFromReq, + setVideoTags } -- cgit v1.2.3