@@ -42,6 +42,6 @@ async function run () { | |||
} | |||
await JobQueue.Instance.init() | |||
await JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput }) | |||
await JobQueue.Instance.createJob({ type: 'video-transcoding', payload: dataInput }) | |||
console.log('Transcoding job for video %s created.', video.uuid) | |||
} |
@@ -283,7 +283,7 @@ async function addVideo (req: express.Request, res: express.Response) { | |||
isNewVideo: true | |||
} | |||
await JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput }) | |||
await JobQueue.Instance.createJob({ type: 'video-transcoding', payload: dataInput }) | |||
} | |||
return res.json({ | |||
@@ -100,36 +100,40 @@ const REMOTE_SCHEME = { | |||
WS: 'wss' | |||
} | |||
const JOB_ATTEMPTS: { [ id in JobType ]: number } = { | |||
// TODO: remove 'video-file' | |||
const JOB_ATTEMPTS: { [ id in (JobType | 'video-file') ]: number } = { | |||
'activitypub-http-broadcast': 5, | |||
'activitypub-http-unicast': 5, | |||
'activitypub-http-fetcher': 5, | |||
'activitypub-follow': 5, | |||
'video-file-import': 1, | |||
'video-transcoding': 1, | |||
'video-file': 1, | |||
'video-import': 1, | |||
'email': 5, | |||
'videos-views': 1, | |||
'activitypub-refresher': 1 | |||
} | |||
const JOB_CONCURRENCY: { [ id in JobType ]: number } = { | |||
const JOB_CONCURRENCY: { [ id in (JobType | 'video-file') ]: number } = { | |||
'activitypub-http-broadcast': 1, | |||
'activitypub-http-unicast': 5, | |||
'activitypub-http-fetcher': 1, | |||
'activitypub-follow': 3, | |||
'video-file-import': 1, | |||
'video-transcoding': 1, | |||
'video-file': 1, | |||
'video-import': 1, | |||
'email': 5, | |||
'videos-views': 1, | |||
'activitypub-refresher': 1 | |||
} | |||
const JOB_TTL: { [ id in JobType ]: number } = { | |||
const JOB_TTL: { [ id in (JobType | 'video-file') ]: number } = { | |||
'activitypub-http-broadcast': 60000 * 10, // 10 minutes | |||
'activitypub-http-unicast': 60000 * 10, // 10 minutes | |||
'activitypub-http-fetcher': 60000 * 10, // 10 minutes | |||
'activitypub-follow': 60000 * 10, // 10 minutes | |||
'video-file-import': 1000 * 3600, // 1 hour | |||
'video-transcoding': 1000 * 3600 * 48, // 2 days, transcoding could be long | |||
'video-file': 1000 * 3600 * 48, // 2 days, transcoding could be long | |||
'video-import': 1000 * 3600 * 2, // hours | |||
'email': 60000 * 10, // 10 minutes | |||
@@ -207,7 +207,7 @@ async function processFile (downloader: () => Promise<string>, videoImport: Vide | |||
isNewVideo: true | |||
} | |||
await JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput }) | |||
await JobQueue.Instance.createJob({ type: 'video-transcoding', payload: dataInput }) | |||
} | |||
} catch (err) { | |||
@@ -11,7 +11,7 @@ import { computeResolutionsToTranscode } from '../../../helpers/ffmpeg-utils' | |||
import { generateHlsPlaylist, importVideoFile, optimizeVideofile, transcodeOriginalVideofile } from '../../video-transcoding' | |||
import { Notifier } from '../../notifier' | |||
export type VideoFilePayload = { | |||
export type VideoTranscodingPayload = { | |||
videoUUID: string | |||
resolution?: VideoResolution | |||
isNewVideo?: boolean | |||
@@ -41,8 +41,8 @@ async function processVideoFileImport (job: Bull.Job) { | |||
return video | |||
} | |||
async function processVideoFile (job: Bull.Job) { | |||
const payload = job.data as VideoFilePayload | |||
async function processVideoTranscoding (job: Bull.Job) { | |||
const payload = job.data as VideoTranscodingPayload | |||
logger.info('Processing video file in job %d.', job.id) | |||
const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(payload.videoUUID) | |||
@@ -83,7 +83,7 @@ async function onHlsPlaylistGenerationSuccess (video: VideoModel) { | |||
}) | |||
} | |||
async function onVideoFileTranscoderOrImportSuccess (video: VideoModel, payload?: VideoFilePayload) { | |||
async function onVideoFileTranscoderOrImportSuccess (video: VideoModel, payload?: VideoTranscodingPayload) { | |||
if (video === undefined) return undefined | |||
const { videoDatabase, videoPublished } = await sequelizeTypescript.transaction(async t => { | |||
@@ -118,7 +118,7 @@ async function onVideoFileTranscoderOrImportSuccess (video: VideoModel, payload? | |||
await createHlsJobIfEnabled(payload) | |||
} | |||
async function onVideoFileOptimizerSuccess (videoArg: VideoModel, payload: VideoFilePayload) { | |||
async function onVideoFileOptimizerSuccess (videoArg: VideoModel, payload: VideoTranscodingPayload) { | |||
if (videoArg === undefined) return undefined | |||
// Outside the transaction (IO on disk) | |||
@@ -148,7 +148,7 @@ async function onVideoFileOptimizerSuccess (videoArg: VideoModel, payload: Video | |||
resolution | |||
} | |||
const p = JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput }) | |||
const p = JobQueue.Instance.createJob({ type: 'video-transcoding', payload: dataInput }) | |||
tasks.push(p) | |||
} | |||
@@ -182,13 +182,13 @@ async function onVideoFileOptimizerSuccess (videoArg: VideoModel, payload: Video | |||
// --------------------------------------------------------------------------- | |||
export { | |||
processVideoFile, | |||
processVideoTranscoding, | |||
processVideoFileImport | |||
} | |||
// --------------------------------------------------------------------------- | |||
function createHlsJobIfEnabled (payload?: VideoFilePayload) { | |||
function createHlsJobIfEnabled (payload?: VideoTranscodingPayload) { | |||
// Generate HLS playlist? | |||
if (payload && CONFIG.TRANSCODING.HLS.ENABLED) { | |||
const hlsTranscodingPayload = { | |||
@@ -199,6 +199,6 @@ function createHlsJobIfEnabled (payload?: VideoFilePayload) { | |||
generateHlsPlaylist: true | |||
} | |||
return JobQueue.Instance.createJob({ type: 'video-file', payload: hlsTranscodingPayload }) | |||
return JobQueue.Instance.createJob({ type: 'video-transcoding', payload: hlsTranscodingPayload }) | |||
} | |||
} |
@@ -7,7 +7,12 @@ import { ActivitypubHttpBroadcastPayload, processActivityPubHttpBroadcast } from | |||
import { ActivitypubHttpFetcherPayload, processActivityPubHttpFetcher } from './handlers/activitypub-http-fetcher' | |||
import { ActivitypubHttpUnicastPayload, processActivityPubHttpUnicast } from './handlers/activitypub-http-unicast' | |||
import { EmailPayload, processEmail } from './handlers/email' | |||
import { processVideoFile, processVideoFileImport, VideoFileImportPayload, VideoFilePayload } from './handlers/video-file' | |||
import { | |||
processVideoFileImport, | |||
processVideoTranscoding, | |||
VideoFileImportPayload, | |||
VideoTranscodingPayload | |||
} from './handlers/video-transcoding' | |||
import { ActivitypubFollowPayload, processActivityPubFollow } from './handlers/activitypub-follow' | |||
import { processVideoImport, VideoImportPayload } from './handlers/video-import' | |||
import { processVideosViews } from './handlers/video-views' | |||
@@ -19,19 +24,20 @@ type CreateJobArgument = | |||
{ type: 'activitypub-http-fetcher', payload: ActivitypubHttpFetcherPayload } | | |||
{ type: 'activitypub-follow', payload: ActivitypubFollowPayload } | | |||
{ type: 'video-file-import', payload: VideoFileImportPayload } | | |||
{ type: 'video-file', payload: VideoFilePayload } | | |||
{ type: 'video-transcoding', payload: VideoTranscodingPayload } | | |||
{ type: 'email', payload: EmailPayload } | | |||
{ type: 'video-import', payload: VideoImportPayload } | | |||
{ type: 'activitypub-refresher', payload: RefreshPayload } | | |||
{ type: 'videos-views', payload: {} } | |||
const handlers: { [ id in JobType ]: (job: Bull.Job) => Promise<any>} = { | |||
const handlers: { [ id in (JobType | 'video-file') ]: (job: Bull.Job) => Promise<any>} = { | |||
'activitypub-http-broadcast': processActivityPubHttpBroadcast, | |||
'activitypub-http-unicast': processActivityPubHttpUnicast, | |||
'activitypub-http-fetcher': processActivityPubHttpFetcher, | |||
'activitypub-follow': processActivityPubFollow, | |||
'video-file-import': processVideoFileImport, | |||
'video-file': processVideoFile, | |||
'video-transcoding': processVideoTranscoding, | |||
'video-file': processVideoTranscoding, // TODO: remove it (changed in 1.3) | |||
'email': processEmail, | |||
'video-import': processVideoImport, | |||
'videos-views': processVideosViews, | |||
@@ -44,7 +50,7 @@ const jobTypes: JobType[] = [ | |||
'activitypub-http-fetcher', | |||
'activitypub-http-unicast', | |||
'email', | |||
'video-file', | |||
'video-transcoding', | |||
'video-file-import', | |||
'video-import', | |||
'videos-views', | |||
@@ -5,7 +5,7 @@ export type JobType = 'activitypub-http-unicast' | | |||
'activitypub-http-fetcher' | | |||
'activitypub-follow' | | |||
'video-file-import' | | |||
'video-file' | | |||
'video-transcoding' | | |||
'email' | | |||
'video-import' | | |||
'videos-views' | | |||