Take in account transcoding for video quota
This commit is contained in:
parent
a10d56bafc
commit
6a84aafd23
8 changed files with 56 additions and 5 deletions
|
@ -11,12 +11,14 @@ import {
|
||||||
USER_PASSWORD,
|
USER_PASSWORD,
|
||||||
USER_VIDEO_QUOTA
|
USER_VIDEO_QUOTA
|
||||||
} from '../../../shared'
|
} from '../../../shared'
|
||||||
|
import { ServerService } from '../../../core'
|
||||||
import { UserCreate } from '../../../../../../shared'
|
import { UserCreate } from '../../../../../../shared'
|
||||||
import { UserEdit } from './user-edit'
|
import { UserEdit } from './user-edit'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'my-user-add',
|
selector: 'my-user-add',
|
||||||
templateUrl: './user-edit.component.html'
|
templateUrl: './user-edit.component.html',
|
||||||
|
styleUrls: [ './user-edit.component.scss' ]
|
||||||
})
|
})
|
||||||
export class UserAddComponent extends UserEdit implements OnInit {
|
export class UserAddComponent extends UserEdit implements OnInit {
|
||||||
error: string
|
error: string
|
||||||
|
@ -36,6 +38,7 @@ export class UserAddComponent extends UserEdit implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
|
protected serverService: ServerService,
|
||||||
private formBuilder: FormBuilder,
|
private formBuilder: FormBuilder,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private notificationsService: NotificationsService,
|
private notificationsService: NotificationsService,
|
||||||
|
|
|
@ -47,6 +47,11 @@
|
||||||
{{ videoQuotaOption.label }}
|
{{ videoQuotaOption.label }}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<div class="transcoding-information" *ngIf="isTranscodingInformationDisplayed()">
|
||||||
|
Transcoding is enabled on server. The video quota only take in account <strong>original</strong> video. <br />
|
||||||
|
In maximum, this user could use ~ {{ computeQuotaWithTranscoding() | bytes }}.
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<input type="submit" value="{{ getFormButtonTitle() }}" class="btn btn-default" [disabled]="!form.valid">
|
<input type="submit" value="{{ getFormButtonTitle() }}" class="btn btn-default" [disabled]="!form.valid">
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
.transcoding-information {
|
||||||
|
margin-top: 5px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
|
@ -1,17 +1,39 @@
|
||||||
|
import { ServerService } from '../../../core'
|
||||||
import { FormReactive } from '../../../shared'
|
import { FormReactive } from '../../../shared'
|
||||||
|
import { VideoResolution } from '../../../../../../shared/models/videos/video-resolution.enum'
|
||||||
|
|
||||||
export abstract class UserEdit extends FormReactive {
|
export abstract class UserEdit extends FormReactive {
|
||||||
videoQuotaOptions = [
|
videoQuotaOptions = [
|
||||||
{ value: -1, label: 'Unlimited' },
|
{ value: -1, label: 'Unlimited' },
|
||||||
{ value: 0, label: '0'},
|
{ value: 0, label: '0'},
|
||||||
{ value: 100 * 1024 * 1024, label: '100MB' },
|
{ value: 100 * 1024 * 1024, label: '100MB' },
|
||||||
{ value: 5 * 1024 * 1024, label: '500MB' },
|
{ value: 500 * 1024 * 1024, label: '500MB' },
|
||||||
{ value: 1024 * 1024 * 1024, label: '1GB' },
|
{ value: 1024 * 1024 * 1024, label: '1GB' },
|
||||||
{ value: 5 * 1024 * 1024 * 1024, label: '5GB' },
|
{ value: 5 * 1024 * 1024 * 1024, label: '5GB' },
|
||||||
{ value: 20 * 1024 * 1024 * 1024, label: '20GB' },
|
{ value: 20 * 1024 * 1024 * 1024, label: '20GB' },
|
||||||
{ value: 50 * 1024 * 1024 * 1024, label: '50GB' }
|
{ value: 50 * 1024 * 1024 * 1024, label: '50GB' }
|
||||||
]
|
]
|
||||||
|
|
||||||
|
protected abstract serverService: ServerService
|
||||||
abstract isCreation (): boolean
|
abstract isCreation (): boolean
|
||||||
abstract getFormButtonTitle (): string
|
abstract getFormButtonTitle (): string
|
||||||
|
|
||||||
|
isTranscodingInformationDisplayed () {
|
||||||
|
const formVideoQuota = parseInt(this.form.value['videoQuota'], 10)
|
||||||
|
|
||||||
|
return this.serverService.getConfig().transcoding.enabledResolutions.length !== 0 &&
|
||||||
|
formVideoQuota > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
computeQuotaWithTranscoding () {
|
||||||
|
const resolutions = this.serverService.getConfig().transcoding.enabledResolutions
|
||||||
|
const higherResolution = VideoResolution.H_1080P
|
||||||
|
let multiplier = 0
|
||||||
|
|
||||||
|
for (const resolution of resolutions) {
|
||||||
|
multiplier += resolution / higherResolution
|
||||||
|
}
|
||||||
|
|
||||||
|
return multiplier * parseInt(this.form.value['videoQuota'], 10)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,13 +7,15 @@ import { NotificationsService } from 'angular2-notifications'
|
||||||
|
|
||||||
import { UserService } from '../shared'
|
import { UserService } from '../shared'
|
||||||
import { USER_EMAIL, USER_VIDEO_QUOTA } from '../../../shared'
|
import { USER_EMAIL, USER_VIDEO_QUOTA } from '../../../shared'
|
||||||
|
import { ServerService } from '../../../core'
|
||||||
import { UserUpdate } from '../../../../../../shared/models/users/user-update.model'
|
import { UserUpdate } from '../../../../../../shared/models/users/user-update.model'
|
||||||
import { User } from '../../../shared/users/user.model'
|
import { User } from '../../../shared/users/user.model'
|
||||||
import { UserEdit } from './user-edit'
|
import { UserEdit } from './user-edit'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'my-user-update',
|
selector: 'my-user-update',
|
||||||
templateUrl: './user-edit.component.html'
|
templateUrl: './user-edit.component.html',
|
||||||
|
styleUrls: [ './user-edit.component.scss' ]
|
||||||
})
|
})
|
||||||
export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
|
export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
|
||||||
error: string
|
error: string
|
||||||
|
@ -33,10 +35,11 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
|
||||||
private paramsSub: Subscription
|
private paramsSub: Subscription
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
private formBuilder: FormBuilder,
|
protected serverService: ServerService,
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private notificationsService: NotificationsService,
|
private notificationsService: NotificationsService,
|
||||||
|
private formBuilder: FormBuilder,
|
||||||
private userService: UserService
|
private userService: UserService
|
||||||
) {
|
) {
|
||||||
super()
|
super()
|
||||||
|
|
|
@ -11,6 +11,9 @@ export class ServerService {
|
||||||
private config: ServerConfig = {
|
private config: ServerConfig = {
|
||||||
signup: {
|
signup: {
|
||||||
allowed: false
|
allowed: false
|
||||||
|
},
|
||||||
|
transcoding: {
|
||||||
|
enabledResolutions: []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private videoCategories: Array<{ id: number, label: string }> = []
|
private videoCategories: Array<{ id: number, label: string }> = []
|
||||||
|
|
|
@ -1,21 +1,29 @@
|
||||||
import * as express from 'express'
|
import * as express from 'express'
|
||||||
|
|
||||||
import { isSignupAllowed } from '../../helpers'
|
import { isSignupAllowed } from '../../helpers'
|
||||||
|
import { CONFIG } from '../../initializers'
|
||||||
import { ServerConfig } from '../../../shared'
|
import { ServerConfig } from '../../../shared'
|
||||||
|
|
||||||
const configRouter = express.Router()
|
const configRouter = express.Router()
|
||||||
|
|
||||||
configRouter.get('/', getConfig)
|
configRouter.get('/', getConfig)
|
||||||
|
|
||||||
// Get the client credentials for the PeerTube front end
|
|
||||||
function getConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
|
function getConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
|
||||||
|
|
||||||
isSignupAllowed().then(allowed => {
|
isSignupAllowed().then(allowed => {
|
||||||
|
const enabledResolutions = Object.keys(CONFIG.TRANSCODING.RESOLUTIONS)
|
||||||
|
.filter(key => CONFIG.TRANSCODING.RESOLUTIONS[key] === true)
|
||||||
|
.map(r => parseInt(r, 10))
|
||||||
|
|
||||||
const json: ServerConfig = {
|
const json: ServerConfig = {
|
||||||
signup: {
|
signup: {
|
||||||
allowed
|
allowed
|
||||||
|
},
|
||||||
|
transcoding: {
|
||||||
|
enabledResolutions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
res.json(json)
|
res.json(json)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,4 +2,7 @@ export interface ServerConfig {
|
||||||
signup: {
|
signup: {
|
||||||
allowed: boolean
|
allowed: boolean
|
||||||
}
|
}
|
||||||
|
transcoding: {
|
||||||
|
enabledResolutions: number[]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue