aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib/schedulers/update-videos-scheduler.ts
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2023-07-31 14:34:36 +0200
committerChocobozzz <me@florianbigard.com>2023-08-11 15:02:33 +0200
commit3a4992633ee62d5edfbb484d9c6bcb3cf158489d (patch)
treee4510b39bdac9c318fdb4b47018d08f15368b8f0 /server/lib/schedulers/update-videos-scheduler.ts
parent04d1da5621d25d59bd5fa1543b725c497bf5d9a8 (diff)
downloadPeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.gz
PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.zst
PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.zip
Migrate server to ESM
Sorry for the very big commit that may lead to git log issues and merge conflicts, but it's a major step forward: * Server can be faster at startup because imports() are async and we can easily lazy import big modules * Angular doesn't seem to support ES import (with .js extension), so we had to correctly organize peertube into a monorepo: * Use yarn workspace feature * Use typescript reference projects for dependencies * Shared projects have been moved into "packages", each one is now a node module (with a dedicated package.json/tsconfig.json) * server/tools have been moved into apps/ and is now a dedicated app bundled and published on NPM so users don't have to build peertube cli tools manually * server/tests have been moved into packages/ so we don't compile them every time we want to run the server * Use isolatedModule option: * Had to move from const enum to const (https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums) * Had to explictely specify "type" imports when used in decorators * Prefer tsx (that uses esbuild under the hood) instead of ts-node to load typescript files (tests with mocha or scripts): * To reduce test complexity as esbuild doesn't support decorator metadata, we only test server files that do not import server models * We still build tests files into js files for a faster CI * Remove unmaintained peertube CLI import script * Removed some barrels to speed up execution (less imports)
Diffstat (limited to 'server/lib/schedulers/update-videos-scheduler.ts')
-rw-r--r--server/lib/schedulers/update-videos-scheduler.ts89
1 files changed, 0 insertions, 89 deletions
diff --git a/server/lib/schedulers/update-videos-scheduler.ts b/server/lib/schedulers/update-videos-scheduler.ts
deleted file mode 100644
index e38685c04..000000000
--- a/server/lib/schedulers/update-videos-scheduler.ts
+++ /dev/null
@@ -1,89 +0,0 @@
1import { VideoModel } from '@server/models/video/video'
2import { MScheduleVideoUpdate } from '@server/types/models'
3import { VideoPrivacy, VideoState } from '@shared/models'
4import { logger } from '../../helpers/logger'
5import { SCHEDULER_INTERVALS_MS } from '../../initializers/constants'
6import { sequelizeTypescript } from '../../initializers/database'
7import { ScheduleVideoUpdateModel } from '../../models/video/schedule-video-update'
8import { Notifier } from '../notifier'
9import { addVideoJobsAfterUpdate } from '../video'
10import { VideoPathManager } from '../video-path-manager'
11import { setVideoPrivacy } from '../video-privacy'
12import { AbstractScheduler } from './abstract-scheduler'
13
14export class UpdateVideosScheduler extends AbstractScheduler {
15
16 private static instance: AbstractScheduler
17
18 protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.UPDATE_VIDEOS
19
20 private constructor () {
21 super()
22 }
23
24 protected async internalExecute () {
25 return this.updateVideos()
26 }
27
28 private async updateVideos () {
29 if (!await ScheduleVideoUpdateModel.areVideosToUpdate()) return undefined
30
31 const schedules = await ScheduleVideoUpdateModel.listVideosToUpdate()
32
33 for (const schedule of schedules) {
34 const videoOnly = await VideoModel.load(schedule.videoId)
35 const mutexReleaser = await VideoPathManager.Instance.lockFiles(videoOnly.uuid)
36
37 try {
38 const { video, published } = await this.updateAVideo(schedule)
39
40 if (published) Notifier.Instance.notifyOnVideoPublishedAfterScheduledUpdate(video)
41 } catch (err) {
42 logger.error('Cannot update video', { err })
43 }
44
45 mutexReleaser()
46 }
47 }
48
49 private async updateAVideo (schedule: MScheduleVideoUpdate) {
50 let oldPrivacy: VideoPrivacy
51 let isNewVideo: boolean
52 let published = false
53
54 const video = await sequelizeTypescript.transaction(async t => {
55 const video = await VideoModel.loadFull(schedule.videoId, t)
56 if (video.state === VideoState.TO_TRANSCODE) return null
57
58 logger.info('Executing scheduled video update on %s.', video.uuid)
59
60 if (schedule.privacy) {
61 isNewVideo = video.isNewVideo(schedule.privacy)
62 oldPrivacy = video.privacy
63
64 setVideoPrivacy(video, schedule.privacy)
65 await video.save({ transaction: t })
66
67 if (oldPrivacy === VideoPrivacy.PRIVATE) {
68 published = true
69 }
70 }
71
72 await schedule.destroy({ transaction: t })
73
74 return video
75 })
76
77 if (!video) {
78 return { video, published: false }
79 }
80
81 await addVideoJobsAfterUpdate({ video, oldPrivacy, isNewVideo, nameChanged: false })
82
83 return { video, published }
84 }
85
86 static get Instance () {
87 return this.instance || (this.instance = new this())
88 }
89}