+ payload = {
+ type: 'optimize-to-webtorrent',
+ videoUUID: video.uuid,
+ isNewVideo
+ }
+ }
+
+ await VideoJobInfoModel.increaseOrCreate(payload.videoUUID, 'pendingTranscode')
+
+ return {
+ type: 'video-transcoding' as 'video-transcoding',
+ priority: await getTranscodingJobPriority(user),
+ payload
+ }
+}
+
+async function buildTranscodingJob (payload: VideoTranscodingPayload, options: CreateJobOptions = {}) {
+ await VideoJobInfoModel.increaseOrCreate(payload.videoUUID, 'pendingTranscode')
+
+ return { type: 'video-transcoding' as 'video-transcoding', payload, ...options }
+}
+
+async function getTranscodingJobPriority (user: MUserId) {
+ const now = new Date()
+ const lastWeek = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7)
+
+ const videoUploadedByUser = await VideoModel.countVideosUploadedByUserSince(user.id, lastWeek)
+
+ return JOB_PRIORITY.TRANSCODING + videoUploadedByUser
+}
+
+// ---------------------------------------------------------------------------
+
+async function buildMoveToObjectStorageJob (options: {
+ video: MVideoUUID
+ previousVideoState: VideoState
+ isNewVideo?: boolean // Default true
+}) {
+ const { video, previousVideoState, isNewVideo = true } = options
+
+ await VideoJobInfoModel.increaseOrCreate(video.uuid, 'pendingMove')
+
+ return {
+ type: 'move-to-object-storage' as 'move-to-object-storage',
+ payload: {
+ videoUUID: video.uuid,
+ isNewVideo,
+ previousVideoState
+ }