aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models/video
diff options
context:
space:
mode:
Diffstat (limited to 'server/models/video')
-rw-r--r--server/models/video/video-job-info.ts16
-rw-r--r--server/models/video/video-live-session.ts13
-rw-r--r--server/models/video/video.ts10
3 files changed, 26 insertions, 13 deletions
diff --git a/server/models/video/video-job-info.ts b/server/models/video/video-job-info.ts
index 740f6b5c6..5845b8c74 100644
--- a/server/models/video/video-job-info.ts
+++ b/server/models/video/video-job-info.ts
@@ -1,5 +1,6 @@
1import { Op, QueryTypes, Transaction } from 'sequelize' 1import { Op, QueryTypes, Transaction } from 'sequelize'
2import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, IsInt, Model, Table, Unique, UpdatedAt } from 'sequelize-typescript' 2import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, IsInt, Model, Table, Unique, UpdatedAt } from 'sequelize-typescript'
3import { forceNumber } from '@shared/core-utils'
3import { AttributesOnly } from '@shared/typescript-utils' 4import { AttributesOnly } from '@shared/typescript-utils'
4import { VideoModel } from './video' 5import { VideoModel } from './video'
5 6
@@ -59,32 +60,33 @@ export class VideoJobInfoModel extends Model<Partial<AttributesOnly<VideoJobInfo
59 return VideoJobInfoModel.findOne({ where, transaction }) 60 return VideoJobInfoModel.findOne({ where, transaction })
60 } 61 }
61 62
62 static async increaseOrCreate (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> { 63 static async increaseOrCreate (videoUUID: string, column: VideoJobInfoColumnType, amountArg = 1): Promise<number> {
63 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } } 64 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
65 const amount = forceNumber(amountArg)
64 66
65 const [ { pendingMove } ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(` 67 const [ result ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(`
66 INSERT INTO "videoJobInfo" ("videoId", "${column}", "createdAt", "updatedAt") 68 INSERT INTO "videoJobInfo" ("videoId", "${column}", "createdAt", "updatedAt")
67 SELECT 69 SELECT
68 "video"."id" AS "videoId", 1, NOW(), NOW() 70 "video"."id" AS "videoId", ${amount}, NOW(), NOW()
69 FROM 71 FROM
70 "video" 72 "video"
71 WHERE 73 WHERE
72 "video"."uuid" = $videoUUID 74 "video"."uuid" = $videoUUID
73 ON CONFLICT ("videoId") DO UPDATE 75 ON CONFLICT ("videoId") DO UPDATE
74 SET 76 SET
75 "${column}" = "videoJobInfo"."${column}" + 1, 77 "${column}" = "videoJobInfo"."${column}" + ${amount},
76 "updatedAt" = NOW() 78 "updatedAt" = NOW()
77 RETURNING 79 RETURNING
78 "${column}" 80 "${column}"
79 `, options) 81 `, options)
80 82
81 return pendingMove 83 return result[column]
82 } 84 }
83 85
84 static async decrease (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> { 86 static async decrease (videoUUID: string, column: VideoJobInfoColumnType): Promise<number> {
85 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } } 87 const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } }
86 88
87 const result = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(` 89 const result = await VideoJobInfoModel.sequelize.query(`
88 UPDATE 90 UPDATE
89 "videoJobInfo" 91 "videoJobInfo"
90 SET 92 SET
@@ -99,7 +101,7 @@ export class VideoJobInfoModel extends Model<Partial<AttributesOnly<VideoJobInfo
99 101
100 if (result.length === 0) return undefined 102 if (result.length === 0) return undefined
101 103
102 return result[0].pendingMove 104 return result[0][column]
103 } 105 }
104 106
105 static async abortAllTasks (videoUUID: string, column: VideoJobInfoColumnType): Promise<void> { 107 static async abortAllTasks (videoUUID: string, column: VideoJobInfoColumnType): Promise<void> {
diff --git a/server/models/video/video-live-session.ts b/server/models/video/video-live-session.ts
index dcded7872..9426f5d11 100644
--- a/server/models/video/video-live-session.ts
+++ b/server/models/video/video-live-session.ts
@@ -147,12 +147,21 @@ export class VideoLiveSessionModel extends Model<Partial<AttributesOnly<VideoLiv
147 return VideoLiveSessionModel.scope(ScopeNames.WITH_REPLAY).findOne(query) 147 return VideoLiveSessionModel.scope(ScopeNames.WITH_REPLAY).findOne(query)
148 } 148 }
149 149
150 static findCurrentSessionOf (videoId: number) { 150 static findCurrentSessionOf (videoUUID: string) {
151 return VideoLiveSessionModel.findOne({ 151 return VideoLiveSessionModel.findOne({
152 where: { 152 where: {
153 liveVideoId: videoId,
154 endDate: null 153 endDate: null
155 }, 154 },
155 include: [
156 {
157 model: VideoModel.unscoped(),
158 as: 'LiveVideo',
159 required: true,
160 where: {
161 uuid: videoUUID
162 }
163 }
164 ],
156 order: [ [ 'startDate', 'DESC' ] ] 165 order: [ [ 'startDate', 'DESC' ] ]
157 }) 166 })
158 } 167 }
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index f817c4a33..baa8c120a 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -29,12 +29,14 @@ import { LiveManager } from '@server/lib/live/live-manager'
29import { removeHLSFileObjectStorageByFilename, removeHLSObjectStorage, removeWebTorrentObjectStorage } from '@server/lib/object-storage' 29import { removeHLSFileObjectStorageByFilename, removeHLSObjectStorage, removeWebTorrentObjectStorage } from '@server/lib/object-storage'
30import { tracer } from '@server/lib/opentelemetry/tracing' 30import { tracer } from '@server/lib/opentelemetry/tracing'
31import { getHLSDirectory, getHLSRedundancyDirectory, getHlsResolutionPlaylistFilename } from '@server/lib/paths' 31import { getHLSDirectory, getHLSRedundancyDirectory, getHlsResolutionPlaylistFilename } from '@server/lib/paths'
32import { Hooks } from '@server/lib/plugins/hooks'
32import { VideoPathManager } from '@server/lib/video-path-manager' 33import { VideoPathManager } from '@server/lib/video-path-manager'
33import { isVideoInPrivateDirectory } from '@server/lib/video-privacy' 34import { isVideoInPrivateDirectory } from '@server/lib/video-privacy'
34import { getServerActor } from '@server/models/application/application' 35import { getServerActor } from '@server/models/application/application'
35import { ModelCache } from '@server/models/shared/model-cache' 36import { ModelCache } from '@server/models/shared/model-cache'
36import { buildVideoEmbedPath, buildVideoWatchPath, pick } from '@shared/core-utils' 37import { buildVideoEmbedPath, buildVideoWatchPath, pick } from '@shared/core-utils'
37import { ffprobePromise, getAudioStream, hasAudioStream, uuidToShort } from '@shared/extra-utils' 38import { uuidToShort } from '@shared/extra-utils'
39import { ffprobePromise, getAudioStream, getVideoStreamDimensionsInfo, getVideoStreamFPS, hasAudioStream } from '@shared/ffmpeg'
38import { 40import {
39 ResultList, 41 ResultList,
40 ThumbnailType, 42 ThumbnailType,
@@ -62,7 +64,6 @@ import {
62 isVideoStateValid, 64 isVideoStateValid,
63 isVideoSupportValid 65 isVideoSupportValid
64} from '../../helpers/custom-validators/videos' 66} from '../../helpers/custom-validators/videos'
65import { getVideoStreamDimensionsInfo } from '../../helpers/ffmpeg'
66import { logger } from '../../helpers/logger' 67import { logger } from '../../helpers/logger'
67import { CONFIG } from '../../initializers/config' 68import { CONFIG } from '../../initializers/config'
68import { ACTIVITY_PUB, API_VERSION, CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, STATIC_PATHS, WEBSERVER } from '../../initializers/constants' 69import { ACTIVITY_PUB, API_VERSION, CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, STATIC_PATHS, WEBSERVER } from '../../initializers/constants'
@@ -137,7 +138,6 @@ import { VideoShareModel } from './video-share'
137import { VideoSourceModel } from './video-source' 138import { VideoSourceModel } from './video-source'
138import { VideoStreamingPlaylistModel } from './video-streaming-playlist' 139import { VideoStreamingPlaylistModel } from './video-streaming-playlist'
139import { VideoTagModel } from './video-tag' 140import { VideoTagModel } from './video-tag'
140import { Hooks } from '@server/lib/plugins/hooks'
141 141
142export enum ScopeNames { 142export enum ScopeNames {
143 FOR_API = 'FOR_API', 143 FOR_API = 'FOR_API',
@@ -798,7 +798,7 @@ export class VideoModel extends Model<Partial<AttributesOnly<VideoModel>>> {
798 798
799 logger.info('Stopping live of video %s after video deletion.', instance.uuid) 799 logger.info('Stopping live of video %s after video deletion.', instance.uuid)
800 800
801 LiveManager.Instance.stopSessionOf(instance.id, null) 801 LiveManager.Instance.stopSessionOf(instance.uuid, null)
802 } 802 }
803 803
804 @BeforeDestroy 804 @BeforeDestroy
@@ -1763,10 +1763,12 @@ export class VideoModel extends Model<Partial<AttributesOnly<VideoModel>>> {
1763 1763
1764 const { audioStream } = await getAudioStream(originalFilePath, probe) 1764 const { audioStream } = await getAudioStream(originalFilePath, probe)
1765 const hasAudio = await hasAudioStream(originalFilePath, probe) 1765 const hasAudio = await hasAudioStream(originalFilePath, probe)
1766 const fps = await getVideoStreamFPS(originalFilePath, probe)
1766 1767
1767 return { 1768 return {
1768 audioStream, 1769 audioStream,
1769 hasAudio, 1770 hasAudio,
1771 fps,
1770 1772
1771 ...await getVideoStreamDimensionsInfo(originalFilePath, probe) 1773 ...await getVideoStreamDimensionsInfo(originalFilePath, probe)
1772 } 1774 }