diff options
author | Chocobozzz <me@florianbigard.com> | 2019-05-17 10:45:53 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2019-05-17 10:45:53 +0200 |
commit | 7b992a86b107fc2917b993127df8e95a66ae94db (patch) | |
tree | ebbd6ded7c855a233a917786e2a15d763de86338 /client/src/app/videos | |
parent | 536598cfafab1c5e24e881db1c528489f804fb6b (diff) | |
download | PeerTube-7b992a86b107fc2917b993127df8e95a66ae94db.tar.gz PeerTube-7b992a86b107fc2917b993127df8e95a66ae94db.tar.zst PeerTube-7b992a86b107fc2917b993127df8e95a66ae94db.zip |
Support audio upload in client
Diffstat (limited to 'client/src/app/videos')
5 files changed, 116 insertions, 43 deletions
diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.html b/client/src/app/videos/+video-edit/shared/video-edit.component.html index 99695204d..28572d611 100644 --- a/client/src/app/videos/+video-edit/shared/video-edit.component.html +++ b/client/src/app/videos/+video-edit/shared/video-edit.component.html | |||
@@ -187,18 +187,14 @@ | |||
187 | <ng-template ngbTabContent> | 187 | <ng-template ngbTabContent> |
188 | <div class="row advanced-settings"> | 188 | <div class="row advanced-settings"> |
189 | <div class="col-md-12 col-xl-8"> | 189 | <div class="col-md-12 col-xl-8"> |
190 | <div class="form-group"> | ||
191 | <my-image-upload | ||
192 | i18n-inputLabel inputLabel="Upload thumbnail" inputName="thumbnailfile" formControlName="thumbnailfile" | ||
193 | previewWidth="200px" previewHeight="110px" | ||
194 | ></my-image-upload> | ||
195 | </div> | ||
196 | 190 | ||
197 | <div class="form-group"> | 191 | <div class="form-group"> |
198 | <my-image-upload | 192 | <label i18n for="previewfile">Video preview</label> |
199 | i18n-inputLabel inputLabel="Upload preview" inputName="previewfile" formControlName="previewfile" | 193 | |
194 | <my-preview-upload | ||
195 | i18n-inputLabel inputLabel="Edit" inputName="previewfile" formControlName="previewfile" | ||
200 | previewWidth="360px" previewHeight="200px" | 196 | previewWidth="360px" previewHeight="200px" |
201 | ></my-image-upload> | 197 | ></my-preview-upload> |
202 | </div> | 198 | </div> |
203 | 199 | ||
204 | <div class="form-group"> | 200 | <div class="form-group"> |
diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.ts b/client/src/app/videos/+video-edit/shared/video-edit.component.ts index c80efd802..95d397b52 100644 --- a/client/src/app/videos/+video-edit/shared/video-edit.component.ts +++ b/client/src/app/videos/+video-edit/shared/video-edit.component.ts | |||
@@ -100,7 +100,6 @@ export class VideoEditComponent implements OnInit, OnDestroy { | |||
100 | language: this.videoValidatorsService.VIDEO_LANGUAGE, | 100 | language: this.videoValidatorsService.VIDEO_LANGUAGE, |
101 | description: this.videoValidatorsService.VIDEO_DESCRIPTION, | 101 | description: this.videoValidatorsService.VIDEO_DESCRIPTION, |
102 | tags: null, | 102 | tags: null, |
103 | thumbnailfile: null, | ||
104 | previewfile: null, | 103 | previewfile: null, |
105 | support: this.videoValidatorsService.VIDEO_SUPPORT, | 104 | support: this.videoValidatorsService.VIDEO_SUPPORT, |
106 | schedulePublicationAt: this.videoValidatorsService.VIDEO_SCHEDULE_PUBLICATION_AT, | 105 | schedulePublicationAt: this.videoValidatorsService.VIDEO_SCHEDULE_PUBLICATION_AT, |
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html index 536769d2f..3247a2bd6 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html +++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html | |||
@@ -26,6 +26,27 @@ | |||
26 | </select> | 26 | </select> |
27 | </div> | 27 | </div> |
28 | </div> | 28 | </div> |
29 | |||
30 | <ng-container *ngIf="isUploadingAudioFile"> | ||
31 | <div class="form-group audio-preview"> | ||
32 | <label i18n for="previewfileUpload">Video background image</label> | ||
33 | |||
34 | <div i18n class="audio-image-info"> | ||
35 | Image that will be merged with your audio file. | ||
36 | <br /> | ||
37 | The chosen image will be definitive and cannot be modified. | ||
38 | </div> | ||
39 | |||
40 | <my-preview-upload | ||
41 | i18n-inputLabel inputLabel="Edit" inputName="previewfileUpload" [(ngModel)]="previewfileUpload" | ||
42 | previewWidth="360px" previewHeight="200px" | ||
43 | ></my-preview-upload> | ||
44 | </div> | ||
45 | |||
46 | <div class="form-group upload-audio-button"> | ||
47 | <my-button className="orange-button" i18n-label [label]="getAudioUploadLabel()" icon="upload" (click)="uploadFirstStep(true)"></my-button> | ||
48 | </div> | ||
49 | </ng-container> | ||
29 | </div> | 50 | </div> |
30 | </div> | 51 | </div> |
31 | 52 | ||
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss index 8adf8f169..684342f09 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss +++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss | |||
@@ -1,9 +1,20 @@ | |||
1 | @import 'variables'; | 1 | @import 'variables'; |
2 | @import 'mixins'; | 2 | @import 'mixins'; |
3 | 3 | ||
4 | .first-step-block .form-group-channel { | 4 | .first-step-block { |
5 | margin-bottom: 20px; | 5 | |
6 | margin-top: 35px; | 6 | .form-group-channel { |
7 | margin-bottom: 20px; | ||
8 | margin-top: 35px; | ||
9 | } | ||
10 | |||
11 | .audio-image-info { | ||
12 | margin-bottom: 10px; | ||
13 | } | ||
14 | |||
15 | .audio-preview { | ||
16 | margin: 30px 0; | ||
17 | } | ||
7 | } | 18 | } |
8 | 19 | ||
9 | .upload-progress-cancel { | 20 | .upload-progress-cancel { |
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts index d6d4bad21..73de25c59 100644 --- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts +++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts | |||
@@ -35,8 +35,10 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy | |||
35 | userVideoQuotaUsed = 0 | 35 | userVideoQuotaUsed = 0 |
36 | userVideoQuotaUsedDaily = 0 | 36 | userVideoQuotaUsedDaily = 0 |
37 | 37 | ||
38 | isUploadingAudioFile = false | ||
38 | isUploadingVideo = false | 39 | isUploadingVideo = false |
39 | isUpdatingVideo = false | 40 | isUpdatingVideo = false |
41 | |||
40 | videoUploaded = false | 42 | videoUploaded = false |
41 | videoUploadObservable: Subscription = null | 43 | videoUploadObservable: Subscription = null |
42 | videoUploadPercents = 0 | 44 | videoUploadPercents = 0 |
@@ -44,7 +46,9 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy | |||
44 | id: 0, | 46 | id: 0, |
45 | uuid: '' | 47 | uuid: '' |
46 | } | 48 | } |
49 | |||
47 | waitTranscodingEnabled = true | 50 | waitTranscodingEnabled = true |
51 | previewfileUpload: File | ||
48 | 52 | ||
49 | error: string | 53 | error: string |
50 | 54 | ||
@@ -100,6 +104,17 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy | |||
100 | } | 104 | } |
101 | } | 105 | } |
102 | 106 | ||
107 | getVideoFile () { | ||
108 | return this.videofileInput.nativeElement.files[0] | ||
109 | } | ||
110 | |||
111 | getAudioUploadLabel () { | ||
112 | const videofile = this.getVideoFile() | ||
113 | if (!videofile) return this.i18n('Upload') | ||
114 | |||
115 | return this.i18n('Upload {{videofileName}}', { videofileName: videofile.name }) | ||
116 | } | ||
117 | |||
103 | fileChange () { | 118 | fileChange () { |
104 | this.uploadFirstStep() | 119 | this.uploadFirstStep() |
105 | } | 120 | } |
@@ -114,38 +129,15 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy | |||
114 | } | 129 | } |
115 | } | 130 | } |
116 | 131 | ||
117 | uploadFirstStep () { | 132 | uploadFirstStep (clickedOnButton = false) { |
118 | const videofile = this.videofileInput.nativeElement.files[0] | 133 | const videofile = this.getVideoFile() |
119 | if (!videofile) return | 134 | if (!videofile) return |
120 | 135 | ||
121 | // Check global user quota | 136 | if (!this.checkGlobalUserQuota(videofile)) return |
122 | const bytePipes = new BytesPipe() | 137 | if (!this.checkDailyUserQuota(videofile)) return |
123 | const videoQuota = this.authService.getUser().videoQuota | ||
124 | if (videoQuota !== -1 && (this.userVideoQuotaUsed + videofile.size) > videoQuota) { | ||
125 | const msg = this.i18n( | ||
126 | 'Your video quota is exceeded with this video (video size: {{videoSize}}, used: {{videoQuotaUsed}}, quota: {{videoQuota}})', | ||
127 | { | ||
128 | videoSize: bytePipes.transform(videofile.size, 0), | ||
129 | videoQuotaUsed: bytePipes.transform(this.userVideoQuotaUsed, 0), | ||
130 | videoQuota: bytePipes.transform(videoQuota, 0) | ||
131 | } | ||
132 | ) | ||
133 | this.notifier.error(msg) | ||
134 | return | ||
135 | } | ||
136 | 138 | ||
137 | // Check daily user quota | 139 | if (clickedOnButton === false && this.isAudioFile(videofile.name)) { |
138 | const videoQuotaDaily = this.authService.getUser().videoQuotaDaily | 140 | this.isUploadingAudioFile = true |
139 | if (videoQuotaDaily !== -1 && (this.userVideoQuotaUsedDaily + videofile.size) > videoQuotaDaily) { | ||
140 | const msg = this.i18n( | ||
141 | 'Your daily video quota is exceeded with this video (video size: {{videoSize}}, used: {{quotaUsedDaily}}, quota: {{quotaDaily}})', | ||
142 | { | ||
143 | videoSize: bytePipes.transform(videofile.size, 0), | ||
144 | quotaUsedDaily: bytePipes.transform(this.userVideoQuotaUsedDaily, 0), | ||
145 | quotaDaily: bytePipes.transform(videoQuotaDaily, 0) | ||
146 | } | ||
147 | ) | ||
148 | this.notifier.error(msg) | ||
149 | return | 141 | return |
150 | } | 142 | } |
151 | 143 | ||
@@ -180,6 +172,11 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy | |||
180 | formData.append('channelId', '' + channelId) | 172 | formData.append('channelId', '' + channelId) |
181 | formData.append('videofile', videofile) | 173 | formData.append('videofile', videofile) |
182 | 174 | ||
175 | if (this.previewfileUpload) { | ||
176 | formData.append('previewfile', this.previewfileUpload) | ||
177 | formData.append('thumbnailfile', this.previewfileUpload) | ||
178 | } | ||
179 | |||
183 | this.isUploadingVideo = true | 180 | this.isUploadingVideo = true |
184 | this.firstStepDone.emit(name) | 181 | this.firstStepDone.emit(name) |
185 | 182 | ||
@@ -187,7 +184,8 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy | |||
187 | name, | 184 | name, |
188 | privacy, | 185 | privacy, |
189 | nsfw, | 186 | nsfw, |
190 | channelId | 187 | channelId, |
188 | previewfile: this.previewfileUpload | ||
191 | }) | 189 | }) |
192 | 190 | ||
193 | this.explainedVideoPrivacies = this.videoService.explainedPrivacyLabels(this.videoPrivacies) | 191 | this.explainedVideoPrivacies = this.videoService.explainedPrivacyLabels(this.videoPrivacies) |
@@ -251,4 +249,52 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy | |||
251 | } | 249 | } |
252 | ) | 250 | ) |
253 | } | 251 | } |
252 | |||
253 | private checkGlobalUserQuota (videofile: File) { | ||
254 | const bytePipes = new BytesPipe() | ||
255 | |||
256 | // Check global user quota | ||
257 | const videoQuota = this.authService.getUser().videoQuota | ||
258 | if (videoQuota !== -1 && (this.userVideoQuotaUsed + videofile.size) > videoQuota) { | ||
259 | const msg = this.i18n( | ||
260 | 'Your video quota is exceeded with this video (video size: {{videoSize}}, used: {{videoQuotaUsed}}, quota: {{videoQuota}})', | ||
261 | { | ||
262 | videoSize: bytePipes.transform(videofile.size, 0), | ||
263 | videoQuotaUsed: bytePipes.transform(this.userVideoQuotaUsed, 0), | ||
264 | videoQuota: bytePipes.transform(videoQuota, 0) | ||
265 | } | ||
266 | ) | ||
267 | this.notifier.error(msg) | ||
268 | |||
269 | return false | ||
270 | } | ||
271 | |||
272 | return true | ||
273 | } | ||
274 | |||
275 | private checkDailyUserQuota (videofile: File) { | ||
276 | const bytePipes = new BytesPipe() | ||
277 | |||
278 | // Check daily user quota | ||
279 | const videoQuotaDaily = this.authService.getUser().videoQuotaDaily | ||
280 | if (videoQuotaDaily !== -1 && (this.userVideoQuotaUsedDaily + videofile.size) > videoQuotaDaily) { | ||
281 | const msg = this.i18n( | ||
282 | 'Your daily video quota is exceeded with this video (video size: {{videoSize}}, used: {{quotaUsedDaily}}, quota: {{quotaDaily}})', | ||
283 | { | ||
284 | videoSize: bytePipes.transform(videofile.size, 0), | ||
285 | quotaUsedDaily: bytePipes.transform(this.userVideoQuotaUsedDaily, 0), | ||
286 | quotaDaily: bytePipes.transform(videoQuotaDaily, 0) | ||
287 | } | ||
288 | ) | ||
289 | this.notifier.error(msg) | ||
290 | |||
291 | return false | ||
292 | } | ||
293 | |||
294 | return true | ||
295 | } | ||
296 | |||
297 | private isAudioFile (filename: string) { | ||
298 | return filename.endsWith('.mp3') || filename.endsWith('.flac') || filename.endsWith('.ogg') | ||
299 | } | ||
254 | } | 300 | } |