diff options
Diffstat (limited to 'server/lib/job-queue/handlers/video-import.ts')
-rw-r--r-- | server/lib/job-queue/handlers/video-import.ts | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/server/lib/job-queue/handlers/video-import.ts b/server/lib/job-queue/handlers/video-import.ts index 13b741180..f9dda79f8 100644 --- a/server/lib/job-queue/handlers/video-import.ts +++ b/server/lib/job-queue/handlers/video-import.ts | |||
@@ -17,9 +17,10 @@ import { move, remove, stat } from 'fs-extra' | |||
17 | import { Notifier } from '../../notifier' | 17 | import { Notifier } from '../../notifier' |
18 | import { CONFIG } from '../../../initializers/config' | 18 | import { CONFIG } from '../../../initializers/config' |
19 | import { sequelizeTypescript } from '../../../initializers/database' | 19 | import { sequelizeTypescript } from '../../../initializers/database' |
20 | import { ThumbnailModel } from '../../../models/video/thumbnail' | ||
21 | import { createVideoMiniatureFromUrl, generateVideoMiniature } from '../../thumbnail' | 20 | import { createVideoMiniatureFromUrl, generateVideoMiniature } from '../../thumbnail' |
22 | import { ThumbnailType } from '../../../../shared/models/videos/thumbnail.type' | 21 | import { ThumbnailType } from '../../../../shared/models/videos/thumbnail.type' |
22 | import { MThumbnail } from '../../../typings/models/video/thumbnail' | ||
23 | import { MVideoImportDefault, MVideoImportDefaultFiles, MVideoImportVideo } from '@server/typings/models/video/video-import' | ||
23 | 24 | ||
24 | type VideoImportYoutubeDLPayload = { | 25 | type VideoImportYoutubeDLPayload = { |
25 | type: 'youtube-dl' | 26 | type: 'youtube-dl' |
@@ -110,11 +111,13 @@ type ProcessFileOptions = { | |||
110 | generateThumbnail: boolean | 111 | generateThumbnail: boolean |
111 | generatePreview: boolean | 112 | generatePreview: boolean |
112 | } | 113 | } |
113 | async function processFile (downloader: () => Promise<string>, videoImport: VideoImportModel, options: ProcessFileOptions) { | 114 | async function processFile (downloader: () => Promise<string>, videoImportArg: MVideoImportDefault, options: ProcessFileOptions) { |
114 | let tempVideoPath: string | 115 | let tempVideoPath: string |
115 | let videoDestFile: string | 116 | let videoDestFile: string |
116 | let videoFile: VideoFileModel | 117 | let videoFile: VideoFileModel |
117 | 118 | ||
119 | const videoImport = videoImportArg as MVideoImportDefaultFiles | ||
120 | |||
118 | try { | 121 | try { |
119 | // Download video from youtubeDL | 122 | // Download video from youtubeDL |
120 | tempVideoPath = await downloader() | 123 | tempVideoPath = await downloader() |
@@ -148,7 +151,7 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide | |||
148 | tempVideoPath = null // This path is not used anymore | 151 | tempVideoPath = null // This path is not used anymore |
149 | 152 | ||
150 | // Process thumbnail | 153 | // Process thumbnail |
151 | let thumbnailModel: ThumbnailModel | 154 | let thumbnailModel: MThumbnail |
152 | if (options.downloadThumbnail && options.thumbnailUrl) { | 155 | if (options.downloadThumbnail && options.thumbnailUrl) { |
153 | thumbnailModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImport.Video, ThumbnailType.MINIATURE) | 156 | thumbnailModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImport.Video, ThumbnailType.MINIATURE) |
154 | } else if (options.generateThumbnail || options.downloadThumbnail) { | 157 | } else if (options.generateThumbnail || options.downloadThumbnail) { |
@@ -156,7 +159,7 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide | |||
156 | } | 159 | } |
157 | 160 | ||
158 | // Process preview | 161 | // Process preview |
159 | let previewModel: ThumbnailModel | 162 | let previewModel: MThumbnail |
160 | if (options.downloadPreview && options.thumbnailUrl) { | 163 | if (options.downloadPreview && options.thumbnailUrl) { |
161 | previewModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImport.Video, ThumbnailType.PREVIEW) | 164 | previewModel = await createVideoMiniatureFromUrl(options.thumbnailUrl, videoImport.Video, ThumbnailType.PREVIEW) |
162 | } else if (options.generatePreview || options.downloadPreview) { | 165 | } else if (options.generatePreview || options.downloadPreview) { |
@@ -166,14 +169,15 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide | |||
166 | // Create torrent | 169 | // Create torrent |
167 | await videoImport.Video.createTorrentAndSetInfoHash(videoFile) | 170 | await videoImport.Video.createTorrentAndSetInfoHash(videoFile) |
168 | 171 | ||
169 | const videoImportUpdated: VideoImportModel = await sequelizeTypescript.transaction(async t => { | 172 | const { videoImportUpdated, video } = await sequelizeTypescript.transaction(async t => { |
173 | const videoImportToUpdate = videoImport as MVideoImportVideo | ||
174 | |||
170 | // Refresh video | 175 | // Refresh video |
171 | const video = await VideoModel.load(videoImport.videoId, t) | 176 | const video = await VideoModel.load(videoImportToUpdate.videoId, t) |
172 | if (!video) throw new Error('Video linked to import ' + videoImport.videoId + ' does not exist anymore.') | 177 | if (!video) throw new Error('Video linked to import ' + videoImportToUpdate.videoId + ' does not exist anymore.') |
173 | videoImport.Video = video | ||
174 | 178 | ||
175 | const videoFileCreated = await videoFile.save({ transaction: t }) | 179 | const videoFileCreated = await videoFile.save({ transaction: t }) |
176 | video.VideoFiles = [ videoFileCreated ] | 180 | videoImportToUpdate.Video = Object.assign(video, { VideoFiles: [ videoFileCreated ] }) |
177 | 181 | ||
178 | // Update video DB object | 182 | // Update video DB object |
179 | video.duration = duration | 183 | video.duration = duration |
@@ -188,25 +192,25 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide | |||
188 | await federateVideoIfNeeded(videoForFederation, true, t) | 192 | await federateVideoIfNeeded(videoForFederation, true, t) |
189 | 193 | ||
190 | // Update video import object | 194 | // Update video import object |
191 | videoImport.state = VideoImportState.SUCCESS | 195 | videoImportToUpdate.state = VideoImportState.SUCCESS |
192 | const videoImportUpdated = await videoImport.save({ transaction: t }) | 196 | const videoImportUpdated = await videoImportToUpdate.save({ transaction: t }) as MVideoImportVideo |
197 | videoImportUpdated.Video = video | ||
193 | 198 | ||
194 | logger.info('Video %s imported.', video.uuid) | 199 | logger.info('Video %s imported.', video.uuid) |
195 | 200 | ||
196 | videoImportUpdated.Video = videoForFederation | 201 | return { videoImportUpdated, video: videoForFederation } |
197 | return videoImportUpdated | ||
198 | }) | 202 | }) |
199 | 203 | ||
200 | Notifier.Instance.notifyOnFinishedVideoImport(videoImportUpdated, true) | 204 | Notifier.Instance.notifyOnFinishedVideoImport(videoImportUpdated, true) |
201 | 205 | ||
202 | if (videoImportUpdated.Video.isBlacklisted()) { | 206 | if (video.isBlacklisted()) { |
203 | Notifier.Instance.notifyOnVideoAutoBlacklist(videoImportUpdated.Video) | 207 | Notifier.Instance.notifyOnVideoAutoBlacklist(video) |
204 | } else { | 208 | } else { |
205 | Notifier.Instance.notifyOnNewVideoIfNeeded(videoImportUpdated.Video) | 209 | Notifier.Instance.notifyOnNewVideoIfNeeded(video) |
206 | } | 210 | } |
207 | 211 | ||
208 | // Create transcoding jobs? | 212 | // Create transcoding jobs? |
209 | if (videoImportUpdated.Video.state === VideoState.TO_TRANSCODE) { | 213 | if (video.state === VideoState.TO_TRANSCODE) { |
210 | // Put uuid because we don't have id auto incremented for now | 214 | // Put uuid because we don't have id auto incremented for now |
211 | const dataInput = { | 215 | const dataInput = { |
212 | type: 'optimize' as 'optimize', | 216 | type: 'optimize' as 'optimize', |