X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-format-utils.ts;h=21f0e0a68b7767f8544a4c0351d5959c149dcd4b;hb=8319d6ae72d4da6de51bd3d4b5c68040fc8dc3b4;hp=2aa5b8677cfffc42be08282e5719f47692958f60;hpb=d5692d4088cdd9fde3be6ff34be8ce2816dab0cf;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-format-utils.ts b/server/models/video/video-format-utils.ts index 2aa5b8677..21f0e0a68 100644 --- a/server/models/video/video-format-utils.ts +++ b/server/models/video/video-format-utils.ts @@ -23,16 +23,18 @@ import { import { MVideoFileRedundanciesOpt } from '../../typings/models/video/video-file' import { VideoFile } from '@shared/models/videos/video-file.model' import { generateMagnetUri } from '@server/helpers/webtorrent' +import { extractVideo } from '@server/lib/videos' export type VideoFormattingJSONOptions = { completeDescription?: boolean additionalAttributes: { - state?: boolean, - waitTranscoding?: boolean, - scheduledUpdate?: boolean, + state?: boolean + waitTranscoding?: boolean + scheduledUpdate?: boolean blacklistInfo?: boolean } } + function videoModelToFormattedJSON (video: MVideoFormattable, options?: VideoFormattingJSONOptions): Video { const userHistory = isArray(video.UserVideoHistories) ? video.UserVideoHistories[0] : undefined @@ -181,12 +183,10 @@ function videoFilesModelToFormattedJSON ( ): VideoFile[] { return videoFiles .map(videoFile => { - let resolutionLabel = videoFile.resolution + 'p' - return { resolution: { id: videoFile.resolution, - label: resolutionLabel + label: videoFile.resolution + 'p' }, magnetUri: generateMagnetUri(model, videoFile, baseUrlHttp, baseUrlWs), size: videoFile.size, @@ -194,7 +194,8 @@ function videoFilesModelToFormattedJSON ( torrentUrl: model.getTorrentUrl(videoFile, baseUrlHttp), torrentDownloadUrl: model.getTorrentDownloadUrl(videoFile, baseUrlHttp), fileUrl: model.getVideoFileUrl(videoFile, baseUrlHttp), - fileDownloadUrl: model.getVideoFileDownloadUrl(videoFile, baseUrlHttp) + fileDownloadUrl: model.getVideoFileDownloadUrl(videoFile, baseUrlHttp), + metadataUrl: videoFile.metadataUrl // only send the metadataUrl and not the metadata over the wire } as VideoFile }) .sort((a, b) => { @@ -214,13 +215,22 @@ function addVideoFilesInAPAcc ( for (const file of files) { acc.push({ type: 'Link', - mediaType: MIMETYPES.VIDEO.EXT_MIMETYPE[ file.extname ] as any, + mediaType: MIMETYPES.VIDEO.EXT_MIMETYPE[file.extname] as any, href: model.getVideoFileUrl(file, baseUrlHttp), height: file.resolution, size: file.size, fps: file.fps }) + acc.push({ + type: 'Link', + rel: [ 'metadata', MIMETYPES.VIDEO.EXT_MIMETYPE[file.extname] ], + mediaType: 'application/json' as 'application/json', + href: extractVideo(model).getVideoFileMetadataUrl(file, baseUrlHttp), + height: file.resolution, + fps: file.fps + }) + acc.push({ type: 'Link', mediaType: 'application/x-bittorrent' as 'application/x-bittorrent', @@ -270,14 +280,20 @@ function videoModelToActivityPubObject (video: MVideoAP): VideoTorrentObject { } } - const url: ActivityUrlObject[] = [] + const url: ActivityUrlObject[] = [ + // HTML url should be the first element in the array so Mastodon correctly displays the embed + { + type: 'Link', + mediaType: 'text/html', + href: WEBSERVER.URL + '/videos/watch/' + video.uuid + } + ] + addVideoFilesInAPAcc(url, video, baseUrlHttp, baseUrlWs, video.VideoFiles || []) for (const playlist of (video.VideoStreamingPlaylists || [])) { - let tag: ActivityTagObject[] - - tag = playlist.p2pMediaLoaderInfohashes - .map(i => ({ type: 'Infohash' as 'Infohash', name: i })) + const tag = playlist.p2pMediaLoaderInfohashes + .map(i => ({ type: 'Infohash' as 'Infohash', name: i })) as ActivityTagObject[] tag.push({ type: 'Link', name: 'sha256', @@ -296,22 +312,16 @@ function videoModelToActivityPubObject (video: MVideoAP): VideoTorrentObject { }) } - // Add video url too - url.push({ - type: 'Link', - mediaType: 'text/html', - href: WEBSERVER.URL + '/videos/watch/' + video.uuid - }) - const subtitleLanguage = [] for (const caption of video.VideoCaptions) { subtitleLanguage.push({ identifier: caption.language, - name: VideoCaptionModel.getLanguageLabel(caption.language) + name: VideoCaptionModel.getLanguageLabel(caption.language), + url: caption.getFileUrl(video) }) } - const miniature = video.getMiniature() + const icons = [ video.getMiniature(), video.getPreview() ] return { type: 'Video' as 'Video', @@ -336,13 +346,13 @@ function videoModelToActivityPubObject (video: MVideoAP): VideoTorrentObject { content: video.getTruncatedDescription(), support: video.support, subtitleLanguage, - icon: { + icon: icons.map(i => ({ type: 'Image', - url: miniature.getFileUrl(video.isOwned()), + url: i.getFileUrl(video), mediaType: 'image/jpeg', - width: miniature.width, - height: miniature.height - }, + width: i.width, + height: i.height + })), url, likes: getVideoLikesActivityPubUrl(video), dislikes: getVideoDislikesActivityPubUrl(video),