Ver código fonte

Refactor how download works. Cleaner filenames.

master
Radium Zheng 7 anos atrás
pai
commit
b284f25fde

+ 15
- 2
react/features/local-recording/controller/RecordingController.js Ver arquivo

@@ -5,7 +5,8 @@ import { i18next } from '../../base/i18n';
5 5
 import {
6 6
     FlacAdapter,
7 7
     OggAdapter,
8
-    WavAdapter
8
+    WavAdapter,
9
+    downloadBlob
9 10
 } from '../recording';
10 11
 import { sessionManager } from '../session';
11 12
 
@@ -320,7 +321,19 @@ class RecordingController {
320 321
      */
321 322
     downloadRecordedData(sessionToken: number) {
322 323
         if (this._adapters[sessionToken]) {
323
-            this._adapters[sessionToken].download();
324
+            this._adapters[sessionToken].exportRecordedData()
325
+                .then(args => {
326
+                    const { data, format } = args;
327
+
328
+                    const filename = `session_${sessionToken}`
329
+                        + `_${this._conference.myUserId()}.${format}`;
330
+
331
+                    downloadBlob(data, filename);
332
+                })
333
+                .catch(error => {
334
+                    logger.error('Failed to download audio for'
335
+                        + ` session ${sessionToken}. Error: ${error}`);
336
+                });
324 337
         } else {
325 338
             logger.error(`Invalid session token for download ${sessionToken}`);
326 339
         }

+ 16
- 6
react/features/local-recording/recording/OggAdapter.js Ver arquivo

@@ -1,5 +1,4 @@
1 1
 import { RecordingAdapter } from './RecordingAdapter';
2
-import { downloadBlob, timestampString } from './Utils';
3 2
 
4 3
 const logger = require('jitsi-meet-logger').getLogger(__filename);
5 4
 
@@ -11,14 +10,22 @@ export class OggAdapter extends RecordingAdapter {
11 10
 
12 11
     /**
13 12
      * Instance of MediaRecorder.
13
+     * @private
14 14
      */
15 15
     _mediaRecorder = null;
16 16
 
17 17
     /**
18 18
      * Initialization promise.
19
+     * @private
19 20
      */
20 21
     _initPromise = null;
21 22
 
23
+    /**
24
+     * The recorded audio file.
25
+     * @private
26
+     */
27
+    _recordedData = null;
28
+
22 29
     /**
23 30
      * Implements {@link RecordingAdapter#start()}.
24 31
      *
@@ -52,16 +59,19 @@ export class OggAdapter extends RecordingAdapter {
52 59
     }
53 60
 
54 61
     /**
55
-     * Implements {@link RecordingAdapter#download()}.
62
+     * Implements {@link RecordingAdapter#exportRecordedData()}.
56 63
      *
57 64
      * @inheritdoc
58 65
      */
59
-    download() {
66
+    exportRecordedData() {
60 67
         if (this._recordedData !== null) {
61
-            const audioURL = window.URL.createObjectURL(this._recordedData);
62
-
63
-            downloadBlob(audioURL, `recording${timestampString()}.ogg`);
68
+            return Promise.resolve({
69
+                data: this._recordedData,
70
+                format: 'ogg'
71
+            });
64 72
         }
73
+
74
+        return Promise.reject('No audio data recorded.');
65 75
     }
66 76
 
67 77
     /**

+ 3
- 3
react/features/local-recording/recording/RecordingAdapter.js Ver arquivo

@@ -26,11 +26,11 @@ export class RecordingAdapter {
26 26
     }
27 27
 
28 28
     /**
29
-     * Initiates download of the recorded and encoded audio file.
29
+     * Export the recorded and encoded audio file.
30 30
      *
31
-     * @returns {void}
31
+     * @returns {Promise<Object>}
32 32
      */
33
-    download() {
33
+    exportRecordedData() {
34 34
         throw new Error('Not implemented');
35 35
     }
36 36
 

+ 6
- 19
react/features/local-recording/recording/Utils.js Ver arquivo

@@ -1,33 +1,20 @@
1 1
 /**
2 2
  * Force download of Blob in browser by faking an <a> tag.
3 3
  *
4
- * @param {string} blob - Base64 URL.
4
+ * @param {Blob} blob - Base64 URL.
5 5
  * @param {string} fileName - The filename to appear in the download dialog.
6 6
  * @returns {void}
7 7
  */
8 8
 export function downloadBlob(blob, fileName = 'recording.ogg') {
9
+    const base64Url = window.URL.createObjectURL(blob);
10
+
9 11
     // fake a anchor tag
10 12
     const a = document.createElement('a');
11 13
 
12
-    document.body.appendChild(a);
13 14
     a.style = 'display: none';
14
-    a.href = blob;
15
+    a.href = base64Url;
15 16
     a.download = fileName;
17
+    document.body.appendChild(a);
16 18
     a.click();
17
-}
18
-
19
-/**
20
- * Obtains a timestamp of now. Used in filenames.
21
- *
22
- * @returns {string}
23
- */
24
-export function timestampString() {
25
-    const timeStampInMs = window.performance
26
-        && window.performance.now
27
-        && window.performance.timing
28
-        && window.performance.timing.navigationStart
29
-        ? window.performance.now() + window.performance.timing.navigationStart
30
-        : Date.now();
31
-
32
-    return timeStampInMs.toString();
19
+    document.body.removeChild(a);
33 20
 }

+ 8
- 6
react/features/local-recording/recording/WavAdapter.js Ver arquivo

@@ -1,5 +1,4 @@
1 1
 import { RecordingAdapter } from './RecordingAdapter';
2
-import { downloadBlob, timestampString } from './Utils';
3 2
 
4 3
 const logger = require('jitsi-meet-logger').getLogger(__filename);
5 4
 
@@ -98,16 +97,19 @@ export class WavAdapter extends RecordingAdapter {
98 97
     }
99 98
 
100 99
     /**
101
-     * Implements {@link RecordingAdapter#download()}.
100
+     * Implements {@link RecordingAdapter#exportRecordedData()}.
102 101
      *
103 102
      * @inheritdoc
104 103
      */
105
-    download() {
104
+    exportRecordedData() {
106 105
         if (this._data !== null) {
107
-            const audioURL = window.URL.createObjectURL(this._data);
108
-
109
-            downloadBlob(audioURL, `recording${timestampString()}.wav`);
106
+            return Promise.resolve({
107
+                data: this._data,
108
+                format: 'wav'
109
+            });
110 110
         }
111
+
112
+        return Promise.reject('No audio data recorded.');
111 113
     }
112 114
 
113 115
     /**

+ 8
- 6
react/features/local-recording/recording/flac/FlacAdapter.js Ver arquivo

@@ -1,5 +1,4 @@
1 1
 import { RecordingAdapter } from '../RecordingAdapter';
2
-import { downloadBlob, timestampString } from '../Utils';
3 2
 import {
4 3
     DEBUG,
5 4
     MAIN_THREAD_FINISH,
@@ -93,16 +92,19 @@ export class FlacAdapter extends RecordingAdapter {
93 92
     }
94 93
 
95 94
     /**
96
-     * Implements {@link RecordingAdapter#download()}.
95
+     * Implements {@link RecordingAdapter#exportRecordedData()}.
97 96
      *
98 97
      * @inheritdoc
99 98
      */
100
-    download() {
99
+    exportRecordedData() {
101 100
         if (this._data !== null) {
102
-            const audioURL = window.URL.createObjectURL(this._data);
103
-
104
-            downloadBlob(audioURL, `recording${timestampString()}.flac`);
101
+            return Promise.resolve({
102
+                data: this._data,
103
+                format: 'flac'
104
+            });
105 105
         }
106
+
107
+        return Promise.reject('No audio data recorded.');
106 108
     }
107 109
 
108 110
     /**

+ 3
- 2
react/features/local-recording/recording/index.js Ver arquivo

@@ -1,4 +1,5 @@
1
-export * from './RecordingAdapter';
2
-export * from './flac';
3 1
 export * from './OggAdapter';
2
+export * from './RecordingAdapter';
3
+export * from './Utils';
4 4
 export * from './WavAdapter';
5
+export * from './flac';

Carregando…
Cancelar
Salvar