+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'
import { FormValidatorService } from '@app/shared/shared-forms'
import { BytesPipe, Video, VideoCaptionService, VideoEdit, VideoService } from '@app/shared/shared-main'
import { LoadingBarService } from '@ngx-loading-bar/core'
-import { HttpStatusCode, VideoCreateResult, VideoPrivacy } from '@shared/models'
+import { HttpStatusCode, VideoCreateResult } 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',
error: string
enableRetryAfterError: boolean
- schedulePublicationPossible = false
-
// So that it can be accessed in the template
- protected readonly BASE_VIDEO_UPLOAD_URL = VideoService.BASE_VIDEO_URL + 'upload-resumable'
+ protected readonly BASE_VIDEO_UPLOAD_URL = VideoService.BASE_VIDEO_URL + '/upload-resumable'
private uploadxOptions: UploadxOptions
private isUpdatingVideo = false
uploaderClass: UploaderXFormData,
chunkSize,
retryConfig: {
- maxAttempts: 6,
- shouldRetry: (code: number) => {
- return code < 400 || code >= 501
+ maxAttempts: 30, // maximum attempts for 503 codes, otherwise set to 6, see below
+ maxDelay: 120_000, // 2 min
+ shouldRetry: (code: number, attempts: number) => {
+ return code === HttpStatusCode.SERVICE_UNAVAILABLE_503 || ((code < 400 || code > 500) && attempts < 6)
}
}
}
this.resumableUploadService.events
.subscribe(state => this.onUploadVideoOngoing(state))
-
- this.schedulePublicationPossible = this.videoPrivacies.some(p => p.id === VideoPrivacy.PRIVATE)
}
ngAfterViewInit () {
this.firstStepError.emit()
this.enableRetryAfterError = false
this.error = ''
+ this.isUploadingAudioFile = false
break
case 'queue':
return $localize`Upload ${videofile.name}`
}
- updateSecondStep () {
- if (this.isPublishingButtonDisabled() || !this.checkForm()) {
- return
- }
+ async updateSecondStep () {
+ if (!await this.isFormValid()) return
+ if (this.isPublishingButtonDisabled()) return
const video = new VideoEdit()
video.patch(this.form.value)
private uploadFile (file: File, previewfile?: File) {
const metadata = {
waitTranscoding: true,
- commentsEnabled: true,
- downloadEnabled: true,
channelId: this.firstStepChannelId,
nsfw: this.serverConfig.instance.isNSFW,
privacy: this.highestPrivacy.toString(),
+ name: this.buildVideoFilename(file.name),
filename: file.name,
previewfile: previewfile as any
}
}
private closeFirstStep (filename: string) {
- const nameWithoutExtension = filename.replace(/\.[^/.]+$/, '')
- const name = nameWithoutExtension.length < 3 ? filename : nameWithoutExtension
+ const name = this.buildVideoFilename(filename)
this.form.patchValue({
name,
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
+ }
}