diff --git a/client/src/app/+videos/+video-watch/shared/information/video-alert.component.html b/client/src/app/+videos/+video-watch/shared/information/video-alert.component.html
index 33b5a47a0..6e5d0bcad 100644
--- a/client/src/app/+videos/+video-watch/shared/information/video-alert.component.html
+++ b/client/src/app/+videos/+video-watch/shared/information/video-alert.component.html
@@ -1,3 +1,7 @@
+
+ Transcoding failed, this video may not work properly.
+
+
The video is being imported, it will be available when the import is finished.
diff --git a/client/src/app/+videos/+video-watch/shared/information/video-alert.component.ts b/client/src/app/+videos/+video-watch/shared/information/video-alert.component.ts
index 257d463b4..addea53c0 100644
--- a/client/src/app/+videos/+video-watch/shared/information/video-alert.component.ts
+++ b/client/src/app/+videos/+video-watch/shared/information/video-alert.component.ts
@@ -14,6 +14,10 @@ export class VideoAlertComponent {
return this.video && this.video.state.id === VideoState.TO_TRANSCODE
}
+ isVideoTranscodingFailed () {
+ return this.video && this.video.state.id === VideoState.TRANSCODING_FAILED
+ }
+
isVideoToImport () {
return this.video && this.video.state.id === VideoState.TO_IMPORT
}
diff --git a/client/src/app/shared/shared-video-miniature/video-miniature.component.ts b/client/src/app/shared/shared-video-miniature/video-miniature.component.ts
index 37ff224ab..f387c38c2 100644
--- a/client/src/app/shared/shared-video-miniature/video-miniature.component.ts
+++ b/client/src/app/shared/shared-video-miniature/video-miniature.component.ts
@@ -175,6 +175,10 @@ export class VideoMiniatureComponent implements OnInit {
return $localize`Publication scheduled on ` + updateAt
}
+ if (video.state.id === VideoState.TRANSCODING_FAILED) {
+ return $localize`Transcoding failed`
+ }
+
if (video.state.id === VideoState.TO_TRANSCODE && video.waitTranscoding === true) {
return $localize`Waiting transcoding`
}
diff --git a/server/lib/job-queue/handlers/video-file-import.ts b/server/lib/job-queue/handlers/video-file-import.ts
index e6c918e6c..47ae10a66 100644
--- a/server/lib/job-queue/handlers/video-file-import.ts
+++ b/server/lib/job-queue/handlers/video-file-import.ts
@@ -7,14 +7,12 @@ import { federateVideoIfNeeded } from '@server/lib/activitypub/videos'
import { generateWebTorrentVideoFilename } from '@server/lib/paths'
import { addMoveToObjectStorageJob } from '@server/lib/video'
import { VideoPathManager } from '@server/lib/video-path-manager'
-import { UserModel } from '@server/models/user/user'
import { MVideoFullLight } from '@server/types/models'
import { VideoFileImportPayload, VideoStorage } from '@shared/models'
import { getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffprobe-utils'
import { logger } from '../../../helpers/logger'
import { VideoModel } from '../../../models/video/video'
import { VideoFileModel } from '../../../models/video/video-file'
-import { createHlsJobIfEnabled } from './video-transcoding'
async function processVideoFileImport (job: Job) {
const payload = job.data as VideoFileImportPayload
@@ -27,20 +25,8 @@ async function processVideoFileImport (job: Job) {
return undefined
}
- const data = await getVideoFileResolution(payload.filePath)
-
await updateVideoFile(video, payload.filePath)
- const user = await UserModel.loadByChannelActorId(video.VideoChannel.actorId)
-
- await createHlsJobIfEnabled(user, {
- videoUUID: video.uuid,
- resolution: data.resolution,
- isPortraitMode: data.isPortraitMode,
- copyCodecs: true,
- isMaxQuality: false
- })
-
if (CONFIG.OBJECT_STORAGE.ENABLED) {
await addMoveToObjectStorageJob(video)
} else {
diff --git a/server/lib/job-queue/handlers/video-transcoding.ts b/server/lib/job-queue/handlers/video-transcoding.ts
index b280a1cc9..0143cd02a 100644
--- a/server/lib/job-queue/handlers/video-transcoding.ts
+++ b/server/lib/job-queue/handlers/video-transcoding.ts
@@ -2,7 +2,7 @@ import { Job } from 'bull'
import { TranscodeOptionsType } from '@server/helpers/ffmpeg-utils'
import { addTranscodingJob, getTranscodingJobPriority } from '@server/lib/video'
import { VideoPathManager } from '@server/lib/video-path-manager'
-import { moveToFailedState, moveToNextState } from '@server/lib/video-state'
+import { moveToFailedTranscodingState, moveToNextState } from '@server/lib/video-state'
import { UserModel } from '@server/models/user/user'
import { VideoJobInfoModel } from '@server/models/video/video-job-info'
import { MUser, MUserId, MVideo, MVideoFullLight, MVideoWithFile } from '@server/types/models'
@@ -52,14 +52,15 @@ async function processVideoTranscoding (job: Job) {
const handler = handlers[payload.type]
if (!handler) {
- await moveToFailedState(video)
+ await moveToFailedTranscodingState(video)
+
throw new Error('Cannot find transcoding handler for ' + payload.type)
}
try {
await handler(job, payload, video, user)
} catch (error) {
- await moveToFailedState(video)
+ await moveToFailedTranscodingState(video)
throw error
}
diff --git a/server/lib/video-state.ts b/server/lib/video-state.ts
index 2260e90f5..0b51f5c6b 100644
--- a/server/lib/video-state.ts
+++ b/server/lib/video-state.ts
@@ -79,10 +79,8 @@ async function moveToExternalStorageState (video: MVideoFullLight, isNewVideo: b
}
}
-function moveToFailedState (video: MVideoFullLight) {
- return sequelizeTypescript.transaction(async t => {
- await video.setNewState(VideoState.TRANSCODING_FAILED, false, t)
- })
+function moveToFailedTranscodingState (video: MVideoFullLight) {
+ return video.setNewState(VideoState.TRANSCODING_FAILED, false, undefined)
}
// ---------------------------------------------------------------------------
@@ -90,7 +88,7 @@ function moveToFailedState (video: MVideoFullLight) {
export {
buildNextVideoState,
moveToExternalStorageState,
- moveToFailedState,
+ moveToFailedTranscodingState,
moveToNextState
}
diff --git a/server/tests/cli/create-import-video-file-job.ts b/server/tests/cli/create-import-video-file-job.ts
index 01817216e..1e278bacc 100644
--- a/server/tests/cli/create-import-video-file-job.ts
+++ b/server/tests/cli/create-import-video-file-job.ts
@@ -14,7 +14,7 @@ import {
setAccessTokensToServers,
waitJobs
} from '@shared/extra-utils'
-import { HttpStatusCode, VideoDetails, VideoFile } from '@shared/models'
+import { HttpStatusCode, VideoDetails, VideoFile, VideoInclude } from '@shared/models'
const expect = chai.expect
@@ -100,7 +100,7 @@ function runTests (objectStorage: boolean) {
await waitJobs(servers)
for (const server of servers) {
- const { data: videos } = await server.videos.list()
+ const { data: videos } = await server.videos.listWithToken({ include: VideoInclude.NOT_PUBLISHED_STATE })
expect(videos).to.have.lengthOf(2)
const video = videos.find(({ uuid }) => uuid === video2UUID)
@@ -124,7 +124,7 @@ function runTests (objectStorage: boolean) {
await waitJobs(servers)
for (const server of servers) {
- const { data: videos } = await server.videos.list()
+ const { data: videos } = await server.videos.listWithToken({ include: VideoInclude.NOT_PUBLISHED_STATE })
expect(videos).to.have.lengthOf(2)
const video = videos.find(({ shortUUID }) => shortUUID === video1ShortId)
diff --git a/support/doc/tools.md b/support/doc/tools.md
index 526cc98b1..c08747cdc 100644
--- a/support/doc/tools.md
+++ b/support/doc/tools.md
@@ -292,7 +292,8 @@ $ docker-compose exec -u peertube peertube npm run create-transcoding-job -- --g
### create-import-video-file-job.js
-You can use this script to import a video file to replace an already uploaded file or to add a new resolution to a video. PeerTube needs to be running.
+You can use this script to import a video file to replace an already uploaded file or to add a new webtorrent resolution to a video. PeerTube needs to be running.
+You can then create a transcoding job using `npm run create-transcoding-job` if you need to optimize your file or create an HLS version of it.
```bash
$ # Basic installation