diff options
Diffstat (limited to 'server/lib')
-rw-r--r-- | server/lib/job-queue/handlers/video-import.ts | 35 | ||||
-rw-r--r-- | server/lib/videos.ts | 27 |
2 files changed, 47 insertions, 15 deletions
diff --git a/server/lib/job-queue/handlers/video-import.ts b/server/lib/job-queue/handlers/video-import.ts index 09f225cec..d8052da72 100644 --- a/server/lib/job-queue/handlers/video-import.ts +++ b/server/lib/job-queue/handlers/video-import.ts | |||
@@ -8,7 +8,6 @@ import { extname } from 'path' | |||
8 | import { VideoFileModel } from '../../../models/video/video-file' | 8 | import { VideoFileModel } from '../../../models/video/video-file' |
9 | import { VIDEO_IMPORT_TIMEOUT } from '../../../initializers/constants' | 9 | import { VIDEO_IMPORT_TIMEOUT } from '../../../initializers/constants' |
10 | import { VideoState } from '../../../../shared' | 10 | import { VideoState } from '../../../../shared' |
11 | import { JobQueue } from '../index' | ||
12 | import { federateVideoIfNeeded } from '../../activitypub' | 11 | import { federateVideoIfNeeded } from '../../activitypub' |
13 | import { VideoModel } from '../../../models/video/video' | 12 | import { VideoModel } from '../../../models/video/video' |
14 | import { createTorrentAndSetInfoHash, downloadWebTorrentVideo } from '../../../helpers/webtorrent' | 13 | import { createTorrentAndSetInfoHash, downloadWebTorrentVideo } from '../../../helpers/webtorrent' |
@@ -22,6 +21,7 @@ import { ThumbnailType } from '../../../../shared/models/videos/thumbnail.type' | |||
22 | import { MThumbnail } from '../../../typings/models/video/thumbnail' | 21 | import { MThumbnail } from '../../../typings/models/video/thumbnail' |
23 | import { MVideoImportDefault, MVideoImportDefaultFiles, MVideoImportVideo } from '@server/typings/models/video/video-import' | 22 | import { MVideoImportDefault, MVideoImportDefaultFiles, MVideoImportVideo } from '@server/typings/models/video/video-import' |
24 | import { getVideoFilePath } from '@server/lib/video-paths' | 23 | import { getVideoFilePath } from '@server/lib/video-paths' |
24 | import { addOptimizeOrMergeAudioJob } from '@server/lib/videos' | ||
25 | 25 | ||
26 | type VideoImportYoutubeDLPayload = { | 26 | type VideoImportYoutubeDLPayload = { |
27 | type: 'youtube-dl' | 27 | type: 'youtube-dl' |
@@ -30,6 +30,8 @@ type VideoImportYoutubeDLPayload = { | |||
30 | thumbnailUrl: string | 30 | thumbnailUrl: string |
31 | downloadThumbnail: boolean | 31 | downloadThumbnail: boolean |
32 | downloadPreview: boolean | 32 | downloadPreview: boolean |
33 | |||
34 | fileExt?: string | ||
33 | } | 35 | } |
34 | 36 | ||
35 | type VideoImportTorrentPayload = { | 37 | type VideoImportTorrentPayload = { |
@@ -90,7 +92,7 @@ async function processYoutubeDLImport (job: Bull.Job, payload: VideoImportYoutub | |||
90 | generatePreview: false | 92 | generatePreview: false |
91 | } | 93 | } |
92 | 94 | ||
93 | return processFile(() => downloadYoutubeDLVideo(videoImport.targetUrl, VIDEO_IMPORT_TIMEOUT), videoImport, options) | 95 | return processFile(() => downloadYoutubeDLVideo(videoImport.targetUrl, payload.fileExt, VIDEO_IMPORT_TIMEOUT), videoImport, options) |
94 | } | 96 | } |
95 | 97 | ||
96 | async function getVideoImportOrDie (videoImportId: number) { | 98 | async function getVideoImportOrDie (videoImportId: number) { |
@@ -154,16 +156,28 @@ async function processFile (downloader: () => Promise<string>, videoImport: MVid | |||
154 | // Process thumbnail | 156 | // Process thumbnail |
155 | let thumbnailModel: MThumbnail | 157 | let thumbnailModel: MThumbnail |
156 | if (options.downloadThumbnail && options.thumbnailUrl) { | 158 | if (options.downloadThumbnail && options.thumbnailUrl) { |
157 | thumbnailModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImportWithFiles.Video, ThumbnailType.MINIATURE) | 159 | try { |
158 | } else if (options.generateThumbnail || options.downloadThumbnail) { | 160 | thumbnailModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImportWithFiles.Video, ThumbnailType.MINIATURE) |
161 | } catch (err) { | ||
162 | logger.warn('Cannot generate video thumbnail %s for %s.', options.thumbnailUrl, videoImportWithFiles.Video.url, { err }) | ||
163 | } | ||
164 | } | ||
165 | |||
166 | if (!thumbnailModel && (options.generateThumbnail || options.downloadThumbnail)) { | ||
159 | thumbnailModel = await generateVideoMiniature(videoImportWithFiles.Video, videoFile, ThumbnailType.MINIATURE) | 167 | thumbnailModel = await generateVideoMiniature(videoImportWithFiles.Video, videoFile, ThumbnailType.MINIATURE) |
160 | } | 168 | } |
161 | 169 | ||
162 | // Process preview | 170 | // Process preview |
163 | let previewModel: MThumbnail | 171 | let previewModel: MThumbnail |
164 | if (options.downloadPreview && options.thumbnailUrl) { | 172 | if (options.downloadPreview && options.thumbnailUrl) { |
165 | previewModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImportWithFiles.Video, ThumbnailType.PREVIEW) | 173 | try { |
166 | } else if (options.generatePreview || options.downloadPreview) { | 174 | previewModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImportWithFiles.Video, ThumbnailType.PREVIEW) |
175 | } catch (err) { | ||
176 | logger.warn('Cannot generate video preview %s for %s.', options.thumbnailUrl, videoImportWithFiles.Video.url, { err }) | ||
177 | } | ||
178 | } | ||
179 | |||
180 | if (!previewModel && (options.generatePreview || options.downloadPreview)) { | ||
167 | previewModel = await generateVideoMiniature(videoImportWithFiles.Video, videoFile, ThumbnailType.PREVIEW) | 181 | previewModel = await generateVideoMiniature(videoImportWithFiles.Video, videoFile, ThumbnailType.PREVIEW) |
168 | } | 182 | } |
169 | 183 | ||
@@ -214,14 +228,7 @@ async function processFile (downloader: () => Promise<string>, videoImport: MVid | |||
214 | 228 | ||
215 | // Create transcoding jobs? | 229 | // Create transcoding jobs? |
216 | if (video.state === VideoState.TO_TRANSCODE) { | 230 | if (video.state === VideoState.TO_TRANSCODE) { |
217 | // Put uuid because we don't have id auto incremented for now | 231 | await addOptimizeOrMergeAudioJob(videoImportUpdated.Video, videoFile) |
218 | const dataInput = { | ||
219 | type: 'optimize' as 'optimize', | ||
220 | videoUUID: videoImportUpdated.Video.uuid, | ||
221 | isNewVideo: true | ||
222 | } | ||
223 | |||
224 | await JobQueue.Instance.createJobWithPromise({ type: 'video-transcoding', payload: dataInput }) | ||
225 | } | 232 | } |
226 | 233 | ||
227 | } catch (err) { | 234 | } catch (err) { |
diff --git a/server/lib/videos.ts b/server/lib/videos.ts index 22e9afbf9..96bdd42e9 100644 --- a/server/lib/videos.ts +++ b/server/lib/videos.ts | |||
@@ -1,4 +1,7 @@ | |||
1 | import { isStreamingPlaylist, MStreamingPlaylistVideo, MVideo } from '@server/typings/models' | 1 | import { isStreamingPlaylist, MStreamingPlaylistVideo, MVideo, MVideoFile } from '@server/typings/models' |
2 | import { VideoTranscodingPayload } from '@server/lib/job-queue/handlers/video-transcoding' | ||
3 | import { DEFAULT_AUDIO_RESOLUTION } from '@server/initializers/constants' | ||
4 | import { JobQueue } from '@server/lib/job-queue' | ||
2 | 5 | ||
3 | function extractVideo (videoOrPlaylist: MVideo | MStreamingPlaylistVideo) { | 6 | function extractVideo (videoOrPlaylist: MVideo | MStreamingPlaylistVideo) { |
4 | return isStreamingPlaylist(videoOrPlaylist) | 7 | return isStreamingPlaylist(videoOrPlaylist) |
@@ -6,6 +9,28 @@ function extractVideo (videoOrPlaylist: MVideo | MStreamingPlaylistVideo) { | |||
6 | : videoOrPlaylist | 9 | : videoOrPlaylist |
7 | } | 10 | } |
8 | 11 | ||
12 | function addOptimizeOrMergeAudioJob (video: MVideo, videoFile: MVideoFile) { | ||
13 | let dataInput: VideoTranscodingPayload | ||
14 | |||
15 | if (videoFile.isAudio()) { | ||
16 | dataInput = { | ||
17 | type: 'merge-audio' as 'merge-audio', | ||
18 | resolution: DEFAULT_AUDIO_RESOLUTION, | ||
19 | videoUUID: video.uuid, | ||
20 | isNewVideo: true | ||
21 | } | ||
22 | } else { | ||
23 | dataInput = { | ||
24 | type: 'optimize' as 'optimize', | ||
25 | videoUUID: video.uuid, | ||
26 | isNewVideo: true | ||
27 | } | ||
28 | } | ||
29 | |||
30 | return JobQueue.Instance.createJobWithPromise({ type: 'video-transcoding', payload: dataInput }) | ||
31 | } | ||
32 | |||
9 | export { | 33 | export { |
34 | addOptimizeOrMergeAudioJob, | ||
10 | extractVideo | 35 | extractVideo |
11 | } | 36 | } |