diff options
Diffstat (limited to 'client/src/app/shared/instance')
3 files changed, 132 insertions, 0 deletions
diff --git a/client/src/app/shared/instance/instance-features-table.component.html b/client/src/app/shared/instance/instance-features-table.component.html new file mode 100644 index 000000000..ba170f074 --- /dev/null +++ b/client/src/app/shared/instance/instance-features-table.component.html | |||
@@ -0,0 +1,28 @@ | |||
1 | <div class="feature-table"> | ||
2 | |||
3 | <table class="table"> | ||
4 | <tr> | ||
5 | <td i18n class="label">Video quota</td> | ||
6 | |||
7 | <td class="value"> | ||
8 | <ng-container *ngIf="initialUserVideoQuota !== -1"> | ||
9 | {{ initialUserVideoQuota | bytes: 0 }} | ||
10 | |||
11 | <my-help helpType="custom" [customHtml]="quotaHelpIndication"></my-help> | ||
12 | </ng-container> | ||
13 | |||
14 | <ng-container i18n *ngIf="initialUserVideoQuota === -1"> | ||
15 | Unlimited | ||
16 | </ng-container> | ||
17 | </td> | ||
18 | </tr> | ||
19 | |||
20 | <tr *ngFor="let feature of features"> | ||
21 | <td class="label">{{ feature.label }}</td> | ||
22 | <td> | ||
23 | <span *ngIf="feature.value === true" class="glyphicon glyphicon-ok"></span> | ||
24 | <span *ngIf="feature.value === false" class="glyphicon glyphicon-remove"></span> | ||
25 | </td> | ||
26 | </tr> | ||
27 | </table> | ||
28 | </div> \ No newline at end of file | ||
diff --git a/client/src/app/shared/instance/instance-features-table.component.scss b/client/src/app/shared/instance/instance-features-table.component.scss new file mode 100644 index 000000000..d597a03ba --- /dev/null +++ b/client/src/app/shared/instance/instance-features-table.component.scss | |||
@@ -0,0 +1,20 @@ | |||
1 | @import '_variables'; | ||
2 | @import '_mixins'; | ||
3 | |||
4 | table { | ||
5 | font-size: 14px; | ||
6 | max-width: 400px; | ||
7 | |||
8 | .label { | ||
9 | font-weight: $font-semibold; | ||
10 | min-width: 330px; | ||
11 | } | ||
12 | |||
13 | .glyphicon-ok { | ||
14 | color: $green; | ||
15 | } | ||
16 | |||
17 | .glyphicon-remove { | ||
18 | color: $red; | ||
19 | } | ||
20 | } \ No newline at end of file | ||
diff --git a/client/src/app/shared/instance/instance-features-table.component.ts b/client/src/app/shared/instance/instance-features-table.component.ts new file mode 100644 index 000000000..1aad5aa81 --- /dev/null +++ b/client/src/app/shared/instance/instance-features-table.component.ts | |||
@@ -0,0 +1,84 @@ | |||
1 | import { Component, OnInit } from '@angular/core' | ||
2 | import { ServerService } from '@app/core' | ||
3 | import { I18n } from '@ngx-translate/i18n-polyfill' | ||
4 | |||
5 | @Component({ | ||
6 | selector: 'my-instance-features-table', | ||
7 | templateUrl: './instance-features-table.component.html', | ||
8 | styleUrls: [ './instance-features-table.component.scss' ] | ||
9 | }) | ||
10 | export class InstanceFeaturesTableComponent implements OnInit { | ||
11 | features: { label: string, value?: boolean }[] = [] | ||
12 | quotaHelpIndication = '' | ||
13 | |||
14 | constructor ( | ||
15 | private i18n: I18n, | ||
16 | private serverService: ServerService | ||
17 | ) { | ||
18 | } | ||
19 | |||
20 | get initialUserVideoQuota () { | ||
21 | return this.serverService.getConfig().user.videoQuota | ||
22 | } | ||
23 | |||
24 | ngOnInit () { | ||
25 | this.serverService.configLoaded | ||
26 | .subscribe(() => { | ||
27 | this.buildFeatures() | ||
28 | this.buildQuotaHelpIndication() | ||
29 | }) | ||
30 | } | ||
31 | |||
32 | private buildFeatures () { | ||
33 | const config = this.serverService.getConfig() | ||
34 | |||
35 | this.features = [ | ||
36 | { | ||
37 | label: this.i18n('Transcode your videos in multiple resolutions'), | ||
38 | value: config.transcoding.enabledResolutions.length !== 0 | ||
39 | }, | ||
40 | { | ||
41 | label: this.i18n('HTTP import (YouTube, Vimeo, direct URL...)'), | ||
42 | value: config.import.videos.http.enabled | ||
43 | }, | ||
44 | { | ||
45 | label: this.i18n('Torrent import'), | ||
46 | value: config.import.videos.torrent.enabled | ||
47 | } | ||
48 | ] | ||
49 | |||
50 | } | ||
51 | |||
52 | private getApproximateTime (seconds: number) { | ||
53 | const hours = Math.floor(seconds / 3600) | ||
54 | let pluralSuffix = '' | ||
55 | if (hours > 1) pluralSuffix = 's' | ||
56 | if (hours > 0) return `~ ${hours} hour${pluralSuffix}` | ||
57 | |||
58 | const minutes = Math.floor(seconds % 3600 / 60) | ||
59 | |||
60 | return this.i18n('~ {{minutes}} {minutes, plural, =1 {minute} other {minutes}}', { minutes }) | ||
61 | } | ||
62 | |||
63 | private buildQuotaHelpIndication () { | ||
64 | if (this.initialUserVideoQuota === -1) return | ||
65 | |||
66 | const initialUserVideoQuotaBit = this.initialUserVideoQuota * 8 | ||
67 | |||
68 | // 1080p: ~ 6Mbps | ||
69 | // 720p: ~ 4Mbps | ||
70 | // 360p: ~ 1.5Mbps | ||
71 | const fullHdSeconds = initialUserVideoQuotaBit / (6 * 1000 * 1000) | ||
72 | const hdSeconds = initialUserVideoQuotaBit / (4 * 1000 * 1000) | ||
73 | const normalSeconds = initialUserVideoQuotaBit / (1.5 * 1000 * 1000) | ||
74 | |||
75 | const lines = [ | ||
76 | this.i18n('{{seconds}} of full HD videos', { seconds: this.getApproximateTime(fullHdSeconds) }), | ||
77 | this.i18n('{{seconds}} of HD videos', { seconds: this.getApproximateTime(hdSeconds) }), | ||
78 | this.i18n('{{seconds}} of average quality videos', { seconds: this.getApproximateTime(normalSeconds) }) | ||
79 | ] | ||
80 | |||
81 | this.quotaHelpIndication = lines.join('<br />') | ||
82 | } | ||
83 | |||
84 | } | ||