@hercilio/ngx-youtube-player
Version:
[](https://travis-ci.org/Hernior/ngx-youtube-player) [](https://badge.fury.io/js/ngx-youtube-player) [![npm d
121 lines • 14.8 kB
JavaScript
import { Injectable } from "@angular/core";
import { ReplaySubject } from "rxjs";
import * as i0 from "@angular/core";
export function win() {
return window;
}
export function YouTubeRef() {
return win()["YT"];
}
export function YouTubePlayerRef() {
return YouTubeRef().Player;
}
export const defaultSizes = {
height: 270,
width: 367,
};
export class YoutubePlayerService {
static { this.ytApiLoaded = false; }
constructor(zone) {
this.zone = zone;
this.api = new ReplaySubject(1);
this.createApi();
}
loadPlayerApi(options) {
const doc = win().document;
if (!YoutubePlayerService["ytApiLoaded"]) {
YoutubePlayerService.ytApiLoaded = true;
const playerApiScript = doc.createElement("script");
playerApiScript.type = "text/javascript";
playerApiScript.src = `${options.protocol}://www.youtube.com/iframe_api`;
doc.body.appendChild(playerApiScript);
}
}
setupPlayer(elementId, outputs, sizes, videoId = "", playerVars) {
const createPlayer = () => {
if (YouTubePlayerRef) {
this.createPlayer(elementId, outputs, sizes, videoId, playerVars);
}
};
this.api.subscribe(createPlayer);
}
play(player) {
player.playVideo();
}
pause(player) {
player.pauseVideo();
}
playVideo(media, player) {
const id = media.id.videoId ? media.id.videoId : media.id;
player.loadVideoById(id);
this.play(player);
}
isPlaying(player) {
// because YT is not loaded yet 1 is used - YT.PlayerState.PLAYING
const isPlayerReady = player && player.getPlayerState;
const playerState = isPlayerReady ? player.getPlayerState() : {};
const isPlayerPlaying = isPlayerReady
? playerState !== YouTubeRef().PlayerState.ENDED &&
playerState !== YouTubeRef().PlayerState.PAUSED
: false;
return isPlayerPlaying;
}
createPlayer(elementId, outputs, sizes, videoId = "", playerVars = {}) {
const playerSize = {
height: sizes.height || defaultSizes.height,
width: sizes.width || defaultSizes.width,
};
const ytPlayer = YouTubePlayerRef();
return new ytPlayer(elementId, {
...playerSize,
events: {
onReady: (ev) => {
this.zone.run(() => outputs.ready && outputs.ready.next(ev.target));
},
onStateChange: (ev) => {
this.zone.run(() => outputs.change && outputs.change.next(ev));
},
},
playerVars,
videoId,
});
}
toggleFullScreen(player, isFullScreen) {
let { height, width } = defaultSizes;
if (!isFullScreen) {
height = window.innerHeight;
width = window.innerWidth;
}
player.setSize(width, height);
}
// adpoted from uid
generateUniqueId() {
const len = 7;
return Math.random().toString(35).substr(2, len);
}
createApi() {
const onYouTubeIframeAPIReady = () => {
if (win()) {
win()["onYouTubeIframeAPIReadyCalled"] = true;
this.api.next();
}
};
win()["onYouTubeIframeAPIReady"] = onYouTubeIframeAPIReady;
/**
* If onYouTubeIframeAPIReady is called in other place, then just trigger next
* This is to prevent player not initializing issue when another player got initialized in other place
*/
if (win()["onYouTubeIframeAPIReadyCalled"]) {
this.api.next();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YoutubePlayerService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YoutubePlayerService, providedIn: "root" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YoutubePlayerService, decorators: [{
type: Injectable,
args: [{
providedIn: "root",
}]
}], ctorParameters: () => [{ type: i0.NgZone }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXlvdXR1YmUtcGxheWVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gteW91dHViZS1wbGF5ZXIvc3JjL2xpYi9uZ3gteW91dHViZS1wbGF5ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBR3JDLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVTtJQUN4QixPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBUSxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE9BQU8sVUFBVSxFQUFFLENBQUMsTUFBYSxDQUFDO0FBQ3BDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDMUIsTUFBTSxFQUFFLEdBQUc7SUFDWCxLQUFLLEVBQUUsR0FBRztDQUNYLENBQUM7QUFLRixNQUFNLE9BQU8sb0JBQW9CO2FBR3hCLGdCQUFXLEdBQUcsS0FBSyxBQUFSLENBQVM7SUFFM0IsWUFBb0IsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFnQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDekMsb0JBQW9CLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QyxNQUFNLGVB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QyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7K0dBMUhVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBJUGxheWVyQXBpU2NyaXB0T3B0aW9ucywgSVBsYXllck91dHB1dHMsIElQbGF5ZXJTaXplIH0gZnJvbSBcIi4vbW9kZWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB3aW4oKSB7XG4gIHJldHVybiB3aW5kb3c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBZb3VUdWJlUmVmKCk6IGFueSB7XG4gIHJldHVybiB3aW4oKVtcIllUXCJdIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFlvdVR1YmVQbGF5ZXJSZWYoKSB7XG4gIHJldHVybiBZb3VUdWJlUmVmKCkuUGxheWVyIGFzIGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTaXplcyA9IHtcbiAgaGVpZ2h0OiAyNzAsXG4gIHdpZHRoOiAzNjcsXG59O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBZb3V0dWJlUGxheWVyU2VydmljZSB7XG4gIGFwaTogUmVwbGF5U3ViamVjdDxZVC5QbGF5ZXI+O1xuXG4gIHN0YXRpYyB5dEFwaUxvYWRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lKSB7XG4gICAgdGhpcy5hcGkgPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgICB0aGlzLmNyZWF0ZUFwaSgpO1xuICB9XG5cbiAgbG9hZFBsYXllckFwaShvcHRpb25zOiBJUGxheWVyQXBpU2NyaXB0T3B0aW9ucykge1xuICAgIGNvbnN0IGRvYyA9IHdpbigpLmRvY3VtZW50O1xuICAgIGlmICghWW91dHViZVBsYXllclNlcnZpY2VbXCJ5dEFwaUxvYWRlZFwiXSkge1xuICAgICAgWW91dHViZVBsYXllclNlcnZpY2UueXRBcGlMb2FkZWQgPSB0cnVlO1xuICAgICAgY29uc3QgcGxheWVyQXBpU2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICBwbGF5ZXJBcGlTY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XG4gICAgICBwbGF5ZXJBcGlTY3JpcHQuc3JjID0gYCR7b3B0aW9ucy5wcm90b2NvbH06Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaWA7XG4gICAgICBkb2MuYm9keS5hcHBlbmRDaGlsZChwbGF5ZXJBcGlTY3JpcHQpO1xuICAgIH1cbiAgfVxuXG4gIHNldHVwUGxheWVyKFxuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIG91dHB1dHM6IElQbGF5ZXJPdXRwdXRzLFxuICAgIHNpemVzOiBJUGxheWVyU2l6ZSxcbiAgICB2aWRlb0lkID0gXCJcIixcbiAgICBwbGF5ZXJWYXJzOiBZVC5QbGF5ZXJWYXJzXG4gICkge1xuICAgIGNvbnN0IGNyZWF0ZVBsYXllciA9ICgpID0+IHtcbiAgICAgIGlmIChZb3VUdWJlUGxheWVyUmVmKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUGxheWVyKGVsZW1lbnRJZCwgb3V0cHV0cywgc2l6ZXMsIHZpZGVvSWQsIHBsYXllclZhcnMpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hcGkuc3Vic2NyaWJlKGNyZWF0ZVBsYXllcik7XG4gIH1cblxuICBwbGF5KHBsYXllcjogWVQuUGxheWVyKSB7XG4gICAgcGxheWVyLnBsYXlWaWRlbygpO1xuICB9XG5cbiAgcGF1c2UocGxheWVyOiBZVC5QbGF5ZXIpIHtcbiAgICBwbGF5ZXIucGF1c2VWaWRlbygpO1xuICB9XG5cbiAgcGxheVZpZGVvKG1lZGlhOiBhbnksIHBsYXllcjogWVQuUGxheWVyKSB7XG4gICAgY29uc3QgaWQgPSBtZWRpYS5pZC52aWRlb0lkID8gbWVkaWEuaWQudmlkZW9JZCA6IG1lZGlhLmlkO1xuICAgIHBsYXllci5sb2FkVmlkZW9CeUlkKGlkKTtcbiAgICB0aGlzLnBsYXkocGxheWVyKTtcbiAgfVxuXG4gIGlzUGxheWluZyhwbGF5ZXI6IFlULlBsYXllcikge1xuICAgIC8vIGJlY2F1c2UgWVQgaXMgbm90IGxvYWRlZCB5ZXQgMSBpcyB1c2VkIC0gWVQuUGxheWVyU3RhdGUuUExBWUlOR1xuICAgIGNvbnN0IGlzUGxheWVyUmVhZHk6IGFueSA9IHBsYXllciAmJiBwbGF5ZXIuZ2V0UGxheWVyU3RhdGU7XG4gICAgY29uc3QgcGxheWVyU3RhdGUgPSBpc1BsYXllclJlYWR5ID8gcGxheWVyLmdldFBsYXllclN0YXRlKCkgOiB7fTtcbiAgICBjb25zdCBpc1BsYXllclBsYXlpbmcgPSBpc1BsYXllclJlYWR5XG4gICAgICA/IHBsYXllclN0YXRlICE9PSBZb3VUdWJlUmVmKCkuUGxheWVyU3RhdGUuRU5ERUQgJiZcbiAgICAgICAgcGxheWVyU3RhdGUgIT09IFlvdVR1YmVSZWYoKS5QbGF5ZXJTdGF0ZS5QQVVTRURcbiAgICAgIDogZmFsc2U7XG4gICAgcmV0dXJuIGlzUGxheWVyUGxheWluZztcbiAgfVxuXG4gIGNyZWF0ZVBsYXllcihcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICBvdXRwdXRzOiBJUGxheWVyT3V0cHV0cyxcbiAgICBzaXplczogSVBsYXllclNpemUsXG4gICAgdmlkZW9JZCA9IFwiXCIsXG4gICAgcGxheWVyVmFyczogWVQuUGxheWVyVmFycyA9IHt9XG4gICkge1xuICAgIGNvbnN0IHBsYXllclNpemUgPSB7XG4gICAgICBoZWlnaHQ6IHNpemVzLmhlaWdodCB8fCBkZWZhdWx0U2l6ZXMuaGVpZ2h0LFxuICAgICAgd2lkdGg6IHNpemVzLndpZHRoIHx8IGRlZmF1bHRTaXplcy53aWR0aCxcbiAgICB9O1xuICAgIGNvbnN0IHl0UGxheWVyID0gWW91VHViZVBsYXllclJlZigpO1xuICAgIHJldHVybiBuZXcgeXRQbGF5ZXIoZWxlbWVudElkLCB7XG4gICAgICAuLi5wbGF5ZXJTaXplLFxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIG9uUmVhZHk6IChldjogWVQuUGxheWVyRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IG91dHB1dHMucmVhZHkgJiYgb3V0cHV0cy5yZWFkeS5uZXh0KGV2LnRhcmdldCkpO1xuICAgICAgICB9LFxuICAgICAgICBvblN0YXRlQ2hhbmdlOiAoZXY6IFlULlBsYXllckV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiBvdXRwdXRzLmNoYW5nZSAmJiBvdXRwdXRzLmNoYW5nZS5uZXh0KGV2KSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcGxheWVyVmFycyxcbiAgICAgIHZpZGVvSWQsXG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVGdWxsU2NyZWVuKFxuICAgIHBsYXllcjogWVQuUGxheWVyLFxuICAgIGlzRnVsbFNjcmVlbjogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgbGV0IHsgaGVpZ2h0LCB3aWR0aCB9ID0gZGVmYXVsdFNpemVzO1xuXG4gICAgaWYgKCFpc0Z1bGxTY3JlZW4pIHtcbiAgICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgfVxuICAgIHBsYXllci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLy8gYWRwb3RlZCBmcm9tIHVpZFxuICBnZW5lcmF0ZVVuaXF1ZUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGVuID0gNztcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNSkuc3Vic3RyKDIsIGxlbik7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFwaSgpIHtcbiAgICBjb25zdCBvbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9ICgpID0+IHtcbiAgICAgIGlmICh3aW4oKSkge1xuICAgICAgICB3aW4oKVtcIm9uWW91VHViZUlmcmFtZUFQSVJlYWR5Q2FsbGVkXCJdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hcGkubmV4dCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luKClbXCJvbllvdVR1YmVJZnJhbWVBUElSZWFkeVwiXSA9IG9uWW91VHViZUlmcmFtZUFQSVJlYWR5O1xuICAgIC8qKlxuICAgICAqIElmIG9uWW91VHViZUlmcmFtZUFQSVJlYWR5IGlzIGNhbGxlZCBpbiBvdGhlciBwbGFjZSwgdGhlbiBqdXN0IHRyaWdnZXIgbmV4dFxuICAgICAqIFRoaXMgaXMgdG8gcHJldmVudCBwbGF5ZXIgbm90IGluaXRpYWxpemluZyBpc3N1ZSB3aGVuIGFub3RoZXIgcGxheWVyIGdvdCBpbml0aWFsaXplZCBpbiBvdGhlciBwbGFjZVxuICAgICAqL1xuICAgIGlmICh3aW4oKVtcIm9uWW91VHViZUlmcmFtZUFQSVJlYWR5Q2FsbGVkXCJdKSB7XG4gICAgICB0aGlzLmFwaS5uZXh0KCk7XG4gICAgfVxuICB9XG59XG4iXX0=