+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 = {
+ videoImportId: payload.videoImportId,
+
+ downloadThumbnail: false,
+ downloadPreview: false,
+
+ 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 = {
+ videoImportId: videoImport.id,
+
+ downloadThumbnail: payload.downloadThumbnail,
+ downloadPreview: payload.downloadPreview,
+ thumbnailUrl: payload.thumbnailUrl,
+
+ generateThumbnail: false,
+ generatePreview: false
+ }
+
+ return processFile(() => downloadYoutubeDLVideo(videoImport.targetUrl, 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 = {
+ videoImportId: number
+
+ downloadThumbnail: boolean
+ downloadPreview: boolean
+ thumbnailUrl?: string
+
+ generateThumbnail: boolean
+ generatePreview: boolean
+}
+async function processFile (downloader: () => Promise<string>, videoImport: VideoImportModel, options: ProcessFileOptions) {