X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo.ts;h=468117504e5ea328fd2744ff5e64c9b93ef84b3a;hb=38a3ccc7f8ad0ea94362b58c732af7c387ab46be;hp=27e605be64af1265a970710e88313d76d96835e2;hpb=e56ce494c8c55e7f653991ffc7d7398ca875e768;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 27e605be6..468117504 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -27,7 +27,8 @@ import { import { getPrivaciesForFederation, isPrivacyForFederation, isStateForFederation } from '@server/helpers/video' import { LiveManager } from '@server/lib/live/live-manager' import { removeHLSFileObjectStorage, removeHLSObjectStorage, removeWebTorrentObjectStorage } from '@server/lib/object-storage' -import { getHLSDirectory, getHLSRedundancyDirectory } from '@server/lib/paths' +import { tracer } from '@server/lib/opentelemetry/tracing' +import { getHLSDirectory, getHLSRedundancyDirectory, getHlsResolutionPlaylistFilename } from '@server/lib/paths' import { VideoPathManager } from '@server/lib/video-path-manager' import { getServerActor } from '@server/models/application/application' import { ModelCache } from '@server/models/model-cache' @@ -768,7 +769,7 @@ export class VideoModel extends Model>> { // Remove physical files and torrents instance.VideoFiles.forEach(file => { - tasks.push(instance.removeWebTorrentFileAndTorrent(file)) + tasks.push(instance.removeWebTorrentFile(file)) }) // Remove playlists file @@ -1209,18 +1210,21 @@ export class VideoModel extends Model>> { return VideoModel.getAvailableForApi(queryOptions) } - static countLocalLives () { - const options = { + static countLives (options: { + remote: boolean + mode: 'published' | 'not-ended' + }) { + const query = { where: { - remote: false, + remote: options.remote, isLive: true, - state: { - [Op.ne]: VideoState.LIVE_ENDED - } + state: options.mode === 'not-ended' + ? { [Op.ne]: VideoState.LIVE_ENDED } + : { [Op.eq]: VideoState.PUBLISHED } } } - return VideoModel.count(options) + return VideoModel.count(query) } static countVideosUploadedByUserSince (userId: number, since: Date) { @@ -1532,6 +1536,8 @@ export class VideoModel extends Model>> { options: BuildVideosListQueryOptions, countVideos = true ): Promise> { + const span = tracer.startSpan('peertube.VideoModel.getAvailableForApi') + function getCount () { if (countVideos !== true) return Promise.resolve(undefined) @@ -1551,6 +1557,8 @@ export class VideoModel extends Model>> { const [ count, rows ] = await Promise.all([ getCount(), getModels() ]) + span.end() + return { data: rows, total: count @@ -1584,22 +1592,21 @@ export class VideoModel extends Model>> { } getQualityFileBy (this: T, fun: (files: MVideoFile[], it: (file: MVideoFile) => number) => MVideoFile) { - // We first transcode to WebTorrent format, so try this array first - if (Array.isArray(this.VideoFiles) && this.VideoFiles.length !== 0) { - const file = fun(this.VideoFiles, file => file.resolution) + const files = this.getAllFiles() + const file = fun(files, file => file.resolution) + if (!file) return undefined + if (file.videoId) { return Object.assign(file, { Video: this }) } - // No webtorrent files, try with streaming playlist files - if (Array.isArray(this.VideoStreamingPlaylists) && this.VideoStreamingPlaylists.length !== 0) { + if (file.videoStreamingPlaylistId) { const streamingPlaylistWithVideo = Object.assign(this.VideoStreamingPlaylists[0], { Video: this }) - const file = fun(streamingPlaylistWithVideo.VideoFiles, file => file.resolution) return Object.assign(file, { VideoStreamingPlaylist: streamingPlaylistWithVideo }) } - return undefined + throw new Error('File is not associated to a video of a playlist') } getMaxQualityFile (this: T): MVideoFileVideo | MVideoFileStreamingPlaylistVideo { @@ -1775,7 +1782,7 @@ export class VideoModel extends Model>> { .concat(toAdd) } - removeWebTorrentFileAndTorrent (videoFile: MVideoFile, isRedundancy = false) { + removeWebTorrentFile (videoFile: MVideoFile, isRedundancy = false) { const filePath = isRedundancy ? VideoPathManager.Instance.getFSRedundancyVideoFilePath(this, videoFile) : VideoPathManager.Instance.getFSVideoFileOutputPath(this, videoFile) @@ -1821,8 +1828,12 @@ export class VideoModel extends Model>> { await videoFile.removeTorrent() await remove(filePath) + const resolutionFilename = getHlsResolutionPlaylistFilename(videoFile.filename) + await remove(VideoPathManager.Instance.getFSHLSOutputPath(this, resolutionFilename)) + if (videoFile.storage === VideoStorage.OBJECT_STORAGE) { await removeHLSFileObjectStorage(streamingPlaylist.withVideo(this), videoFile.filename) + await removeHLSFileObjectStorage(streamingPlaylist.withVideo(this), resolutionFilename) } } @@ -1888,6 +1899,8 @@ export class VideoModel extends Model>> { } getBandwidthBits (this: MVideo, videoFile: MVideoFile) { + if (!this.duration) throw new Error(`Cannot get bandwidth bits because video ${this.url} has duration of 0`) + return Math.ceil((videoFile.size * 8) / this.duration) }