import { VideoModel } from '../../../models/video/video'
import { VideoCaptionModel } from '../../../models/video/video-caption'
import { moveAndProcessCaptionFile } from '../../../helpers/captions-utils'
-import { getVideoActivityPubUrl } from '../../../lib/activitypub'
+import { getVideoActivityPubUrl } from '../../../lib/activitypub/url'
import { TagModel } from '../../../models/video/tag'
import { VideoImportModel } from '../../../models/video/video-import'
import { JobQueue } from '../../../lib/job-queue/job-queue'
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,
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 && youtubeDLInfo.thumbnailUrl) {
+ 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 && youtubeDLInfo.thumbnailUrl) {
+ previewModel = await processPreviewFromUrl(youtubeDLInfo.thumbnailUrl, video)
+ }
const tags = body.tags || youtubeDLInfo.tags
const videoImportAttributes = {
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'
remote: false,
category: body.category || importData.category,
licence: body.licence || importData.licence,
- language: body.language || undefined,
+ language: body.language || importData.language,
commentsEnabled: body.commentsEnabled !== false, // If the value is not "false", the default is "true"
downloadEnabled: body.downloadEnabled !== false,
waitTranscoding: body.waitTranscoding || false,
privacy: body.privacy || VideoPrivacy.PRIVATE,
duration: 0, // duration will be set by the import job
channelId: channelId,
- originallyPublishedAt: importData.originallyPublishedAt
+ originallyPublishedAt: body.originallyPublishedAt || importData.originallyPublishedAt
}
const video = new VideoModel(videoData)
video.url = getVideoActivityPubUrl(video)
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