import { Notifier } from '../notifier'
import { sequelizeTypescript } from '../../initializers/database'
import { MVideoFullLight } from '@server/types/models'
+import { VideoModel } from '@server/models/video/video'
export class UpdateVideosScheduler extends AbstractScheduler {
private async updateVideos () {
if (!await ScheduleVideoUpdateModel.areVideosToUpdate()) return undefined
- const publishedVideos = await sequelizeTypescript.transaction(async t => {
- const schedules = await ScheduleVideoUpdateModel.listVideosToUpdate(t)
- const publishedVideos: MVideoFullLight[] = []
+ const schedules = await ScheduleVideoUpdateModel.listVideosToUpdate()
+ const publishedVideos: MVideoFullLight[] = []
+
+ for (const schedule of schedules) {
+ await sequelizeTypescript.transaction(async t => {
+ const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(schedule.videoId, t)
- for (const schedule of schedules) {
- const video = schedule.Video
logger.info('Executing scheduled video update on %s.', video.uuid)
if (schedule.privacy) {
await federateVideoIfNeeded(video, isNewVideo, t)
if (wasConfidentialVideo) {
- const videoToPublish: MVideoFullLight = Object.assign(video, { ScheduleVideoUpdate: schedule, UserVideoHistories: [] })
- publishedVideos.push(videoToPublish)
+ publishedVideos.push(video)
}
}
await schedule.destroy({ transaction: t })
- }
-
- return publishedVideos
- })
+ })
+ }
for (const v of publishedVideos) {
Notifier.Instance.notifyOnNewVideoIfNeeded(v)
import { Op, Transaction } from 'sequelize'
import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, Model, Table, UpdatedAt } from 'sequelize-typescript'
-import { MScheduleVideoUpdateFormattable, MScheduleVideoUpdateVideoAll } from '@server/types/models'
+import { MScheduleVideoUpdateFormattable, MScheduleVideoUpdate } from '@server/types/models'
import { AttributesOnly } from '@shared/core-utils'
import { VideoPrivacy } from '../../../shared/models/videos'
-import { ScopeNames as VideoScopeNames, VideoModel } from './video'
+import { VideoModel } from './video'
@Table({
tableName: 'scheduleVideoUpdate',
.then(res => !!res)
}
- static listVideosToUpdate (t: Transaction) {
+ static listVideosToUpdate (transaction?: Transaction) {
const query = {
where: {
updateAt: {
[Op.lte]: new Date()
}
},
- include: [
- {
- model: VideoModel.scope(
- [
- VideoScopeNames.WITH_WEBTORRENT_FILES,
- VideoScopeNames.WITH_STREAMING_PLAYLISTS,
- VideoScopeNames.WITH_ACCOUNT_DETAILS,
- VideoScopeNames.WITH_BLACKLISTED,
- VideoScopeNames.WITH_THUMBNAILS,
- VideoScopeNames.WITH_TAGS
- ]
- )
- }
- ],
- transaction: t
+ transaction
}
- return ScheduleVideoUpdateModel.findAll<MScheduleVideoUpdateVideoAll>(query)
+ return ScheduleVideoUpdateModel.findAll<MScheduleVideoUpdate>(query)
}
static deleteByVideoId (videoId: number, t: Transaction) {
import { ScheduleVideoUpdateModel } from '../../../models/video/schedule-video-update'
-import { PickWith } from '@shared/core-utils'
-import { MVideoAPWithoutCaption, MVideoWithBlacklistLight } from './video'
-
-type Use<K extends keyof ScheduleVideoUpdateModel, M> = PickWith<ScheduleVideoUpdateModel, K, M>
// ############################################################################
// ############################################################################
-export type MScheduleVideoUpdateVideoAll =
- MScheduleVideoUpdate &
- Use<'Video', MVideoAPWithoutCaption & MVideoWithBlacklistLight>
-
// Format for API or AP object
export type MScheduleVideoUpdateFormattable = Pick<MScheduleVideoUpdate, 'updateAt' | 'privacy'>