</ng-container>
<ng-container ngbNavItem="transcoding">
- <a ngbNavLink i18n>Transcoding</a>
+ <a ngbNavLink i18n>VOD Transcoding</a>
<ng-template ngbNavContent>
<div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isLiveEnabled() }">
<label i18n for="liveMaxDuration">Max live duration</label>
- <div>
- <ng-select
- labelForId="liveMaxDuration" [items]="liveMaxDurationOptions" formControlName="maxDuration"
- bindLabel="label" bindValue="value"
- [clearable]="false"
- [searchable]="false"
- ></ng-select>
- </div>
+
+ <ng-select
+ labelForId="liveMaxDuration" [items]="liveMaxDurationOptions" formControlName="maxDuration"
+ bindLabel="label" bindValue="value" [clearable]="false" [searchable]="false"
+ ></ng-select>
</div>
</ng-container>
}
input[type=number] {
- @include peertube-input-text(315px);
+ @include peertube-input-text($form-base-input-width);
+
display: block;
}
]
this.liveMaxDurationOptions = [
- { value: null, label: $localize`No limit` },
+ { value: -1, label: $localize`No limit` },
{ value: 1000 * 3600, label: $localize`1 hour` },
{ value: 1000 * 3600 * 3, label: $localize`3 hours` },
{ value: 1000 * 3600 * 5, label: $localize`5 hours` },
async formValidated () {
const value: CustomConfig = this.form.getRawValue()
- // Transform "null" to null
- const maxDuration = value.live.maxDuration as any
- if (maxDuration === 'null') value.live.maxDuration = null
-
this.configService.updateCustomConfig(value)
.subscribe(
res => {
@mixin ng-select ($width) {
- ::ng-deep ng-select {
+ ::ng-deep &.ng-select,
+ ::ng-deep .ng-select {
width: $width;
@media screen and (max-width: $width) {
enabled: false
# Limit lives duration
- # Set null to disable duration limit
- max_duration: null # For example: '5 hours'
+ # -1 == unlimited
+ max_duration: -1 # For example: '5 hours'
# Limit max number of live videos created on your instance
# -1 == unlimited
# Limit lives duration
# Set null to disable duration limit
- max_duration: null # For example: '5 hours'
+ max_duration: -1 # For example: '5 hours'
# Limit max number of live videos created on your instance
# -1 == unlimited
private isDurationConstraintValid (streamingStartTime: number) {
const maxDuration = CONFIG.LIVE.MAX_DURATION
// No limit
- if (maxDuration === null) return true
+ if (maxDuration < 0) return true
const now = new Date().getTime()
const max = streamingStartTime + maxDuration
import { body } from 'express-validator'
import { isIntOrNull } from '@server/helpers/custom-validators/misc'
import { isEmailEnabled } from '@server/initializers/config'
+import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
import { CustomConfig } from '../../../shared/models/server/custom-config.model'
import { isThemeNameValid } from '../../helpers/custom-validators/plugins'
import { isUserNSFWPolicyValid, isUserVideoQuotaDailyValid, isUserVideoQuotaValid } from '../../helpers/custom-validators/users'
import { logger } from '../../helpers/logger'
import { isThemeRegistered } from '../../lib/plugins/theme-utils'
import { areValidationErrors } from './utils'
-import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
const customConfigUpdateValidator = [
body('instance.name').exists().withMessage('Should have a valid instance name'),
body('live.enabled').isBoolean().withMessage('Should have a valid live enabled boolean'),
body('live.allowReplay').isBoolean().withMessage('Should have a valid live allow replay boolean'),
- body('live.maxDuration').custom(isIntOrNull).withMessage('Should have a valid live max duration'),
+ body('live.maxDuration').isInt().withMessage('Should have a valid live max duration'),
body('live.maxInstanceLives').custom(isIntOrNull).withMessage('Should have a valid max instance lives'),
body('live.maxUserLives').custom(isIntOrNull).withMessage('Should have a valid max user lives'),
body('live.transcoding.enabled').isBoolean().withMessage('Should have a valid live transcoding enabled boolean'),
enabled: true,
allowReplay: false,
- maxDuration: null,
+ maxDuration: 30,
maxInstanceLives: -1,
maxUserLives: 50,
live: {
enabled: true,
allowReplay: true,
- maxDuration: null,
+ maxDuration: -1,
transcoding: {
enabled: true,
resolutions: {
live: {
enabled: true,
allowReplay: true,
- maxDuration: null,
+ maxDuration: -1,
transcoding: {
enabled: true,
resolutions: {
live: {
enabled: true,
allowReplay: true,
- maxDuration: null,
+ maxDuration: -1,
transcoding: {
enabled: false,
resolutions: {
live: {
enabled: true,
allowReplay: true,
- maxDuration: null,
+ maxDuration: -1,
transcoding: {
enabled: true,
resolutions: {
expect(data.live.enabled).to.be.false
expect(data.live.allowReplay).to.be.false
- expect(data.live.maxDuration).to.be.null
+ expect(data.live.maxDuration).to.equal(-1)
expect(data.live.maxInstanceLives).to.equal(20)
expect(data.live.maxUserLives).to.equal(3)
expect(data.live.transcoding.enabled).to.be.false
live: {
enabled: true,
allowReplay: false,
- maxDuration: null,
+ maxDuration: -1,
maxInstanceLives: -1,
maxUserLives: 50,
transcoding: {