X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fvideos%2Findex.ts;h=1dfd7c7a0d4321d69950a8e33d269ea78064df37;hb=583eb04b541175035d6d452ca626a96ebf2b7437;hp=eb46ea01f5d0bbc78d14a633f5096296221fbf69;hpb=2c8776fc316da9719e5ebc55dfabdcac9e197ac4;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts index eb46ea01f..1dfd7c7a0 100644 --- a/server/controllers/api/videos/index.ts +++ b/server/controllers/api/videos/index.ts @@ -1,10 +1,10 @@ import * as express from 'express' import { extname } from 'path' import { VideoCreate, VideoPrivacy, VideoState, VideoUpdate } from '../../../../shared' -import { getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils' +import { getMetadataFromFile, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils' import { logger } from '../../../helpers/logger' import { auditLoggerFactory, getAuditIdFromRes, VideoAuditView } from '../../../helpers/audit-logger' -import { getFormattedObjects, getServerActor } from '../../../helpers/utils' +import { getFormattedObjects } from '../../../helpers/utils' import { autoBlacklistVideoIfNeeded } from '../../../lib/video-blacklist' import { DEFAULT_AUDIO_RESOLUTION, @@ -14,12 +14,7 @@ import { VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers/constants' -import { - changeVideoChannelShare, - federateVideoIfNeeded, - fetchRemoteVideoDescription, - getVideoActivityPubUrl -} from '../../../lib/activitypub' +import { federateVideoIfNeeded, fetchRemoteVideoDescription } from '../../../lib/activitypub/videos' import { JobQueue } from '../../../lib/job-queue' import { Redis } from '../../../lib/redis' import { @@ -32,6 +27,7 @@ import { paginationValidator, setDefaultPagination, setDefaultSort, + videoFileMetadataGetValidator, videosAddValidator, videosCustomGetValidator, videosGetValidator, @@ -61,11 +57,15 @@ import { CONFIG } from '../../../initializers/config' import { sequelizeTypescript } from '../../../initializers/database' import { createVideoMiniatureFromExisting, generateVideoMiniature } from '../../../lib/thumbnail' import { ThumbnailType } from '../../../../shared/models/videos/thumbnail.type' -import { VideoTranscodingPayload } from '../../../lib/job-queue/handlers/video-transcoding' import { Hooks } from '../../../lib/plugins/hooks' -import { MVideoDetails, MVideoFullLight } from '@server/typings/models' +import { MVideoDetails, MVideoFullLight } from '@server/types/models' import { createTorrentAndSetInfoHash } from '@server/helpers/webtorrent' import { getVideoFilePath } from '@server/lib/video-paths' +import toInt from 'validator/lib/toInt' +import { addOptimizeOrMergeAudioJob } from '@server/helpers/video' +import { getServerActor } from '@server/models/application/application' +import { changeVideoChannelShare } from '@server/lib/activitypub/share' +import { getVideoActivityPubUrl } from '@server/lib/activitypub/url' const auditLogger = auditLoggerFactory('videos') const videosRouter = express.Router() @@ -128,6 +128,10 @@ videosRouter.get('/:id/description', asyncMiddleware(videosGetValidator), asyncMiddleware(getVideoDescription) ) +videosRouter.get('/:id/metadata/:videoFileId', + asyncMiddleware(videoFileMetadataGetValidator), + asyncMiddleware(getVideoFileMetadata) +) videosRouter.get('/:id', optionalAuthenticate, asyncMiddleware(videosCustomGetValidator('only-video-with-rights')), @@ -206,7 +210,8 @@ async function addVideo (req: express.Request, res: express.Response) { const videoFile = new VideoFileModel({ extname: extname(videoPhysicalFile.filename), size: videoPhysicalFile.size, - videoStreamingPlaylistId: null + videoStreamingPlaylistId: null, + metadata: await getMetadataFromFile(videoPhysicalFile.path) }) if (videoFile.isAudio()) { @@ -289,25 +294,7 @@ async function addVideo (req: express.Request, res: express.Response) { Notifier.Instance.notifyOnNewVideoIfNeeded(videoCreated) if (video.state === VideoState.TO_TRANSCODE) { - // Put uuid because we don't have id auto incremented for now - let dataInput: VideoTranscodingPayload - - if (videoFile.isAudio()) { - dataInput = { - type: 'merge-audio' as 'merge-audio', - resolution: DEFAULT_AUDIO_RESOLUTION, - videoUUID: videoCreated.uuid, - isNewVideo: true - } - } else { - dataInput = { - type: 'optimize' as 'optimize', - videoUUID: videoCreated.uuid, - isNewVideo: true - } - } - - await JobQueue.Instance.createJobWithPromise({ type: 'video-transcoding', payload: dataInput }) + await addOptimizeOrMergeAudioJob(videoCreated, videoFile) } Hooks.runAction('action:api.video.uploaded', { video: videoCreated }) @@ -330,11 +317,11 @@ async function updateVideo (req: express.Request, res: express.Response) { const hadPrivacyForFederation = videoInstance.hasPrivacyForFederation() // Process thumbnail or create it from the video - const thumbnailModel = req.files && req.files['thumbnailfile'] + const thumbnailModel = req.files?.['thumbnailfile'] ? await createVideoMiniatureFromExisting(req.files['thumbnailfile'][0].path, videoInstance, ThumbnailType.MINIATURE, false) : undefined - const previewModel = req.files && req.files['previewfile'] + const previewModel = req.files?.['previewfile'] ? await createVideoMiniatureFromExisting(req.files['previewfile'][0].path, videoInstance, ThumbnailType.PREVIEW, false) : undefined @@ -493,6 +480,12 @@ async function getVideoDescription (req: express.Request, res: express.Response) return res.json({ description }) } +async function getVideoFileMetadata (req: express.Request, res: express.Response) { + const videoFile = await VideoFileModel.loadWithMetadata(toInt(req.params.videoFileId)) + + return res.json(videoFile.metadata) +} + async function listVideos (req: express.Request, res: express.Response) { const countVideos = getCountVideos(req)