diff options
Diffstat (limited to 'server/controllers/api')
-rw-r--r-- | server/controllers/api/videos/upload.ts | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/server/controllers/api/videos/upload.ts b/server/controllers/api/videos/upload.ts index 89f50714d..5c740c041 100644 --- a/server/controllers/api/videos/upload.ts +++ b/server/controllers/api/videos/upload.ts | |||
@@ -1,12 +1,21 @@ | |||
1 | import * as express from 'express' | 1 | import * as express from 'express' |
2 | import { move } from 'fs-extra' | 2 | import { move } from 'fs-extra' |
3 | import { basename } from 'path' | ||
3 | import { getLowercaseExtension } from '@server/helpers/core-utils' | 4 | import { getLowercaseExtension } from '@server/helpers/core-utils' |
4 | import { deleteResumableUploadMetaFile, getResumableUploadPath } from '@server/helpers/upload' | 5 | import { deleteResumableUploadMetaFile, getResumableUploadPath } from '@server/helpers/upload' |
5 | import { uuidToShort } from '@server/helpers/uuid' | 6 | import { uuidToShort } from '@server/helpers/uuid' |
6 | import { createTorrentAndSetInfoHash } from '@server/helpers/webtorrent' | 7 | import { createTorrentAndSetInfoHash } from '@server/helpers/webtorrent' |
7 | import { getLocalVideoActivityPubUrl } from '@server/lib/activitypub/url' | 8 | import { getLocalVideoActivityPubUrl } from '@server/lib/activitypub/url' |
8 | import { addOptimizeOrMergeAudioJob, buildLocalVideoFromReq, buildVideoThumbnailsFromReq, setVideoTags } from '@server/lib/video' | 9 | import { generateWebTorrentVideoFilename } from '@server/lib/paths' |
9 | import { generateWebTorrentVideoFilename, getVideoFilePath } from '@server/lib/video-paths' | 10 | import { |
11 | addMoveToObjectStorageJob, | ||
12 | addOptimizeOrMergeAudioJob, | ||
13 | buildLocalVideoFromReq, | ||
14 | buildVideoThumbnailsFromReq, | ||
15 | setVideoTags | ||
16 | } from '@server/lib/video' | ||
17 | import { VideoPathManager } from '@server/lib/video-path-manager' | ||
18 | import { buildNextVideoState } from '@server/lib/video-state' | ||
10 | import { openapiOperationDoc } from '@server/middlewares/doc' | 19 | import { openapiOperationDoc } from '@server/middlewares/doc' |
11 | import { MVideo, MVideoFile, MVideoFullLight } from '@server/types/models' | 20 | import { MVideo, MVideoFile, MVideoFullLight } from '@server/types/models' |
12 | import { uploadx } from '@uploadx/core' | 21 | import { uploadx } from '@uploadx/core' |
@@ -139,23 +148,20 @@ async function addVideo (options: { | |||
139 | 148 | ||
140 | const videoData = buildLocalVideoFromReq(videoInfo, videoChannel.id) | 149 | const videoData = buildLocalVideoFromReq(videoInfo, videoChannel.id) |
141 | 150 | ||
142 | videoData.state = CONFIG.TRANSCODING.ENABLED | 151 | videoData.state = buildNextVideoState() |
143 | ? VideoState.TO_TRANSCODE | ||
144 | : VideoState.PUBLISHED | ||
145 | |||
146 | videoData.duration = videoPhysicalFile.duration // duration was added by a previous middleware | 152 | videoData.duration = videoPhysicalFile.duration // duration was added by a previous middleware |
147 | 153 | ||
148 | const video = new VideoModel(videoData) as MVideoFullLight | 154 | const video = new VideoModel(videoData) as MVideoFullLight |
149 | video.VideoChannel = videoChannel | 155 | video.VideoChannel = videoChannel |
150 | video.url = getLocalVideoActivityPubUrl(video) // We use the UUID, so set the URL after building the object | 156 | video.url = getLocalVideoActivityPubUrl(video) // We use the UUID, so set the URL after building the object |
151 | 157 | ||
152 | const videoFile = await buildNewFile(video, videoPhysicalFile) | 158 | const videoFile = await buildNewFile(videoPhysicalFile) |
153 | 159 | ||
154 | // Move physical file | 160 | // Move physical file |
155 | const destination = getVideoFilePath(video, videoFile) | 161 | const destination = VideoPathManager.Instance.getFSVideoFileOutputPath(video, videoFile) |
156 | await move(videoPhysicalFile.path, destination) | 162 | await move(videoPhysicalFile.path, destination) |
157 | // This is important in case if there is another attempt in the retry process | 163 | // This is important in case if there is another attempt in the retry process |
158 | videoPhysicalFile.filename = getVideoFilePath(video, videoFile) | 164 | videoPhysicalFile.filename = basename(destination) |
159 | videoPhysicalFile.path = destination | 165 | videoPhysicalFile.path = destination |
160 | 166 | ||
161 | const [ thumbnailModel, previewModel ] = await buildVideoThumbnailsFromReq({ | 167 | const [ thumbnailModel, previewModel ] = await buildVideoThumbnailsFromReq({ |
@@ -210,9 +216,13 @@ async function addVideo (options: { | |||
210 | 216 | ||
211 | createTorrentFederate(video, videoFile) | 217 | createTorrentFederate(video, videoFile) |
212 | .then(() => { | 218 | .then(() => { |
213 | if (video.state !== VideoState.TO_TRANSCODE) return | 219 | if (video.state === VideoState.TO_MOVE_TO_EXTERNAL_STORAGE) { |
220 | return addMoveToObjectStorageJob(video) | ||
221 | } | ||
214 | 222 | ||
215 | return addOptimizeOrMergeAudioJob(videoCreated, videoFile, user) | 223 | if (video.state === VideoState.TO_TRANSCODE) { |
224 | return addOptimizeOrMergeAudioJob(videoCreated, videoFile, user) | ||
225 | } | ||
216 | }) | 226 | }) |
217 | .catch(err => logger.error('Cannot add optimize/merge audio job for %s.', videoCreated.uuid, { err, ...lTags(videoCreated.uuid) })) | 227 | .catch(err => logger.error('Cannot add optimize/merge audio job for %s.', videoCreated.uuid, { err, ...lTags(videoCreated.uuid) })) |
218 | 228 | ||
@@ -227,7 +237,7 @@ async function addVideo (options: { | |||
227 | }) | 237 | }) |
228 | } | 238 | } |
229 | 239 | ||
230 | async function buildNewFile (video: MVideo, videoPhysicalFile: express.VideoUploadFile) { | 240 | async function buildNewFile (videoPhysicalFile: express.VideoUploadFile) { |
231 | const videoFile = new VideoFileModel({ | 241 | const videoFile = new VideoFileModel({ |
232 | extname: getLowercaseExtension(videoPhysicalFile.filename), | 242 | extname: getLowercaseExtension(videoPhysicalFile.filename), |
233 | size: videoPhysicalFile.size, | 243 | size: videoPhysicalFile.size, |