better handling of missing audio preview

This commit is contained in:
or-else
2022-05-05 15:50:19 -07:00
parent cc75d81538
commit 30d57e11f2
15 changed files with 78 additions and 87 deletions
+1 -1
View File
@@ -1373,6 +1373,6 @@
"defaultMessage": "unavailable", "defaultMessage": "unavailable",
"description": "Message shown when media preview is not available", "description": "Message shown when media preview is not available",
"missing": false, "missing": false,
"obsolete": false "obsolete": true
} }
} }
+1 -1
View File
@@ -1373,6 +1373,6 @@
"defaultMessage": "unavailable", "defaultMessage": "unavailable",
"description": "Message shown when media preview is not available", "description": "Message shown when media preview is not available",
"missing": false, "missing": false,
"obsolete": false "obsolete": true
} }
} }
+1 -1
View File
@@ -1373,6 +1373,6 @@
"defaultMessage": "unavailable", "defaultMessage": "unavailable",
"description": "Message shown when media preview is not available", "description": "Message shown when media preview is not available",
"missing": false, "missing": false,
"obsolete": false "obsolete": true
} }
} }
-4
View File
@@ -608,10 +608,6 @@
"defaultMessage": "phone", "defaultMessage": "phone",
"description": "Dative case of 'phone', i.e. 'phone' in 'by phone'" "description": "Dative case of 'phone', i.e. 'phone' in 'by phone'"
}, },
"preview_unavailable": {
"defaultMessage": "unavailable",
"description": "Message shown when media preview is not available"
},
"private_editing_placeholder": { "private_editing_placeholder": {
"defaultMessage": "Visible to you only", "defaultMessage": "Visible to you only",
"description": "Placeholder for editing 'private'" "description": "Placeholder for editing 'private'"
+1 -1
View File
@@ -1373,6 +1373,6 @@
"defaultMessage": "unavailable", "defaultMessage": "unavailable",
"description": "Message shown when media preview is not available", "description": "Message shown when media preview is not available",
"missing": false, "missing": false,
"obsolete": false "obsolete": true
} }
} }
+1 -1
View File
@@ -1373,6 +1373,6 @@
"defaultMessage": "unavailable", "defaultMessage": "unavailable",
"description": "Message shown when media preview is not available", "description": "Message shown when media preview is not available",
"missing": false, "missing": false,
"obsolete": false "obsolete": true
} }
} }
+1 -1
View File
@@ -1373,6 +1373,6 @@
"defaultMessage": "unavailable", "defaultMessage": "unavailable",
"description": "Message shown when media preview is not available", "description": "Message shown when media preview is not available",
"missing": false, "missing": false,
"obsolete": false "obsolete": true
} }
} }
+1 -1
View File
@@ -1373,6 +1373,6 @@
"defaultMessage": "unavailable", "defaultMessage": "unavailable",
"description": "Message shown when media preview is not available", "description": "Message shown when media preview is not available",
"missing": false, "missing": false,
"obsolete": false "obsolete": true
} }
} }
+1 -1
View File
@@ -1373,6 +1373,6 @@
"defaultMessage": "unavailable", "defaultMessage": "unavailable",
"description": "Message shown when media preview is not available", "description": "Message shown when media preview is not available",
"missing": false, "missing": false,
"obsolete": false "obsolete": true
} }
} }
+1 -1
View File
File diff suppressed because one or more lines are too long
+33 -37
View File
@@ -24,7 +24,7 @@ export default class AudioPlayer extends React.PureComponent {
super(props); super(props);
let preview = base64ToIntArray(this.props.preview); let preview = base64ToIntArray(this.props.preview);
if (Array.isArray(preview) && preview.length < MIN_PREVIEW_LENGTH) { if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {
preview = null; preview = null;
} }
@@ -57,9 +57,7 @@ export default class AudioPlayer extends React.PureComponent {
this.initAudio(); this.initAudio();
} }
if (this.state.preview) { this.initCanvas();
this.initCanvas();
}
} }
componentWillUnmount() { componentWillUnmount() {
@@ -79,7 +77,7 @@ export default class AudioPlayer extends React.PureComponent {
if (this.props.preview != prevProps.preview) { if (this.props.preview != prevProps.preview) {
let preview = base64ToIntArray(this.props.preview); let preview = base64ToIntArray(this.props.preview);
if (Array.isArray(preview) && preview.length < MIN_PREVIEW_LENGTH) { if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {
preview = null; preview = null;
} }
this.setState({preview: preview}, this.initCanvas); this.setState({preview: preview}, this.initCanvas);
@@ -173,27 +171,36 @@ export default class AudioPlayer extends React.PureComponent {
// Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here. // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.
resampleBars(original) { resampleBars(original) {
const barCount = Math.min(original.length, ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0); const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;
const factor = original.length / barCount; // Remove extra padding on the right due to fractional bar which is not drawn.
let amps = []; this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;
let max = -1;
for (let i=0;i<barCount;i++) { if (!Array.isArray(original) || original.length == 0) {
let lo = (i * factor) | 0; // low bound; return Array.apply(null, Array(dstCount)).map(_ => 0.01);
let hi = ((i + 1) * factor) | 0; // high bound;
let amp = 0.0;
for (let j=lo; j<hi; j++) {
amp += original[j]
}
amps[i] = Math.max(0, amp / (hi - lo));
max = Math.max(amps[i], max);
} }
if (max > 0) { const factor = original.length / dstCount;
// Remove extra padding on the right due to fractional bar which is not drawn. let amps = [];
this.effectiveWidth = barCount * (LINE_WIDTH + SPACING) + SPACING; let maxAmp = -1;
return amps.map(a => a / max); for (let i=0; i<dstCount; i++) {
let lo = (i * factor) | 0; // low bound;
let hi = ((i + 1) * factor) | 0; // high bound;
if (hi == lo) {
amps[i] = original[lo];
} else {
let amp = 0.0;
for (let j=lo; j<hi; j++) {
amp += original[j]
}
amps[i] = Math.max(0, amp / (hi - lo));
}
maxAmp = Math.max(amps[i], maxAmp);
} }
return null;
if (maxAmp > 0) {
return amps.map(a => a / maxAmp);
}
return Array.apply(null, Array(dstCount)).map(_ => 0.01);
} }
handlePlay(e) { handlePlay(e) {
@@ -221,7 +228,7 @@ export default class AudioPlayer extends React.PureComponent {
const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING; const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;
this.audioPlayer.currentTime = this.props.duration * offset / 1000; this.audioPlayer.currentTime = this.props.duration * offset / 1000;
this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)}); this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});
if (!this.state.playing && this.state.preview) { if (!this.state.playing) {
this.visualize(); this.visualize();
} }
} }
@@ -237,25 +244,14 @@ export default class AudioPlayer extends React.PureComponent {
</a>); </a>);
return (<div className="audio-player">{this.props.short ? return (<div className="audio-player">{this.props.short ?
<> <>
<div> <canvas className="playback" ref={this.canvasRef} onClick={this.handleSeek} />
{this.state.preview ?
<canvas className="playback" ref={this.canvasRef} onClick={this.handleSeek} /> :
<div className="playback"> - </div>
}
</div>
{play} {play}
</> </>
: :
<> <>
{play} {play}
<div> <div>
{this.state.preview ? <canvas className="playback" ref={this.canvasRef} onClick={this.handleSeek} />
<canvas className="playback" ref={this.canvasRef} onClick={this.handleSeek} /> :
<div className="playback">
<FormattedMessage
id="preview_unavailable" defaultMessage="unavailable" description="Message shown when media preview is not available" />
</div>
}
<div className="timer">{this.state.currentTime}/{this.state.duration}</div> <div className="timer">{this.state.currentTime}/{this.state.duration}</div>
</div> </div>
</> </>
+33 -34
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long