} from 'sequelize-typescript'
import { setAsUpdated } from '@server/helpers/database-utils'
import { buildNSFWFilter } from '@server/helpers/express-utils'
+import { uuidToShort } from '@server/helpers/uuid'
import { getPrivaciesForFederation, isPrivacyForFederation, isStateForFederation } from '@server/helpers/video'
-import { LiveManager } from '@server/lib/live-manager'
+import { LiveManager } from '@server/lib/live/live-manager'
import { getHLSDirectory, getVideoFilePath } from '@server/lib/video-paths'
import { getServerActor } from '@server/models/application/application'
import { ModelCache } from '@server/models/model-cache'
-import { AttributesOnly } from '@shared/core-utils'
+import { AttributesOnly, buildVideoEmbedPath, buildVideoWatchPath } from '@shared/core-utils'
import { VideoFile } from '@shared/models/videos/video-file.model'
import { ResultList, UserRight, VideoPrivacy, VideoState } from '../../../shared'
import { VideoObject } from '../../../shared/models/activitypub/objects'
import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
import { isBooleanValid } from '../../helpers/custom-validators/misc'
import {
- isVideoCategoryValid,
isVideoDescriptionValid,
isVideoDurationValid,
- isVideoLanguageValid,
- isVideoLicenceValid,
isVideoNameValid,
isVideoPrivacyValid,
isVideoStateValid,
@AllowNull(true)
@Default(null)
- @Is('VideoCategory', value => throwIfNotValid(value, isVideoCategoryValid, 'category', true))
@Column
category: number
@AllowNull(true)
@Default(null)
- @Is('VideoLicence', value => throwIfNotValid(value, isVideoLicenceValid, 'licence', true))
@Column
licence: number
@AllowNull(true)
@Default(null)
- @Is('VideoLanguage', value => throwIfNotValid(value, isVideoLanguageValid, 'language', true))
@Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEOS.LANGUAGE.max))
language: string
foreignKey: {
allowNull: true
},
- hooks: true
+ onDelete: 'cascade'
})
VideoChannel: VideoChannelModel
// Remove physical files and torrents
instance.VideoFiles.forEach(file => {
- tasks.push(instance.removeFile(file))
- tasks.push(file.removeTorrent())
+ tasks.push(instance.removeFileAndTorrent(file))
})
// Remove playlists file
static async searchAndPopulateAccountAndServer (options: {
includeLocalVideos: boolean
search?: string
+ host?: string
start?: number
count?: number
sort?: string
user: options.user,
filter: options.filter,
+ host: options.host,
start: options.start,
count: options.count,
}
getWatchStaticPath () {
- return '/w/' + this.uuid
+ return buildVideoWatchPath({ shortUUID: uuidToShort(this.uuid) })
}
getEmbedStaticPath () {
- return '/videos/embed/' + this.uuid
+ return buildVideoEmbedPath(this)
}
getMiniatureStaticPath () {
.concat(toAdd)
}
- removeFile (videoFile: MVideoFile, isRedundancy = false) {
+ removeFileAndTorrent (videoFile: MVideoFile, isRedundancy = false) {
const filePath = getVideoFilePath(this, videoFile, isRedundancy)
- return remove(filePath)
- .catch(err => logger.warn('Cannot delete file %s.', filePath, { err }))
+
+ const promises: Promise<any>[] = [ remove(filePath) ]
+ if (!isRedundancy) promises.push(videoFile.removeTorrent())
+
+ return Promise.all(promises)
}
async removeStreamingPlaylistFiles (streamingPlaylist: MStreamingPlaylist, isRedundancy = false) {