+ const queue: Queue = this.queues[key]
+ await queue.clean(parseDurationToMs('7 days'), 1000, 'completed')
+ await queue.clean(parseDurationToMs('7 days'), 1000, 'failed')
+ }
+ }
+
+ private addRepeatableJobs () {
+ this.queues['videos-views-stats'].add('job', {}, {
+ repeat: REPEAT_JOBS['videos-views-stats'],
+
+ ...this.buildJobRemovalOptions('videos-views-stats')
+ }).catch(err => logger.error('Cannot add repeatable job.', { err }))
+
+ if (CONFIG.FEDERATION.VIDEOS.CLEANUP_REMOTE_INTERACTIONS) {
+ this.queues['activitypub-cleaner'].add('job', {}, {
+ repeat: REPEAT_JOBS['activitypub-cleaner'],
+
+ ...this.buildJobRemovalOptions('activitypub-cleaner')
+ }).catch(err => logger.error('Cannot add repeatable job.', { err }))
+ }
+ }
+
+ private getJobConcurrency (jobType: JobType) {
+ if (jobType === 'video-transcoding') return CONFIG.TRANSCODING.CONCURRENCY
+ if (jobType === 'video-import') return CONFIG.IMPORT.VIDEOS.CONCURRENCY
+
+ return JOB_CONCURRENCY[jobType]
+ }
+
+ private buildJobRemovalOptions (queueName: string) {
+ return {
+ removeOnComplete: {
+ // Wants seconds
+ age: (JOB_REMOVAL_OPTIONS.SUCCESS[queueName] || JOB_REMOVAL_OPTIONS.SUCCESS.DEFAULT) / 1000,
+
+ count: JOB_REMOVAL_OPTIONS.COUNT
+ },
+ removeOnFail: {
+ // Wants seconds
+ age: (JOB_REMOVAL_OPTIONS.FAILURE[queueName] || JOB_REMOVAL_OPTIONS.FAILURE.DEFAULT) / 1000,
+
+ count: JOB_REMOVAL_OPTIONS.COUNT / 1000
+ }