nplayer
Version:
powerful danmaku video player
92 lines (76 loc) • 2.33 kB
text/typescript
import { EVENT } from 'src/ts/constants';
import { Icon } from 'src/ts/features';
import { Player } from 'src/ts/player';
import {
addClass,
addDisposable, addDisposableListener, Component, hide, show,
} from 'src/ts/utils';
export class Poster extends Component {
private playEl: HTMLElement;
private poster: string;
private tryToPlayed = false;
constructor(container: HTMLElement, private player: Player) {
super(container, '.poster');
this.poster = player.opts.poster;
this.playEl = player.opts.posterPlayEl || Icon.play();
addClass(this.playEl, 'poster_play');
this.el.appendChild(this.playEl);
this.hide();
if (!player.opts.posterEnable) return;
this.show();
if (this.poster) this.applyStyle({ backgroundImage: `url(${this.poster})` });
addDisposableListener(this, this.el, 'click', () => {
if (this.tryToPlayed) {
show(this.playEl);
player.pause();
this.tryToPlayed = false;
return;
}
this.tryToPlayed = true;
if (player.loaded) {
this.hide();
} else {
hide(this.playEl);
player.loading.show();
}
player.play();
});
addDisposable(this, player.on(EVENT.CANPLAY, this.tryHide));
addDisposable(this, player.on(EVENT.LOADED_METADATA, this.tryHide));
addDisposable(this, player.on(EVENT.UPDATE_OPTIONS, () => {
if (player.opts.poster && player.opts.poster !== this.poster && !player.playing) {
this.poster = player.opts.poster;
this.applyStyle({ backgroundImage: `url(${this.poster})` });
this.tryToPlayed = false;
this.addTimeUpdateHandler();
this.show();
}
}));
this.addTimeUpdateHandler();
}
private addTimeUpdateHandler() {
this.player.off(EVENT.TIME_UPDATE, this.onTimeUpdate);
this.player.on(EVENT.TIME_UPDATE, this.onTimeUpdate);
}
private onTimeUpdate = () => {
if (this.player.playing) {
this.tryToPlayed = true;
this.hide();
this.player.off(EVENT.TIME_UPDATE, this.onTimeUpdate);
}
}
private tryHide = () => {
if (!this.tryToPlayed) return;
this.hide();
}
get isActive(): boolean {
return this.el.style.display !== 'none';
}
show() {
show(this.el);
show(this.playEl);
}
hide() {
hide(this.el);
}
}