+// ---------------------------------------------------------------------------
+
+async function processTorrentImport (job: Bull.Job, payload: VideoImportTorrentPayload) {
+ logger.info('Processing torrent video import in job %d.', job.id)
+
+ const videoImport = await getVideoImportOrDie(payload.videoImportId)
+
+ const options = {
+ type: payload.type,
+ videoImportId: payload.videoImportId,
+
+ generateThumbnail: true,
+ generatePreview: true
+ }
+ const target = {
+ torrentName: videoImport.torrentName ? getSecureTorrentName(videoImport.torrentName) : undefined,
+ magnetUri: videoImport.magnetUri
+ }
+ return processFile(() => downloadWebTorrentVideo(target, VIDEO_IMPORT_TIMEOUT), videoImport, options)
+}
+
+async function processYoutubeDLImport (job: Bull.Job, payload: VideoImportYoutubeDLPayload) {
+ logger.info('Processing youtubeDL video import in job %d.', job.id)
+
+ const videoImport = await getVideoImportOrDie(payload.videoImportId)
+ const options = {
+ type: payload.type,
+ videoImportId: videoImport.id,
+
+ generateThumbnail: payload.generateThumbnail,
+ generatePreview: payload.generatePreview
+ }
+
+ return processFile(() => downloadYoutubeDLVideo(videoImport.targetUrl, payload.fileExt, VIDEO_IMPORT_TIMEOUT), videoImport, options)
+}
+
+async function getVideoImportOrDie (videoImportId: number) {
+ const videoImport = await VideoImportModel.loadAndPopulateVideo(videoImportId)
+ if (!videoImport || !videoImport.Video) {
+ throw new Error('Cannot import video %s: the video import or video linked to this import does not exist anymore.')
+ }
+
+ return videoImport
+}
+
+type ProcessFileOptions = {
+ type: VideoImportYoutubeDLPayloadType | VideoImportTorrentPayloadType
+ videoImportId: number
+
+ generateThumbnail: boolean
+ generatePreview: boolean
+}
+async function processFile (downloader: () => Promise<string>, videoImport: MVideoImportDefault, options: ProcessFileOptions) {