mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-02-20 11:48:31 -06:00
Get the save replay setting when the session started to prevent inconsistent behaviour when the setting changed before the session was processed by the live ending job Display more information about the potential session replay in live modal information
162 lines
3.4 KiB
TypeScript
162 lines
3.4 KiB
TypeScript
import { FindOptions } from 'sequelize'
|
|
import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
|
|
import { MVideoLiveSession, MVideoLiveSessionReplay } from '@server/types/models'
|
|
import { uuidToShort } from '@shared/extra-utils'
|
|
import { LiveVideoError, LiveVideoSession } from '@shared/models'
|
|
import { AttributesOnly } from '@shared/typescript-utils'
|
|
import { VideoModel } from './video'
|
|
|
|
export enum ScopeNames {
|
|
WITH_REPLAY = 'WITH_REPLAY'
|
|
}
|
|
|
|
@Scopes(() => ({
|
|
[ScopeNames.WITH_REPLAY]: {
|
|
include: [
|
|
{
|
|
model: VideoModel.unscoped(),
|
|
as: 'ReplayVideo',
|
|
required: false
|
|
}
|
|
]
|
|
}
|
|
}))
|
|
@Table({
|
|
tableName: 'videoLiveSession',
|
|
indexes: [
|
|
{
|
|
fields: [ 'replayVideoId' ],
|
|
unique: true
|
|
},
|
|
{
|
|
fields: [ 'liveVideoId' ]
|
|
}
|
|
]
|
|
})
|
|
export class VideoLiveSessionModel extends Model<Partial<AttributesOnly<VideoLiveSessionModel>>> {
|
|
|
|
@CreatedAt
|
|
createdAt: Date
|
|
|
|
@UpdatedAt
|
|
updatedAt: Date
|
|
|
|
@AllowNull(false)
|
|
@Column(DataType.DATE)
|
|
startDate: Date
|
|
|
|
@AllowNull(true)
|
|
@Column(DataType.DATE)
|
|
endDate: Date
|
|
|
|
@AllowNull(true)
|
|
@Column
|
|
error: LiveVideoError
|
|
|
|
@AllowNull(false)
|
|
@Column
|
|
saveReplay: boolean
|
|
|
|
@AllowNull(false)
|
|
@Column
|
|
endingProcessed: boolean
|
|
|
|
@ForeignKey(() => VideoModel)
|
|
@Column
|
|
replayVideoId: number
|
|
|
|
@BelongsTo(() => VideoModel, {
|
|
foreignKey: {
|
|
allowNull: true,
|
|
name: 'replayVideoId'
|
|
},
|
|
as: 'ReplayVideo',
|
|
onDelete: 'set null'
|
|
})
|
|
ReplayVideo: VideoModel
|
|
|
|
@ForeignKey(() => VideoModel)
|
|
@Column
|
|
liveVideoId: number
|
|
|
|
@BelongsTo(() => VideoModel, {
|
|
foreignKey: {
|
|
allowNull: true,
|
|
name: 'liveVideoId'
|
|
},
|
|
as: 'LiveVideo',
|
|
onDelete: 'set null'
|
|
})
|
|
LiveVideo: VideoModel
|
|
|
|
static load (id: number): Promise<MVideoLiveSession> {
|
|
return VideoLiveSessionModel.findOne({
|
|
where: { id }
|
|
})
|
|
}
|
|
|
|
static findSessionOfReplay (replayVideoId: number) {
|
|
const query = {
|
|
where: {
|
|
replayVideoId
|
|
}
|
|
}
|
|
|
|
return VideoLiveSessionModel.scope(ScopeNames.WITH_REPLAY).findOne(query)
|
|
}
|
|
|
|
static findCurrentSessionOf (videoId: number) {
|
|
return VideoLiveSessionModel.findOne({
|
|
where: {
|
|
liveVideoId: videoId,
|
|
endDate: null
|
|
},
|
|
order: [ [ 'startDate', 'DESC' ] ]
|
|
})
|
|
}
|
|
|
|
static findLatestSessionOf (videoId: number) {
|
|
return VideoLiveSessionModel.findOne({
|
|
where: {
|
|
liveVideoId: videoId
|
|
},
|
|
order: [ [ 'startDate', 'DESC' ] ]
|
|
})
|
|
}
|
|
|
|
static listSessionsOfLiveForAPI (options: { videoId: number }) {
|
|
const { videoId } = options
|
|
|
|
const query: FindOptions<AttributesOnly<VideoLiveSessionModel>> = {
|
|
where: {
|
|
liveVideoId: videoId
|
|
},
|
|
order: [ [ 'startDate', 'ASC' ] ]
|
|
}
|
|
|
|
return VideoLiveSessionModel.scope(ScopeNames.WITH_REPLAY).findAll(query)
|
|
}
|
|
|
|
toFormattedJSON (this: MVideoLiveSessionReplay): LiveVideoSession {
|
|
const replayVideo = this.ReplayVideo
|
|
? {
|
|
id: this.ReplayVideo.id,
|
|
uuid: this.ReplayVideo.uuid,
|
|
shortUUID: uuidToShort(this.ReplayVideo.uuid)
|
|
}
|
|
: undefined
|
|
|
|
return {
|
|
id: this.id,
|
|
startDate: this.startDate.toISOString(),
|
|
endDate: this.endDate
|
|
? this.endDate.toISOString()
|
|
: null,
|
|
endingProcessed: this.endingProcessed,
|
|
saveReplay: this.saveReplay,
|
|
replayVideo,
|
|
error: this.error
|
|
}
|
|
}
|
|
}
|