videojs-youtube icon indicating copy to clipboard operation
videojs-youtube copied to clipboard

triggering events on wrong states

Open mysuf opened this issue 7 years ago • 0 comments

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...

mysuf avatar Jul 25 '18 14:07 mysuf