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: [PATCH] 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 --- .../video-import-url.component.ts | 37 ++++++++++++-- server/controllers/api/videos/import.ts | 46 +++++++++++++++--- server/lib/job-queue/handlers/video-import.ts | 42 +++------------- server/tests/api/videos/video-imports.ts | 5 ++ .../tests/fixtures/video_import_preview.jpg | Bin 0 -> 37360 bytes .../tests/fixtures/video_import_thumbnail.jpg | Bin 0 -> 5885 bytes 6 files changed, 86 insertions(+), 44 deletions(-) create mode 100644 server/tests/fixtures/video_import_preview.jpg create mode 100644 server/tests/fixtures/video_import_thumbnail.jpg diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts index a17d73683..213c42333 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts @@ -11,7 +11,7 @@ import { VideoEdit } from '@app/shared/video/video-edit.model' import { FormValidatorService } from '@app/shared' import { VideoCaptionService } from '@app/shared/video-caption' import { VideoImportService } from '@app/shared/video-import' -import { scrollToTop } from '@app/shared/misc/utils' +import { scrollToTop, getAbsoluteAPIUrl } from '@app/shared/misc/utils' import { switchMap, map } from 'rxjs/operators' @Component({ @@ -95,12 +95,22 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom this.isImportingVideo = false this.hasImportedVideo = true + const absoluteAPIUrl = getAbsoluteAPIUrl() + + const thumbnailUrl = video.thumbnailPath + ? absoluteAPIUrl + video.thumbnailPath + : null + + const previewUrl = video.previewPath + ? absoluteAPIUrl + video.previewPath + : null + this.video = new VideoEdit(Object.assign(video, { commentsEnabled: videoUpdate.commentsEnabled, downloadEnabled: videoUpdate.downloadEnabled, support: null, - thumbnailUrl: null, - previewUrl: null + thumbnailUrl, + previewUrl })) this.videoCaptions = videoCaptions @@ -147,5 +157,26 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom private hydrateFormFromVideo () { this.form.patchValue(this.video.toFormPatch()) + + const objects = [ + { + url: 'thumbnailUrl', + name: 'thumbnailfile' + }, + { + url: 'previewUrl', + name: 'previewfile' + } + ] + + for (const obj of objects) { + fetch(this.video[obj.url]) + .then(response => response.blob()) + .then(data => { + this.form.patchValue({ + [ obj.name ]: data + }) + }) + } } } 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 diff --git a/server/lib/job-queue/handlers/video-import.ts b/server/lib/job-queue/handlers/video-import.ts index d8052da72..6cdae5b03 100644 --- a/server/lib/job-queue/handlers/video-import.ts +++ b/server/lib/job-queue/handlers/video-import.ts @@ -16,7 +16,7 @@ import { move, remove, stat } from 'fs-extra' import { Notifier } from '../../notifier' import { CONFIG } from '../../../initializers/config' import { sequelizeTypescript } from '../../../initializers/database' -import { createVideoMiniatureFromUrl, generateVideoMiniature } from '../../thumbnail' +import { generateVideoMiniature } from '../../thumbnail' import { ThumbnailType } from '../../../../shared/models/videos/thumbnail.type' import { MThumbnail } from '../../../typings/models/video/thumbnail' import { MVideoImportDefault, MVideoImportDefaultFiles, MVideoImportVideo } from '@server/typings/models/video/video-import' @@ -27,9 +27,8 @@ type VideoImportYoutubeDLPayload = { type: 'youtube-dl' videoImportId: number - thumbnailUrl: string - downloadThumbnail: boolean - downloadPreview: boolean + generateThumbnail: boolean + generatePreview: boolean fileExt?: string } @@ -64,9 +63,6 @@ async function processTorrentImport (job: Bull.Job, payload: VideoImportTorrentP const options = { videoImportId: payload.videoImportId, - downloadThumbnail: false, - downloadPreview: false, - generateThumbnail: true, generatePreview: true } @@ -84,12 +80,8 @@ async function processYoutubeDLImport (job: Bull.Job, payload: VideoImportYoutub const options = { videoImportId: videoImport.id, - downloadThumbnail: payload.downloadThumbnail, - downloadPreview: payload.downloadPreview, - thumbnailUrl: payload.thumbnailUrl, - - generateThumbnail: false, - generatePreview: false + generateThumbnail: payload.generateThumbnail, + generatePreview: payload.generatePreview } return processFile(() => downloadYoutubeDLVideo(videoImport.targetUrl, payload.fileExt, VIDEO_IMPORT_TIMEOUT), videoImport, options) @@ -107,10 +99,6 @@ async function getVideoImportOrDie (videoImportId: number) { type ProcessFileOptions = { videoImportId: number - downloadThumbnail: boolean - downloadPreview: boolean - thumbnailUrl?: string - generateThumbnail: boolean generatePreview: boolean } @@ -155,29 +143,13 @@ async function processFile (downloader: () => Promise, videoImport: MVid // Process thumbnail let thumbnailModel: MThumbnail - if (options.downloadThumbnail && options.thumbnailUrl) { - try { - thumbnailModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImportWithFiles.Video, ThumbnailType.MINIATURE) - } catch (err) { - logger.warn('Cannot generate video thumbnail %s for %s.', options.thumbnailUrl, videoImportWithFiles.Video.url, { err }) - } - } - - if (!thumbnailModel && (options.generateThumbnail || options.downloadThumbnail)) { + if (options.generateThumbnail) { thumbnailModel = await generateVideoMiniature(videoImportWithFiles.Video, videoFile, ThumbnailType.MINIATURE) } // Process preview let previewModel: MThumbnail - if (options.downloadPreview && options.thumbnailUrl) { - try { - previewModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImportWithFiles.Video, ThumbnailType.PREVIEW) - } catch (err) { - logger.warn('Cannot generate video preview %s for %s.', options.thumbnailUrl, videoImportWithFiles.Video.url, { err }) - } - } - - if (!previewModel && (options.generatePreview || options.downloadPreview)) { + if (options.generatePreview) { previewModel = await generateVideoMiniature(videoImportWithFiles.Video, videoFile, ThumbnailType.PREVIEW) } diff --git a/server/tests/api/videos/video-imports.ts b/server/tests/api/videos/video-imports.ts index 8e179b825..4d5989f43 100644 --- a/server/tests/api/videos/video-imports.ts +++ b/server/tests/api/videos/video-imports.ts @@ -19,6 +19,7 @@ import { } from '../../../../shared/extra-utils' import { waitJobs } from '../../../../shared/extra-utils/server/jobs' import { getMagnetURI, getMyVideoImports, getYoutubeVideoUrl, importVideo } from '../../../../shared/extra-utils/videos/video-imports' +import { testImage } from '../../../../shared/extra-utils/miscs/miscs' const expect = chai.expect @@ -118,6 +119,10 @@ describe('Test video imports', function () { const attributes = immutableAssign(baseAttributes, { targetUrl: getYoutubeVideoUrl() }) const res = await importVideo(servers[0].url, servers[0].accessToken, attributes) expect(res.body.video.name).to.equal('small video - youtube') + expect(res.body.video.thumbnailPath).to.equal(`/static/thumbnails/${res.body.video.uuid}.jpg`) + expect(res.body.video.previewPath).to.equal(`/static/previews/${res.body.video.uuid}.jpg`) + await testImage(servers[0].url, 'video_import_thumbnail', res.body.video.thumbnailPath) + await testImage(servers[0].url, 'video_import_preview', res.body.video.previewPath) const resCaptions = await listVideoCaptions(servers[0].url, res.body.video.id) const videoCaptions: VideoCaption[] = resCaptions.body.data diff --git a/server/tests/fixtures/video_import_preview.jpg b/server/tests/fixtures/video_import_preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f8d1d91d7a53f785423708bc9366a1d5a285b6f GIT binary patch literal 37360 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 literal 0 HcmV?d00001 -- 2.41.0