From e78acf81ff00568555e9823c1d9b01c7616b7272 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 3 Dec 2021 14:09:52 +0100 Subject: [PATCH 1/3] Fix additional extensions admin config description --- .../edit-custom-config/edit-vod-transcoding.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.html b/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.html index 048f7908d..1158f027b 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.html +++ b/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.html @@ -51,7 +51,7 @@ i18n-labelText labelText="Allow additional extensions" > - Allows users to upload {{ additionalVideoExtensions }} videos. + Allows users to upload videos with additional extensions than .mp4, .ogv and .webm (for example: .avi, .mov, .mkv etc). From 453537426a4e172967320cfac4bb1f53c28d94f5 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 3 Dec 2021 14:23:45 +0100 Subject: [PATCH 2/3] Fix too long filename video upload --- .../video-upload.component.ts | 21 ++++++++++++++++--- .../middlewares/validators/videos/videos.ts | 2 +- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts b/client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts index 76205db44..28d7ec458 100644 --- a/client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts +++ b/client/src/app/+videos/+video-edit/video-add-components/video-upload.component.ts @@ -1,4 +1,6 @@ +import { truncate } from 'lodash-es' import { UploadState, UploadxOptions, UploadxService } from 'ngx-uploadx' +import { isIOS } from 'src/assets/player/utils' import { HttpErrorResponse, HttpEventType, HttpHeaders } from '@angular/common/http' import { AfterViewInit, Component, ElementRef, EventEmitter, OnDestroy, OnInit, Output, ViewChild } from '@angular/core' import { Router } from '@angular/router' @@ -10,7 +12,6 @@ import { LoadingBarService } from '@ngx-loading-bar/core' import { HttpStatusCode, VideoCreateResult, VideoPrivacy } from '@shared/models' import { UploaderXFormData } from './uploaderx-form-data' import { VideoSend } from './video-send' -import { isIOS } from 'src/assets/player/utils' @Component({ selector: 'my-video-upload', @@ -281,6 +282,7 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy channelId: this.firstStepChannelId, nsfw: this.serverConfig.instance.isNSFW, privacy: this.highestPrivacy.toString(), + name: this.buildVideoFilename(file.name), filename: file.name, previewfile: previewfile as any } @@ -311,8 +313,7 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy } private closeFirstStep (filename: string) { - const nameWithoutExtension = filename.replace(/\.[^/.]+$/, '') - const name = nameWithoutExtension.length < 3 ? filename : nameWithoutExtension + const name = this.buildVideoFilename(filename) this.form.patchValue({ name, @@ -369,4 +370,18 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy return extensions.some(e => filename.endsWith(e)) } + + private buildVideoFilename (filename: string) { + const nameWithoutExtension = filename.replace(/\.[^/.]+$/, '') + let name = nameWithoutExtension.length < 3 + ? filename + : nameWithoutExtension + + const videoNameMaxSize = 110 + if (name.length > videoNameMaxSize) { + name = truncate(name, { length: videoNameMaxSize, omission: '' }) + } + + return name + } } diff --git a/server/middlewares/validators/videos/videos.ts b/server/middlewares/validators/videos/videos.ts index 4916decbf..3ebdbc33d 100644 --- a/server/middlewares/validators/videos/videos.ts +++ b/server/middlewares/validators/videos/videos.ts @@ -211,7 +211,7 @@ const videosAddResumableInitValidator = getCommonVideoEditAttributes().concat([ const videoFileMetadata = { mimetype: req.headers['x-upload-content-type'] as string, size: +req.headers['x-upload-content-length'], - originalname: req.body.name + originalname: req.body.filename } const user = res.locals.oauth.token.User From 025d858e7997d6b9895fa6b7beaf23bf5ff814af Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 3 Dec 2021 14:40:29 +0100 Subject: [PATCH 3/3] Fix pending transcoding with failed job --- .../job-queue/handlers/video-transcoding.ts | 27 ++++++++++--------- server/models/video/video-job-info.ts | 6 +++-- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/server/lib/job-queue/handlers/video-transcoding.ts b/server/lib/job-queue/handlers/video-transcoding.ts index 0d80eb6c5..0edcdcba3 100644 --- a/server/lib/job-queue/handlers/video-transcoding.ts +++ b/server/lib/job-queue/handlers/video-transcoding.ts @@ -53,6 +53,7 @@ async function processVideoTranscoding (job: Job) { if (!handler) { await moveToFailedTranscodingState(video) + await VideoJobInfoModel.decrease(video.uuid, 'pendingTranscode') throw new Error('Cannot find transcoding handler for ' + payload.type) } @@ -62,12 +63,20 @@ async function processVideoTranscoding (job: Job) { } catch (error) { await moveToFailedTranscodingState(video) + await VideoJobInfoModel.decrease(video.uuid, 'pendingTranscode') + throw error } return video } +// --------------------------------------------------------------------------- + +export { + processVideoTranscoding +} + // --------------------------------------------------------------------------- // Job handlers // --------------------------------------------------------------------------- @@ -119,7 +128,7 @@ async function handleWebTorrentMergeAudioJob (job: Job, payload: MergeAudioTrans logger.info('Merge audio transcoding job for %s ended.', video.uuid, lTags(video.uuid)) - await onVideoFileOptimizer(video, payload, 'video', user) + await onVideoFirstWebTorrentTranscoding(video, payload, 'video', user) } async function handleWebTorrentOptimizeJob (job: Job, payload: OptimizeTranscodingPayload, video: MVideoFullLight, user: MUserId) { @@ -129,7 +138,7 @@ async function handleWebTorrentOptimizeJob (job: Job, payload: OptimizeTranscodi logger.info('Optimize transcoding job for %s ended.', video.uuid, lTags(video.uuid)) - await onVideoFileOptimizer(video, payload, transcodeType, user) + await onVideoFirstWebTorrentTranscoding(video, payload, transcodeType, user) } // --------------------------------------------------------------------------- @@ -159,7 +168,7 @@ async function onHlsPlaylistGeneration (video: MVideoFullLight, user: MUser, pay await retryTransactionWrapper(moveToNextState, video, payload.isNewVideo) } -async function onVideoFileOptimizer ( +async function onVideoFirstWebTorrentTranscoding ( videoArg: MVideoWithFile, payload: OptimizeTranscodingPayload | MergeAudioTranscodingPayload, transcodeType: TranscodeOptionsType, @@ -211,6 +220,8 @@ async function onNewWebTorrentFileResolution ( await retryTransactionWrapper(moveToNextState, video, payload.isNewVideo) } +// --------------------------------------------------------------------------- + async function createHlsJobIfEnabled (user: MUserId, payload: { videoUUID: string resolution: number @@ -241,16 +252,6 @@ async function createHlsJobIfEnabled (user: MUserId, payload: { return true } -// --------------------------------------------------------------------------- - -export { - processVideoTranscoding, - createHlsJobIfEnabled, - onNewWebTorrentFileResolution -} - -// --------------------------------------------------------------------------- - async function createLowerResolutionsJobs (options: { video: MVideoFullLight user: MUserId diff --git a/server/models/video/video-job-info.ts b/server/models/video/video-job-info.ts index cb1f3f2f0..7da5128d7 100644 --- a/server/models/video/video-job-info.ts +++ b/server/models/video/video-job-info.ts @@ -3,6 +3,8 @@ import { AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, IsInt, Mo import { AttributesOnly } from '@shared/core-utils' import { VideoModel } from './video' +export type VideoJobInfoColumnType = 'pendingMove' | 'pendingTranscode' + @Table({ tableName: 'videoJobInfo', indexes: [ @@ -57,7 +59,7 @@ export class VideoJobInfoModel extends Model { + static async increaseOrCreate (videoUUID: string, column: VideoJobInfoColumnType): Promise { const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } } const [ { pendingMove } ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(` @@ -79,7 +81,7 @@ export class VideoJobInfoModel extends Model { + static async decrease (videoUUID: string, column: VideoJobInfoColumnType): Promise { const options = { type: QueryTypes.SELECT as QueryTypes.SELECT, bind: { videoUUID } } const [ { pendingMove } ] = await VideoJobInfoModel.sequelize.query<{ pendingMove: number }>(`