{"version":3,"sources":["node_modules/@angular/youtube-player/fesm2022/youtube-player.mjs","src/app/features/consent/components/consent-accept-button/consent-accept-button.component.ts","src/app/features/consent/components/consent-accept-button/consent-accept-button.component.html","src/app/features/youtube/service/youtube-api-loading.service.ts","src/app/features/youtube/components/youtube-player-lazy/youtube-player-lazy.component.ts","src/app/features/youtube/components/youtube-player-lazy/youtube-player-lazy.component.html","src/app/features/youtube/components/youtube-player-contentful/youtube-player-contentful.component.ts","src/app/features/youtube/components/youtube-player-contentful/youtube-player-contentful.component.html"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { Component, ChangeDetectionStrategy, ViewEncapsulation, Input, InjectionToken, numberAttribute, inject, CSP_NONCE, ChangeDetectorRef, PLATFORM_ID, booleanAttribute, Inject, Output, ViewChild, NgModule } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Subject, BehaviorSubject, fromEventPattern, of, Observable } from 'rxjs';\nimport { switchMap, takeUntil } from 'rxjs/operators';\nconst _c0 = [\"youtubeContainer\"];\nfunction YouTubePlayer_Conditional_0_Template(rf, ctx) {\n if (rf & 1) {\n const _r1 = i0.ɵɵgetCurrentView();\n i0.ɵɵelementStart(0, \"youtube-player-placeholder\", 2);\n i0.ɵɵlistener(\"click\", function YouTubePlayer_Conditional_0_Template_youtube_player_placeholder_click_0_listener() {\n i0.ɵɵrestoreView(_r1);\n const ctx_r1 = i0.ɵɵnextContext();\n return i0.ɵɵresetView(ctx_r1._load(true));\n });\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n const ctx_r1 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"videoId\", ctx_r1.videoId)(\"width\", ctx_r1.width)(\"height\", ctx_r1.height)(\"isLoading\", ctx_r1._isLoading)(\"buttonLabel\", ctx_r1.placeholderButtonLabel)(\"quality\", ctx_r1.placeholderImageQuality);\n }\n}\nlet YouTubePlayerPlaceholder = /*#__PURE__*/(() => {\n class YouTubePlayerPlaceholder {\n /** Gets the background image showing the placeholder. */\n _getBackgroundImage() {\n let url;\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 return `url(${url})`;\n }\n static {\n this.ɵfac = function YouTubePlayerPlaceholder_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || YouTubePlayerPlaceholder)();\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: YouTubePlayerPlaceholder,\n selectors: [[\"youtube-player-placeholder\"]],\n hostAttrs: [1, \"youtube-player-placeholder\"],\n hostVars: 8,\n hostBindings: function YouTubePlayerPlaceholder_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵstyleProp(\"background-image\", ctx._getBackgroundImage())(\"width\", ctx.width, \"px\")(\"height\", ctx.height, \"px\");\n i0.ɵɵclassProp(\"youtube-player-placeholder-loading\", ctx.isLoading);\n }\n },\n inputs: {\n videoId: \"videoId\",\n width: \"width\",\n height: \"height\",\n isLoading: \"isLoading\",\n buttonLabel: \"buttonLabel\",\n quality: \"quality\"\n },\n standalone: true,\n features: [i0.ɵɵStandaloneFeature],\n decls: 4,\n vars: 1,\n consts: [[\"type\", \"button\", 1, \"youtube-player-placeholder-button\"], [\"height\", \"100%\", \"version\", \"1.1\", \"viewBox\", \"0 0 68 48\", \"focusable\", \"false\", \"aria-hidden\", \"true\"], [\"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\"], [\"d\", \"M 45,24 27,14 27,34\", \"fill\", \"#fff\"]],\n template: function YouTubePlayerPlaceholder_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵelementStart(0, \"button\", 0);\n i0.ɵɵnamespaceSVG();\n i0.ɵɵelementStart(1, \"svg\", 1);\n i0.ɵɵelement(2, \"path\", 2)(3, \"path\", 3);\n i0.ɵɵelementEnd()();\n }\n if (rf & 2) {\n i0.ɵɵattribute(\"aria-label\", ctx.buttonLabel);\n }\n },\n styles: [\".youtube-player-placeholder{display:flex;align-items:center;justify-content:center;width:100%;overflow:hidden;cursor:pointer;background-color:#000;background-position:center center;background-size:cover;transition:box-shadow 300ms ease;box-shadow:inset 0 120px 90px -90px rgba(0,0,0,.8)}.youtube-player-placeholder-button{transition:opacity 300ms ease;-moz-appearance:none;-webkit-appearance:none;background:none;border:none;padding:0;display:flex}.youtube-player-placeholder-button svg{width:68px;height:48px}.youtube-player-placeholder-loading{box-shadow:none}.youtube-player-placeholder-loading .youtube-player-placeholder-button{opacity:0}\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return YouTubePlayerPlaceholder;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/** Injection token used to configure the `YouTubePlayer`. */\nconst YOUTUBE_PLAYER_CONFIG = /*#__PURE__*/new InjectionToken('YOUTUBE_PLAYER_CONFIG');\nconst DEFAULT_PLAYER_WIDTH = 640;\nconst DEFAULT_PLAYER_HEIGHT = 390;\n/** Coercion function for time values. */\nfunction coerceTime(value) {\n return value == null ? value : numberAttribute(value, 0);\n}\n/**\n * Equivalent of `YT.PlayerState` which we can't use, because it's meant to\n * be read off the `window` which we can't do before the API has been loaded.\n */\nvar PlayerState = /*#__PURE__*/function (PlayerState) {\n PlayerState[PlayerState[\"UNSTARTED\"] = -1] = \"UNSTARTED\";\n PlayerState[PlayerState[\"ENDED\"] = 0] = \"ENDED\";\n PlayerState[PlayerState[\"PLAYING\"] = 1] = \"PLAYING\";\n PlayerState[PlayerState[\"PAUSED\"] = 2] = \"PAUSED\";\n PlayerState[PlayerState[\"BUFFERING\"] = 3] = \"BUFFERING\";\n PlayerState[PlayerState[\"CUED\"] = 5] = \"CUED\";\n return PlayerState;\n}(PlayerState || {});\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 */\nlet YouTubePlayer = /*#__PURE__*/(() => {\n class YouTubePlayer {\n /** Height of video player */\n get height() {\n return this._height;\n }\n set height(height) {\n this._height = height == null || isNaN(height) ? DEFAULT_PLAYER_HEIGHT : height;\n }\n /** Width of video player */\n get width() {\n return this._width;\n }\n set width(width) {\n this._width = width == null || isNaN(width) ? DEFAULT_PLAYER_WIDTH : width;\n }\n constructor(_ngZone, platformId) {\n this._ngZone = _ngZone;\n this._destroyed = new Subject();\n this._playerChanges = new BehaviorSubject(undefined);\n this._nonce = inject(CSP_NONCE, {\n optional: true\n });\n this._changeDetectorRef = inject(ChangeDetectorRef);\n this._isLoading = false;\n this._hasPlaceholder = true;\n this._height = DEFAULT_PLAYER_HEIGHT;\n this._width = DEFAULT_PLAYER_WIDTH;\n /** Whether cookies inside the player have been disabled. */\n this.disableCookies = false;\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 this.disablePlaceholder = false;\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 this.showBeforeIframeApiLoads = false;\n /** Outputs are direct proxies from the player itself. */\n this.ready = this._getLazyEmitter('onReady');\n this.stateChange = this._getLazyEmitter('onStateChange');\n this.error = this._getLazyEmitter('onError');\n this.apiChange = this._getLazyEmitter('onApiChange');\n this.playbackQualityChange = this._getLazyEmitter('onPlaybackQualityChange');\n this.playbackRateChange = this._getLazyEmitter('onPlaybackRateChange');\n const config = inject(YOUTUBE_PLAYER_CONFIG, {\n optional: true\n });\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 ngAfterViewInit() {\n this._conditionallyLoad();\n }\n ngOnChanges(changes) {\n if (this._shouldRecreatePlayer(changes)) {\n this._conditionallyLoad();\n } else if (this._player) {\n if (changes['width'] || changes['height']) {\n this._setSize();\n }\n if (changes['suggestedQuality']) {\n this._setQuality();\n }\n if (changes['startSeconds'] || changes['endSeconds'] || changes['suggestedQuality']) {\n this._cuePlayer();\n }\n }\n }\n ngOnDestroy() {\n this._pendingPlayer?.destroy();\n if (this._player) {\n this._player.destroy();\n window.onYouTubeIframeAPIReady = this._existingApiReadyCallback;\n }\n this._playerChanges.complete();\n this._destroyed.next();\n this._destroyed.complete();\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 = PlayerState.PLAYING;\n this._load(true);\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 = PlayerState.PAUSED;\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 = PlayerState.CUED;\n }\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#seekTo */\n seekTo(seconds, allowSeekAhead) {\n if (this._player) {\n this._player.seekTo(seconds, allowSeekAhead);\n } else {\n this._getPendingState().seek = {\n seconds,\n 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 /** 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 /** See https://developers.google.com/youtube/iframe_api_reference#isMuted */\n isMuted() {\n if (this._player) {\n return this._player.isMuted();\n }\n if (this._pendingPlayerState) {\n return !!this._pendingPlayerState.muted;\n }\n return false;\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#setVolume */\n setVolume(volume) {\n if (this._player) {\n this._player.setVolume(volume);\n } else {\n this._getPendingState().volume = volume;\n }\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getVolume */\n getVolume() {\n if (this._player) {\n return this._player.getVolume();\n }\n if (this._pendingPlayerState && this._pendingPlayerState.volume != null) {\n return this._pendingPlayerState.volume;\n }\n return 0;\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */\n setPlaybackRate(playbackRate) {\n if (this._player) {\n return this._player.setPlaybackRate(playbackRate);\n } else {\n this._getPendingState().playbackRate = playbackRate;\n }\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */\n getPlaybackRate() {\n if (this._player) {\n return this._player.getPlaybackRate();\n }\n if (this._pendingPlayerState && this._pendingPlayerState.playbackRate != null) {\n return this._pendingPlayerState.playbackRate;\n }\n return 0;\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */\n getAvailablePlaybackRates() {\n return this._player ? this._player.getAvailablePlaybackRates() : [];\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */\n getVideoLoadedFraction() {\n return this._player ? this._player.getVideoLoadedFraction() : 0;\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */\n getPlayerState() {\n if (!this._isBrowser || !window.YT) {\n return undefined;\n }\n if (this._player) {\n return this._player.getPlayerState();\n }\n if (this._pendingPlayerState && this._pendingPlayerState.playbackState != null) {\n return this._pendingPlayerState.playbackState;\n }\n return PlayerState.UNSTARTED;\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */\n getCurrentTime() {\n if (this._player) {\n return this._player.getCurrentTime();\n }\n if (this._pendingPlayerState && this._pendingPlayerState.seek) {\n return this._pendingPlayerState.seek.seconds;\n }\n return 0;\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */\n getPlaybackQuality() {\n return this._player ? this._player.getPlaybackQuality() : 'default';\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */\n getAvailableQualityLevels() {\n return this._player ? this._player.getAvailableQualityLevels() : [];\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getDuration */\n getDuration() {\n return this._player ? this._player.getDuration() : 0;\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */\n getVideoUrl() {\n return this._player ? this._player.getVideoUrl() : '';\n }\n /** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */\n getVideoEmbedCode() {\n return this._player ? this._player.getVideoEmbedCode() : '';\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 _load(playVideo) {\n // Don't do anything if we're not in a browser environment.\n if (!this._isBrowser) {\n return;\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('Namespace YT not found, cannot construct embedded youtube player. ' + 'Please install the YouTube Player API Reference for iframe Embeds: ' + 'https://developers.google.com/youtube/iframe_api_reference');\n }\n this._existingApiReadyCallback = window.onYouTubeIframeAPIReady;\n window.onYouTubeIframeAPIReady = () => {\n this._existingApiReadyCallback?.();\n this._ngZone.run(() => this._createPlayer(playVideo));\n };\n } else {\n this._createPlayer(playVideo);\n }\n }\n /** Loads the player depending on the internal state of the component. */\n _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 /** Whether to show the placeholder element. */\n _shouldShowPlaceholder() {\n if (this.disablePlaceholder) {\n return false;\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 return this._hasPlaceholder && !!this.videoId && !this._player;\n }\n /** Gets an object that should be used to store the temporary API state. */\n _getPendingState() {\n if (!this._pendingPlayerState) {\n this._pendingPlayerState = {};\n }\n return this._pendingPlayerState;\n }\n /**\n * Determines whether a change in the component state\n * requires the YouTube player to be recreated.\n */\n _shouldRecreatePlayer(changes) {\n const change = changes['videoId'] || changes['playerVars'] || changes['disableCookies'] || changes['disablePlaceholder'];\n return !!change && !change.isFirstChange();\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 _createPlayer(playVideo) {\n this._player?.destroy();\n this._pendingPlayer?.destroy();\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 // 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(() => 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 ? {\n ...(this.playerVars || {}),\n autoplay: 1\n } : this.playerVars\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 if (this._pendingPlayerState) {\n this._applyPendingPlayerState(player, this._pendingPlayerState);\n this._pendingPlayerState = undefined;\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 === PlayerState.UNSTARTED || state === PlayerState.CUED || state == null) {\n this._cuePlayer();\n }\n this._changeDetectorRef.markForCheck();\n });\n };\n this._pendingPlayer = player;\n player.addEventListener('onReady', whenReady);\n }\n /** Applies any state that changed before the player was initialized. */\n _applyPendingPlayerState(player, pendingState) {\n const {\n playbackState,\n playbackRate,\n volume,\n muted,\n seek\n } = pendingState;\n switch (playbackState) {\n case PlayerState.PLAYING:\n player.playVideo();\n break;\n case PlayerState.PAUSED:\n player.pauseVideo();\n break;\n case PlayerState.CUED:\n player.stopVideo();\n break;\n }\n if (playbackRate != null) {\n player.setPlaybackRate(playbackRate);\n }\n if (volume != null) {\n player.setVolume(volume);\n }\n if (muted != null) {\n muted ? player.mute() : player.unMute();\n }\n if (seek != null) {\n player.seekTo(seek.seconds, seek.allowSeekAhead);\n }\n }\n /** Cues the player based on the current component state. */\n _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 /** Sets the player's size based on the current input values. */\n _setSize() {\n this._player?.setSize(this.width, this.height);\n }\n /** Sets the player's quality based on the current input values. */\n _setQuality() {\n if (this._player && this.suggestedQuality) {\n this._player.setPlaybackQuality(this.suggestedQuality);\n }\n }\n /** Gets an observable that adds an event listener to the player when a user subscribes to it. */\n _getLazyEmitter(name) {\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 ? fromEventPattern(listener => {\n player.addEventListener(name, listener);\n }, listener => {\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 }) : of();\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 => new Observable(observer => source.subscribe({\n next: value => this._ngZone.run(() => observer.next(value)),\n error: error => observer.error(error),\n complete: () => observer.complete()\n })),\n // Ensures that everything is cleared out on destroy.\n takeUntil(this._destroyed));\n }\n static {\n this.ɵfac = function YouTubePlayer_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || YouTubePlayer)(i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(PLATFORM_ID));\n };\n }\n static {\n this.ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: YouTubePlayer,\n selectors: [[\"youtube-player\"]],\n viewQuery: function YouTubePlayer_Query(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵviewQuery(_c0, 7);\n }\n if (rf & 2) {\n let _t;\n i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.youtubeContainer = _t.first);\n }\n },\n inputs: {\n videoId: \"videoId\",\n height: [2, \"height\", \"height\", numberAttribute],\n width: [2, \"width\", \"width\", numberAttribute],\n startSeconds: [2, \"startSeconds\", \"startSeconds\", coerceTime],\n endSeconds: [2, \"endSeconds\", \"endSeconds\", coerceTime],\n suggestedQuality: \"suggestedQuality\",\n playerVars: \"playerVars\",\n disableCookies: [2, \"disableCookies\", \"disableCookies\", booleanAttribute],\n loadApi: [2, \"loadApi\", \"loadApi\", booleanAttribute],\n disablePlaceholder: [2, \"disablePlaceholder\", \"disablePlaceholder\", booleanAttribute],\n showBeforeIframeApiLoads: [2, \"showBeforeIframeApiLoads\", \"showBeforeIframeApiLoads\", booleanAttribute],\n placeholderButtonLabel: \"placeholderButtonLabel\",\n placeholderImageQuality: \"placeholderImageQuality\"\n },\n outputs: {\n ready: \"ready\",\n stateChange: \"stateChange\",\n error: \"error\",\n apiChange: \"apiChange\",\n playbackQualityChange: \"playbackQualityChange\",\n playbackRateChange: \"playbackRateChange\"\n },\n standalone: true,\n features: [i0.ɵɵInputTransformsFeature, i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature],\n decls: 4,\n vars: 3,\n consts: [[\"youtubeContainer\", \"\"], [3, \"videoId\", \"width\", \"height\", \"isLoading\", \"buttonLabel\", \"quality\"], [3, \"click\", \"videoId\", \"width\", \"height\", \"isLoading\", \"buttonLabel\", \"quality\"]],\n template: function YouTubePlayer_Template(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵtemplate(0, YouTubePlayer_Conditional_0_Template, 1, 6, \"youtube-player-placeholder\", 1);\n i0.ɵɵelementStart(1, \"div\");\n i0.ɵɵelement(2, \"div\", null, 0);\n i0.ɵɵelementEnd();\n }\n if (rf & 2) {\n i0.ɵɵconditional(ctx._shouldShowPlaceholder() ? 0 : -1);\n i0.ɵɵadvance();\n i0.ɵɵstyleProp(\"display\", ctx._shouldShowPlaceholder() ? \"none\" : \"\");\n }\n },\n dependencies: [YouTubePlayerPlaceholder],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return YouTubePlayer;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet apiLoaded = false;\n/** Loads the YouTube API from a specified URL only once. */\nfunction loadApi(nonce) {\n if (apiLoaded) {\n return;\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 => {\n script.removeEventListener('load', callback);\n script.removeEventListener('error', callback);\n if (event.type === 'error') {\n apiLoaded = false;\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.src = url;\n script.async = true;\n if (nonce) {\n script.setAttribute('nonce', nonce);\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}\nlet YouTubePlayerModule = /*#__PURE__*/(() => {\n class YouTubePlayerModule {\n static {\n this.ɵfac = function YouTubePlayerModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || YouTubePlayerModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: YouTubePlayerModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n }\n }\n return YouTubePlayerModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { YOUTUBE_PLAYER_CONFIG, YouTubePlayer, YouTubePlayerModule };\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { CookieConsentService } from '@core/services/cookie-consent.service';\nimport { EventTrackerService } from '@core/services/event-tracker.service';\nimport { ANALYTICS_EVENTS } from '@core/utils/AnalyticsEvents';\n\n@Component({\n selector: 'app-consent-accept-button',\n templateUrl: './consent-accept-button.component.html',\n styleUrls: ['./consent-accept-button.component.css'],\n standalone: true,\n})\nexport class ConsentAcceptButtonComponent implements OnInit {\n @Input() text: string = '';\n\n @Output() accepted = new EventEmitter();\n\n constructor(\n private cookieConsentService: CookieConsentService,\n private eventTrackerService: EventTrackerService\n ) {}\n\n ngOnInit(): void {}\n\n accept() {\n this.cookieConsentService.accept();\n this.accepted.emit(true);\n this.eventTrackerService.trackEvent(ANALYTICS_EVENTS.COOKIE_CONSENT, {\n given: true,\n });\n }\n}\n","\n {{ text || 'Accept' }}\n\n","import { DOCUMENT } from '@angular/common';\nimport { Inject, Injectable } from '@angular/core';\nimport { EnvironmentService } from '@core/services/environment.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class YoutubeApiLoadingService {\n apiLoaded = false;\n constructor(\n private environmentService: EnvironmentService,\n @Inject(DOCUMENT) private document: Document\n ) {}\n\n loadApi() {\n if (this.environmentService.isBrowser() && !this.apiLoaded) {\n // This code loads the IFrame Player API code asynchronously, according to the instructions at\n // https://developers.google.com/youtube/iframe_api_reference#Getting_Started\n const tag = this.document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n this.document.body.appendChild(tag);\n this.apiLoaded = true;\n }\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n} from '@angular/core';\nimport { YouTubePlayerModule } from '@angular/youtube-player';\nimport { CookieConsentService } from '@core/services/cookie-consent.service';\nimport { YoutubeApiLoadingService } from '@features/youtube/service/youtube-api-loading.service';\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\nimport { faYoutube } from '@fortawesome/free-brands-svg-icons';\nimport { Observable } from 'rxjs';\nimport { IntersectionObserverDirective } from '../../../../shared/intersection-observer/intersection-observer.directive';\nimport { ConsentAcceptButtonComponent } from '../../../consent/components/consent-accept-button/consent-accept-button.component';\n\n@Component({\n selector: 'app-youtube-player-lazy',\n templateUrl: './youtube-player-lazy.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n YouTubePlayerModule,\n IntersectionObserverDirective,\n FontAwesomeModule,\n ConsentAcceptButtonComponent,\n AsyncPipe,\n ],\n})\nexport class YoutubePlayerLazyComponent implements OnInit {\n @Input() videoId: string;\n cookieConsent: Observable;\n faYoutube = faYoutube;\n\n constructor(\n private youtubeApiLoadingService: YoutubeApiLoadingService,\n private cookieConsentService: CookieConsentService\n ) {}\n\n ngOnInit(): void {\n this.cookieConsent = this.cookieConsentService.consentChanged;\n }\n loadApi(visible: boolean) {\n if (visible) {\n this.youtubeApiLoadingService.loadApi();\n }\n }\n}\n","\n @if (cookieConsent | async) {\n \n \n } @else {\n
\n
\n
\n

There would be a youtube video here.

\n Sadly, the youtube player requires cookies to work.\n
\n
\n \n
\n
\n \n
\n }\n\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n} from '@angular/core';\nimport { SeoService } from '@core/services/seo.service';\nimport { YoutubeVideo } from '@generated/graphql';\nimport { VideoObject, WithContext } from 'schema-dts';\n\nimport { JsonLdComponent } from '@features/seo/json-ld/json-ld.component';\nimport { YoutubePlayerLazyComponent } from '../youtube-player-lazy/youtube-player-lazy.component';\n\n@Component({\n selector: 'app-youtube-player-contentful',\n templateUrl: './youtube-player-contentful.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [YoutubePlayerLazyComponent, JsonLdComponent],\n})\nexport class YoutubePlayerContentfulComponent implements OnInit {\n @Input() entry: YoutubeVideo;\n\n seoYoutubeVideo: WithContext;\n\n videoId: string = '';\n constructor(private seoService: SeoService) {}\n\n ngOnInit(): void {\n if (this.entry?.videoUrl) {\n const urlTree = new URL(this.entry.videoUrl);\n this.videoId = urlTree.searchParams.get('v');\n }\n this.seoYoutubeVideo = this.seoService.generateYoutubeVideo(this.entry);\n }\n}\n","\n\n"],"mappings":"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","names":["_c0","YouTubePlayer_Conditional_0_Template","rf","ctx","_r1","ɵɵgetCurrentView","ɵɵelementStart","ɵɵlistener","ɵɵrestoreView","ctx_r1","ɵɵnextContext","ɵɵresetView","ɵɵelementEnd","ɵɵproperty","YouTubePlayerPlaceholder","url","__ngFactoryType__","ɵɵdefineComponent","ɵɵstyleProp","ɵɵclassProp","ɵɵStandaloneFeature","ɵɵnamespaceSVG","ɵɵelement","ɵɵattribute","YOUTUBE_PLAYER_CONFIG","InjectionToken","DEFAULT_PLAYER_WIDTH","DEFAULT_PLAYER_HEIGHT","coerceTime","value","numberAttribute","PlayerState","YouTubePlayer","height","width","_ngZone","platformId","Subject","BehaviorSubject","inject","CSP_NONCE","ChangeDetectorRef","config","isPlatformBrowser","changes","seconds","allowSeekAhead","volume","playbackRate","playVideo","loadApi","change","player","__spreadProps","__spreadValues","whenReady","state","pendingState","playbackState","muted","seek","name","switchMap","fromEventPattern","listener","of","source","Observable","observer","error","takeUntil","ɵɵdirectiveInject","NgZone","PLATFORM_ID","ɵɵviewQuery","_t","ɵɵqueryRefresh","ɵɵloadQuery","booleanAttribute","ɵɵInputTransformsFeature","ɵɵNgOnChangesFeature","ɵɵtemplate","ɵɵconditional","ɵɵadvance","apiLoaded","nonce","script","callback","event","YouTubePlayerModule","ɵɵdefineNgModule","ɵɵdefineInjector","ConsentAcceptButtonComponent","constructor","cookieConsentService","eventTrackerService","text","accepted","EventEmitter","ngOnInit","accept","emit","trackEvent","ANALYTICS_EVENTS","COOKIE_CONSENT","given","ɵɵdirectiveInject","CookieConsentService","EventTrackerService","selectors","inputs","outputs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","ɵɵelementStart","ɵɵlistener","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate1","YoutubeApiLoadingService","constructor","environmentService","document","apiLoaded","loadApi","isBrowser","tag","createElement","src","body","appendChild","ɵɵinject","EnvironmentService","DOCUMENT","factory","ɵfac","providedIn","ɵɵelementStart","ɵɵlistener","$event","ɵɵrestoreView","_r1","ctx_r1","ɵɵnextContext","ɵɵresetView","loadApi","ɵɵelementEnd","ɵɵproperty","videoId","ɵɵtext","ɵɵelement","ɵɵadvance","faYoutube","YoutubePlayerLazyComponent","constructor","youtubeApiLoadingService","cookieConsentService","ngOnInit","cookieConsent","consentChanged","visible","ɵɵdirectiveInject","YoutubeApiLoadingService","CookieConsentService","selectors","inputs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","ɵɵtemplate","YoutubePlayerLazyComponent_Conditional_1_Template","YoutubePlayerLazyComponent_Conditional_3_Template","ɵɵconditional","ɵɵpipeBind1","YouTubePlayerModule","YouTubePlayer","IntersectionObserverDirective","FontAwesomeModule","FaIconComponent","ConsentAcceptButtonComponent","AsyncPipe","encapsulation","changeDetection","YoutubePlayerContentfulComponent","constructor","seoService","videoId","ngOnInit","entry","videoUrl","urlTree","URL","searchParams","get","seoYoutubeVideo","generateYoutubeVideo","ɵɵdirectiveInject","SeoService","selectors","inputs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","ɵɵelement","ɵɵproperty","ɵɵadvance","YoutubePlayerLazyComponent","JsonLdComponent","encapsulation","changeDetection"],"x_google_ignoreList":[0]}