+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'
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
) {
super()
+ // FIXME: https://github.com/Chocobozzz/PeerTube/issues/4382#issuecomment-915854167
+ const chunkSize = isIOS()
+ ? 0
+ : undefined // Auto chunk size
+
this.uploadxOptions = {
endpoint: this.BASE_VIDEO_UPLOAD_URL,
multiple: false,
token: this.authService.getAccessToken(),
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)
}
}
}
let text = ''
if (this.videoUploaded === true) {
- // FIXME: cannot concatenate strings using $localize
+ // We can't concatenate strings using $localize
text = $localize`Your video was uploaded to your account and is private.` + ' ' +
$localize`But associated data (tags, description...) will be lost, are you sure you want to leave this page?`
} else {
this.firstStepError.emit()
this.enableRetryAfterError = false
this.error = ''
+ this.isUploadingAudioFile = false
break
case 'queue':
}
isPublishingButtonDisabled () {
- return !this.form.valid ||
+ return !this.checkForm() ||
this.isUpdatingVideo === true ||
this.videoUploaded !== true ||
!this.videoUploadedIds.id
}
updateSecondStep () {
- if (this.isPublishingButtonDisabled() || !this.checkForm()) {
+ if (this.isPublishingButtonDisabled()) {
return
}
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
+ }
}