labo-components
Version:
177 lines (147 loc) • 3.94 kB
JSX
import PlayerAPI from '../PlayerAPI';
import IDUtil from '../../../util/IDUtil';
//key: cp1KvUB8slrOvOjg+U8melMoNwxOm/honmDwGg==
//https://developer.jwplayer.com/jw-player/docs/developer-guide/api/javascript_api_reference
//@deprecated, don't use this player anymore. Just use the HTML5VideoPlayer
class JWPlayer extends React.Component {
constructor(props) {
super(props);
this.state = {
playerAPI : null
}
}
componentDidMount() {
console.debug('MOUNTING JW PLAYER')
let type = 'mp4';
if (this.props.mediaObject.mimeType && this.props.mediaObject.mimeType.indexOf('audio') != -1) {
type = 'mp3';
}
const playList = [{
file : this.props.mediaObject.url,
withCredentials : this.props.useCredentials,
type : type,
image: null
}]
const playerAPI = jwplayer('jw_player').setup({
playlist: playList,
// height:'100%',
// width: 'auto',
controls : true,
mute : true,
autostart: false,
key: 'cp1KvUB8slrOvOjg+U8melMoNwxOm/honmDwGg=='
})
if(this.props.eventCallbacks) {
playerAPI.on('bufferChange', this.props.eventCallbacks.loadProgress.bind(this))
.on('time', this.props.eventCallbacks.playProgress.bind(this))
.on('play', this.props.eventCallbacks.onPlay.bind(this))
.on('pause', this.props.eventCallbacks.onPause.bind(this))
.on('complete', this.props.eventCallbacks.onFinish.bind(this))
.on('seek', this.props.eventCallbacks.onSeek.bind(this))
.on('ready', this.onReady.bind(this, playerAPI));
}
}
onReady(playerAPI) {
console.debug('READY JW')
if(this.state.playerAPI == null) {
this.setState(
{playerAPI : playerAPI},
() => {
this.onSourceLoaded();
}
);
} else {
this.onSourceLoaded();
}
}
onSourceLoaded() {
//then seek to the starting point
const start = this.props.mediaObject.start ? this.props.mediaObject.start : 0;
if(start > 0) {
this.state.playerAPI.seek(start / 1000);
}
//notify the owner
if(this.props.onPlayerReady) {
this.props.onPlayerReady(new JWPlayerAPI(this.state.playerAPI));
}
}
shouldComponentUpdate(nextProps, nextState) {
if(nextProps.mediaObject.assetId == this.props.mediaObject.assetId) {
return false
}
return true
}
componentDidUpdate() {
console.debug('make sure the new media object ' + this.props.mediaObject.assetId + ' is loaded')
}
componentWillUnmount() {
if(this.state.playerAPI) {
console.debug('unmounting the JW player?')
this.state.playerAPI.remove();
}
}
render() {
console.debug('rerendering???')
return (
<div id={'jw_player'} className={IDUtil.cssClassName('jw-player')}/>
);
}
}
class JWPlayerAPI extends PlayerAPI {
constructor(playerAPI) {
super(playerAPI);
this.lastVolume = -1;
}
/* ------------ Implemented API calls ------------- */
play() {
this.playerAPI.play();
}
pause() {
this.playerAPI.pause();
}
seek(secs) {
this.playerAPI.seek(secs);
}
getPosition(callback=null) {
if(!callback) {
return this.playerAPI.getPosition();
}
callback(this.playerAPI.getPosition());
}
getDuration(callback=null) {
if(!callback) {
return this.playerAPI.getDuration();
}
callback(this.playerAPI.getDuration());
}
isPaused(callback=null) {
if(!callback) {
return this.playerAPI.getState() == 'paused';
}
callback(this.playerAPI.getState() == 'paused');
}
setVolume(volume) { //volume between 0-1, JW uses 0-100
if(volume !== 0) {
this.lastVolume = volume;
}
this.playerAPI.setVolume(volume * 100);
}
getVolume() {
return this.playerAPI.getVolume();
}
getLastVolume() {
return this.lastVolume;
}
toggleMute() {
this.playerAPI.setMute(!this.playerAPI.getMute());
if(this.isMuted()) {
this.lastVolume = this.playerAPI.getVolume();
}
}
isMuted() {
return this.playerAPI.getMute()
}
/* ----------------------- non-essential player specific calls ----------------------- */
//TODO
}
export default JWPlayer;