mirror of https://github.com/Chocobozzz/PeerTube
Add transcoding fail message in client
parent
4e29f4fe23
commit
221ee1adc9
|
@ -1,3 +1,7 @@
|
||||||
|
<div i18n class="alert alert-warning" *ngIf="isVideoTranscodingFailed()">
|
||||||
|
Transcoding failed, this video may not work properly.
|
||||||
|
</div>
|
||||||
|
|
||||||
<div i18n class="alert alert-warning" *ngIf="isVideoToImport()">
|
<div i18n class="alert alert-warning" *ngIf="isVideoToImport()">
|
||||||
The video is being imported, it will be available when the import is finished.
|
The video is being imported, it will be available when the import is finished.
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -14,6 +14,10 @@ export class VideoAlertComponent {
|
||||||
return this.video && this.video.state.id === VideoState.TO_TRANSCODE
|
return this.video && this.video.state.id === VideoState.TO_TRANSCODE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isVideoTranscodingFailed () {
|
||||||
|
return this.video && this.video.state.id === VideoState.TRANSCODING_FAILED
|
||||||
|
}
|
||||||
|
|
||||||
isVideoToImport () {
|
isVideoToImport () {
|
||||||
return this.video && this.video.state.id === VideoState.TO_IMPORT
|
return this.video && this.video.state.id === VideoState.TO_IMPORT
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,6 +175,10 @@ export class VideoMiniatureComponent implements OnInit {
|
||||||
return $localize`Publication scheduled on ` + updateAt
|
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) {
|
if (video.state.id === VideoState.TO_TRANSCODE && video.waitTranscoding === true) {
|
||||||
return $localize`Waiting transcoding`
|
return $localize`Waiting transcoding`
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,14 +7,12 @@ import { federateVideoIfNeeded } from '@server/lib/activitypub/videos'
|
||||||
import { generateWebTorrentVideoFilename } from '@server/lib/paths'
|
import { generateWebTorrentVideoFilename } from '@server/lib/paths'
|
||||||
import { addMoveToObjectStorageJob } from '@server/lib/video'
|
import { addMoveToObjectStorageJob } from '@server/lib/video'
|
||||||
import { VideoPathManager } from '@server/lib/video-path-manager'
|
import { VideoPathManager } from '@server/lib/video-path-manager'
|
||||||
import { UserModel } from '@server/models/user/user'
|
|
||||||
import { MVideoFullLight } from '@server/types/models'
|
import { MVideoFullLight } from '@server/types/models'
|
||||||
import { VideoFileImportPayload, VideoStorage } from '@shared/models'
|
import { VideoFileImportPayload, VideoStorage } from '@shared/models'
|
||||||
import { getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffprobe-utils'
|
import { getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffprobe-utils'
|
||||||
import { logger } from '../../../helpers/logger'
|
import { logger } from '../../../helpers/logger'
|
||||||
import { VideoModel } from '../../../models/video/video'
|
import { VideoModel } from '../../../models/video/video'
|
||||||
import { VideoFileModel } from '../../../models/video/video-file'
|
import { VideoFileModel } from '../../../models/video/video-file'
|
||||||
import { createHlsJobIfEnabled } from './video-transcoding'
|
|
||||||
|
|
||||||
async function processVideoFileImport (job: Job) {
|
async function processVideoFileImport (job: Job) {
|
||||||
const payload = job.data as VideoFileImportPayload
|
const payload = job.data as VideoFileImportPayload
|
||||||
|
@ -27,20 +25,8 @@ async function processVideoFileImport (job: Job) {
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await getVideoFileResolution(payload.filePath)
|
|
||||||
|
|
||||||
await updateVideoFile(video, 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) {
|
if (CONFIG.OBJECT_STORAGE.ENABLED) {
|
||||||
await addMoveToObjectStorageJob(video)
|
await addMoveToObjectStorageJob(video)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { Job } from 'bull'
|
||||||
import { TranscodeOptionsType } from '@server/helpers/ffmpeg-utils'
|
import { TranscodeOptionsType } from '@server/helpers/ffmpeg-utils'
|
||||||
import { addTranscodingJob, getTranscodingJobPriority } from '@server/lib/video'
|
import { addTranscodingJob, getTranscodingJobPriority } from '@server/lib/video'
|
||||||
import { VideoPathManager } from '@server/lib/video-path-manager'
|
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 { UserModel } from '@server/models/user/user'
|
||||||
import { VideoJobInfoModel } from '@server/models/video/video-job-info'
|
import { VideoJobInfoModel } from '@server/models/video/video-job-info'
|
||||||
import { MUser, MUserId, MVideo, MVideoFullLight, MVideoWithFile } from '@server/types/models'
|
import { MUser, MUserId, MVideo, MVideoFullLight, MVideoWithFile } from '@server/types/models'
|
||||||
|
@ -52,14 +52,15 @@ async function processVideoTranscoding (job: Job) {
|
||||||
const handler = handlers[payload.type]
|
const handler = handlers[payload.type]
|
||||||
|
|
||||||
if (!handler) {
|
if (!handler) {
|
||||||
await moveToFailedState(video)
|
await moveToFailedTranscodingState(video)
|
||||||
|
|
||||||
throw new Error('Cannot find transcoding handler for ' + payload.type)
|
throw new Error('Cannot find transcoding handler for ' + payload.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await handler(job, payload, video, user)
|
await handler(job, payload, video, user)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
await moveToFailedState(video)
|
await moveToFailedTranscodingState(video)
|
||||||
|
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,10 +79,8 @@ async function moveToExternalStorageState (video: MVideoFullLight, isNewVideo: b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function moveToFailedState (video: MVideoFullLight) {
|
function moveToFailedTranscodingState (video: MVideoFullLight) {
|
||||||
return sequelizeTypescript.transaction(async t => {
|
return video.setNewState(VideoState.TRANSCODING_FAILED, false, undefined)
|
||||||
await video.setNewState(VideoState.TRANSCODING_FAILED, false, t)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -90,7 +88,7 @@ function moveToFailedState (video: MVideoFullLight) {
|
||||||
export {
|
export {
|
||||||
buildNextVideoState,
|
buildNextVideoState,
|
||||||
moveToExternalStorageState,
|
moveToExternalStorageState,
|
||||||
moveToFailedState,
|
moveToFailedTranscodingState,
|
||||||
moveToNextState
|
moveToNextState
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ import {
|
||||||
setAccessTokensToServers,
|
setAccessTokensToServers,
|
||||||
waitJobs
|
waitJobs
|
||||||
} from '@shared/extra-utils'
|
} from '@shared/extra-utils'
|
||||||
import { HttpStatusCode, VideoDetails, VideoFile } from '@shared/models'
|
import { HttpStatusCode, VideoDetails, VideoFile, VideoInclude } from '@shared/models'
|
||||||
|
|
||||||
const expect = chai.expect
|
const expect = chai.expect
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ function runTests (objectStorage: boolean) {
|
||||||
await waitJobs(servers)
|
await waitJobs(servers)
|
||||||
|
|
||||||
for (const server of 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)
|
expect(videos).to.have.lengthOf(2)
|
||||||
|
|
||||||
const video = videos.find(({ uuid }) => uuid === video2UUID)
|
const video = videos.find(({ uuid }) => uuid === video2UUID)
|
||||||
|
@ -124,7 +124,7 @@ function runTests (objectStorage: boolean) {
|
||||||
await waitJobs(servers)
|
await waitJobs(servers)
|
||||||
|
|
||||||
for (const server of 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)
|
expect(videos).to.have.lengthOf(2)
|
||||||
|
|
||||||
const video = videos.find(({ shortUUID }) => shortUUID === video1ShortId)
|
const video = videos.find(({ shortUUID }) => shortUUID === video1ShortId)
|
||||||
|
|
|
@ -292,7 +292,8 @@ $ docker-compose exec -u peertube peertube npm run create-transcoding-job -- --g
|
||||||
|
|
||||||
### create-import-video-file-job.js
|
### 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
|
```bash
|
||||||
$ # Basic installation
|
$ # Basic installation
|
||||||
|
|
Loading…
Reference in New Issue