From 2baea0c77cc765f7cbca9c9a2f4272268892a35c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 14 Jun 2018 18:06:56 +0200 Subject: Add ability for uploaders to schedule video update --- server/lib/schedulers/update-videos-scheduler.ts | 62 ++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 server/lib/schedulers/update-videos-scheduler.ts (limited to 'server/lib/schedulers/update-videos-scheduler.ts') diff --git a/server/lib/schedulers/update-videos-scheduler.ts b/server/lib/schedulers/update-videos-scheduler.ts new file mode 100644 index 000000000..d123c3ceb --- /dev/null +++ b/server/lib/schedulers/update-videos-scheduler.ts @@ -0,0 +1,62 @@ +import { isTestInstance } from '../../helpers/core-utils' +import { logger } from '../../helpers/logger' +import { JobQueue } from '../job-queue' +import { AbstractScheduler } from './abstract-scheduler' +import { ScheduleVideoUpdateModel } from '../../models/video/schedule-video-update' +import { retryTransactionWrapper } from '../../helpers/database-utils' +import { federateVideoIfNeeded } from '../activitypub' +import { SCHEDULER_INTERVALS_MS, sequelizeTypescript } from '../../initializers' +import { VideoPrivacy } from '../../../shared/models/videos' + +export class UpdateVideosScheduler extends AbstractScheduler { + + private static instance: AbstractScheduler + + protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.updateVideos + + private isRunning = false + + private constructor () { + super() + } + + async execute () { + if (this.isRunning === true) return + this.isRunning = true + + try { + await retryTransactionWrapper(this.updateVideos.bind(this)) + } catch (err) { + logger.error('Cannot execute update videos scheduler.', { err }) + } finally { + this.isRunning = false + } + } + + private updateVideos () { + return sequelizeTypescript.transaction(async t => { + const schedules = await ScheduleVideoUpdateModel.listVideosToUpdate(t) + + for (const schedule of schedules) { + const video = schedule.Video + logger.info('Executing scheduled video update on %s.', video.uuid) + + if (schedule.privacy) { + const oldPrivacy = video.privacy + + video.privacy = schedule.privacy + await video.save({ transaction: t }) + + const isNewVideo = oldPrivacy === VideoPrivacy.PRIVATE + await federateVideoIfNeeded(video, isNewVideo, t) + } + + await schedule.destroy({ transaction: t }) + } + }) + } + + static get Instance () { + return this.instance || (this.instance = new this()) + } +} -- cgit v1.2.3