From b1770a0af464ad6350d156245b1abcc1395e142e Mon Sep 17 00:00:00 2001 From: Kim <1877318+kimsible@users.noreply.github.com> Date: Mon, 20 Apr 2020 10:28:38 +0200 Subject: Add thumbnail / preview generation from url on the fly (#2646) * Add thumbnails generation on the fly to URL import * Display generated preview to import first edit * Use ternary to get type inference * Move preview/thumbnail test just after import Co-authored-by: kimsible --- server/controllers/api/videos/import.ts | 46 ++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) (limited to 'server/controllers/api') diff --git a/server/controllers/api/videos/import.ts b/server/controllers/api/videos/import.ts index f4630375e..fb2de5dc0 100644 --- a/server/controllers/api/videos/import.ts +++ b/server/controllers/api/videos/import.ts @@ -23,7 +23,7 @@ import { move, readFile } from 'fs-extra' import { autoBlacklistVideoIfNeeded } from '../../../lib/video-blacklist' import { CONFIG } from '../../../initializers/config' import { sequelizeTypescript } from '../../../initializers/database' -import { createVideoMiniatureFromExisting } from '../../../lib/thumbnail' +import { createVideoMiniatureFromExisting, createVideoMiniatureFromUrl } from '../../../lib/thumbnail' import { ThumbnailType } from '../../../../shared/models/videos/thumbnail.type' import { MChannelAccountDefault, @@ -153,8 +153,25 @@ async function addYoutubeDLImport (req: express.Request, res: express.Response) const video = buildVideo(res.locals.videoChannel.id, body, youtubeDLInfo) - const thumbnailModel = await processThumbnail(req, video) - const previewModel = await processPreview(req, video) + let thumbnailModel: MThumbnail + + // Process video thumbnail from request.files + thumbnailModel = await processThumbnail(req, video) + + // Process video thumbnail from url if processing from request.files failed + if (!thumbnailModel) { + thumbnailModel = await processThumbnailFromUrl(youtubeDLInfo.thumbnailUrl, video) + } + + let previewModel: MThumbnail + + // Process video preview from request.files + previewModel = await processPreview(req, video) + + // Process video preview from url if processing from request.files failed + if (!previewModel) { + previewModel = await processPreviewFromUrl(youtubeDLInfo.thumbnailUrl, video) + } const tags = body.tags || youtubeDLInfo.tags const videoImportAttributes = { @@ -200,9 +217,8 @@ async function addYoutubeDLImport (req: express.Request, res: express.Response) const payload = { type: 'youtube-dl' as 'youtube-dl', videoImportId: videoImport.id, - thumbnailUrl: youtubeDLInfo.thumbnailUrl, - downloadThumbnail: !thumbnailModel, - downloadPreview: !previewModel, + generateThumbnail: !thumbnailModel, + generatePreview: !previewModel, fileExt: youtubeDLInfo.fileExt ? `.${youtubeDLInfo.fileExt}` : '.mp4' @@ -261,6 +277,24 @@ async function processPreview (req: express.Request, video: VideoModel) { return undefined } +async function processThumbnailFromUrl (url: string, video: VideoModel) { + try { + return createVideoMiniatureFromUrl(url, video, ThumbnailType.MINIATURE) + } catch (err) { + logger.warn('Cannot generate video thumbnail %s for %s.', url, video.url, { err }) + return undefined + } +} + +async function processPreviewFromUrl (url: string, video: VideoModel) { + try { + return createVideoMiniatureFromUrl(url, video, ThumbnailType.PREVIEW) + } catch (err) { + logger.warn('Cannot generate video preview %s for %s.', url, video.url, { err }) + return undefined + } +} + function insertIntoDB (parameters: { video: MVideoThumbnailAccountDefault thumbnailModel: MThumbnail -- cgit v1.2.3