@angular/youtube-player 17.0.2 → 17.1.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/public-api.mjs +2 -2
- package/esm2022/youtube-module.mjs +4 -5
- package/esm2022/youtube-player-placeholder.mjs +74 -0
- package/esm2022/youtube-player.mjs +201 -52
- package/fesm2022/youtube-player.mjs +268 -56
- package/fesm2022/youtube-player.mjs.map +1 -1
- package/index.d.ts +70 -4
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtube-player.mjs","sources":["../../../../../../src/youtube-player/youtube-player.ts","../../../../../../src/youtube-player/youtube-module.ts","../../../../../../src/youtube-player/youtube-player_public_index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/// <reference types=\"youtube\" />\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnDestroy,\n Output,\n ViewChild,\n ViewEncapsulation,\n Inject,\n PLATFORM_ID,\n OnChanges,\n SimpleChanges,\n AfterViewInit,\n} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\nimport {Observable, of as observableOf, Subject, BehaviorSubject, fromEventPattern} from 'rxjs';\nimport {takeUntil, switchMap} from 'rxjs/operators';\n\ndeclare global {\n interface Window {\n YT: typeof YT | undefined;\n onYouTubeIframeAPIReady: (() => void) | undefined;\n }\n}\n\nexport const DEFAULT_PLAYER_WIDTH = 640;\nexport const DEFAULT_PLAYER_HEIGHT = 390;\n\n/**\n * Object used to store the state of the player if the\n * user tries to interact with the API before it has been loaded.\n */\ninterface PendingPlayerState {\n playbackState?: YT.PlayerState.PLAYING | YT.PlayerState.PAUSED | YT.PlayerState.CUED;\n playbackRate?: number;\n volume?: number;\n muted?: boolean;\n seek?: {seconds: number; allowSeekAhead: boolean};\n}\n\n/**\n * Angular component that renders a YouTube player via the YouTube player\n * iframe API.\n * @see https://developers.google.com/youtube/iframe_api_reference\n */\n@Component({\n selector: 'youtube-player',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n // This div is *replaced* by the YouTube player embed.\n template: '<div #youtubeContainer></div>',\n})\nexport class YouTubePlayer implements AfterViewInit, OnChanges, OnDestroy {\n /** Whether we're currently rendering inside a browser. */\n private readonly _isBrowser: boolean;\n private _player: YT.Player | undefined;\n private _pendingPlayer: YT.Player | undefined;\n private _existingApiReadyCallback: (() => void) | undefined;\n private _pendingPlayerState: PendingPlayerState | undefined;\n private readonly _destroyed = new Subject<void>();\n private readonly _playerChanges = new BehaviorSubject<YT.Player | undefined>(undefined);\n\n /** YouTube Video ID to view */\n @Input()\n videoId: string | undefined;\n\n /** Height of video player */\n @Input()\n get height(): number {\n return this._height;\n }\n set height(height: number | undefined) {\n this._height = height || DEFAULT_PLAYER_HEIGHT;\n }\n private _height = DEFAULT_PLAYER_HEIGHT;\n\n /** Width of video player */\n @Input()\n get width(): number {\n return this._width;\n }\n set width(width: number | undefined) {\n this._width = width || DEFAULT_PLAYER_WIDTH;\n }\n private _width = DEFAULT_PLAYER_WIDTH;\n\n /** The moment when the player is supposed to start playing */\n @Input()\n startSeconds: number | undefined;\n\n /** The moment when the player is supposed to stop playing */\n @Input()\n endSeconds: number | undefined;\n\n /** The suggested quality of the player */\n @Input()\n suggestedQuality: YT.SuggestedVideoQuality | undefined;\n\n /**\n * Extra parameters used to configure the player. See:\n * https://developers.google.com/youtube/player_parameters.html?playerVersion=HTML5#Parameters\n */\n @Input()\n playerVars: YT.PlayerVars | undefined;\n\n /** Whether cookies inside the player have been disabled. */\n @Input()\n disableCookies: boolean = false;\n\n /**\n * Whether the iframe will attempt to load regardless of the status of the api on the\n * page. Set this to true if you don't want the `onYouTubeIframeAPIReady` field to be\n * set on the global window.\n */\n @Input() showBeforeIframeApiLoads: boolean | undefined;\n\n /** Outputs are direct proxies from the player itself. */\n @Output() readonly ready: Observable<YT.PlayerEvent> =\n this._getLazyEmitter<YT.PlayerEvent>('onReady');\n\n @Output() readonly stateChange: Observable<YT.OnStateChangeEvent> =\n this._getLazyEmitter<YT.OnStateChangeEvent>('onStateChange');\n\n @Output() readonly error: Observable<YT.OnErrorEvent> =\n this._getLazyEmitter<YT.OnErrorEvent>('onError');\n\n @Output() readonly apiChange: Observable<YT.PlayerEvent> =\n this._getLazyEmitter<YT.PlayerEvent>('onApiChange');\n\n @Output() readonly playbackQualityChange: Observable<YT.OnPlaybackQualityChangeEvent> =\n this._getLazyEmitter<YT.OnPlaybackQualityChangeEvent>('onPlaybackQualityChange');\n\n @Output() readonly playbackRateChange: Observable<YT.OnPlaybackRateChangeEvent> =\n this._getLazyEmitter<YT.OnPlaybackRateChangeEvent>('onPlaybackRateChange');\n\n /** The element that will be replaced by the iframe. */\n @ViewChild('youtubeContainer', {static: true})\n youtubeContainer: ElementRef<HTMLElement>;\n\n constructor(\n private _ngZone: NgZone,\n @Inject(PLATFORM_ID) platformId: Object,\n ) {\n this._isBrowser = isPlatformBrowser(platformId);\n }\n\n ngAfterViewInit() {\n // Don't do anything if we're not in a browser environment.\n if (!this._isBrowser) {\n return;\n }\n\n if (!window.YT || !window.YT.Player) {\n if (this.showBeforeIframeApiLoads && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw new Error(\n 'Namespace YT not found, cannot construct embedded youtube player. ' +\n 'Please install the YouTube Player API Reference for iframe Embeds: ' +\n 'https://developers.google.com/youtube/iframe_api_reference',\n );\n }\n\n this._existingApiReadyCallback = window.onYouTubeIframeAPIReady;\n\n window.onYouTubeIframeAPIReady = () => {\n this._existingApiReadyCallback?.();\n this._ngZone.run(() => this._createPlayer());\n };\n } else {\n this._createPlayer();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this._shouldRecreatePlayer(changes)) {\n this._createPlayer();\n } else if (this._player) {\n if (changes['width'] || changes['height']) {\n this._setSize();\n }\n\n if (changes['suggestedQuality']) {\n this._setQuality();\n }\n\n if (changes['startSeconds'] || changes['endSeconds'] || changes['suggestedQuality']) {\n this._cuePlayer();\n }\n }\n }\n\n ngOnDestroy() {\n this._pendingPlayer?.destroy();\n\n if (this._player) {\n this._player.destroy();\n window.onYouTubeIframeAPIReady = this._existingApiReadyCallback;\n }\n\n this._playerChanges.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#playVideo */\n playVideo() {\n if (this._player) {\n this._player.playVideo();\n } else {\n this._getPendingState().playbackState = YT.PlayerState.PLAYING;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#pauseVideo */\n pauseVideo() {\n if (this._player) {\n this._player.pauseVideo();\n } else {\n this._getPendingState().playbackState = YT.PlayerState.PAUSED;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#stopVideo */\n stopVideo() {\n if (this._player) {\n this._player.stopVideo();\n } else {\n // It seems like YouTube sets the player to CUED when it's stopped.\n this._getPendingState().playbackState = YT.PlayerState.CUED;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#seekTo */\n seekTo(seconds: number, allowSeekAhead: boolean) {\n if (this._player) {\n this._player.seekTo(seconds, allowSeekAhead);\n } else {\n this._getPendingState().seek = {seconds, allowSeekAhead};\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#mute */\n mute() {\n if (this._player) {\n this._player.mute();\n } else {\n this._getPendingState().muted = true;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#unMute */\n unMute() {\n if (this._player) {\n this._player.unMute();\n } else {\n this._getPendingState().muted = false;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#isMuted */\n isMuted(): boolean {\n if (this._player) {\n return this._player.isMuted();\n }\n\n if (this._pendingPlayerState) {\n return !!this._pendingPlayerState.muted;\n }\n\n return false;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#setVolume */\n setVolume(volume: number) {\n if (this._player) {\n this._player.setVolume(volume);\n } else {\n this._getPendingState().volume = volume;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVolume */\n getVolume(): number {\n if (this._player) {\n return this._player.getVolume();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.volume != null) {\n return this._pendingPlayerState.volume;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */\n setPlaybackRate(playbackRate: number) {\n if (this._player) {\n return this._player.setPlaybackRate(playbackRate);\n } else {\n this._getPendingState().playbackRate = playbackRate;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */\n getPlaybackRate(): number {\n if (this._player) {\n return this._player.getPlaybackRate();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.playbackRate != null) {\n return this._pendingPlayerState.playbackRate;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */\n getAvailablePlaybackRates(): number[] {\n return this._player ? this._player.getAvailablePlaybackRates() : [];\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */\n getVideoLoadedFraction(): number {\n return this._player ? this._player.getVideoLoadedFraction() : 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */\n getPlayerState(): YT.PlayerState | undefined {\n if (!this._isBrowser || !window.YT) {\n return undefined;\n }\n\n if (this._player) {\n return this._player.getPlayerState();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.playbackState != null) {\n return this._pendingPlayerState.playbackState;\n }\n\n return YT.PlayerState.UNSTARTED;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */\n getCurrentTime(): number {\n if (this._player) {\n return this._player.getCurrentTime();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.seek) {\n return this._pendingPlayerState.seek.seconds;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */\n getPlaybackQuality(): YT.SuggestedVideoQuality {\n return this._player ? this._player.getPlaybackQuality() : 'default';\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */\n getAvailableQualityLevels(): YT.SuggestedVideoQuality[] {\n return this._player ? this._player.getAvailableQualityLevels() : [];\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getDuration */\n getDuration(): number {\n return this._player ? this._player.getDuration() : 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */\n getVideoUrl(): string {\n return this._player ? this._player.getVideoUrl() : '';\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */\n getVideoEmbedCode(): string {\n return this._player ? this._player.getVideoEmbedCode() : '';\n }\n\n /** Gets an object that should be used to store the temporary API state. */\n private _getPendingState(): PendingPlayerState {\n if (!this._pendingPlayerState) {\n this._pendingPlayerState = {};\n }\n\n return this._pendingPlayerState;\n }\n\n /**\n * Determines whether a change in the component state\n * requires the YouTube player to be recreated.\n */\n private _shouldRecreatePlayer(changes: SimpleChanges): boolean {\n const change = changes['videoId'] || changes['playerVars'] || changes['disableCookies'];\n return !!change && !change.isFirstChange();\n }\n\n /** Creates a new YouTube player and destroys the existing one. */\n private _createPlayer() {\n this._player?.destroy();\n this._pendingPlayer?.destroy();\n\n // A player can't be created if the API isn't loaded,\n // or there isn't a video or playlist to be played.\n if (typeof YT === 'undefined' || (!this.videoId && !this.playerVars?.list)) {\n return;\n }\n\n // Important! We need to create the Player object outside of the `NgZone`, because it kicks\n // off a 250ms setInterval which will continually trigger change detection if we don't.\n const player = this._ngZone.runOutsideAngular(\n () =>\n new YT.Player(this.youtubeContainer.nativeElement, {\n videoId: this.videoId,\n host: this.disableCookies ? 'https://www.youtube-nocookie.com' : undefined,\n width: this.width,\n height: this.height,\n playerVars: this.playerVars,\n }),\n );\n\n const whenReady = () => {\n // Only assign the player once it's ready, otherwise YouTube doesn't expose some APIs.\n this._player = player;\n this._pendingPlayer = undefined;\n player.removeEventListener('onReady', whenReady);\n this._playerChanges.next(player);\n this._setSize();\n this._setQuality();\n\n if (this._pendingPlayerState) {\n this._applyPendingPlayerState(player, this._pendingPlayerState);\n this._pendingPlayerState = undefined;\n }\n\n // Only cue the player when it either hasn't started yet or it's cued,\n // otherwise cuing it can interrupt a player with autoplay enabled.\n const state = player.getPlayerState();\n if (state === YT.PlayerState.UNSTARTED || state === YT.PlayerState.CUED || state == null) {\n this._cuePlayer();\n }\n };\n\n this._pendingPlayer = player;\n player.addEventListener('onReady', whenReady);\n }\n\n /** Applies any state that changed before the player was initialized. */\n private _applyPendingPlayerState(player: YT.Player, pendingState: PendingPlayerState): void {\n const {playbackState, playbackRate, volume, muted, seek} = pendingState;\n\n switch (playbackState) {\n case YT.PlayerState.PLAYING:\n player.playVideo();\n break;\n case YT.PlayerState.PAUSED:\n player.pauseVideo();\n break;\n case YT.PlayerState.CUED:\n player.stopVideo();\n break;\n }\n\n if (playbackRate != null) {\n player.setPlaybackRate(playbackRate);\n }\n\n if (volume != null) {\n player.setVolume(volume);\n }\n\n if (muted != null) {\n muted ? player.mute() : player.unMute();\n }\n\n if (seek != null) {\n player.seekTo(seek.seconds, seek.allowSeekAhead);\n }\n }\n\n /** Cues the player based on the current component state. */\n private _cuePlayer() {\n if (this._player && this.videoId) {\n this._player.cueVideoById({\n videoId: this.videoId,\n startSeconds: this.startSeconds,\n endSeconds: this.endSeconds,\n suggestedQuality: this.suggestedQuality,\n });\n }\n }\n\n /** Sets the player's size based on the current input values. */\n private _setSize() {\n this._player?.setSize(this.width, this.height);\n }\n\n /** Sets the player's quality based on the current input values. */\n private _setQuality() {\n if (this._player && this.suggestedQuality) {\n this._player.setPlaybackQuality(this.suggestedQuality);\n }\n }\n\n /** Gets an observable that adds an event listener to the player when a user subscribes to it. */\n private _getLazyEmitter<T extends YT.PlayerEvent>(name: keyof YT.Events): Observable<T> {\n // Start with the stream of players. This way the events will be transferred\n // over to the new player if it gets swapped out under-the-hood.\n return this._playerChanges.pipe(\n // Switch to the bound event. `switchMap` ensures that the old event is removed when the\n // player is changed. If there's no player, return an observable that never emits.\n switchMap(player => {\n return player\n ? fromEventPattern<T>(\n (listener: (event: T) => void) => {\n player.addEventListener(name, listener);\n },\n (listener: (event: T) => void) => {\n // The API seems to throw when we try to unbind from a destroyed player and it doesn't\n // expose whether the player has been destroyed so we have to wrap it in a try/catch to\n // prevent the entire stream from erroring out.\n try {\n player?.removeEventListener?.(name, listener);\n } catch {}\n },\n )\n : observableOf<T>();\n }),\n // By default we run all the API interactions outside the zone\n // so we have to bring the events back in manually when they emit.\n source =>\n new Observable<T>(observer =>\n source.subscribe({\n next: value => this._ngZone.run(() => observer.next(value)),\n error: error => observer.error(error),\n complete: () => observer.complete(),\n }),\n ),\n // Ensures that everything is cleared out on destroy.\n takeUntil(this._destroyed),\n );\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\n\nimport {YouTubePlayer} from './youtube-player';\n\nconst COMPONENTS = [YouTubePlayer];\n\n@NgModule({\n declarations: COMPONENTS,\n exports: COMPONENTS,\n})\nexport class YouTubePlayerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["observableOf"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"youtube-player.mjs","sources":["../../../../../../src/youtube-player/youtube-player-placeholder.ts","../../../../../../src/youtube-player/youtube-player.ts","../../../../../../src/youtube-player/youtube-module.ts","../../../../../../src/youtube-player/youtube-player_public_index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ChangeDetectionStrategy, Component, Input, ViewEncapsulation} from '@angular/core';\n\n/** Quality of the placeholder image. */\nexport type PlaceholderImageQuality = 'high' | 'standard' | 'low';\n\n@Component({\n selector: 'youtube-player-placeholder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <button type=\"button\" class=\"youtube-player-placeholder-button\" [attr.aria-label]=\"buttonLabel\">\n <svg\n height=\"100%\"\n version=\"1.1\"\n viewBox=\"0 0 68 48\"\n focusable=\"false\"\n aria-hidden=\"true\">\n <path d=\"M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z\" fill=\"#f00\"></path>\n <path d=\"M 45,24 27,14 27,34\" fill=\"#fff\"></path>\n </svg>\n </button>\n `,\n standalone: true,\n styleUrl: 'youtube-player-placeholder.css',\n host: {\n 'class': 'youtube-player-placeholder',\n '[class.youtube-player-placeholder-loading]': 'isLoading',\n '[style.background-image]': '_getBackgroundImage()',\n '[style.width.px]': 'width',\n '[style.height.px]': 'height',\n },\n})\nexport class YouTubePlayerPlaceholder {\n /** ID of the video for which to show the placeholder. */\n @Input() videoId: string;\n\n /** Width of the video for which to show the placeholder. */\n @Input() width: number;\n\n /** Height of the video for which to show the placeholder. */\n @Input() height: number;\n\n /** Whether the video is currently being loaded. */\n @Input() isLoading: boolean;\n\n /** Accessible label for the play button. */\n @Input() buttonLabel: string;\n\n /** Quality of the placeholder image. */\n @Input() quality: PlaceholderImageQuality;\n\n /** Gets the background image showing the placeholder. */\n protected _getBackgroundImage(): string | undefined {\n let url: string;\n\n if (this.quality === 'low') {\n url = `https://i.ytimg.com/vi/${this.videoId}/hqdefault.jpg`;\n } else if (this.quality === 'high') {\n url = `https://i.ytimg.com/vi/${this.videoId}/maxresdefault.jpg`;\n } else {\n url = `https://i.ytimg.com/vi_webp/${this.videoId}/sddefault.webp`;\n }\n\n return `url(${url})`;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/// <reference types=\"youtube\" />\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnDestroy,\n Output,\n ViewChild,\n ViewEncapsulation,\n Inject,\n PLATFORM_ID,\n OnChanges,\n SimpleChanges,\n booleanAttribute,\n numberAttribute,\n InjectionToken,\n inject,\n CSP_NONCE,\n ChangeDetectorRef,\n AfterViewInit,\n} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\nimport {Observable, of as observableOf, Subject, BehaviorSubject, fromEventPattern} from 'rxjs';\nimport {takeUntil, switchMap} from 'rxjs/operators';\nimport {PlaceholderImageQuality, YouTubePlayerPlaceholder} from './youtube-player-placeholder';\n\ndeclare global {\n interface Window {\n YT: typeof YT | undefined;\n onYouTubeIframeAPIReady: (() => void) | undefined;\n }\n}\n\n/** Injection token used to configure the `YouTubePlayer`. */\nexport const YOUTUBE_PLAYER_CONFIG = new InjectionToken<YouTubePlayerConfig>(\n 'YOUTUBE_PLAYER_CONFIG',\n);\n\n/** Object that can be used to configure the `YouTubePlayer`. */\nexport interface YouTubePlayerConfig {\n /** Whether to load the YouTube iframe API automatically. Defaults to `true`. */\n loadApi?: boolean;\n\n /**\n * By default the player shows a placeholder image instead of loading the YouTube API which\n * improves the initial page load performance. Use this option to disable the placeholder loading\n * behavior globally. Defaults to `false`.\n */\n disablePlaceholder?: boolean;\n\n /** Accessible label for the play button inside of the placeholder. */\n placeholderButtonLabel?: string;\n\n /**\n * Quality of the displayed placeholder image. Defaults to `standard`,\n * because not all video have a high-quality placeholder.\n */\n placeholderImageQuality?: PlaceholderImageQuality;\n}\n\nexport const DEFAULT_PLAYER_WIDTH = 640;\nexport const DEFAULT_PLAYER_HEIGHT = 390;\n\n/**\n * Object used to store the state of the player if the\n * user tries to interact with the API before it has been loaded.\n */\ninterface PendingPlayerState {\n playbackState?: YT.PlayerState.PLAYING | YT.PlayerState.PAUSED | YT.PlayerState.CUED;\n playbackRate?: number;\n volume?: number;\n muted?: boolean;\n seek?: {seconds: number; allowSeekAhead: boolean};\n}\n\n/** Coercion function for time values. */\nfunction coerceTime(value: number | undefined): number | undefined {\n return value == null ? value : numberAttribute(value, 0);\n}\n\n/**\n * Angular component that renders a YouTube player via the YouTube player\n * iframe API.\n * @see https://developers.google.com/youtube/iframe_api_reference\n */\n@Component({\n selector: 'youtube-player',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [YouTubePlayerPlaceholder],\n template: `\n @if (_shouldShowPlaceholder()) {\n <youtube-player-placeholder\n [videoId]=\"videoId!\"\n [width]=\"width\"\n [height]=\"height\"\n [isLoading]=\"_isLoading\"\n [buttonLabel]=\"placeholderButtonLabel\"\n [quality]=\"placeholderImageQuality\"\n (click)=\"_load(true)\"/>\n }\n <div [style.display]=\"_shouldShowPlaceholder() ? 'none' : ''\">\n <div #youtubeContainer></div>\n </div>\n `,\n})\nexport class YouTubePlayer implements AfterViewInit, OnChanges, OnDestroy {\n /** Whether we're currently rendering inside a browser. */\n private readonly _isBrowser: boolean;\n private _player: YT.Player | undefined;\n private _pendingPlayer: YT.Player | undefined;\n private _existingApiReadyCallback: (() => void) | undefined;\n private _pendingPlayerState: PendingPlayerState | undefined;\n private readonly _destroyed = new Subject<void>();\n private readonly _playerChanges = new BehaviorSubject<YT.Player | undefined>(undefined);\n private readonly _nonce = inject(CSP_NONCE, {optional: true});\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\n protected _isLoading = false;\n protected _hasPlaceholder = true;\n\n /** YouTube Video ID to view */\n @Input()\n videoId: string | undefined;\n\n /** Height of video player */\n @Input({transform: numberAttribute})\n get height(): number {\n return this._height;\n }\n set height(height: number | undefined) {\n this._height = height == null || isNaN(height) ? DEFAULT_PLAYER_HEIGHT : height;\n }\n private _height = DEFAULT_PLAYER_HEIGHT;\n\n /** Width of video player */\n @Input({transform: numberAttribute})\n get width(): number {\n return this._width;\n }\n set width(width: number | undefined) {\n this._width = width == null || isNaN(width) ? DEFAULT_PLAYER_WIDTH : width;\n }\n private _width = DEFAULT_PLAYER_WIDTH;\n\n /** The moment when the player is supposed to start playing */\n @Input({transform: coerceTime})\n startSeconds: number | undefined;\n\n /** The moment when the player is supposed to stop playing */\n @Input({transform: coerceTime})\n endSeconds: number | undefined;\n\n /** The suggested quality of the player */\n @Input()\n suggestedQuality: YT.SuggestedVideoQuality | undefined;\n\n /**\n * Extra parameters used to configure the player. See:\n * https://developers.google.com/youtube/player_parameters.html?playerVersion=HTML5#Parameters\n */\n @Input()\n playerVars: YT.PlayerVars | undefined;\n\n /** Whether cookies inside the player have been disabled. */\n @Input({transform: booleanAttribute})\n disableCookies: boolean = false;\n\n /** Whether to automatically load the YouTube iframe API. Defaults to `true`. */\n @Input({transform: booleanAttribute})\n loadApi: boolean;\n\n /**\n * By default the player shows a placeholder image instead of loading the YouTube API which\n * improves the initial page load performance. This input allows for the behavior to be disabled.\n */\n @Input({transform: booleanAttribute})\n disablePlaceholder: boolean = false;\n\n /**\n * Whether the iframe will attempt to load regardless of the status of the api on the\n * page. Set this to true if you don't want the `onYouTubeIframeAPIReady` field to be\n * set on the global window.\n */\n @Input({transform: booleanAttribute}) showBeforeIframeApiLoads: boolean = false;\n\n /** Accessible label for the play button inside of the placeholder. */\n @Input() placeholderButtonLabel: string;\n\n /**\n * Quality of the displayed placeholder image. Defaults to `standard`,\n * because not all video have a high-quality placeholder.\n */\n @Input() placeholderImageQuality: PlaceholderImageQuality;\n\n /** Outputs are direct proxies from the player itself. */\n @Output() readonly ready: Observable<YT.PlayerEvent> =\n this._getLazyEmitter<YT.PlayerEvent>('onReady');\n\n @Output() readonly stateChange: Observable<YT.OnStateChangeEvent> =\n this._getLazyEmitter<YT.OnStateChangeEvent>('onStateChange');\n\n @Output() readonly error: Observable<YT.OnErrorEvent> =\n this._getLazyEmitter<YT.OnErrorEvent>('onError');\n\n @Output() readonly apiChange: Observable<YT.PlayerEvent> =\n this._getLazyEmitter<YT.PlayerEvent>('onApiChange');\n\n @Output() readonly playbackQualityChange: Observable<YT.OnPlaybackQualityChangeEvent> =\n this._getLazyEmitter<YT.OnPlaybackQualityChangeEvent>('onPlaybackQualityChange');\n\n @Output() readonly playbackRateChange: Observable<YT.OnPlaybackRateChangeEvent> =\n this._getLazyEmitter<YT.OnPlaybackRateChangeEvent>('onPlaybackRateChange');\n\n /** The element that will be replaced by the iframe. */\n @ViewChild('youtubeContainer', {static: true})\n youtubeContainer: ElementRef<HTMLElement>;\n\n constructor(\n private _ngZone: NgZone,\n @Inject(PLATFORM_ID) platformId: Object,\n ) {\n const config = inject(YOUTUBE_PLAYER_CONFIG, {optional: true});\n this.loadApi = config?.loadApi ?? true;\n this.disablePlaceholder = !!config?.disablePlaceholder;\n this.placeholderButtonLabel = config?.placeholderButtonLabel || 'Play video';\n this.placeholderImageQuality = config?.placeholderImageQuality || 'standard';\n this._isBrowser = isPlatformBrowser(platformId);\n }\n\n ngAfterViewInit() {\n this._conditionallyLoad();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this._shouldRecreatePlayer(changes)) {\n this._conditionallyLoad();\n } else if (this._player) {\n if (changes['width'] || changes['height']) {\n this._setSize();\n }\n\n if (changes['suggestedQuality']) {\n this._setQuality();\n }\n\n if (changes['startSeconds'] || changes['endSeconds'] || changes['suggestedQuality']) {\n this._cuePlayer();\n }\n }\n }\n\n ngOnDestroy() {\n this._pendingPlayer?.destroy();\n\n if (this._player) {\n this._player.destroy();\n window.onYouTubeIframeAPIReady = this._existingApiReadyCallback;\n }\n\n this._playerChanges.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#playVideo */\n playVideo() {\n if (this._player) {\n this._player.playVideo();\n } else {\n this._getPendingState().playbackState = YT.PlayerState.PLAYING;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#pauseVideo */\n pauseVideo() {\n if (this._player) {\n this._player.pauseVideo();\n } else {\n this._getPendingState().playbackState = YT.PlayerState.PAUSED;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#stopVideo */\n stopVideo() {\n if (this._player) {\n this._player.stopVideo();\n } else {\n // It seems like YouTube sets the player to CUED when it's stopped.\n this._getPendingState().playbackState = YT.PlayerState.CUED;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#seekTo */\n seekTo(seconds: number, allowSeekAhead: boolean) {\n if (this._player) {\n this._player.seekTo(seconds, allowSeekAhead);\n } else {\n this._getPendingState().seek = {seconds, allowSeekAhead};\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#mute */\n mute() {\n if (this._player) {\n this._player.mute();\n } else {\n this._getPendingState().muted = true;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#unMute */\n unMute() {\n if (this._player) {\n this._player.unMute();\n } else {\n this._getPendingState().muted = false;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#isMuted */\n isMuted(): boolean {\n if (this._player) {\n return this._player.isMuted();\n }\n\n if (this._pendingPlayerState) {\n return !!this._pendingPlayerState.muted;\n }\n\n return false;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#setVolume */\n setVolume(volume: number) {\n if (this._player) {\n this._player.setVolume(volume);\n } else {\n this._getPendingState().volume = volume;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVolume */\n getVolume(): number {\n if (this._player) {\n return this._player.getVolume();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.volume != null) {\n return this._pendingPlayerState.volume;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */\n setPlaybackRate(playbackRate: number) {\n if (this._player) {\n return this._player.setPlaybackRate(playbackRate);\n } else {\n this._getPendingState().playbackRate = playbackRate;\n }\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */\n getPlaybackRate(): number {\n if (this._player) {\n return this._player.getPlaybackRate();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.playbackRate != null) {\n return this._pendingPlayerState.playbackRate;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */\n getAvailablePlaybackRates(): number[] {\n return this._player ? this._player.getAvailablePlaybackRates() : [];\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */\n getVideoLoadedFraction(): number {\n return this._player ? this._player.getVideoLoadedFraction() : 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */\n getPlayerState(): YT.PlayerState | undefined {\n if (!this._isBrowser || !window.YT) {\n return undefined;\n }\n\n if (this._player) {\n return this._player.getPlayerState();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.playbackState != null) {\n return this._pendingPlayerState.playbackState;\n }\n\n return YT.PlayerState.UNSTARTED;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */\n getCurrentTime(): number {\n if (this._player) {\n return this._player.getCurrentTime();\n }\n\n if (this._pendingPlayerState && this._pendingPlayerState.seek) {\n return this._pendingPlayerState.seek.seconds;\n }\n\n return 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */\n getPlaybackQuality(): YT.SuggestedVideoQuality {\n return this._player ? this._player.getPlaybackQuality() : 'default';\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */\n getAvailableQualityLevels(): YT.SuggestedVideoQuality[] {\n return this._player ? this._player.getAvailableQualityLevels() : [];\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getDuration */\n getDuration(): number {\n return this._player ? this._player.getDuration() : 0;\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */\n getVideoUrl(): string {\n return this._player ? this._player.getVideoUrl() : '';\n }\n\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */\n getVideoEmbedCode(): string {\n return this._player ? this._player.getVideoEmbedCode() : '';\n }\n\n /**\n * Loads the YouTube API and sets up the player.\n * @param playVideo Whether to automatically play the video once the player is loaded.\n */\n protected _load(playVideo: boolean) {\n // Don't do anything if we're not in a browser environment.\n if (!this._isBrowser) {\n return;\n }\n\n if (!window.YT || !window.YT.Player) {\n if (this.loadApi) {\n this._isLoading = true;\n loadApi(this._nonce);\n } else if (this.showBeforeIframeApiLoads && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw new Error(\n 'Namespace YT not found, cannot construct embedded youtube player. ' +\n 'Please install the YouTube Player API Reference for iframe Embeds: ' +\n 'https://developers.google.com/youtube/iframe_api_reference',\n );\n }\n\n this._existingApiReadyCallback = window.onYouTubeIframeAPIReady;\n\n window.onYouTubeIframeAPIReady = () => {\n this._existingApiReadyCallback?.();\n this._ngZone.run(() => this._createPlayer(playVideo));\n };\n } else {\n this._createPlayer(playVideo);\n }\n }\n\n /** Loads the player depending on the internal state of the component. */\n private _conditionallyLoad() {\n // If the placeholder isn't shown anymore, we have to trigger a load.\n if (!this._shouldShowPlaceholder()) {\n this._load(false);\n } else if (this.playerVars?.autoplay === 1) {\n // If it's an autoplaying video, we have to hide the placeholder and start playing.\n this._load(true);\n }\n }\n\n /** Whether to show the placeholder element. */\n protected _shouldShowPlaceholder(): boolean {\n if (this.disablePlaceholder) {\n return false;\n }\n\n // Since we don't load the API on the server, we show the placeholder permanently.\n if (!this._isBrowser) {\n return true;\n }\n\n return this._hasPlaceholder && !!this.videoId && !this._player;\n }\n\n /** Gets an object that should be used to store the temporary API state. */\n private _getPendingState(): PendingPlayerState {\n if (!this._pendingPlayerState) {\n this._pendingPlayerState = {};\n }\n\n return this._pendingPlayerState;\n }\n\n /**\n * Determines whether a change in the component state\n * requires the YouTube player to be recreated.\n */\n private _shouldRecreatePlayer(changes: SimpleChanges): boolean {\n const change =\n changes['videoId'] ||\n changes['playerVars'] ||\n changes['disableCookies'] ||\n changes['disablePlaceholder'];\n return !!change && !change.isFirstChange();\n }\n\n /**\n * Creates a new YouTube player and destroys the existing one.\n * @param playVideo Whether to play the video once it loads.\n */\n private _createPlayer(playVideo: boolean) {\n this._player?.destroy();\n this._pendingPlayer?.destroy();\n\n // A player can't be created if the API isn't loaded,\n // or there isn't a video or playlist to be played.\n if (typeof YT === 'undefined' || (!this.videoId && !this.playerVars?.list)) {\n return;\n }\n\n // Important! We need to create the Player object outside of the `NgZone`, because it kicks\n // off a 250ms setInterval which will continually trigger change detection if we don't.\n const player = this._ngZone.runOutsideAngular(\n () =>\n new YT.Player(this.youtubeContainer.nativeElement, {\n videoId: this.videoId,\n host: this.disableCookies ? 'https://www.youtube-nocookie.com' : undefined,\n width: this.width,\n height: this.height,\n // Calling `playVideo` on load doesn't appear to actually play\n // the video so we need to trigger it through `playerVars` instead.\n playerVars: playVideo ? {...(this.playerVars || {}), autoplay: 1} : this.playerVars,\n }),\n );\n\n const whenReady = () => {\n // Only assign the player once it's ready, otherwise YouTube doesn't expose some APIs.\n this._ngZone.run(() => {\n this._isLoading = false;\n this._hasPlaceholder = false;\n this._player = player;\n this._pendingPlayer = undefined;\n player.removeEventListener('onReady', whenReady);\n this._playerChanges.next(player);\n this._setSize();\n this._setQuality();\n\n if (this._pendingPlayerState) {\n this._applyPendingPlayerState(player, this._pendingPlayerState);\n this._pendingPlayerState = undefined;\n }\n\n // Only cue the player when it either hasn't started yet or it's cued,\n // otherwise cuing it can interrupt a player with autoplay enabled.\n const state = player.getPlayerState();\n if (state === YT.PlayerState.UNSTARTED || state === YT.PlayerState.CUED || state == null) {\n this._cuePlayer();\n }\n\n this._changeDetectorRef.markForCheck();\n });\n };\n\n this._pendingPlayer = player;\n player.addEventListener('onReady', whenReady);\n }\n\n /** Applies any state that changed before the player was initialized. */\n private _applyPendingPlayerState(player: YT.Player, pendingState: PendingPlayerState): void {\n const {playbackState, playbackRate, volume, muted, seek} = pendingState;\n\n switch (playbackState) {\n case YT.PlayerState.PLAYING:\n player.playVideo();\n break;\n case YT.PlayerState.PAUSED:\n player.pauseVideo();\n break;\n case YT.PlayerState.CUED:\n player.stopVideo();\n break;\n }\n\n if (playbackRate != null) {\n player.setPlaybackRate(playbackRate);\n }\n\n if (volume != null) {\n player.setVolume(volume);\n }\n\n if (muted != null) {\n muted ? player.mute() : player.unMute();\n }\n\n if (seek != null) {\n player.seekTo(seek.seconds, seek.allowSeekAhead);\n }\n }\n\n /** Cues the player based on the current component state. */\n private _cuePlayer() {\n if (this._player && this.videoId) {\n this._player.cueVideoById({\n videoId: this.videoId,\n startSeconds: this.startSeconds,\n endSeconds: this.endSeconds,\n suggestedQuality: this.suggestedQuality,\n });\n }\n }\n\n /** Sets the player's size based on the current input values. */\n private _setSize() {\n this._player?.setSize(this.width, this.height);\n }\n\n /** Sets the player's quality based on the current input values. */\n private _setQuality() {\n if (this._player && this.suggestedQuality) {\n this._player.setPlaybackQuality(this.suggestedQuality);\n }\n }\n\n /** Gets an observable that adds an event listener to the player when a user subscribes to it. */\n private _getLazyEmitter<T extends YT.PlayerEvent>(name: keyof YT.Events): Observable<T> {\n // Start with the stream of players. This way the events will be transferred\n // over to the new player if it gets swapped out under-the-hood.\n return this._playerChanges.pipe(\n // Switch to the bound event. `switchMap` ensures that the old event is removed when the\n // player is changed. If there's no player, return an observable that never emits.\n switchMap(player => {\n return player\n ? fromEventPattern<T>(\n (listener: (event: T) => void) => {\n player.addEventListener(name, listener);\n },\n (listener: (event: T) => void) => {\n // The API seems to throw when we try to unbind from a destroyed player and it doesn't\n // expose whether the player has been destroyed so we have to wrap it in a try/catch to\n // prevent the entire stream from erroring out.\n try {\n player?.removeEventListener?.(name, listener);\n } catch {}\n },\n )\n : observableOf<T>();\n }),\n // By default we run all the API interactions outside the zone\n // so we have to bring the events back in manually when they emit.\n source =>\n new Observable<T>(observer =>\n source.subscribe({\n next: value => this._ngZone.run(() => observer.next(value)),\n error: error => observer.error(error),\n complete: () => observer.complete(),\n }),\n ),\n // Ensures that everything is cleared out on destroy.\n takeUntil(this._destroyed),\n );\n }\n}\n\nlet apiLoaded = false;\n\n/** Loads the YouTube API from a specified URL only once. */\nfunction loadApi(nonce: string | null): void {\n if (apiLoaded) {\n return;\n }\n\n // We can use `document` directly here, because this logic doesn't run outside the browser.\n const url = 'https://www.youtube.com/iframe_api';\n const script = document.createElement('script');\n const callback = (event: Event) => {\n script.removeEventListener('load', callback);\n script.removeEventListener('error', callback);\n\n if (event.type === 'error') {\n apiLoaded = false;\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.error(`Failed to load YouTube API from ${url}`);\n }\n }\n };\n script.addEventListener('load', callback);\n script.addEventListener('error', callback);\n (script as any).src = url;\n script.async = true;\n\n if (nonce) {\n script.nonce = nonce;\n }\n\n // Set this immediately to true so we don't start loading another script\n // while this one is pending. If loading fails, we'll flip it back to false.\n apiLoaded = true;\n document.body.appendChild(script);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {YouTubePlayer} from './youtube-player';\n\n@NgModule({\n imports: [YouTubePlayer],\n exports: [YouTubePlayer],\n})\nexport class YouTubePlayerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["observableOf"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { AfterViewInit } from '@angular/core';
|
|
4
4
|
import { ElementRef } from '@angular/core';
|
|
5
5
|
import * as i0 from '@angular/core';
|
|
6
|
+
import { InjectionToken } from '@angular/core';
|
|
6
7
|
import { NgZone } from '@angular/core';
|
|
7
8
|
import { Observable } from 'rxjs';
|
|
8
9
|
import { OnChanges } from '@angular/core';
|
|
@@ -15,12 +16,20 @@ declare const DEFAULT_PLAYER_WIDTH = 640;
|
|
|
15
16
|
|
|
16
17
|
declare namespace i1 {
|
|
17
18
|
export {
|
|
19
|
+
YOUTUBE_PLAYER_CONFIG,
|
|
20
|
+
YouTubePlayerConfig,
|
|
18
21
|
DEFAULT_PLAYER_WIDTH,
|
|
19
22
|
DEFAULT_PLAYER_HEIGHT,
|
|
20
23
|
YouTubePlayer
|
|
21
24
|
}
|
|
22
25
|
}
|
|
23
26
|
|
|
27
|
+
/** Quality of the placeholder image. */
|
|
28
|
+
export declare type PlaceholderImageQuality = 'high' | 'standard' | 'low';
|
|
29
|
+
|
|
30
|
+
/** Injection token used to configure the `YouTubePlayer`. */
|
|
31
|
+
export declare const YOUTUBE_PLAYER_CONFIG: InjectionToken<YouTubePlayerConfig>;
|
|
32
|
+
|
|
24
33
|
/**
|
|
25
34
|
* Angular component that renders a YouTube player via the YouTube player
|
|
26
35
|
* iframe API.
|
|
@@ -36,6 +45,10 @@ export declare class YouTubePlayer implements AfterViewInit, OnChanges, OnDestro
|
|
|
36
45
|
private _pendingPlayerState;
|
|
37
46
|
private readonly _destroyed;
|
|
38
47
|
private readonly _playerChanges;
|
|
48
|
+
private readonly _nonce;
|
|
49
|
+
private readonly _changeDetectorRef;
|
|
50
|
+
protected _isLoading: boolean;
|
|
51
|
+
protected _hasPlaceholder: boolean;
|
|
39
52
|
/** YouTube Video ID to view */
|
|
40
53
|
videoId: string | undefined;
|
|
41
54
|
/** Height of video player */
|
|
@@ -59,12 +72,26 @@ export declare class YouTubePlayer implements AfterViewInit, OnChanges, OnDestro
|
|
|
59
72
|
playerVars: YT.PlayerVars | undefined;
|
|
60
73
|
/** Whether cookies inside the player have been disabled. */
|
|
61
74
|
disableCookies: boolean;
|
|
75
|
+
/** Whether to automatically load the YouTube iframe API. Defaults to `true`. */
|
|
76
|
+
loadApi: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* By default the player shows a placeholder image instead of loading the YouTube API which
|
|
79
|
+
* improves the initial page load performance. This input allows for the behavior to be disabled.
|
|
80
|
+
*/
|
|
81
|
+
disablePlaceholder: boolean;
|
|
62
82
|
/**
|
|
63
83
|
* Whether the iframe will attempt to load regardless of the status of the api on the
|
|
64
84
|
* page. Set this to true if you don't want the `onYouTubeIframeAPIReady` field to be
|
|
65
85
|
* set on the global window.
|
|
66
86
|
*/
|
|
67
|
-
showBeforeIframeApiLoads: boolean
|
|
87
|
+
showBeforeIframeApiLoads: boolean;
|
|
88
|
+
/** Accessible label for the play button inside of the placeholder. */
|
|
89
|
+
placeholderButtonLabel: string;
|
|
90
|
+
/**
|
|
91
|
+
* Quality of the displayed placeholder image. Defaults to `standard`,
|
|
92
|
+
* because not all video have a high-quality placeholder.
|
|
93
|
+
*/
|
|
94
|
+
placeholderImageQuality: PlaceholderImageQuality;
|
|
68
95
|
/** Outputs are direct proxies from the player itself. */
|
|
69
96
|
readonly ready: Observable<YT.PlayerEvent>;
|
|
70
97
|
readonly stateChange: Observable<YT.OnStateChangeEvent>;
|
|
@@ -118,6 +145,15 @@ export declare class YouTubePlayer implements AfterViewInit, OnChanges, OnDestro
|
|
|
118
145
|
getVideoUrl(): string;
|
|
119
146
|
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */
|
|
120
147
|
getVideoEmbedCode(): string;
|
|
148
|
+
/**
|
|
149
|
+
* Loads the YouTube API and sets up the player.
|
|
150
|
+
* @param playVideo Whether to automatically play the video once the player is loaded.
|
|
151
|
+
*/
|
|
152
|
+
protected _load(playVideo: boolean): void;
|
|
153
|
+
/** Loads the player depending on the internal state of the component. */
|
|
154
|
+
private _conditionallyLoad;
|
|
155
|
+
/** Whether to show the placeholder element. */
|
|
156
|
+
protected _shouldShowPlaceholder(): boolean;
|
|
121
157
|
/** Gets an object that should be used to store the temporary API state. */
|
|
122
158
|
private _getPendingState;
|
|
123
159
|
/**
|
|
@@ -125,7 +161,10 @@ export declare class YouTubePlayer implements AfterViewInit, OnChanges, OnDestro
|
|
|
125
161
|
* requires the YouTube player to be recreated.
|
|
126
162
|
*/
|
|
127
163
|
private _shouldRecreatePlayer;
|
|
128
|
-
/**
|
|
164
|
+
/**
|
|
165
|
+
* Creates a new YouTube player and destroys the existing one.
|
|
166
|
+
* @param playVideo Whether to play the video once it loads.
|
|
167
|
+
*/
|
|
129
168
|
private _createPlayer;
|
|
130
169
|
/** Applies any state that changed before the player was initialized. */
|
|
131
170
|
private _applyPendingPlayerState;
|
|
@@ -138,12 +177,39 @@ export declare class YouTubePlayer implements AfterViewInit, OnChanges, OnDestro
|
|
|
138
177
|
/** Gets an observable that adds an event listener to the player when a user subscribes to it. */
|
|
139
178
|
private _getLazyEmitter;
|
|
140
179
|
static ɵfac: i0.ɵɵFactoryDeclaration<YouTubePlayer, never>;
|
|
141
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<YouTubePlayer, "youtube-player", never, { "videoId": { "alias": "videoId"; "required": false; }; "height": { "alias": "height"; "required": false; }; "width": { "alias": "width"; "required": false; }; "startSeconds": { "alias": "startSeconds"; "required": false; }; "endSeconds": { "alias": "endSeconds"; "required": false; }; "suggestedQuality": { "alias": "suggestedQuality"; "required": false; }; "playerVars": { "alias": "playerVars"; "required": false; }; "disableCookies": { "alias": "disableCookies"; "required": false; }; "showBeforeIframeApiLoads": { "alias": "showBeforeIframeApiLoads"; "required": false; }; }, { "ready": "ready"; "stateChange": "stateChange"; "error": "error"; "apiChange": "apiChange"; "playbackQualityChange": "playbackQualityChange"; "playbackRateChange": "playbackRateChange"; }, never, never,
|
|
180
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<YouTubePlayer, "youtube-player", never, { "videoId": { "alias": "videoId"; "required": false; }; "height": { "alias": "height"; "required": false; }; "width": { "alias": "width"; "required": false; }; "startSeconds": { "alias": "startSeconds"; "required": false; }; "endSeconds": { "alias": "endSeconds"; "required": false; }; "suggestedQuality": { "alias": "suggestedQuality"; "required": false; }; "playerVars": { "alias": "playerVars"; "required": false; }; "disableCookies": { "alias": "disableCookies"; "required": false; }; "loadApi": { "alias": "loadApi"; "required": false; }; "disablePlaceholder": { "alias": "disablePlaceholder"; "required": false; }; "showBeforeIframeApiLoads": { "alias": "showBeforeIframeApiLoads"; "required": false; }; "placeholderButtonLabel": { "alias": "placeholderButtonLabel"; "required": false; }; "placeholderImageQuality": { "alias": "placeholderImageQuality"; "required": false; }; }, { "ready": "ready"; "stateChange": "stateChange"; "error": "error"; "apiChange": "apiChange"; "playbackQualityChange": "playbackQualityChange"; "playbackRateChange": "playbackRateChange"; }, never, never, true, never>;
|
|
181
|
+
static ngAcceptInputType_height: unknown;
|
|
182
|
+
static ngAcceptInputType_width: unknown;
|
|
183
|
+
static ngAcceptInputType_startSeconds: number | undefined;
|
|
184
|
+
static ngAcceptInputType_endSeconds: number | undefined;
|
|
185
|
+
static ngAcceptInputType_disableCookies: unknown;
|
|
186
|
+
static ngAcceptInputType_loadApi: unknown;
|
|
187
|
+
static ngAcceptInputType_disablePlaceholder: unknown;
|
|
188
|
+
static ngAcceptInputType_showBeforeIframeApiLoads: unknown;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Object that can be used to configure the `YouTubePlayer`. */
|
|
192
|
+
export declare interface YouTubePlayerConfig {
|
|
193
|
+
/** Whether to load the YouTube iframe API automatically. Defaults to `true`. */
|
|
194
|
+
loadApi?: boolean;
|
|
195
|
+
/**
|
|
196
|
+
* By default the player shows a placeholder image instead of loading the YouTube API which
|
|
197
|
+
* improves the initial page load performance. Use this option to disable the placeholder loading
|
|
198
|
+
* behavior globally. Defaults to `false`.
|
|
199
|
+
*/
|
|
200
|
+
disablePlaceholder?: boolean;
|
|
201
|
+
/** Accessible label for the play button inside of the placeholder. */
|
|
202
|
+
placeholderButtonLabel?: string;
|
|
203
|
+
/**
|
|
204
|
+
* Quality of the displayed placeholder image. Defaults to `standard`,
|
|
205
|
+
* because not all video have a high-quality placeholder.
|
|
206
|
+
*/
|
|
207
|
+
placeholderImageQuality?: PlaceholderImageQuality;
|
|
142
208
|
}
|
|
143
209
|
|
|
144
210
|
export declare class YouTubePlayerModule {
|
|
145
211
|
static ɵfac: i0.ɵɵFactoryDeclaration<YouTubePlayerModule, never>;
|
|
146
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<YouTubePlayerModule, [typeof i1.YouTubePlayer],
|
|
212
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<YouTubePlayerModule, never, [typeof i1.YouTubePlayer], [typeof i1.YouTubePlayer]>;
|
|
147
213
|
static ɵinj: i0.ɵɵInjectorDeclaration<YouTubePlayerModule>;
|
|
148
214
|
}
|
|
149
215
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/youtube-player",
|
|
3
|
-
"version": "17.0.
|
|
3
|
+
"version": "17.1.0-next.1",
|
|
4
4
|
"description": "Angular YouTube Player",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"tslib": "^2.3.0"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|
|
24
|
-
"@angular/core": "^17.0.0 || ^18.0.0",
|
|
25
|
-
"@angular/common": "^17.0.0 || ^18.0.0",
|
|
24
|
+
"@angular/core": "^17.0.0-0 || ^17.1.0-0 || ^17.2.0-0 || ^17.3.0-0 || ^18.0.0-0",
|
|
25
|
+
"@angular/common": "^17.0.0-0 || ^17.1.0-0 || ^17.2.0-0 || ^17.3.0-0 || ^18.0.0-0",
|
|
26
26
|
"rxjs": "^6.5.3 || ^7.4.0"
|
|
27
27
|
},
|
|
28
28
|
"sideEffects": false,
|