X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fformatter%2Fvideo-format-utils.ts;h=6f05dbdc8bf2008126d85d1d1b99418593daf604;hb=32fde390f465b9ceef9e49c4037acdacbe176d65;hp=611edf0b938ebb265e6da299e5c76152d82acbb4;hpb=f443a74649174b2f9347c158e30f8ac7aa3e958a;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/formatter/video-format-utils.ts b/server/models/video/formatter/video-format-utils.ts index 611edf0b9..6f05dbdc8 100644 --- a/server/models/video/formatter/video-format-utils.ts +++ b/server/models/video/formatter/video-format-utils.ts @@ -1,11 +1,20 @@ import { generateMagnetUri } from '@server/helpers/webtorrent' +import { getActivityStreamDuration } from '@server/lib/activitypub/activity' +import { tracer } from '@server/lib/opentelemetry/tracing' import { getLocalVideoFileMetadataUrl } from '@server/lib/video-urls' -import { VideoViews } from '@server/lib/video-views' +import { VideoViewsManager } from '@server/lib/views/video-views-manager' import { uuidToShort } from '@shared/extra-utils' -import { VideoFile, VideosCommonQueryAfterSanitize } from '@shared/models' -import { ActivityTagObject, ActivityUrlObject, VideoObject } from '../../../../shared/models/activitypub/objects' -import { Video, VideoDetails, VideoInclude } from '../../../../shared/models/videos' -import { VideoStreamingPlaylist } from '../../../../shared/models/videos/video-streaming-playlist.model' +import { + ActivityTagObject, + ActivityUrlObject, + Video, + VideoDetails, + VideoFile, + VideoInclude, + VideoObject, + VideosCommonQueryAfterSanitize, + VideoStreamingPlaylist +} from '@shared/models' import { isArray } from '../../../helpers/custom-validators/misc' import { MIMETYPES, @@ -25,6 +34,7 @@ import { import { MServer, MStreamingPlaylistRedundanciesOpt, + MUserId, MVideo, MVideoAP, MVideoFile, @@ -48,7 +58,7 @@ export type VideoFormattingJSONOptions = { } function guessAdditionalAttributesFromQuery (query: VideosCommonQueryAfterSanitize): VideoFormattingJSONOptions { - if (!query || !query.include) return {} + if (!query?.include) return {} return { additionalAttributes: { @@ -63,6 +73,8 @@ function guessAdditionalAttributesFromQuery (query: VideosCommonQueryAfterSaniti } function videoModelToFormattedJSON (video: MVideoFormattable, options: VideoFormattingJSONOptions = {}): Video { + const span = tracer.startSpan('peertube.VideoModel.toFormattedJSON') + const userHistory = isArray(video.UserVideoHistories) ? video.UserVideoHistories[0] : undefined const videoObject: Video = { @@ -91,13 +103,17 @@ function videoModelToFormattedJSON (video: MVideoFormattable, options: VideoForm }, nsfw: video.nsfw, + truncatedDescription: video.getTruncatedDescription(), description: options && options.completeDescription === true ? video.description : video.getTruncatedDescription(), isLocal: video.isOwned(), duration: video.duration, + views: video.views, + viewers: VideoViewsManager.Instance.getViewers(video), + likes: video.likes, dislikes: video.dislikes, thumbnailPath: video.getMiniatureStaticPath(), @@ -121,10 +137,6 @@ function videoModelToFormattedJSON (video: MVideoFormattable, options: VideoForm pluginData: (video as any).pluginData } - if (video.isLive) { - videoObject.viewers = VideoViews.Instance.getViewers(video) - } - const add = options.additionalAttributes if (add?.state === true) { videoObject.state = { @@ -161,11 +173,16 @@ function videoModelToFormattedJSON (video: MVideoFormattable, options: VideoForm videoObject.files = videoFilesModelToFormattedJSON(video, video.VideoFiles) } + span.end() + return videoObject } function videoModelToFormattedDetailsJSON (video: MVideoFormattableDetails): VideoDetails { + const span = tracer.startSpan('peertube.VideoModel.toFormattedDetailsJSON') + const videoJSON = video.toFormattedJSON({ + completeDescription: true, additionalAttributes: { scheduledUpdate: true, blacklistInfo: true, @@ -192,6 +209,8 @@ function videoModelToFormattedDetailsJSON (video: MVideoFormattableDetails): Vid trackerUrls: video.getTrackerUrls() } + span.end() + return Object.assign(videoJSON, detailsJSON) } @@ -229,8 +248,12 @@ function sortByResolutionDesc (fileA: MVideoFile, fileB: MVideoFile) { function videoFilesModelToFormattedJSON ( video: MVideoFormattable, videoFiles: MVideoFileRedundanciesOpt[], - includeMagnet = true + options: { + includeMagnet?: boolean // default true + } = {} ): VideoFile[] { + const { includeMagnet = true } = options + const trackerUrls = includeMagnet ? video.getTrackerUrls() : [] @@ -240,6 +263,8 @@ function videoFilesModelToFormattedJSON ( .sort(sortByResolutionDesc) .map(videoFile => { return { + id: videoFile.id, + resolution: { id: videoFile.resolution, label: videoFile.resolution === 0 ? 'Audio' : `${videoFile.resolution}p` @@ -263,11 +288,14 @@ function videoFilesModelToFormattedJSON ( }) } -function addVideoFilesInAPAcc ( - acc: ActivityUrlObject[] | ActivityTagObject[], - video: MVideo, +function addVideoFilesInAPAcc (options: { + acc: ActivityUrlObject[] | ActivityTagObject[] + video: MVideo files: MVideoFile[] -) { + user?: MUserId +}) { + const { acc, video, files } = options + const trackerUrls = video.getTrackerUrls() const sortedFiles = (files || []) @@ -352,7 +380,7 @@ function videoModelToActivityPubObject (video: MVideoAP): VideoObject { } ] - addVideoFilesInAPAcc(url, video, video.VideoFiles || []) + addVideoFilesInAPAcc({ acc: url, video, files: video.VideoFiles || [] }) for (const playlist of (video.VideoStreamingPlaylists || [])) { const tag = playlist.p2pMediaLoaderInfohashes @@ -364,7 +392,7 @@ function videoModelToActivityPubObject (video: MVideoAP): VideoObject { href: playlist.getSha256SegmentsUrl(video) }) - addVideoFilesInAPAcc(tag, video, playlist.VideoFiles || []) + addVideoFilesInAPAcc({ acc: tag, video, files: playlist.VideoFiles || [] }) url.push({ type: 'Link', @@ -459,13 +487,8 @@ function videoModelToActivityPubObject (video: MVideoAP): VideoObject { } } -function getActivityStreamDuration (duration: number) { - // https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration - return 'PT' + duration + 'S' -} - function getCategoryLabel (id: number) { - return VIDEO_CATEGORIES[id] || 'Misc' + return VIDEO_CATEGORIES[id] || 'Unknown' } function getLicenceLabel (id: number) { @@ -489,7 +512,6 @@ export { videoModelToFormattedDetailsJSON, videoFilesModelToFormattedJSON, videoModelToActivityPubObject, - getActivityStreamDuration, guessAdditionalAttributesFromQuery,