diff options
Diffstat (limited to 'server/models/video')
-rw-r--r-- | server/models/video/video-job-info.ts | 16 | ||||
-rw-r--r-- | server/models/video/video-live-session.ts | 13 | ||||
-rw-r--r-- | server/models/video/video.ts | 10 |
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 @@ | |||
1 | import { Op, QueryTypes, Transaction } from 'sequelize' | 1 | import { Op, QueryTypes, Transaction } from 'sequelize' |
2 | import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, IsInt, Model, Table, Unique, UpdatedAt } from 'sequelize-typescript' | 2 | import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, IsInt, Model, Table, Unique, UpdatedAt } from 'sequelize-typescript' |
3 | import { forceNumber } from '@shared/core-utils' | ||
3 | import { AttributesOnly } from '@shared/typescript-utils' | 4 | import { AttributesOnly } from '@shared/typescript-utils' |
4 | import { VideoModel } from './video' | 5 | import { 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' | |||
29 | import { removeHLSFileObjectStorageByFilename, removeHLSObjectStorage, removeWebTorrentObjectStorage } from '@server/lib/object-storage' | 29 | import { removeHLSFileObjectStorageByFilename, removeHLSObjectStorage, removeWebTorrentObjectStorage } from '@server/lib/object-storage' |
30 | import { tracer } from '@server/lib/opentelemetry/tracing' | 30 | import { tracer } from '@server/lib/opentelemetry/tracing' |
31 | import { getHLSDirectory, getHLSRedundancyDirectory, getHlsResolutionPlaylistFilename } from '@server/lib/paths' | 31 | import { getHLSDirectory, getHLSRedundancyDirectory, getHlsResolutionPlaylistFilename } from '@server/lib/paths' |
32 | import { Hooks } from '@server/lib/plugins/hooks' | ||
32 | import { VideoPathManager } from '@server/lib/video-path-manager' | 33 | import { VideoPathManager } from '@server/lib/video-path-manager' |
33 | import { isVideoInPrivateDirectory } from '@server/lib/video-privacy' | 34 | import { isVideoInPrivateDirectory } from '@server/lib/video-privacy' |
34 | import { getServerActor } from '@server/models/application/application' | 35 | import { getServerActor } from '@server/models/application/application' |
35 | import { ModelCache } from '@server/models/shared/model-cache' | 36 | import { ModelCache } from '@server/models/shared/model-cache' |
36 | import { buildVideoEmbedPath, buildVideoWatchPath, pick } from '@shared/core-utils' | 37 | import { buildVideoEmbedPath, buildVideoWatchPath, pick } from '@shared/core-utils' |
37 | import { ffprobePromise, getAudioStream, hasAudioStream, uuidToShort } from '@shared/extra-utils' | 38 | import { uuidToShort } from '@shared/extra-utils' |
39 | import { ffprobePromise, getAudioStream, getVideoStreamDimensionsInfo, getVideoStreamFPS, hasAudioStream } from '@shared/ffmpeg' | ||
38 | import { | 40 | import { |
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' |
65 | import { getVideoStreamDimensionsInfo } from '../../helpers/ffmpeg' | ||
66 | import { logger } from '../../helpers/logger' | 67 | import { logger } from '../../helpers/logger' |
67 | import { CONFIG } from '../../initializers/config' | 68 | import { CONFIG } from '../../initializers/config' |
68 | import { ACTIVITY_PUB, API_VERSION, CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, STATIC_PATHS, WEBSERVER } from '../../initializers/constants' | 69 | import { ACTIVITY_PUB, API_VERSION, CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, STATIC_PATHS, WEBSERVER } from '../../initializers/constants' |
@@ -137,7 +138,6 @@ import { VideoShareModel } from './video-share' | |||
137 | import { VideoSourceModel } from './video-source' | 138 | import { VideoSourceModel } from './video-source' |
138 | import { VideoStreamingPlaylistModel } from './video-streaming-playlist' | 139 | import { VideoStreamingPlaylistModel } from './video-streaming-playlist' |
139 | import { VideoTagModel } from './video-tag' | 140 | import { VideoTagModel } from './video-tag' |
140 | import { Hooks } from '@server/lib/plugins/hooks' | ||
141 | 141 | ||
142 | export enum ScopeNames { | 142 | export 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 | } |