videojs-youtube
videojs-youtube copied to clipboard
triggering events on wrong states
Hi,
currently it triggers loadedmetadata on -1. Also durationchange on -1 and PLAYING state (twice). On -1 it gets duration 0 so there is no change of duration (probably ratechange aswell). All these events should be triggered on PLAYING (but only once per source). These are my final overrides for subclassed Youtube tech:
// overrides default method to reset loadeddata for onPlayerStateChange
setSrc(source) {
if (source && source.src) {
this.loadeddata = false;
}
super.setSrc.call(this, source);
}
// overrides default method because plugin triggers events wrong
onPlayerStateChange(e) {
var state = e.data;
if (state === this.lastState || this.errorNumber) {
return;
}
this.lastState = state;
switch (state) {
case -1:
this.trigger('loadstart');
break;
case YT.PlayerState.CUED:
this.trigger('canplay');
break;
case YT.PlayerState.ENDED:
this.trigger('ended');
break;
case YT.PlayerState.PLAYING:
if (!this.loadeddata) {
this.loadeddata = true;
this.trigger('durationchange');
this.trigger('ratechange');
this.trigger('loadedmetadata');
} else {
this.trigger('timeupdate');
}
this.trigger('playing');
this.trigger('play');
if (this.isSeeking) {
this.onSeeked();
}
break;
case YT.PlayerState.PAUSED:
if (this.isSeeking) {
this.onSeeked();
} else {
this.trigger('pause');
}
break;
case YT.PlayerState.BUFFERING:
this.player_.trigger('timeupdate');
this.player_.trigger('waiting');
break;
}
}
// https://caniuse.com/#feat=fullscreen
supportsFullScreen() {
return !videojs.browser.IS_IOS;
}
Another questionable thing is using this.player_ inside Tech when tech's this.player_ reffers to self...