|
|
@ -7,6 +7,7 @@ import classNames from 'classnames'; |
|
|
|
import { throttle } from 'lodash'; |
|
|
|
import { throttle } from 'lodash'; |
|
|
|
import { encode, decode } from 'blurhash'; |
|
|
|
import { encode, decode } from 'blurhash'; |
|
|
|
import { getPointerPosition, fileNameFromURL } from 'flavours/glitch/features/video'; |
|
|
|
import { getPointerPosition, fileNameFromURL } from 'flavours/glitch/features/video'; |
|
|
|
|
|
|
|
import { debounce } from 'lodash'; |
|
|
|
|
|
|
|
|
|
|
|
const digitCharacters = [ |
|
|
|
const digitCharacters = [ |
|
|
|
'0', |
|
|
|
'0', |
|
|
@ -172,16 +173,20 @@ class Audio extends React.PureComponent { |
|
|
|
setPlayerRef = c => { |
|
|
|
setPlayerRef = c => { |
|
|
|
this.player = c; |
|
|
|
this.player = c; |
|
|
|
|
|
|
|
|
|
|
|
if (c) { |
|
|
|
if (this.player) { |
|
|
|
const width = c.offsetWidth; |
|
|
|
this._setDimensions(); |
|
|
|
const height = width / (16/9); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (this.props.cacheWidth) { |
|
|
|
_setDimensions () { |
|
|
|
this.props.cacheWidth(width); |
|
|
|
const width = this.player.offsetWidth; |
|
|
|
} |
|
|
|
const height = width / (16/9); |
|
|
|
|
|
|
|
|
|
|
|
this.setState({ width, height }); |
|
|
|
if (this.props.cacheWidth) { |
|
|
|
|
|
|
|
this.props.cacheWidth(width); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.setState({ width, height }); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
setSeekRef = c => { |
|
|
|
setSeekRef = c => { |
|
|
@ -213,6 +218,8 @@ class Audio extends React.PureComponent { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
componentDidMount () { |
|
|
|
componentDidMount () { |
|
|
|
|
|
|
|
window.addEventListener('resize', this.handleResize, { passive: true }); |
|
|
|
|
|
|
|
|
|
|
|
const img = new Image(); |
|
|
|
const img = new Image(); |
|
|
|
img.crossOrigin = 'anonymous'; |
|
|
|
img.crossOrigin = 'anonymous'; |
|
|
|
img.onload = () => this.handlePosterLoad(img); |
|
|
|
img.onload = () => this.handlePosterLoad(img); |
|
|
@ -239,6 +246,10 @@ class Audio extends React.PureComponent { |
|
|
|
this._draw(); |
|
|
|
this._draw(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
componentWillUnmount () { |
|
|
|
|
|
|
|
window.removeEventListener('resize', this.handleResize); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
togglePlay = () => { |
|
|
|
togglePlay = () => { |
|
|
|
if (this.state.paused) { |
|
|
|
if (this.state.paused) { |
|
|
|
this.setState({ paused: false }, () => this.audio.play()); |
|
|
|
this.setState({ paused: false }, () => this.audio.play()); |
|
|
@ -247,6 +258,14 @@ class Audio extends React.PureComponent { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handleResize = debounce(() => { |
|
|
|
|
|
|
|
if (this.player) { |
|
|
|
|
|
|
|
this._setDimensions(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, 250, { |
|
|
|
|
|
|
|
trailing: true, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
handlePlay = () => { |
|
|
|
handlePlay = () => { |
|
|
|
this.setState({ paused: false }); |
|
|
|
this.setState({ paused: false }); |
|
|
|
|
|
|
|
|
|
|
@ -545,14 +564,13 @@ class Audio extends React.PureComponent { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_drawTick (x1, y1, x2, y2) { |
|
|
|
_drawTick (x1, y1, x2, y2) { |
|
|
|
const radius = this._getRadius(); |
|
|
|
const cx = this._getCX(); |
|
|
|
const cx = parseInt(this.state.width / 2); |
|
|
|
const cy = this._getCY(); |
|
|
|
const cy = parseInt(radius + (PADDING * this._getScaleCoefficient())); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const dx1 = parseInt(cx + x1); |
|
|
|
const dx1 = Math.ceil(cx + x1); |
|
|
|
const dy1 = parseInt(cy + y1); |
|
|
|
const dy1 = Math.ceil(cy + y1); |
|
|
|
const dx2 = parseInt(cx + x2); |
|
|
|
const dx2 = Math.ceil(cx + x2); |
|
|
|
const dy2 = parseInt(cy + y2); |
|
|
|
const dy2 = Math.ceil(cy + y2); |
|
|
|
|
|
|
|
|
|
|
|
const gradient = this.canvasContext.createLinearGradient(dx1, dy1, dx2, dy2); |
|
|
|
const gradient = this.canvasContext.createLinearGradient(dx1, dy1, dx2, dy2); |
|
|
|
|
|
|
|
|
|
|
@ -571,6 +589,14 @@ class Audio extends React.PureComponent { |
|
|
|
this.canvasContext.stroke(); |
|
|
|
this.canvasContext.stroke(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_getCX() { |
|
|
|
|
|
|
|
return Math.floor(this.state.width / 2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_getCY() { |
|
|
|
|
|
|
|
return Math.floor(this._getRadius() + (PADDING * this._getScaleCoefficient())); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_getColor () { |
|
|
|
_getColor () { |
|
|
|
return `rgb(${this.state.color.r}, ${this.state.color.g}, ${this.state.color.b})`; |
|
|
|
return `rgb(${this.state.color.r}, ${this.state.color.g}, ${this.state.color.b})`; |
|
|
|
} |
|
|
|
} |
|
|
@ -619,7 +645,7 @@ class Audio extends React.PureComponent { |
|
|
|
alt='' |
|
|
|
alt='' |
|
|
|
width={(this._getRadius() - TICK_SIZE) * 2} |
|
|
|
width={(this._getRadius() - TICK_SIZE) * 2} |
|
|
|
height={(this._getRadius() - TICK_SIZE) * 2} |
|
|
|
height={(this._getRadius() - TICK_SIZE) * 2} |
|
|
|
style={{ position: 'absolute', left: parseInt(this.state.width / 2), top: parseInt(this._getRadius() + (PADDING * this._getScaleCoefficient())), transform: 'translate(-50%, -50%)', borderRadius: '50%', pointerEvents: 'none' }} |
|
|
|
style={{ position: 'absolute', left: this._getCX(), top: this._getCY(), transform: 'translate(-50%, -50%)', borderRadius: '50%', pointerEvents: 'none' }} |
|
|
|
/> |
|
|
|
/> |
|
|
|
|
|
|
|
|
|
|
|
<div className='video-player__seek' onMouseDown={this.handleMouseDown} ref={this.setSeekRef}> |
|
|
|
<div className='video-player__seek' onMouseDown={this.handleMouseDown} ref={this.setSeekRef}> |
|
|
|