UNPKG

@hercilio/ngx-youtube-player

Version:

[![Build Status](https://travis-ci.org/Hernior/ngx-youtube-player.svg?branch=master)](https://travis-ci.org/Hernior/ngx-youtube-player) [![npm version](https://badge.fury.io/js/ngx-youtube-player.svg)](https://badge.fury.io/js/ngx-youtube-player) [![npm d

121 lines 14.8 kB
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=