@edm-webplayer/webplayer-angular 0.2.30 → 0.2.31

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.
@@ -517,10 +517,19 @@ ${allPairs.map(([n, v]) => ` ${n}: ${v};`).join("\n")}
517
517
  muted: false,
518
518
  disableContextMenu: true,
519
519
  captions: { active: false, update: false, language: "auto" },
520
+ // Desliga a persistência do Plyr em localStorage. Sem isso, o Plyr
521
+ // restaura "captions:true" de uma sessão anterior e LIGA legenda sozinho
522
+ // em qualquer vídeo (inclusive ASR), por fora do nosso controle.
523
+ storage: { enabled: false },
520
524
  };
521
525
  plyrOptions.hl = locale;
522
526
  if (captionsLanguage) {
523
- plyrOptions.captions = { language: captionsLanguage };
527
+ // Mantém active:false senão o Plyr ativa legenda por padrão.
528
+ plyrOptions.captions = {
529
+ active: false,
530
+ update: false,
531
+ language: captionsLanguage,
532
+ };
524
533
  }
525
534
  if (this.config.video_host === "youtube") {
526
535
  plyrOptions.youtube = youtubePlayerVars;
@@ -1 +1 @@
1
- {"version":3,"file":"edm-webplayer-webplayer-angular.mjs","sources":["../../../projects/webplayer-angular/src/webplayer.types.ts","../../../projects/webplayer-angular/src/webplayer-config.service.ts","../../../projects/webplayer-angular/src/progress.service.ts","../../../projects/webplayer-angular/src/utils/playback-reset.ts","../../../projects/webplayer-angular/src/players/plyr-player/plyr-player.component.ts","../../../projects/webplayer-angular/src/players/vimeo-player/vimeo-player.component.ts","../../../projects/webplayer-angular/src/players/panda-player/panda-player.component.ts","../../../projects/webplayer-angular/src/players/scaleup-player/scaleup-player.component.ts","../../../projects/webplayer-angular/src/global.service.ts","../../../projects/webplayer-angular/src/player-loader/player-loader.component.ts","../../../projects/webplayer-angular/src/webplayer.component.ts","../../../projects/webplayer-angular/src/utils/time-format.pipe.ts","../../../projects/webplayer-angular/src/webplayer.module.ts","../../../projects/webplayer-angular/src/edm-webplayer-webplayer-angular.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\n\nexport interface WebplayerConfig {\n video_host: \"youtube\" | \"vimeo\" | \"mp4\" | \"hls\" | \"panda\" | \"scaleup\";\n video_id: string | null;\n library_id?: string | number | null;\n video_external_id?: string | null;\n video_locale?: string | null;\n video_language?: string | null;\n captions_locale?: string | null;\n captions_language?: string | null;\n last_time?: number | null;\n last_percent?: number;\n seen?: boolean | string | number;\n embed?: string | null;\n watermark?: string;\n progress_url?: string;\n is_live?: boolean; // is the video live\n mirror?: boolean; // mirror the video\n autoplay?: boolean; // auto play the video\n locale?: string | null; // preferred locale/language (e.g. pt-BR)\n language?: string | null; // backwards compatibility alias\n disable_vimeo_recommendations?: boolean; // hide Vimeo suggested videos after playback\n vimeo_premium?: boolean; // set to true when the Vimeo account supports premium embeds\n ui?: {\n colors?: {\n bg?: string;\n alert?: string;\n \"font-bt\"?: string;\n \"text-color\"?: string;\n \"progress-view-off\"?: string;\n \"player-controls\"?: string;\n };\n };\n}\n\nexport const WEPLAYER_CONFIG = new InjectionToken<WebplayerConfig>(\n \"webplayer.config\",\n);\n","import { Injectable, Inject, Optional } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { WebplayerConfig, WEPLAYER_CONFIG } from './webplayer.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WebplayerConfigService {\n private configSubject: BehaviorSubject<WebplayerConfig | null>;\n\n public get config$(): Observable<WebplayerConfig | null> {\n return this.configSubject.asObservable();\n }\n\n constructor(@Optional() @Inject(WEPLAYER_CONFIG) providedConfig: WebplayerConfig) {\n this.configSubject = new BehaviorSubject<WebplayerConfig | null>(providedConfig);\n }\n\n setConfig(config: Partial<WebplayerConfig>) {\n const currentConfig = this.configSubject.getValue();\n const newConfig = { ...(currentConfig || {}), ...config } as WebplayerConfig;\n this.configSubject.next(newConfig);\n }\n\n getConfig(): WebplayerConfig | null {\n return this.configSubject.getValue();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport interface WebplayerProgress {\n currentTime: number;\n duration: number;\n percent: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class WebplayerProgressService {\n\n public progress$ = new Subject<WebplayerProgress>();\n public ended$ = new Subject<void>();\n\n private key(videoKey: string) { return `webplayer:${videoKey}`; }\n\n saveProgress(videoKey: string, time: number) {\n try {\n localStorage.setItem(this.key(videoKey), String(Math.floor(time)));\n } catch {}\n }\n\n getProgress(videoKey: string): number {\n try {\n return Number(localStorage.getItem(this.key(videoKey)) || 0);\n } catch {\n return 0;\n }\n }\n}\n","import { WebplayerConfig } from '../webplayer.types';\n\n/** Percentage threshold (0-1) above which the video is considered \"already watched\". */\nexport const RESET_PERCENT_THRESHOLD = 0.8;\n\n/** Minimum saved seconds before the player attempts to seek on load. */\nexport const MIN_SEEK_SECONDS = 15;\n\n/**\n * Determines whether playback should start from the beginning instead of\n * resuming from the saved position. Returns `true` when the video has\n * already been fully (or mostly) watched so the user can re-watch it\n * without the player jumping to the end and immediately firing \"ended\".\n */\nexport function shouldResetProgressToBeginning(config: WebplayerConfig): boolean {\n const seenFlag = (config as any)?.seen;\n if (seenFlag === true || seenFlag === 'true' || seenFlag === 1) {\n return true;\n }\n const rawPercent = config?.last_percent;\n if (rawPercent === undefined || rawPercent === null || rawPercent === 0) {\n return false;\n }\n let percent = Number(rawPercent);\n if (!Number.isFinite(percent)) {\n return false;\n }\n if (percent > 1) {\n percent = percent / 100;\n }\n return percent >= RESET_PERCENT_THRESHOLD;\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild,\n Output,\n EventEmitter,\n} from \"@angular/core\";\nimport { CommonModule, DOCUMENT } from \"@angular/common\";\nimport * as Plyr from \"plyr\";\nimport \"plyr/dist/plyr.css\";\nimport Hls from \"hls.js\";\nimport { WebplayerConfig } from \"../../webplayer.types\";\nimport { WebplayerProgressService } from \"../../progress.service\";\nimport { shouldResetProgressToBeginning, MIN_SEEK_SECONDS } from \"../../utils/playback-reset\";\nimport { last } from \"rxjs\";\n\n@Component({\n selector: \"app-plyr-player\",\n template: `<video #video playsinline></video>`,\n standalone: true,\n imports: [CommonModule],\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n --plyr-color-main: var(--theme-alert, #19a6d9);\n --plyr-color-hover: var(--theme-alert, #2dbbff);\n --plyr-progress-buffer-background: var(\n --theme-progress-view-off,\n rgba(255, 255, 255, 0.25)\n );\n --plyr-control-background: var(--theme-bg, rgba(0, 0, 0, 0.8));\n --plyr-control-color: var(--theme-player-controls, #fff);\n --plyr-control-button-color: var(--theme-font-bt, #fff);\n --plyr-menu-text-color: var(--theme-text-color, #fff);\n }\n :host ::ng-deep .plyr__controls {\n color: var(--plyr-control-color) !important;\n transition:\n opacity 0.2s ease,\n transform 0.2s ease;\n z-index: 10 !important;\n }\n :host ::ng-deep .plyr__controls button {\n color: var(--plyr-control-color) !important;\n }\n :host ::ng-deep .plyr__progress__buffer {\n background-color: var(--plyr-progress-buffer-background) !important;\n }\n :host ::ng-deep .plyr,\n :host ::ng-deep .plyr__video-wrapper,\n :host ::ng-deep .plyr__video-embed,\n :host ::ng-deep .plyr__video-embed > iframe,\n :host ::ng-deep video {\n width: 100% !important;\n height: 100% !important;\n aspect-ratio: auto !important;\n top: 0 !important;\n left: 0 !important;\n }\n :host ::ng-deep .mirror {\n transform: scaleX(-1) !important;\n -webkit-transform: scaleX(-1) !important;\n }\n :host ::ng-deep .plyr--video .plyr__control.plyr__tab-focus,\n :host ::ng-deep .plyr--video .plyr__control:hover,\n :host ::ng-deep .plyr--video .plyr__control[aria-expanded=\"true\"] {\n background: var(--plyr-color-hover) !important;\n color: var(--plyr-control-button-color) !important;\n }\n\n :host ::ng-deep .plyr__control {\n z-index: 10 !important;\n }\n\n :host ::ng-deep .plyr--full-ui input[type=\"range\"] {\n color: var(--plyr-color-main) !important;\n }\n\n :host\n ::ng-deep\n .plyr__menu__container\n .plyr__control[role=\"menuitemradio\"][aria-checked=\"true\"]::before {\n background: var(--plyr-color-main) !important;\n }\n\n :host ::ng-deep .plyr__menu__container {\n background: var(--plyr-control-background) !important;\n color: var(--plyr-menu-text-color) !important;\n z-index: 7 !important;\n }\n :host ::ng-deep .plyr__menu__container .plyr__control {\n color: var(--plyr-menu-text-color) !important;\n }\n\n :host ::ng-deep .plyr--auto-hide-controls .plyr__controls {\n opacity: 0 !important;\n pointer-events: none !important;\n transform: translateY(12px);\n }\n\n :host ::ng-deep .ytp-more-videos-view .ytp-suggestions {\n pointer-events: none !important;\n }\n\n :host(.live-mode) ::ng-deep .plyr__controls,\n :host(.live-mode) ::ng-deep .plyr__control,\n :host(.live-mode) ::ng-deep .plyr__menu,\n :host(.live-mode) ::ng-deep .plyr__menu__container,\n :host(.live-mode) ::ng-deep .plyr__control--overlaid,\n :host(.live-mode) ::ng-deep .plyr__control--overlaid + .plyr__control {\n display: none !important;\n }\n\n :host(.live-mode) ::ng-deep .plyr__video-wrapper,\n :host(.live-mode) ::ng-deep video,\n :host(.live-mode) ::ng-deep .plyr__video-embed {\n pointer-events: none !important;\n }\n\n :host ::ng-deep .plyr__live-interaction-blocker {\n position: absolute;\n inset: 0;\n z-index: 12;\n pointer-events: auto;\n }\n\n :host ::ng-deep .plyr__control--overlaid,\n :host\n ::ng-deep\n .plyr--video\n .plyr__control.plyr__control--overlaid:hover {\n background: #fff !important;\n color: #000 !important;\n }\n `,\n ],\n})\nexport class PlyrPlayerComponent\n implements AfterViewInit, OnDestroy, OnChanges, OnInit\n{\n @HostBinding(\"class.live-mode\") get isLiveMode() {\n return !!this.config?.is_live;\n }\n @ViewChild(\"video\", { static: true }) videoRef!: ElementRef<HTMLVideoElement>;\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n\n private plyr!: any;\n private hls?: Hls;\n private controlsVisibilityCleanup?: () => void;\n private recommendationBlocker?: HTMLElement | null;\n private recommendationBlockerActiveZone?: HTMLElement | null;\n private topClickBlocker?: HTMLElement | null;\n private menuObserver?: MutationObserver;\n private captionToggleBtn?: HTMLButtonElement | null;\n private captionsEnabled = false;\n private playbackEnded = false;\n private overlayBlockAll = false;\n private liveInteractionBlocker?: HTMLElement | null;\n private readonly controlsSafeZonePxDesktop = 96;\n private readonly controlsSafeZonePxTouch = 144;\n private readonly overlayInteractionGapPx = 20;\n private readonly onResize = () => {\n this.updateRecommendationBlockerSafeZone();\n };\n private readonly onRecommendationBlockerClick = (event?: Event) => {\n if (event) {\n try {\n event.preventDefault();\n } catch {}\n try {\n event.stopPropagation();\n } catch {}\n }\n };\n private readonly onTopBlockerPointerDown = (event: Event) => {\n try {\n event.preventDefault();\n } catch {}\n try {\n event.stopPropagation();\n } catch {}\n };\n private readonly onTopBlockerClick = (event: Event) => {\n try {\n event.preventDefault();\n } catch {}\n try {\n event.stopPropagation();\n } catch {}\n };\n\n constructor(\n private progressService: WebplayerProgressService,\n @Inject(DOCUMENT) private document: Document,\n ) {}\n\n ngOnInit() {\n console.log(this.config);\n if (this.config?.ui?.colors) {\n this.applyTheme(this.config.ui.colors);\n }\n }\n\n private isTouchDevice(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n if (typeof navigator !== \"undefined\" && navigator.maxTouchPoints > 0) {\n return true;\n }\n if (window.matchMedia) {\n try {\n if (window.matchMedia(\"(pointer: coarse)\").matches) {\n return true;\n }\n } catch {}\n }\n return \"ontouchstart\" in window;\n }\n\n private getControlsSafeZone(): number {\n const controls = (this.plyr?.elements?.controls ??\n null) as HTMLElement | null;\n const menuHeight = this.getOpenMenuHeight();\n const baseSafeZone = this.isTouchDevice()\n ? this.controlsSafeZonePxTouch\n : this.controlsSafeZonePxDesktop;\n if (!controls) {\n return Math.max(baseSafeZone, menuHeight + 5);\n }\n let controlsHeight = 0;\n try {\n const rect = controls.getBoundingClientRect?.();\n if (rect && rect.height) {\n controlsHeight = rect.height;\n }\n } catch {}\n if (!controlsHeight) {\n controlsHeight = controls.offsetHeight || controls.clientHeight || 0;\n }\n return Math.max(baseSafeZone, Math.ceil(controlsHeight + menuHeight + 24));\n }\n\n private getOverlaySafeZone(): number {\n const host = this.config?.video_host;\n if (this.overlayBlockAll && host === \"youtube\") {\n if (this.playbackEnded) {\n return 0;\n }\n return this.overlayInteractionGapPx;\n }\n return Math.max(this.overlayInteractionGapPx, this.getControlsSafeZone());\n }\n\n private getOpenMenuHeight(): number {\n const container = this.plyr?.elements?.container as HTMLElement | undefined;\n if (!container) return 0;\n const menu = container.querySelector(\n '.plyr__menu__container[aria-hidden=\"false\"], .plyr__menu__container:not([aria-hidden])',\n ) as HTMLElement | null;\n if (!menu) return 0;\n try {\n const rect = menu.getBoundingClientRect?.();\n if (rect && rect.height) return Math.ceil(rect.height);\n } catch {}\n const fallback = menu.offsetHeight || menu.clientHeight || 0;\n return fallback;\n }\n\n ngAfterViewInit() {\n this.setupPlayer();\n window.addEventListener(\"message\", this.onCastMessage);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes[\"config\"] && this.plyr) {\n this.setupPlayer();\n }\n }\n\n private applyTheme(colors: { [key: string]: string }) {\n const STYLE_ID = \"webplayer-theme-vars\";\n let styleEl = this.document.getElementById(\n STYLE_ID,\n ) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = this.document.createElement(\"style\");\n styleEl.id = STYLE_ID;\n this.document.head.appendChild(styleEl);\n }\n\n const rootStyle = this.document.documentElement.style;\n const allPairs: Array<[string, string]> = [];\n\n for (const key in colors) {\n if (Object.prototype.hasOwnProperty.call(colors, key)) {\n const cssVarName = `--theme-${key.replace(\"progresss-\", \"progress-\")}`;\n const cssVarValue = String(colors[key]);\n allPairs.push([cssVarName, cssVarValue]);\n try {\n rootStyle.setProperty(cssVarName, cssVarValue);\n } catch {}\n }\n }\n\n const cssRule = `:root{\n${allPairs.map(([n, v]) => ` ${n}: ${v};`).join(\"\\n\")}\n}`;\n styleEl.textContent = cssRule;\n }\n\n private getVideoWrapper(): HTMLElement | null {\n const container = this.plyr?.elements?.container as HTMLElement | undefined;\n if (!container) return null;\n const wrapper =\n (this.plyr?.elements as any)?.wrapper ||\n container.querySelector(\".plyr__video-wrapper\");\n return (wrapper as HTMLElement) || null;\n }\n\n private ensureRecommendationBlocker(): HTMLElement | null {\n if (this.recommendationBlocker && this.recommendationBlocker.isConnected) {\n return this.recommendationBlocker;\n }\n const wrapper = this.getVideoWrapper();\n if (!wrapper) return null;\n\n const blocker = this.document.createElement(\"div\");\n blocker.className = \"plyr-recommendation-blocker\";\n blocker.style.position = \"absolute\";\n blocker.style.top = \"0\";\n blocker.style.left = \"0\";\n blocker.style.width = \"100%\";\n blocker.style.height = \"100%\";\n blocker.style.zIndex = \"9\";\n blocker.style.pointerEvents = \"none\";\n blocker.style.display = \"none\";\n blocker.style.background = \"rgba(0,0,0,0)\";\n blocker.style.cursor = \"pointer\";\n\n const activeZone = this.document.createElement(\"div\");\n activeZone.className = \"plyr-recommendation-blocker__zone\";\n activeZone.style.position = \"absolute\";\n activeZone.style.top = \"0\";\n activeZone.style.left = \"0\";\n activeZone.style.width = \"100%\";\n activeZone.style.bottom = `20px`;\n activeZone.style.pointerEvents = \"auto\";\n activeZone.style.background = \"rgba(0,0,0,0)\";\n activeZone.style.cursor = \"pointer\";\n activeZone.addEventListener(\"pointerdown\", this.onTopBlockerPointerDown);\n activeZone.addEventListener(\"click\", this.onRecommendationBlockerClick);\n blocker.appendChild(activeZone);\n\n wrapper.appendChild(blocker);\n this.recommendationBlocker = blocker;\n this.recommendationBlockerActiveZone = activeZone;\n this.updateRecommendationBlockerSafeZone();\n return blocker;\n }\n\n private toggleRecommendationBlocker(active: boolean) {\n if (this.config.video_host !== \"youtube\") {\n return;\n }\n const blocker = this.ensureRecommendationBlocker();\n if (!blocker) return;\n blocker.style.display = active ? \"block\" : \"none\";\n blocker.style.pointerEvents = \"none\";\n this.updateRecommendationBlockerSafeZone();\n }\n\n private updateRecommendationBlockerSafeZone() {\n if (this.recommendationBlockerActiveZone) {\n this.recommendationBlockerActiveZone.style.pointerEvents = this\n .overlayBlockAll\n ? \"auto\"\n : \"none\";\n }\n this.updateTopClickBlockerSafeZone();\n }\n\n private ensureTopClickBlocker() {\n if (this.config.video_host !== \"youtube\") {\n return;\n }\n const wrapper = this.getVideoWrapper();\n if (!wrapper) return;\n if (this.topClickBlocker && this.topClickBlocker.isConnected) {\n this.updateTopClickBlockerSafeZone();\n return;\n }\n const blocker = this.document.createElement(\"div\");\n blocker.className = \"plyr-top-click-blocker\";\n blocker.style.position = \"absolute\";\n blocker.style.top = \"0\";\n blocker.style.left = \"0\";\n blocker.style.right = \"0\";\n blocker.style.width = \"100%\";\n blocker.style.zIndex = \"12\";\n blocker.style.pointerEvents = \"auto\";\n blocker.style.background = \"rgba(0,0,0,0)\";\n blocker.style.touchAction = \"none\";\n blocker.style.cursor = \"default\";\n blocker.addEventListener(\"pointerdown\", this.onTopBlockerPointerDown);\n blocker.addEventListener(\"click\", this.onTopBlockerClick);\n wrapper.appendChild(blocker);\n this.topClickBlocker = blocker;\n this.updateTopClickBlockerSafeZone();\n }\n\n private updateTopClickBlockerSafeZone() {\n if (!this.topClickBlocker) return;\n const height = Math.max(48, Math.ceil(this.getOverlaySafeZone()));\n this.topClickBlocker.style.height = `${height}px`;\n this.topClickBlocker.style.pointerEvents = this.overlayBlockAll\n ? \"auto\"\n : \"none\";\n }\n\n private observeMenuChanges() {\n this.menuObserver?.disconnect();\n const container = this.plyr?.elements?.container as HTMLElement | undefined;\n if (!container) {\n this.menuObserver = undefined;\n return;\n }\n const observer = new MutationObserver(() => {\n this.updateRecommendationBlockerSafeZone();\n });\n observer.observe(container, {\n subtree: true,\n attributes: true,\n attributeFilter: [\"aria-hidden\", \"class\", \"style\"],\n });\n this.menuObserver = observer;\n }\n\n private hasReachedEndThreshold(): boolean {\n const duration = this.plyr?.duration;\n if (!Number.isFinite(duration) || !duration || duration <= 0) {\n return false;\n }\n const current = this.plyr?.currentTime || 0;\n const remaining = duration - current;\n const percent = duration > 0 ? current / duration : 0;\n if (this.config?.video_host === \"youtube\") {\n return percent >= 0.95 || remaining <= 1.5;\n }\n return percent >= 0.98 || remaining <= 0.75;\n }\n\n private forceLivePlaybackResume() {\n try {\n const maybePromise = this.plyr?.play?.();\n if (maybePromise && typeof maybePromise.then === \"function\") {\n maybePromise.catch(() => {});\n }\n } catch {}\n }\n\n private updateLiveInteractionBlocker(isLive: boolean) {\n if (!isLive) {\n this.detachLiveInteractionBlocker();\n return;\n }\n const container = (this.plyr?.elements?.container ??\n null) as HTMLElement | null;\n if (!container) {\n return;\n }\n if (this.liveInteractionBlocker?.isConnected) {\n return;\n }\n const blocker = this.document.createElement(\"div\");\n blocker.className = \"plyr__live-interaction-blocker\";\n blocker.setAttribute(\"aria-hidden\", \"true\");\n container.appendChild(blocker);\n this.liveInteractionBlocker = blocker;\n }\n\n private detachLiveInteractionBlocker() {\n if (this.liveInteractionBlocker?.parentNode) {\n try {\n this.liveInteractionBlocker.parentNode.removeChild(\n this.liveInteractionBlocker,\n );\n } catch {}\n }\n this.liveInteractionBlocker = null;\n }\n\n private bindFullscreenBehavior() {\n const onEnterFullscreen = () => {\n console.log(\"event: enterfullscreen\");\n parent.postMessage(\"event: fullscreen_enter', '*'\");\n };\n\n const onExitFullscreen = () => {\n console.log(\"event: exitfullscreen\");\n parent.postMessage(\"event: fullscreen_exit', '*'\");\n };\n\n this.plyr.on(\"enterfullscreen\", onEnterFullscreen as any);\n this.plyr.on(\"exitfullscreen\", onExitFullscreen as any);\n }\n\n private setupPlayer() {\n if (!this.videoRef) return;\n\n this.hls?.destroy();\n this.controlsVisibilityCleanup?.();\n this.controlsVisibilityCleanup = undefined;\n this.plyr?.destroy();\n this.recommendationBlocker = null;\n const speedOptions = [1, 1.25, 1.5, 2];\n const locale = \"pt-BR\";\n const captionsLanguage = \"pt\";\n\n const isLive = !!this.config?.is_live;\n\n const youtubePlayerVars: Record<string, any> = {\n rel: 0,\n modestbranding: 1,\n noCookie: true,\n };\n\n youtubePlayerVars['playerVars'] = {\n hl: locale,\n cc_lang_pref: captionsLanguage || locale.split(\"-\")[0]?.toLowerCase(),\n playsinline: 1,\n autoplay: isLive ? 1 : 0,\n showInfo: 0,\n rel: 0,\n vq: \"hd1080\",\n iv_load_policy: 3,\n modestbranding: 1,\n noCookie: false,\n };\n // Legenda OFF por padrão: cc_lang_pref define o idioma quando o usuário\n // ligar pelo botão CC, mas cc_load_policy=0 não exibe legenda ao carregar.\n youtubePlayerVars['playerVars'].cc_load_policy = 0;\n\n const defaultControls = [\n \"play-large\",\n \"play\",\n \"progress\",\n \"current-time\",\n \"duration\",\n \"mute\",\n \"volume\",\n \"captions\",\n \"settings\",\n \"pip\",\n \"airplay\",\n \"fullscreen\",\n ];\n const liveControls: string[] = [];\n const plyrOptions: any = {\n controls: isLive ? liveControls : defaultControls,\n fullscreen: {\n enabled: true,\n fallback: true,\n iosNative: !isLive,\n container: null,\n },\n i18n: {\n speed: \"Velocidade\",\n },\n speed: {\n selected: 1,\n options: speedOptions,\n },\n clickToPlay: true,\n hideControls: true,\n keyboard: { focused: !isLive, global: false },\n autoplay: isLive ? true : false,\n muted: false,\n disableContextMenu: true,\n captions: { active: false, update: false, language: \"auto\" },\n };\n\n plyrOptions.hl = locale;\n if (captionsLanguage) {\n plyrOptions.captions = { language: captionsLanguage };\n }\n\n if (this.config.video_host === \"youtube\") {\n plyrOptions.youtube = youtubePlayerVars;\n }\n\n this.plyr = new (Plyr as any).default(\n this.videoRef.nativeElement,\n plyrOptions,\n );\n if (typeof this.plyr?.toggleControls === \"function\") {\n this.plyr.toggleControls(!isLive);\n }\n this.updateLiveInteractionBlocker(isLive);\n this.bindFullscreenBehavior();\n this.ensureTopClickBlocker();\n this.observeMenuChanges();\n this.playbackEnded = false;\n this.overlayBlockAll = false;\n window.removeEventListener(\"resize\", this.onResize);\n window.addEventListener(\"resize\", this.onResize);\n this.bindEvents();\n this.loadSource(this.videoRef.nativeElement).then(() => {});\n }\n\n private bindEvents() {\n const THROTTLE_MS = 300;\n let lastEmit = 0;\n\n const emitProgress = () => {\n const t = this.plyr.currentTime || 0;\n const d = this.plyr.duration || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({\n currentTime: t,\n duration: d,\n percent: p,\n });\n };\n\n const onTimeUpdate = () => {\n const now = performance.now();\n if (now - lastEmit >= THROTTLE_MS) {\n lastEmit = now;\n emitProgress();\n }\n const current = Math.floor(this.plyr.currentTime || 0);\n const duration = Math.floor(this.plyr.duration || 0);\n parent.postMessage(\"currentTime:\" + current, \"*\");\n console.log(\"event: current_time \" + current);\n console.log(\"event: duration \" + duration);\n this.postCastEvent({\n event: \"current_time\",\n currentTime: current,\n duration,\n });\n };\n\n const onPlay = () => {\n this.playbackEnded = false;\n this.overlayBlockAll = false;\n this.updateRecommendationBlockerSafeZone();\n this.toggleRecommendationBlocker(false);\n if (!this.hasJumped) {\n this.jumpToLastTime();\n }\n parent.postMessage(\"playing_video\", \"*\");\n this.postCastEvent({\n event: \"play\",\n currentTime: this.plyr.currentTime || 0,\n });\n };\n\n const onPause = () => {\n if (this.config?.is_live) {\n this.forceLivePlaybackResume();\n return;\n }\n emitProgress();\n console.log(\"event: pause\");\n parent.postMessage(\"paused_video\", \"*\");\n this.postCastEvent({\n event: \"pause\",\n currentTime: this.plyr.currentTime || 0,\n });\n this.overlayBlockAll = true;\n this.updateRecommendationBlockerSafeZone();\n this.toggleRecommendationBlocker(true);\n };\n\n const onEnded = () => {\n emitProgress();\n emitProgress();\n if (!this.hasReachedEndThreshold()) {\n console.warn(\n \"Ignoring premature ended event\",\n this.plyr?.currentTime,\n this.plyr?.duration,\n );\n return;\n }\n this.playbackEnded = true;\n this.overlayBlockAll = true;\n this.updateRecommendationBlockerSafeZone();\n console.log(\"event: ended\");\n parent.postMessage(\"event: ended\", \"*\");\n this.postCastEvent({\n event: \"ended\",\n currentTime: this.plyr.currentTime || 0,\n });\n this.progressService.ended$.next();\n this.toggleRecommendationBlocker(true);\n };\n\n this.plyr?.on?.(\"timeupdate\", onTimeUpdate);\n this.plyr?.on?.(\"play\", onPlay);\n this.plyr?.on?.(\"pause\", onPause);\n this.plyr?.on?.(\"ended\", onEnded);\n }\n\n private hasJumped = false;\n\n private jumpToLastTime() {\n if (this.hasJumped || !this.plyr || !this.config) {\n return;\n }\n\n if (shouldResetProgressToBeginning(this.config)) {\n console.log('Vídeo já assistido, iniciando do começo');\n this.hasJumped = true;\n return;\n }\n\n const lastTime = this.config.last_time || 0;\n\n if (lastTime > MIN_SEEK_SECONDS) {\n // Usa o seek direto para evitar o forward 0\n this.plyr.currentTime = lastTime;\n console.log(`Buscando para o tempo salvo: ${lastTime}s`);\n }\n\n this.hasJumped = true; // Marca como executado para não repetir\n }\n\n /**\n * Indica se uma faixa de legenda do YouTube é gerada automaticamente (ASR).\n * Faixas ASR vêm com kind === \"asr\" ou vss_id começando com \"a.\".\n */\n private isYoutubeAsrTrack(track: any): boolean {\n if (!track) return false;\n const kind = (track.kind || \"\").toLowerCase();\n const vss = (track.vss_id || track.vssId || \"\").toString();\n return kind === \"asr\" || vss.startsWith(\"a.\");\n }\n\n /**\n * Retorna SOMENTE as faixas de legenda publicadas (não-ASR) do vídeo, via API\n * do iframe. Legenda gerada automaticamente é deliberadamente excluída — não\n * queremos ativá-la de forma alguma para YouTube.\n *\n * Usa apenas o módulo \"captions\" (HTML5). O módulo legado \"cc\" é evitado de\n * propósito: ativar os dois juntos pode renderizar legenda em duplicidade.\n */\n private getYoutubePublishedTracks(yt: any): any[] {\n if (!yt || typeof yt.getOption !== \"function\") return [];\n try {\n yt.loadModule?.(\"captions\");\n const list = yt.getOption?.(\"captions\", \"tracklist\");\n if (Array.isArray(list)) {\n return list.filter((t: any) => !this.isYoutubeAsrTrack(t));\n }\n } catch {}\n return [];\n }\n\n /**\n * Injeta um botão de legenda (CC) customizado na barra do Plyr para YouTube,\n * SOMENTE quando o vídeo tem legenda PUBLICADA (não-ASR). Legenda gerada\n * automaticamente nunca é ativada nem ganha botão. Nada é forçado.\n *\n * O tracklist costuma popular só após o onApiChange, então tentamos algumas\n * vezes antes de desistir.\n */\n private injectCaptionToggle(attempt = 0) {\n if (this.config?.video_host !== \"youtube\") return;\n const controls = (this.plyr as any)?.elements?.controls as\n | HTMLElement\n | undefined;\n const yt: any = (this.plyr as any)?.embed;\n if (!controls || !yt) {\n if (attempt < 6) {\n setTimeout(() => this.injectCaptionToggle(attempt + 1), 700);\n }\n return;\n }\n if (controls.querySelector(\".plyr__control--yt-captions\")) return;\n\n // Só exibe o botão se houver faixa publicada (não-ASR). Caso contrário, não\n // injeta nada — inclui vídeos só com legenda automática (tracklist vazio).\n const published = this.getYoutubePublishedTracks(yt);\n if (!published.length) {\n if (attempt < 6) {\n setTimeout(() => this.injectCaptionToggle(attempt + 1), 700);\n }\n return;\n }\n\n // Garante legenda desligada por padrão (não exibe ao carregar).\n try {\n yt.setOption?.(\"captions\", \"track\", {});\n } catch {}\n\n // Remove o botão de legenda nativo do Plyr (normalmente já fica oculto para\n // YouTube) para garantir que nunca haja dois botões CC, em qualquer iOS.\n controls\n .querySelectorAll('[data-plyr=\"captions\"]')\n .forEach((el) => el.remove());\n\n const btn = this.document.createElement(\"button\");\n btn.type = \"button\";\n // plyr__control--pressed: o Plyr usa ESTA classe (não o aria-pressed) para\n // alternar entre o ícone .icon--pressed (legenda on) e .icon--not-pressed.\n btn.className =\n \"plyr__control plyr__control--yt-captions\" +\n (this.captionsEnabled ? \" plyr__control--pressed\" : \"\");\n btn.setAttribute(\"data-plyr\", \"yt-captions\");\n btn.setAttribute(\"aria-label\", \"Legendas\");\n btn.setAttribute(\"aria-pressed\", String(this.captionsEnabled));\n // Reaproveita o sprite de ícones do Plyr (captions on/off) e as classes\n // .icon--pressed/.icon--not-pressed que o próprio Plyr alterna via aria-pressed.\n btn.innerHTML = `\n <svg class=\"icon--pressed\" aria-hidden=\"true\" focusable=\"false\"><use xlink:href=\"#plyr-captions-on\"></use></svg>\n <svg class=\"icon--not-pressed\" aria-hidden=\"true\" focusable=\"false\"><use xlink:href=\"#plyr-captions-off\"></use></svg>\n <span class=\"label--pressed plyr__sr-only\">Desativar legendas</span>\n <span class=\"label--not-pressed plyr__sr-only\">Ativar legendas</span>\n `;\n btn.addEventListener(\"click\", () => this.toggleYoutubeCaptions());\n\n const ref =\n (controls.querySelector(\n '[data-plyr=\"settings\"], .plyr__menu',\n ) as HTMLElement | null) ||\n (controls.querySelector(\n '[data-plyr=\"fullscreen\"]',\n ) as HTMLElement | null);\n if (ref && ref.parentElement === controls) {\n controls.insertBefore(btn, ref);\n } else {\n controls.appendChild(btn);\n }\n this.captionToggleBtn = btn;\n }\n\n private toggleYoutubeCaptions() {\n const yt: any = (this.plyr as any)?.embed;\n if (!yt) return;\n this.captionsEnabled = !this.captionsEnabled;\n // Usa SOMENTE o módulo \"captions\" (uma única ativação) para não duplicar.\n try {\n if (this.captionsEnabled) {\n yt.loadModule?.(\"captions\");\n // Só faixas publicadas (não-ASR). Sem fallback por languageCode, para\n // nunca ativar legenda automática.\n const tracks = this.getYoutubePublishedTracks(yt);\n const match =\n tracks.find((t: any) =>\n (t?.languageCode || \"\").toLowerCase().startsWith(\"pt\"),\n ) || tracks[0];\n if (match) {\n yt.setOption?.(\"captions\", \"track\", match);\n }\n } else {\n // Objeto vazio remove a faixa de legenda no player do YouTube.\n yt.setOption?.(\"captions\", \"track\", {});\n }\n } catch {}\n this.captionToggleBtn?.setAttribute(\n \"aria-pressed\",\n String(this.captionsEnabled),\n );\n // Alterna a classe que o Plyr usa para trocar o ícone on/off.\n this.captionToggleBtn?.classList.toggle(\n \"plyr__control--pressed\",\n this.captionsEnabled,\n );\n }\n\n private loadSource(video: HTMLVideoElement): Promise<void> {\n return new Promise((resolve) => {\n if (!this.config) {\n return resolve();\n }\n\n if (this.hls) {\n this.hls.destroy();\n this.hls = undefined;\n }\n\n if (this.config.video_host === \"youtube\") {\n const onReady = () => {\n this.plyr.pause();\n parent.postMessage(\"playerIsReadyToPlay\", \"*\");\n parent.postMessage(\"duration:\" + this.plyr.duration, \"*\");\n console.log(\"event: current_time \" + this.plyr.currentTime);\n console.log(\"event: duration \" + this.plyr.duration);\n console.log(\"event: ready\");\n this.postCastEvent({\n event: \"ready\",\n duration: this.plyr.duration || 0,\n currentTime: this.plyr.currentTime || 0,\n });\n\n if (this.config.is_live) {\n this.plyr?.on(\"playing\", function () {\n console.log(\"event: playing_live\");\n parent.postMessage(\"event: playing_live\", \"*\");\n });\n }\n\n if (this.config.mirror) {\n setTimeout(() => {\n document\n .querySelector(`.plyr__video-embed iframe`)\n ?.classList.add(\"mirror\");\n }, 1000);\n }\n this.injectCaptionToggle();\n this.ready.emit();\n };\n\n this.plyr.on(\"ready\", onReady);\n }\n\n if (this.config.video_host === \"youtube\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_id, provider: \"youtube\" }],\n };\n } else if (this.config.video_host === \"mp4\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_external_id, type: \"video/mp4\" }],\n };\n } else if (this.config.video_host === \"hls\") {\n let sourceX = \"\";\n try {\n sourceX = atob(this.config.video_id || \"\");\n } catch (e) {\n sourceX = this.config.video_id || \"\";\n }\n const canNative = video.canPlayType(\"application/vnd.apple.mpegurl\");\n\n if (canNative) {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: sourceX, type: \"application/vnd.apple.mpegurl\" }],\n };\n const onLoadedMeta = () => {\n video.removeEventListener(\"loadedmetadata\", onLoadedMeta);\n };\n video.addEventListener(\"loadedmetadata\", onLoadedMeta);\n } else if (Hls.isSupported()) {\n this.hls = new Hls({ enableWorker: true, lowLatencyMode: true });\n this.hls.attachMedia(video);\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls!.loadSource(sourceX);\n });\n this.hls.on(Hls.Events.MANIFEST_PARSED, () => {});\n this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n this.hls!.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n this.hls!.recoverMediaError();\n break;\n default:\n try {\n this.hls!.destroy();\n } catch {}\n break;\n }\n }\n });\n } else {\n this.plyr.source = { type: \"video\", sources: [{ src: sourceX }] };\n }\n }\n resolve();\n });\n }\n\n private postCastEvent(payload: Record<string, unknown>) {\n parent.postMessage(JSON.stringify(payload), \"*\");\n }\n\n private onCastMessage = (evt: MessageEvent) => {\n let data = evt.data;\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {}\n }\n if (data?.action === \"request-iframe-media-metadata\") {\n this.postCastEvent({\n event: \"metadata\",\n duration: this.plyr?.duration || 0,\n currentTime: this.plyr?.currentTime || 0,\n });\n }\n if (data?.action === \"play\") {\n this.plyr?.play();\n }\n if (data?.action === \"pause\") {\n this.plyr?.pause();\n }\n if (data?.action === \"seek\" && typeof data.time === \"number\") {\n this.plyr && (this.plyr.currentTime = data.time);\n }\n };\n\n ngOnDestroy() {\n this.hls?.destroy();\n this.controlsVisibilityCleanup?.();\n this.controlsVisibilityCleanup = undefined;\n this.detachLiveInteractionBlocker();\n if (this.recommendationBlocker?.parentElement) {\n try {\n this.recommendationBlocker.parentElement.removeChild(\n this.recommendationBlocker,\n );\n } catch {}\n }\n if (this.recommendationBlockerActiveZone) {\n try {\n this.recommendationBlockerActiveZone.removeEventListener(\n \"pointerdown\",\n this.onTopBlockerPointerDown,\n );\n this.recommendationBlockerActiveZone.removeEventListener(\n \"click\",\n this.onRecommendationBlockerClick,\n );\n } catch {}\n }\n this.recommendationBlocker = null;\n this.recommendationBlockerActiveZone = null;\n if (this.topClickBlocker?.parentElement) {\n try {\n this.topClickBlocker.removeEventListener(\n \"pointerdown\",\n this.onTopBlockerPointerDown,\n );\n this.topClickBlocker.removeEventListener(\n \"click\",\n this.onTopBlockerClick,\n );\n this.topClickBlocker.parentElement.removeChild(this.topClickBlocker);\n } catch {}\n }\n this.topClickBlocker = null;\n this.menuObserver?.disconnect();\n this.menuObserver = undefined;\n window.removeEventListener(\"resize\", this.onResize);\n this.plyr?.destroy();\n window.removeEventListener(\"message\", this.onCastMessage);\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport * as Plyr from 'plyr';\nimport 'plyr/dist/plyr.css';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { WebplayerProgressService } from '../../progress.service';\nimport { shouldResetProgressToBeginning } from '../../utils/playback-reset';\n\n@Component({\n selector: 'app-vimeo-player',\n standalone: true,\n imports: [CommonModule],\n host: {\n '[class.overlay-visible]': 'endedOverlayVisible',\n },\n template: `\n <div class=\"vimeo-wrapper\">\n <video #video playsinline></video>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n --plyr-color-main: var(--theme-alert, #19a6d9);\n --plyr-color-hover: var(--theme-alert, #2dbbff);\n --plyr-progress-buffer-background: var(\n --theme-progress-view-off,\n rgba(255, 255, 255, 0.25)\n );\n --plyr-control-background: var(--theme-bg, rgba(0, 0, 0, 0.8));\n --plyr-control-color: var(--theme-player-controls, #fff);\n --plyr-control-button-color: var(--theme-font-bt, #fff);\n --plyr-menu-text-color: var(--theme-text-color, #fff);\n }\n :host ::ng-deep .plyr__controls {\n color: var(--plyr-control-color) !important;\n transition: opacity 0.2s ease, transform 0.2s ease;\n z-index: 5;\n }\n :host ::ng-deep .plyr__controls button {\n color: var(--plyr-control-color) !important;\n }\n :host ::ng-deep .plyr__progress__buffer {\n background-color: var(--plyr-progress-buffer-background) !important;\n }\n .vimeo-wrapper {\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep .plyr,\n :host ::ng-deep .plyr__video-wrapper,\n :host ::ng-deep .plyr__video-embed,\n :host ::ng-deep .plyr__video-embed > iframe {\n width: 100% !important;\n height: 100% !important;\n top: 0 !important;\n left: 0 !important;\n background: #000 !important;\n }\n :host ::ng-deep .plyr__video-embed > iframe,\n :host ::ng-deep video {\n max-height: 100% !important;\n object-fit: contain !important;\n }\n :host ::ng-deep .plyr__video-wrapper {\n position: relative;\n z-index: 1;\n }\n :host(.overlay-visible) ::ng-deep .plyr__video-wrapper::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 40px;\n pointer-events: none;\n background: radial-gradient(\n circle at 30% 20%,\n rgba(255, 255, 255, 0.12),\n transparent 45%\n ),\n radial-gradient(\n circle at 70% 30%,\n rgba(255, 255, 255, 0.09),\n transparent 45%\n ),\n rgba(0, 0, 0, 0.92);\n z-index: 2;\n }\n :host ::ng-deep .plyr--video .plyr__control.plyr__tab-focus,\n :host ::ng-deep .plyr--video .plyr__control:hover,\n :host ::ng-deep .plyr--video .plyr__control[aria-expanded='true'] {\n background: var(--plyr-color-hover) !important;\n color: var(--plyr-control-button-color) !important;\n }\n :host ::ng-deep .plyr--full-ui input[type='range'] {\n color: var(--plyr-color-main) !important;\n }\n :host\n ::ng-deep\n .plyr__menu__container\n .plyr__control[role='menuitemradio'][aria-checked='true']::before {\n background: var(--plyr-color-main) !important;\n }\n :host ::ng-deep .plyr__menu__container {\n background: var(--plyr-control-background) !important;\n color: var(--plyr-menu-text-color) !important;\n z-index: 7 !important;\n }\n :host ::ng-deep .plyr__menu__container .plyr__control {\n color: var(--plyr-menu-text-color) !important;\n }\n :host ::ng-deep .plyr__control--overlaid {\n position: fixed !important;\n z-index: 4 !important;\n }\n :host ::ng-deep .plyr--auto-hide-controls .plyr__controls {\n opacity: 0 !important;\n pointer-events: none !important;\n transform: translateY(12px);\n }\n :host ::ng-deep .ytp-more-videos-view .ytp-suggestions {\n pointer-events: none !important;\n }\n\n :host ::ng-deep .plyr--vimeo .plyr__video-wrapper.plyr__video-embed{ \n aspect-ratio: 16 / 9 !important; \n width: 100% !important; \n height: auto !important;\n }\n\n :host ::ng-deep .plyr__control--overlaid, :host ::ng-deep .plyr--video .plyr__control.plyr__control--overlaid:hover {\n background: #fff !important;\n color: #000 !important;\n }\n :host ::ng-deep .plyr--vimeo .plyr__captions {\n display: none !important;\n }\n `,\n ],\n})\nexport class VimeoPlayerComponent\n implements OnInit, AfterViewInit, OnDestroy, OnChanges\n{\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n @ViewChild('video', { static: true })\n videoRef!: ElementRef<HTMLVideoElement>;\n\n private plyr?: any;\n private startTimeApplied = false;\n private pendingStartTime?: number;\n private endedLoggedOnPause = false;\n private iosFullscreenCleanup?: () => void;\n private castListenerAttached = false;\n private unmuteForCast() {\n try {\n const videoEl = this.videoRef?.nativeElement;\n if (videoEl) {\n videoEl.muted = false;\n videoEl.volume = 1;\n }\n if (this.plyr) {\n this.plyr.muted = false;\n this.plyr.volume = 1;\n }\n } catch {}\n }\n private readonly onCastMessage = (event: MessageEvent) => {\n let data = event.data;\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch {}\n }\n if (data?.action === 'request-iframe-media-metadata') {\n console.log('Received request-iframe-media-metadata message');\n setTimeout(() => {\n this.postCastEvent({\n event: 'metadata',\n duration: this.plyr?.duration || 0,\n currentTime: this.plyr?.currentTime || 0,\n }); \n }, 100);\n \n }\n if (data?.action === 'play') {\n this.unmuteForCast();\n this.plyr?.play?.();\n }\n if (data?.action === 'pause') {\n this.plyr?.pause?.();\n }\n if (data?.action === 'seek' && typeof data.time === 'number') {\n this.plyr && (this.plyr.currentTime = data.time);\n }\n };\n endedOverlayVisible = false;\n constructor(\n private progressService: WebplayerProgressService,\n @Inject(DOCUMENT) private document: Document\n ) {}\n\n ngOnInit(): void {\n this.applyTheme(this.config?.ui?.colors);\n }\n\n ngAfterViewInit(): void {\n this.ensureCastMessageListener();\n this.setupPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.plyr) {\n this.ensureCastMessageListener();\n this.setupPlayer();\n }\n }\n\n private setupPlayer() {\n if (!this.videoRef) {\n return;\n }\n const videoElement = this.videoRef.nativeElement;\n const isIOS = this.isIOSContext();\n this.applyInlineAttributes(videoElement, isIOS);\n\n this.plyr?.destroy();\n this.startTimeApplied = false;\n this.pendingStartTime = undefined;\n this.endedLoggedOnPause = false;\n this.endedOverlayVisible = false;\n const shouldAutoplay = false;\n const startMuted = shouldAutoplay;\n const speedOptions = [1, 1.25, 1.5, 2];\n const baseControls = [\n 'play-large',\n 'play',\n 'progress',\n 'current-time',\n 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ];\n const options: any = {\n controls: isIOS ? baseControls.filter((c) => c !== 'fullscreen') : baseControls,\n clickToPlay: true,\n autoplay: shouldAutoplay,\n muted: startMuted,\n keyboard: { focused: true, global: false },\n hideControls: true,\n i18n: {\n speed: \"Velocidade\",\n },\n speed: {\n selected: 1,\n options: speedOptions,\n }, \n fullscreen: {\n enabled: !isIOS,\n fallback: !isIOS,\n iosNative: true,\n container: null,\n },\n };\n options.vimeo = {\n autopause: true,\n autoplay: shouldAutoplay,\n muted: startMuted,\n playsinline: true,\n byline: false,\n portrait: false,\n title: false,\n pip: false,\n controls: false,\n };\n\n this.plyr = new (Plyr as any).default(videoElement, options);\n this.plyr.source = {\n type: 'video',\n sources: [{ src: this.config.video_id, provider: 'vimeo' }],\n };\n\n this.bindIOSFullscreenLogging(videoElement, isIOS);\n this.bindEvents();\n }\n\n private bindEvents() {\n if (!this.plyr) return;\n let durationPosted = false;\n const THROTTLE_MS = 300;\n let lastEmit = 0;\n const onTimeUpdate = () => {\n setTimeout(() => {\n const currentReal = this.plyr.currentTime || 0;\n const durationReal = this.plyr.duration || 0;\n const current = Math.floor(currentReal);\n const duration = Math.floor(this.plyr.duration);\n if (!durationPosted && duration > 0) {\n durationPosted = true;\n console.log('event: duration ' + duration);\n parent.postMessage('duration:' + duration, '*');\n }\n const percent = duration > 0 ? +((current / duration) * 100).toFixed(2) : 0;\n const now = performance.now();\n if (now - lastEmit >= THROTTLE_MS) {\n lastEmit = now;\n this.progressService.progress$.next({ currentTime: currentReal, duration: durationReal, percent });\n }\n parent.postMessage('currentTime:' + current, '*');\n console.log('event: current_time ' + current);\n console.log('event: duration ' + duration);\n this.postCastEvent({\n event: 'current_time',\n currentTime: current,\n duration,\n });\n this.tryApplyPendingStartTime();\n }, 0);\n \n };\n\n this.plyr.on('ready', () => {\n this.applySavedStartTime();\n const duration = this.plyr.duration || 0;\n console.log('event: ready');\n if (duration > 0) {\n parent.postMessage('duration:' + duration, '*');\n }\n parent.postMessage('playerIsReadyToPlay', '*');\n this.postCastEvent({\n event: 'ready',\n duration,\n currentTime: this.plyr.currentTime || 0,\n });\n this.ready.emit();\n });\n\n const reapplyStartTime = () => {\n if (typeof this.pendingStartTime === 'number' || !this.startTimeApplied) {\n this.applySavedStartTime(true);\n }\n if (this.startTimeApplied) {\n this.plyr?.off?.('loadedmetadata', reapplyStartTime);\n this.plyr?.off?.('durationchange', reapplyStartTime);\n }\n };\n\n this.plyr.on('timeupdate', onTimeUpdate);\n this.plyr.on('loadedmetadata', reapplyStartTime);\n this.plyr.on('durationchange', reapplyStartTime);\n this.plyr.on('play', () => {\n this.endedLoggedOnPause = false;\n this.tryApplyPendingStartTime();\n //this.jumpToPendingStartTime();\n this.endedOverlayVisible = false;\n this.progressService.ended$.next();\n console.log('event: playing_video');\n if (this.config?.is_live) {\n console.log('event: playing_live');\n parent.postMessage('event: playing_live', '*');\n }\n parent.postMessage('playing_video', '*');\n this.postCastEvent({\n event: 'play',\n currentTime: this.plyr.currentTime || 0,\n });\n onTimeUpdate();\n });\n this.plyr.on('pause', () => {\n this.endedOverlayVisible = false;\n console.log('event: pause');\n parent.postMessage('paused_video', '*');\n this.postCastEvent({\n event: 'pause',\n currentTime: this.plyr.currentTime || 0,\n });\n onTimeUpdate();\n if (this.shouldEmitEndedOnPause()) {\n this.handleEnded(true);\n }\n this.unlockPlayerInteraction();\n });\n this.plyr.on('ended', () => {\n onTimeUpdate();\n this.handleEnded();\n });\n this.plyr.on('enterfullscreen', () => {\n console.log('event: enterfullscreen');\n parent.postMessage('event: fullscreen_enter', '*');\n this.postCastEvent({ event: 'enterfullscreen' });\n });\n this.plyr.on('exitfullscreen', () => {\n console.log('event: exitfullscreen');\n parent.postMessage('event: fullscreen_exit', '*');\n this.postCastEvent({ event: 'exitfullscreen' });\n });\n }\n\n private resolveStartTime(\n last_time: any,\n last_percent: any,\n duration: number\n ): number {\n if (shouldResetProgressToBeginning(this.config)) {\n return 0;\n }\n const dur = Number(duration) || 0;\n if (dur <= 0) {\n if (last_time && Number(last_time) > 0) {\n return Number(last_time);\n }\n return 0;\n }\n if (last_time && Number(last_time) > 0) {\n return Math.min(Number(last_time), dur - 2);\n }\n if (last_percent && Number(last_percent) > 0) {\n let percent = Number(last_percent);\n if (percent > 1) {\n percent = percent / 100;\n }\n return Math.min(percent * dur, dur - 2);\n }\n return 0;\n }\n\n\n private isIOSDevice(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const iOS = /iPad|iPhone|iPod/.test(ua);\n const iPadOS =\n navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n return iOS || iPadOS;\n }\n\n private applySavedStartTime(force = false) {\n if (!this.plyr) return;\n if (this.startTimeApplied && !force) return;\n const duration = this.plyr.duration || 0;\n const start = this.resolveStartTime(\n this.config?.last_time,\n this.config?.last_percent,\n duration\n );\n if (!(start > 0)) {\n this.pendingStartTime = undefined;\n return;\n }\n if (duration > 0) {\n this.pendingStartTime = start;\n this.startTimeApplied = false;\n this.jumpToPendingStartTime();\n this.resumeAfterPendingSeek();\n } else {\n this.pendingStartTime = start;\n this.startTimeApplied = false;\n }\n }\n\n ngOnDestroy(): void {\n this.plyr?.destroy();\n this.removeIOSFullscreenLogging();\n if (typeof window !== 'undefined') {\n if (this.castListenerAttached) {\n window.removeEventListener('message', this.onCastMessage);\n this.castListenerAttached = false;\n }\n window.removeEventListener('message', this.onCastMessage);\n }\n }\n\n private postCastEvent(payload: Record<string, unknown>) {\n parent.postMessage(JSON.stringify(payload), '*');\n }\n\n private applyTheme(colors?: { [key: string]: string }) {\n if (!colors) return;\n const STYLE_ID = 'webplayer-theme-vars';\n let styleEl = this.document.getElementById(\n STYLE_ID\n ) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = this.document.createElement('style');\n styleEl.id = STYLE_ID;\n this.document.head.appendChild(styleEl);\n }\n\n const rootStyle = this.document.documentElement.style;\n const allPairs: Array<[string, string]> = [];\n\n for (const key in colors) {\n if (Object.prototype.hasOwnProperty.call(colors, key)) {\n const cssVarName = `--theme-${key.replace('progresss-', 'progress-')}`;\n const cssVarValue = String(colors[key]);\n allPairs.push([cssVarName, cssVarValue]);\n try {\n rootStyle.setProperty(cssVarName, cssVarValue);\n } catch {}\n }\n }\n\n const cssRule = `:root{\n${allPairs.map(([n, v]) => ` ${n}: ${v};`).join('\\n')}\n}`;\n styleEl.textContent = cssRule;\n }\n\n private seekTo(time: number) {\n if (!this.plyr) return;\n const target = Math.max(0, Number(time) || 0);\n try {\n this.plyr.currentTime = target;\n } catch {}\n }\n\n private tryApplyPendingStartTime() {\n if (this.startTimeApplied) return;\n if (!this.plyr) return;\n const pending = this.pendingStartTime;\n if (typeof pending !== 'number' || !(pending > 0)) {\n return;\n }\n const duration = this.plyr.duration || 0;\n if (!(duration > 0)) {\n return;\n }\n const current = this.plyr.currentTime || 0;\n const tolerance = 0.35;\n const nearingTarget = Math.abs(current - pending) <= tolerance;\n if (nearingTarget && duration > 0) {\n this.startTimeApplied = true;\n this.pendingStartTime = undefined;\n return;\n }\n this.jumpToPendingStartTime();\n }\n\n private jumpToPendingStartTime() {\n if (this.startTimeApplied) return;\n if (!this.plyr) return;\n const pending = this.pendingStartTime;\n if (typeof pending !== 'number' || !(pending > 0)) {\n return;\n }\n const restoreMute = this.temporarilyMuteForSeek();\n this.seekTo(pending);\n if (restoreMute) {\n setTimeout(() => restoreMute(), 300);\n }\n this.pendingStartTime = undefined;\n this.startTimeApplied = true;\n }\n\n private resumeAfterPendingSeek() {\n if (!this.plyr) return;\n const resume = () => {\n this.plyr?.off?.('seeked', resume);\n try {\n const maybePromise = this.plyr?.play?.();\n if (maybePromise && typeof maybePromise.then === 'function') {\n maybePromise.catch(() => {});\n }\n } catch {}\n };\n try {\n this.plyr?.pause?.();\n } catch {}\n this.plyr?.off?.('seeked', resume);\n this.plyr?.on?.('seeked', resume);\n }\n\n private shouldEmitEndedOnPause(): boolean {\n if (!this.isIOSContext()) {\n return false;\n }\n if (this.endedLoggedOnPause) {\n return false;\n }\n const duration = this.plyr?.duration;\n if (!Number.isFinite(duration) || !duration || duration <= 0) {\n return false;\n }\n const current = this.plyr?.currentTime || 0;\n return duration - current < 1;\n }\n\n private handleEnded(triggeredByPause = false) {\n if (triggeredByPause && this.endedLoggedOnPause) {\n return;\n }\n if (!triggeredByPause) {\n this.endedOverlayVisible = true;\n }\n console.log('event: ended');\n parent.postMessage('event: ended', '*');\n this.postCastEvent({\n event: 'ended',\n currentTime: this.plyr?.currentTime || 0,\n });\n this.progressService.ended$.next();\n this.endedLoggedOnPause = true;\n }\n\n private isIOSContext(): boolean {\n if (this.isIOSDevice()) {\n return true;\n }\n if (typeof window === 'undefined') {\n return false;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const os = params.get('os');\n if (os && os.toLowerCase() === 'ios') {\n return true;\n }\n } catch {}\n return false;\n }\n\n private temporarilyMuteForSeek(): (() => void) | null {\n const video = this.videoRef?.nativeElement ?? null;\n const prevVideoMuted = video?.muted ?? false;\n const prevPlyrMuted = !!this.plyr?.muted;\n try {\n if (video) {\n video.muted = true;\n }\n if (this.plyr) {\n this.plyr.muted = true;\n }\n } catch {}\n\n return () => {\n try {\n if (video) {\n video.muted = prevVideoMuted;\n }\n } catch {}\n try {\n if (this.plyr) {\n this.plyr.muted = prevPlyrMuted;\n }\n } catch {}\n this.unlockPlayerInteraction();\n };\n }\n\n private applyInlineAttributes(videoElement: HTMLVideoElement, isIOS: boolean) {\n try {\n videoElement.setAttribute('playsinline', 'true');\n videoElement.setAttribute('webkit-playsinline', 'true');\n if (isIOS) {\n videoElement.setAttribute('x5-playsinline', 'true');\n videoElement.setAttribute('x5-video-player-type', 'h5');\n }\n } catch {}\n }\n\n private bindIOSFullscreenLogging(videoElement: HTMLVideoElement, isIOS: boolean) {\n this.removeIOSFullscreenLogging();\n if (!isIOS) return;\n const logEvent = (name: string) => {\n console.log(`event: ${name}`);\n try {\n parent.postMessage(`event: ${name}`, '*');\n } catch {}\n };\n const onEnter = () => logEvent('webkit_enterfullscreen');\n const onExit = () => logEvent('webkit_exitfullscreen');\n try {\n videoElement.addEventListener('webkitbeginfullscreen', onEnter);\n videoElement.addEventListener('webkitendfullscreen', onExit);\n this.iosFullscreenCleanup = () => {\n try {\n videoElement.removeEventListener('webkitbeginfullscreen', onEnter);\n videoElement.removeEventListener('webkitendfullscreen', onExit);\n } catch {}\n this.iosFullscreenCleanup = undefined;\n };\n } catch {}\n }\n\n private removeIOSFullscreenLogging() {\n try {\n this.iosFullscreenCleanup?.();\n } catch {}\n this.iosFullscreenCleanup = undefined;\n }\n\n private ensureCastMessageListener() {\n if (typeof window === 'undefined') {\n return;\n }\n if (this.castListenerAttached) {\n return;\n }\n window.addEventListener('message', this.onCastMessage);\n this.castListenerAttached = true;\n }\n\n private unlockPlayerInteraction() {\n try {\n const controls = this.plyr?.elements?.controls as HTMLElement | undefined;\n if (controls) {\n controls.style.pointerEvents = 'auto';\n }\n const overlay = this.plyr?.elements?.buttons?.play as HTMLElement | undefined;\n if (overlay) {\n overlay.style.pointerEvents = 'auto';\n }\n } catch {}\n }\n\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { WebplayerProgressService } from '../../progress.service';\nimport { shouldResetProgressToBeginning } from '../../utils/playback-reset';\n\ndeclare global {\n interface Window {\n pandascripttag?: any[];\n PandaPlayer?: any;\n }\n}\n\n@Component({\n selector: 'app-panda-player',\n template: '', // O conteúdo do DOM é gerenciado programaticamente\n standalone: true,\n imports: [CommonModule],\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep .panda-player,\n :host ::ng-deep iframe[src*=\"pandavideo.com.br\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n border: none !important;\n }\n `]\n})\nexport class PandaPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n\n private pandaPlayer?: any;\n private pandaContainer?: HTMLDivElement;\n private pandaProgressThrottle = 0;\n private primaryColor?: string;\n private controlsColor?: string;\n\n constructor(\n private elementRef: ElementRef,\n private progressService: WebplayerProgressService,\n ) {}\n\n ngOnInit() {\n if (this.config?.video_host !== 'panda') {\n return;\n }\n this.applyTheme();\n this.loadPandaPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && this.pandaPlayer) {\n this.loadPandaPlayer();\n }\n }\n\n private applyTheme() {\n if (this.config?.ui?.colors) {\n this.primaryColor = this.config.ui.colors['progress-view-off'];\n this.controlsColor = this.config.ui.colors['text-color'];\n }\n }\n\n private loadPandaPlayer() {\n if (!this.config.embed) {\n return;\n }\n\n this.ensurePandaScript().then(() => {\n const host: HTMLElement = this.elementRef.nativeElement;\n console.log('Panda Player Config:', this.config, host);\n if (!this.pandaContainer) {\n this.pandaContainer = document.createElement(\"div\");\n this.pandaContainer.style.width = \"100%\";\n this.pandaContainer.style.height = \"100%\";\n this.pandaContainer.id = `panda-${this.config.video_id || Math.random().toString(36).slice(2)}`;\n host.appendChild(this.pandaContainer);\n }\n\n try {\n this.pandaPlayer?.destroy?.();\n } catch {}\n\n const videoId = this.config.video_external_id || (this.config.embed ? this.extractPandaVideoId(this.config.embed) : undefined);\n const libraryId = (this.config.embed ? this.extractPandaLibraryId(this.config.embed) : undefined);\n\n window.pandascripttag = window.pandascripttag || [];\n window.pandascripttag.push(() => {\n this.pandaPlayer = new (window as any).PandaPlayer(\n this.pandaContainer!.id,\n {\n video_external_id: videoId,\n library_id: libraryId,\n onReady: () => {\n if (this.primaryColor) {\n try { this.pandaPlayer.setColor('primary', this.primaryColor); } catch {}\n }\n if (this.controlsColor) {\n try { this.pandaPlayer.setColor('secondary', this.controlsColor); } catch {}\n }\n\n const dur = this.pandaPlayer?.getDuration?.() || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) {\n try { this.pandaPlayer.setCurrentTime(start); } catch {}\n }\n if (this.config.autoplay) {\n try { this.pandaPlayer.play(); } catch {}\n }\n this.ready.emit();\n },\n playerConfigs: {\n autoplay: !!this.config.autoplay,\n smartAutoplay: !!this.config.autoplay,\n },\n \n }\n );\n\n this.pandaPlayer.onEvent((event: any) => {\n this.handlePandaEvent(event);\n });\n });\n });\n }\n\n ngOnDestroy() {\n try {\n this.pandaPlayer?.destroy?.();\n } catch {}\n try {\n this.pandaContainer?.remove?.();\n } catch {}\n }\n\n private async ensurePandaScript(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (window.PandaPlayer) return resolve();\n const existing = document.querySelector(\n 'script[src^=\"https://player.pandavideo.com.br/api.v2.js\"]'\n ) as HTMLScriptElement;\n if (existing) {\n existing.addEventListener(\"load\", () => resolve());\n if ((existing as any).readyState === \"complete\") resolve();\n return;\n }\n const script = document.createElement(\"script\");\n script.src = \"https://player.pandavideo.com.br/api.v2.js\";\n script.async = true;\n script.onload = () => resolve();\n document.head.appendChild(script);\n });\n }\n\n private extractPandaVideoId(url: string): string | undefined {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n try {\n u = new URL(decodeURIComponent(url));\n } catch {\n return undefined;\n }\n }\n try {\n const v = u.searchParams.get(\"v\") || undefined;\n return v || undefined;\n } catch {\n return undefined;\n }\n }\n\n private extractPandaLibraryId(url: string): string | undefined {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n try {\n u = new URL(decodeURIComponent(url));\n } catch {\n return undefined;\n }\n }\n try {\n const { hostname } = u;\n const firstLabel = hostname.split(\".\")[0] || \"\";\n const maybeLib = firstLabel.startsWith(\"player-\")\n ? firstLabel.slice(\"player-\".length)\n : firstLabel;\n return maybeLib || undefined;\n } catch {\n return undefined;\n }\n }\n\n private handlePandaEvent(evt: any) {\n const type = evt?.message || evt?.type;\n const THROTTLE_MS = 300;\n const now = performance.now();\n\n if (type === \"panda_timeupdate\") {\n if (now - this.pandaProgressThrottle >= THROTTLE_MS) {\n this.pandaProgressThrottle = now;\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n }\n }\n\n if (type === \"panda_play\") {\n const snapshot = this.safeProgressSnapshot();\n if (snapshot) {\n this.progressService.progress$.next(snapshot);\n }\n this.notifyParentPlaybackEvent('play', snapshot ?? {});\n }\n\n if (type === \"panda_pause\") {\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n this.notifyParentPlaybackEvent('pause', this.safeProgressSnapshot());\n }\n\n if (type === \"panda_ended\") {\n const snapshot = this.safeProgressSnapshot();\n if (snapshot) {\n this.progressService.progress$.next(snapshot);\n }\n this.progressService.ended$.next();\n this.notifyParentPlaybackEvent('ended', snapshot ?? {});\n }\n }\n\n private resolveStartTime(\n last_time: any,\n last_percent: any,\n duration: number,\n opts: { minStartSec?: number; endGuardSec?: number } = {}\n ): number {\n if (shouldResetProgressToBeginning(this.config)) {\n return 0;\n }\n\n const minStartSec = opts.minStartSec ?? 3;\n const endGuardSec = opts.endGuardSec ?? 2;\n\n const dur = Number(duration) || 0;\n if (dur <= 0) return 0;\n\n const hasTime =\n last_time !== undefined && last_time !== null && last_time !== \"\";\n if (hasTime) {\n let t = Number(last_time);\n if (!isFinite(t) || t < 0) t = 0;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n const hasPercent =\n last_percent !== undefined &&\n last_percent !== null &&\n last_percent !== \"\";\n if (hasPercent) {\n let p = Number(last_percent);\n if (!isFinite(p) || p < 0) p = 0;\n if (p > 1) p = p / 100;\n let t = dur * p;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n return 0;\n }\n\n private safeProgressSnapshot():\n | { currentTime: number; duration: number; percent: number }\n | null {\n try {\n const currentTime = this.pandaPlayer?.getCurrentTime?.() || 0;\n const duration = this.pandaPlayer?.getDuration?.() || 0;\n const percent =\n duration > 0 ? +((currentTime / duration) * 100).toFixed(2) : 0;\n return { currentTime, duration, percent };\n } catch {\n return null;\n }\n }\n\n private notifyParentPlaybackEvent(event: string, extra: any = {}) {\n if (typeof window === 'undefined') return;\n const target = typeof parent !== 'undefined' ? parent : null;\n if (!target || target === window) return;\n const payload = { event, ...extra };\n try {\n target.postMessage(`event: ${event}`, '*');\n } catch {}\n try {\n target.postMessage(JSON.stringify(payload), '*');\n } catch {}\n }\n}\n","import {\n Component,\n ElementRef,\n Input,\n OnDestroy,\n OnInit,\n OnChanges,\n SimpleChanges,\n Output,\n EventEmitter,\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { WebplayerConfig } from \"../../webplayer.types\";\nimport { WebplayerProgressService } from \"../../progress.service\";\nimport { shouldResetProgressToBeginning } from \"../../utils/playback-reset\";\n\n@Component({\n selector: \"app-scaleup-player\",\n template: \"\", // O conteúdo do DOM é gerenciado programaticamente\n standalone: true,\n imports: [CommonModule],\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep iframe[src*=\"scaleup.com.br\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n border: none !important;\n }\n `,\n ],\n})\nexport class ScaleupPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n private scaleupIframe?: HTMLIFrameElement;\n private scaleupMessageHandler?: (e: MessageEvent) => void;\n private scaleupProgressThrottle = 0;\n private castMessageHandler?: (e: MessageEvent) => void;\n private lastDuration = 0;\n private lastCurrentTime = 0;\n\n constructor(\n private elementRef: ElementRef,\n private progressService: WebplayerProgressService,\n ) {}\n\n ngOnInit() {\n if (this.config?.video_host !== \"scaleup\") {\n return;\n }\n this.loadScaleupPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes[\"config\"] && this.scaleupIframe) {\n this.loadScaleupPlayer();\n }\n }\n\n private loadScaleupPlayer() {\n const videoId = this.config.video_id;\n const lastTime = shouldResetProgressToBeginning(this.config)\n ? 0\n : Math.max(0, Math.floor(Number(this.config.last_time) || 0));\n const eventsList = this.resolveEventsList();\n const params = new URLSearchParams({\n seekTo: String(lastTime),\n events: eventsList,\n autoplay: String(!!this.config.autoplay),\n });\n if (this.isIOSContext()) {\n params.set(\"fullscreen\", \"0\");\n }\n const scaleupSrc = `https://player.scaleup.com.br/embed/${videoId}?${params.toString()}`;\n\n const host: HTMLElement = this.elementRef.nativeElement;\n\n if (this.scaleupIframe) {\n this.scaleupIframe.remove();\n }\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = scaleupSrc;\n iframe.allow = \"autoplay; encrypted-media; picture-in-picture; web-share\";\n iframe.referrerPolicy = \"origin-when-cross-origin\";\n iframe.allowFullscreen = false;\n iframe.frameBorder = \"0\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.position = \"absolute\";\n iframe.style.top = \"0\";\n iframe.style.left = \"0\";\n\n host.appendChild(iframe);\n this.scaleupIframe = iframe;\n this.ensureCastMessageHandler();\n\n // Emite evento ready quando o iframe carregar\n iframe.onload = () => {\n this.ready.emit();\n };\n\n if (this.scaleupMessageHandler) {\n window.removeEventListener(\"message\", this.scaleupMessageHandler);\n }\n\n this.scaleupMessageHandler = (e: MessageEvent) => {\n try {\n const originOk =\n typeof e.origin === \"string\" && e.origin.includes(\"scaleup.com.br\");\n console.log(\"Scaleup message received:\", e);\n console.log(\"Origin OK:\", originOk);\n if (!originOk) return;\n\n const data =\n typeof e.data === \"string\"\n ? (() => {\n try {\n return JSON.parse(e.data);\n } catch {\n return undefined;\n }\n })()\n : e.data;\n console.log(\"Parsed data:\", data);\n if (!data || typeof data !== \"object\") return;\n\n const type = (\n data.event ||\n data.type ||\n data.message ||\n data.eventName ||\n \"\"\n )\n .toString()\n .toLowerCase();\n console.log(\"Event type:\", type);\n if (!type) return;\n\n if (type.includes(\"fullscreen\") || type.includes(\"fullwindow\")) {\n try {\n console.log(`scaleup event: ${type}`);\n } catch {}\n }\n\n const t = Number((data.currentTime ?? data.time ?? data.position) || 0);\n const d = Number((data.duration ?? data.totalDuration) || 0);\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.lastCurrentTime = t;\n this.lastDuration = d;\n this.postCastProgress(t, d);\n\n const THROTTLE_MS = 300;\n const now = performance.now();\n\n if (\n type.includes(\"timeupdate\") ||\n type === \"playing\" ||\n type === \"progress\"\n ) {\n if (now - this.scaleupProgressThrottle >= THROTTLE_MS) {\n this.scaleupProgressThrottle = now;\n this.progressService.progress$.next({\n currentTime: t,\n duration: d,\n percent: p,\n });\n }\n }\n if (type === \"pause\" || type === \"paused\") {\n this.progressService.progress$.next({\n currentTime: t,\n duration: d,\n percent: p,\n });\n }\n if (type === \"ended\" || type === \"end\" || type === \"complete\") {\n this.progressService.progress$.next({\n currentTime: t,\n duration: d,\n percent: p,\n });\n this.progressService.ended$.next();\n console.log(\"event: ended\");\n try {\n parent.postMessage(\"event: ended\", \"*\");\n } catch {}\n }\n } catch {}\n };\n window.addEventListener(\"message\", this.scaleupMessageHandler);\n }\n\n ngOnDestroy() {\n try {\n this.scaleupIframe?.remove();\n } catch {}\n if (this.scaleupMessageHandler) {\n window.removeEventListener(\"message\", this.scaleupMessageHandler);\n this.scaleupMessageHandler = undefined;\n }\n if (this.castMessageHandler) {\n window.removeEventListener(\"message\", this.castMessageHandler);\n this.castMessageHandler = undefined;\n }\n }\n\n private postCastProgress(currentTime: number, duration: number) {\n try {\n parent.postMessage({ currentTime, duration }, \"*\");\n } catch {}\n try {\n parent.postMessage(\"currentTime:\" + currentTime, \"*\");\n parent.postMessage(\"duration:\" + duration, \"*\");\n console.log(\"event: current_time \" + currentTime);\n console.log(\"event: duration \" + duration);\n } catch {}\n }\n\n private sendScaleupCommand(cmd: any) {\n try {\n console.log(\"Scaleup -> iframe command\", cmd);\n const target = this.scaleupIframe?.contentWindow;\n if (!target) return;\n target.postMessage(cmd, \"*\");\n if (cmd?.action && typeof cmd.action === \"string\") {\n target.postMessage({ type: cmd.action }, \"*\");\n target.postMessage(cmd.action, \"*\");\n }\n } catch {}\n }\n\n private ensureCastMessageHandler() {\n if (this.castMessageHandler) return;\n\n this.castMessageHandler = (event: MessageEvent) => {\n console.log(\"Cast message received (Scaleup)\", event.data);\n const data = event?.data;\n if (!data) return;\n\n let payload: any = data;\n if (typeof data === \"string\") {\n try {\n payload = JSON.parse(data);\n } catch {\n payload = { action: data };\n }\n }\n const actionRaw = payload?.action ?? payload?.type ?? \"\";\n const action =\n typeof actionRaw === \"string\" ? actionRaw.toLowerCase() : \"\";\n console.log(\"Cast normalized action\", action);\n\n if (action === \"request-iframe-media-metadata\") {\n const duration = this.lastDuration || 0;\n const currentTime = this.lastCurrentTime || 0;\n this.postCastProgress(currentTime, duration);\n return;\n }\n\n if (action === \"play\") {\n this.sendScaleupCommand({ action: \"play\" });\n return;\n }\n\n if (action === \"pause\") {\n this.sendScaleupCommand({ action: \"pause\" });\n return;\n }\n\n if (action === \"seek\" && typeof payload.time === \"number\") {\n this.sendScaleupCommand({ action: \"seek\", time: payload.time });\n return;\n }\n };\n\n window.addEventListener(\"message\", this.castMessageHandler);\n }\n\n private resolveEventsList(): string {\n const baseEvents = [\n \"controlsdisabled\",\n \"controlsenabled\",\n \"dispose\",\n \"durationchange\",\n \"ended\",\n \"enterpictureinpicture\",\n \"error\",\n \"firstplay\",\n \"leavepictureinpicture\",\n \"loadedmetadata\",\n \"loadstart\",\n \"pause\",\n \"play\",\n \"playerreset\",\n \"playerresize\",\n \"playing\",\n \"posterchange\",\n \"progress\",\n \"ratechange\",\n \"ready\",\n \"resize\",\n \"seeked\",\n \"seeking\",\n \"textdata\",\n \"timeupdate\",\n \"useractive\",\n \"userinactive\",\n \"volumechange\",\n \"waiting\",\n ];\n if (!this.isIOSContext()) {\n return baseEvents.join(\",\");\n }\n return baseEvents\n .filter(\n (name) =>\n !name.toLowerCase().includes(\"fullscreen\") &&\n !name.toLowerCase().includes(\"fullwindow\") &&\n !name.toLowerCase().includes(\"airplay\"),\n )\n .join(\",\");\n }\n\n private isIOSDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent || \"\";\n const iOS = /iPad|iPhone|iPod/.test(ua);\n const iPadOS =\n navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1;\n return iOS || iPadOS;\n }\n\n private isIOSContext(): boolean {\n if (this.isIOSDevice()) {\n return true;\n }\n return false;\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalLoadingService {\n private loadingElement: HTMLElement | null;\n\n constructor(@Inject(DOCUMENT) private document: Document) {\n this.loadingElement = this.document.getElementById('global-loading');\n }\n\n public hide() {\n if (this.loadingElement) {\n this.loadingElement.style.opacity = '0';\n setTimeout(() => {\n if (this.loadingElement) {\n this.loadingElement.style.display = 'none';\n }\n }, 500); // Duração da transição do CSS\n }\n }\n\n public show() {\n if (this.loadingElement) {\n this.loadingElement.style.display = 'flex';\n this.loadingElement.style.opacity = '1';\n }\n }\n}","import { CommonModule } from \"@angular/common\";\nimport { Component, Inject, Input } from \"@angular/core\";\n\nimport { PlyrPlayerComponent } from \"../players/plyr-player/plyr-player.component\";\nimport { VimeoPlayerComponent } from \"../players/vimeo-player/vimeo-player.component\";\nimport { PandaPlayerComponent } from \"../players/panda-player/panda-player.component\";\nimport { ScaleupPlayerComponent } from \"../players/scaleup-player/scaleup-player.component\";\n\nimport { WebplayerConfig, WEPLAYER_CONFIG } from \"../webplayer.types\";\nimport { GlobalLoadingService } from \"../global.service\";\n\n@Component({\n selector: \"app-player-loader\",\n template: `\n <div style=\"width: 100%; height: 100%;\">\n <div [ngSwitch]=\"config?.video_host\" style=\"width: 100%; height: 100%;\">\n <app-plyr-player\n *ngSwitchCase=\"'hls'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'mp4'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'youtube'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-vimeo-player\n *ngSwitchCase=\"'vimeo'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-vimeo-player>\n <app-panda-player\n *ngSwitchCase=\"'panda'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-panda-player>\n <app-scaleup-player\n *ngSwitchCase=\"'scaleup'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-scaleup-player>\n <div *ngSwitchDefault>\n <p>Player não suportado ou configuração não fornecida.</p>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n `,\n ],\n standalone: true,\n imports: [\n CommonModule,\n PlyrPlayerComponent,\n VimeoPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n ],\n})\nexport class PlayerLoaderComponent {\n @Input() config!: WebplayerConfig | any;\n playerType: \"plyr\" | \"panda\" | \"scaleup\" | null = null;\n\n constructor(\n @Inject(WEPLAYER_CONFIG) private defaultConfig: WebplayerConfig,\n private globalLoading: GlobalLoadingService\n ) {\n this.config = { ...this.defaultConfig, ...this.config };\n this.playerType = this.getPlayerType(this.config.videoUrl);\n }\n\n private getPlayerType(videoUrl: string): \"plyr\" | \"panda\" | \"scaleup\" | null {\n if (videoUrl?.includes(\"panda\")) return \"panda\";\n if (videoUrl?.includes(\"scaleup\")) return \"scaleup\";\n if (\n videoUrl?.includes(\"vimeo\") ||\n videoUrl?.includes(\"youtube\") ||\n videoUrl?.includes(\".m3u8\") ||\n videoUrl?.includes(\".mp4\")\n )\n return \"plyr\";\n return \"plyr\";\n }\n\n onPlayerReady() {\n this.globalLoading.hide();\n }\n}\n","import { Component, Output, EventEmitter, OnDestroy, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { WebplayerConfig } from './webplayer.types';\nimport { WebplayerConfigService } from './webplayer-config.service';\nimport { WebplayerProgress, WebplayerProgressService } from './progress.service';\nimport { PlayerLoaderComponent } from './player-loader/player-loader.component';\n\n@Component({\n selector: 'edm-webplayer',\n template: `\n <app-player-loader [config]=\"config\" *ngIf=\"config\"></app-player-loader>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n `,\n ],\n standalone: true,\n imports: [CommonModule, PlayerLoaderComponent],\n})\nexport class WebplayerComponent implements OnInit, OnDestroy {\n @Output('playProgress') progress = new EventEmitter<WebplayerProgress>();\n @Output('playEnded') ended = new EventEmitter<void>();\n\n config: WebplayerConfig | null = null;\n private subscriptions = new Subscription();\n\n constructor(\n private configService: WebplayerConfigService,\n private progressService: WebplayerProgressService\n ) {}\n\n ngOnInit(): void {\n this.subscriptions.add(\n this.configService.config$.subscribe(config => {\n this.config = config;\n })\n );\n\n this.subscriptions.add(\n this.progressService.progress$.subscribe(p => this.progress.emit(p))\n );\n\n this.subscriptions.add(\n this.progressService.ended$.subscribe(() => this.ended.emit())\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'timeFormat', standalone: true })\nexport class TimeFormatPipe implements PipeTransform {\n transform(seconds: number | null | undefined): string {\n const val = typeof seconds === 'number' && isFinite(seconds) ? seconds : 0;\n const sec = Math.floor(val % 60).toString().padStart(2, '0');\n const min = Math.floor(val / 60).toString().padStart(2, '0');\n const hrs = Math.floor(val / 3600);\n if (hrs > 0) {\n const mm = Math.floor((val % 3600) / 60).toString().padStart(2, '0');\n return `${hrs}:${mm}:${sec}`;\n }\n return `${min}:${sec}`;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerComponent } from './webplayer.component';\nimport { TimeFormatPipe } from './utils/time-format.pipe';\nimport { PlayerLoaderComponent } from './player-loader/player-loader.component';\nimport { PlyrPlayerComponent } from './players/plyr-player/plyr-player.component';\nimport { PandaPlayerComponent } from './players/panda-player/panda-player.component';\nimport { ScaleupPlayerComponent } from './players/scaleup-player/scaleup-player.component';\n\n@NgModule({\n imports: [\n CommonModule,\n WebplayerComponent,\n PlayerLoaderComponent,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n TimeFormatPipe,\n ],\n exports: [\n WebplayerComponent,\n PlayerLoaderComponent,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n TimeFormatPipe,\n ]\n})\nexport class WebplayerModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WebplayerProgressService","i1.GlobalLoadingService","i1.WebplayerConfigService","i2.WebplayerProgressService"],"mappings":"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"}
1
+ {"version":3,"file":"edm-webplayer-webplayer-angular.mjs","sources":["../../../projects/webplayer-angular/src/webplayer.types.ts","../../../projects/webplayer-angular/src/webplayer-config.service.ts","../../../projects/webplayer-angular/src/progress.service.ts","../../../projects/webplayer-angular/src/utils/playback-reset.ts","../../../projects/webplayer-angular/src/players/plyr-player/plyr-player.component.ts","../../../projects/webplayer-angular/src/players/vimeo-player/vimeo-player.component.ts","../../../projects/webplayer-angular/src/players/panda-player/panda-player.component.ts","../../../projects/webplayer-angular/src/players/scaleup-player/scaleup-player.component.ts","../../../projects/webplayer-angular/src/global.service.ts","../../../projects/webplayer-angular/src/player-loader/player-loader.component.ts","../../../projects/webplayer-angular/src/webplayer.component.ts","../../../projects/webplayer-angular/src/utils/time-format.pipe.ts","../../../projects/webplayer-angular/src/webplayer.module.ts","../../../projects/webplayer-angular/src/edm-webplayer-webplayer-angular.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\n\nexport interface WebplayerConfig {\n video_host: \"youtube\" | \"vimeo\" | \"mp4\" | \"hls\" | \"panda\" | \"scaleup\";\n video_id: string | null;\n library_id?: string | number | null;\n video_external_id?: string | null;\n video_locale?: string | null;\n video_language?: string | null;\n captions_locale?: string | null;\n captions_language?: string | null;\n last_time?: number | null;\n last_percent?: number;\n seen?: boolean | string | number;\n embed?: string | null;\n watermark?: string;\n progress_url?: string;\n is_live?: boolean; // is the video live\n mirror?: boolean; // mirror the video\n autoplay?: boolean; // auto play the video\n locale?: string | null; // preferred locale/language (e.g. pt-BR)\n language?: string | null; // backwards compatibility alias\n disable_vimeo_recommendations?: boolean; // hide Vimeo suggested videos after playback\n vimeo_premium?: boolean; // set to true when the Vimeo account supports premium embeds\n ui?: {\n colors?: {\n bg?: string;\n alert?: string;\n \"font-bt\"?: string;\n \"text-color\"?: string;\n \"progress-view-off\"?: string;\n \"player-controls\"?: string;\n };\n };\n}\n\nexport const WEPLAYER_CONFIG = new InjectionToken<WebplayerConfig>(\n \"webplayer.config\",\n);\n","import { Injectable, Inject, Optional } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { WebplayerConfig, WEPLAYER_CONFIG } from './webplayer.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WebplayerConfigService {\n private configSubject: BehaviorSubject<WebplayerConfig | null>;\n\n public get config$(): Observable<WebplayerConfig | null> {\n return this.configSubject.asObservable();\n }\n\n constructor(@Optional() @Inject(WEPLAYER_CONFIG) providedConfig: WebplayerConfig) {\n this.configSubject = new BehaviorSubject<WebplayerConfig | null>(providedConfig);\n }\n\n setConfig(config: Partial<WebplayerConfig>) {\n const currentConfig = this.configSubject.getValue();\n const newConfig = { ...(currentConfig || {}), ...config } as WebplayerConfig;\n this.configSubject.next(newConfig);\n }\n\n getConfig(): WebplayerConfig | null {\n return this.configSubject.getValue();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport interface WebplayerProgress {\n currentTime: number;\n duration: number;\n percent: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class WebplayerProgressService {\n\n public progress$ = new Subject<WebplayerProgress>();\n public ended$ = new Subject<void>();\n\n private key(videoKey: string) { return `webplayer:${videoKey}`; }\n\n saveProgress(videoKey: string, time: number) {\n try {\n localStorage.setItem(this.key(videoKey), String(Math.floor(time)));\n } catch {}\n }\n\n getProgress(videoKey: string): number {\n try {\n return Number(localStorage.getItem(this.key(videoKey)) || 0);\n } catch {\n return 0;\n }\n }\n}\n","import { WebplayerConfig } from '../webplayer.types';\n\n/** Percentage threshold (0-1) above which the video is considered \"already watched\". */\nexport const RESET_PERCENT_THRESHOLD = 0.8;\n\n/** Minimum saved seconds before the player attempts to seek on load. */\nexport const MIN_SEEK_SECONDS = 15;\n\n/**\n * Determines whether playback should start from the beginning instead of\n * resuming from the saved position. Returns `true` when the video has\n * already been fully (or mostly) watched so the user can re-watch it\n * without the player jumping to the end and immediately firing \"ended\".\n */\nexport function shouldResetProgressToBeginning(config: WebplayerConfig): boolean {\n const seenFlag = (config as any)?.seen;\n if (seenFlag === true || seenFlag === 'true' || seenFlag === 1) {\n return true;\n }\n const rawPercent = config?.last_percent;\n if (rawPercent === undefined || rawPercent === null || rawPercent === 0) {\n return false;\n }\n let percent = Number(rawPercent);\n if (!Number.isFinite(percent)) {\n return false;\n }\n if (percent > 1) {\n percent = percent / 100;\n }\n return percent >= RESET_PERCENT_THRESHOLD;\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild,\n Output,\n EventEmitter,\n} from \"@angular/core\";\nimport { CommonModule, DOCUMENT } from \"@angular/common\";\nimport * as Plyr from \"plyr\";\nimport \"plyr/dist/plyr.css\";\nimport Hls from \"hls.js\";\nimport { WebplayerConfig } from \"../../webplayer.types\";\nimport { WebplayerProgressService } from \"../../progress.service\";\nimport { shouldResetProgressToBeginning, MIN_SEEK_SECONDS } from \"../../utils/playback-reset\";\nimport { last } from \"rxjs\";\n\n@Component({\n selector: \"app-plyr-player\",\n template: `<video #video playsinline></video>`,\n standalone: true,\n imports: [CommonModule],\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n --plyr-color-main: var(--theme-alert, #19a6d9);\n --plyr-color-hover: var(--theme-alert, #2dbbff);\n --plyr-progress-buffer-background: var(\n --theme-progress-view-off,\n rgba(255, 255, 255, 0.25)\n );\n --plyr-control-background: var(--theme-bg, rgba(0, 0, 0, 0.8));\n --plyr-control-color: var(--theme-player-controls, #fff);\n --plyr-control-button-color: var(--theme-font-bt, #fff);\n --plyr-menu-text-color: var(--theme-text-color, #fff);\n }\n :host ::ng-deep .plyr__controls {\n color: var(--plyr-control-color) !important;\n transition:\n opacity 0.2s ease,\n transform 0.2s ease;\n z-index: 10 !important;\n }\n :host ::ng-deep .plyr__controls button {\n color: var(--plyr-control-color) !important;\n }\n :host ::ng-deep .plyr__progress__buffer {\n background-color: var(--plyr-progress-buffer-background) !important;\n }\n :host ::ng-deep .plyr,\n :host ::ng-deep .plyr__video-wrapper,\n :host ::ng-deep .plyr__video-embed,\n :host ::ng-deep .plyr__video-embed > iframe,\n :host ::ng-deep video {\n width: 100% !important;\n height: 100% !important;\n aspect-ratio: auto !important;\n top: 0 !important;\n left: 0 !important;\n }\n :host ::ng-deep .mirror {\n transform: scaleX(-1) !important;\n -webkit-transform: scaleX(-1) !important;\n }\n :host ::ng-deep .plyr--video .plyr__control.plyr__tab-focus,\n :host ::ng-deep .plyr--video .plyr__control:hover,\n :host ::ng-deep .plyr--video .plyr__control[aria-expanded=\"true\"] {\n background: var(--plyr-color-hover) !important;\n color: var(--plyr-control-button-color) !important;\n }\n\n :host ::ng-deep .plyr__control {\n z-index: 10 !important;\n }\n\n :host ::ng-deep .plyr--full-ui input[type=\"range\"] {\n color: var(--plyr-color-main) !important;\n }\n\n :host\n ::ng-deep\n .plyr__menu__container\n .plyr__control[role=\"menuitemradio\"][aria-checked=\"true\"]::before {\n background: var(--plyr-color-main) !important;\n }\n\n :host ::ng-deep .plyr__menu__container {\n background: var(--plyr-control-background) !important;\n color: var(--plyr-menu-text-color) !important;\n z-index: 7 !important;\n }\n :host ::ng-deep .plyr__menu__container .plyr__control {\n color: var(--plyr-menu-text-color) !important;\n }\n\n :host ::ng-deep .plyr--auto-hide-controls .plyr__controls {\n opacity: 0 !important;\n pointer-events: none !important;\n transform: translateY(12px);\n }\n\n :host ::ng-deep .ytp-more-videos-view .ytp-suggestions {\n pointer-events: none !important;\n }\n\n :host(.live-mode) ::ng-deep .plyr__controls,\n :host(.live-mode) ::ng-deep .plyr__control,\n :host(.live-mode) ::ng-deep .plyr__menu,\n :host(.live-mode) ::ng-deep .plyr__menu__container,\n :host(.live-mode) ::ng-deep .plyr__control--overlaid,\n :host(.live-mode) ::ng-deep .plyr__control--overlaid + .plyr__control {\n display: none !important;\n }\n\n :host(.live-mode) ::ng-deep .plyr__video-wrapper,\n :host(.live-mode) ::ng-deep video,\n :host(.live-mode) ::ng-deep .plyr__video-embed {\n pointer-events: none !important;\n }\n\n :host ::ng-deep .plyr__live-interaction-blocker {\n position: absolute;\n inset: 0;\n z-index: 12;\n pointer-events: auto;\n }\n\n :host ::ng-deep .plyr__control--overlaid,\n :host\n ::ng-deep\n .plyr--video\n .plyr__control.plyr__control--overlaid:hover {\n background: #fff !important;\n color: #000 !important;\n }\n `,\n ],\n})\nexport class PlyrPlayerComponent\n implements AfterViewInit, OnDestroy, OnChanges, OnInit\n{\n @HostBinding(\"class.live-mode\") get isLiveMode() {\n return !!this.config?.is_live;\n }\n @ViewChild(\"video\", { static: true }) videoRef!: ElementRef<HTMLVideoElement>;\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n\n private plyr!: any;\n private hls?: Hls;\n private controlsVisibilityCleanup?: () => void;\n private recommendationBlocker?: HTMLElement | null;\n private recommendationBlockerActiveZone?: HTMLElement | null;\n private topClickBlocker?: HTMLElement | null;\n private menuObserver?: MutationObserver;\n private captionToggleBtn?: HTMLButtonElement | null;\n private captionsEnabled = false;\n private playbackEnded = false;\n private overlayBlockAll = false;\n private liveInteractionBlocker?: HTMLElement | null;\n private readonly controlsSafeZonePxDesktop = 96;\n private readonly controlsSafeZonePxTouch = 144;\n private readonly overlayInteractionGapPx = 20;\n private readonly onResize = () => {\n this.updateRecommendationBlockerSafeZone();\n };\n private readonly onRecommendationBlockerClick = (event?: Event) => {\n if (event) {\n try {\n event.preventDefault();\n } catch {}\n try {\n event.stopPropagation();\n } catch {}\n }\n };\n private readonly onTopBlockerPointerDown = (event: Event) => {\n try {\n event.preventDefault();\n } catch {}\n try {\n event.stopPropagation();\n } catch {}\n };\n private readonly onTopBlockerClick = (event: Event) => {\n try {\n event.preventDefault();\n } catch {}\n try {\n event.stopPropagation();\n } catch {}\n };\n\n constructor(\n private progressService: WebplayerProgressService,\n @Inject(DOCUMENT) private document: Document,\n ) {}\n\n ngOnInit() {\n console.log(this.config);\n if (this.config?.ui?.colors) {\n this.applyTheme(this.config.ui.colors);\n }\n }\n\n private isTouchDevice(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n if (typeof navigator !== \"undefined\" && navigator.maxTouchPoints > 0) {\n return true;\n }\n if (window.matchMedia) {\n try {\n if (window.matchMedia(\"(pointer: coarse)\").matches) {\n return true;\n }\n } catch {}\n }\n return \"ontouchstart\" in window;\n }\n\n private getControlsSafeZone(): number {\n const controls = (this.plyr?.elements?.controls ??\n null) as HTMLElement | null;\n const menuHeight = this.getOpenMenuHeight();\n const baseSafeZone = this.isTouchDevice()\n ? this.controlsSafeZonePxTouch\n : this.controlsSafeZonePxDesktop;\n if (!controls) {\n return Math.max(baseSafeZone, menuHeight + 5);\n }\n let controlsHeight = 0;\n try {\n const rect = controls.getBoundingClientRect?.();\n if (rect && rect.height) {\n controlsHeight = rect.height;\n }\n } catch {}\n if (!controlsHeight) {\n controlsHeight = controls.offsetHeight || controls.clientHeight || 0;\n }\n return Math.max(baseSafeZone, Math.ceil(controlsHeight + menuHeight + 24));\n }\n\n private getOverlaySafeZone(): number {\n const host = this.config?.video_host;\n if (this.overlayBlockAll && host === \"youtube\") {\n if (this.playbackEnded) {\n return 0;\n }\n return this.overlayInteractionGapPx;\n }\n return Math.max(this.overlayInteractionGapPx, this.getControlsSafeZone());\n }\n\n private getOpenMenuHeight(): number {\n const container = this.plyr?.elements?.container as HTMLElement | undefined;\n if (!container) return 0;\n const menu = container.querySelector(\n '.plyr__menu__container[aria-hidden=\"false\"], .plyr__menu__container:not([aria-hidden])',\n ) as HTMLElement | null;\n if (!menu) return 0;\n try {\n const rect = menu.getBoundingClientRect?.();\n if (rect && rect.height) return Math.ceil(rect.height);\n } catch {}\n const fallback = menu.offsetHeight || menu.clientHeight || 0;\n return fallback;\n }\n\n ngAfterViewInit() {\n this.setupPlayer();\n window.addEventListener(\"message\", this.onCastMessage);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes[\"config\"] && this.plyr) {\n this.setupPlayer();\n }\n }\n\n private applyTheme(colors: { [key: string]: string }) {\n const STYLE_ID = \"webplayer-theme-vars\";\n let styleEl = this.document.getElementById(\n STYLE_ID,\n ) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = this.document.createElement(\"style\");\n styleEl.id = STYLE_ID;\n this.document.head.appendChild(styleEl);\n }\n\n const rootStyle = this.document.documentElement.style;\n const allPairs: Array<[string, string]> = [];\n\n for (const key in colors) {\n if (Object.prototype.hasOwnProperty.call(colors, key)) {\n const cssVarName = `--theme-${key.replace(\"progresss-\", \"progress-\")}`;\n const cssVarValue = String(colors[key]);\n allPairs.push([cssVarName, cssVarValue]);\n try {\n rootStyle.setProperty(cssVarName, cssVarValue);\n } catch {}\n }\n }\n\n const cssRule = `:root{\n${allPairs.map(([n, v]) => ` ${n}: ${v};`).join(\"\\n\")}\n}`;\n styleEl.textContent = cssRule;\n }\n\n private getVideoWrapper(): HTMLElement | null {\n const container = this.plyr?.elements?.container as HTMLElement | undefined;\n if (!container) return null;\n const wrapper =\n (this.plyr?.elements as any)?.wrapper ||\n container.querySelector(\".plyr__video-wrapper\");\n return (wrapper as HTMLElement) || null;\n }\n\n private ensureRecommendationBlocker(): HTMLElement | null {\n if (this.recommendationBlocker && this.recommendationBlocker.isConnected) {\n return this.recommendationBlocker;\n }\n const wrapper = this.getVideoWrapper();\n if (!wrapper) return null;\n\n const blocker = this.document.createElement(\"div\");\n blocker.className = \"plyr-recommendation-blocker\";\n blocker.style.position = \"absolute\";\n blocker.style.top = \"0\";\n blocker.style.left = \"0\";\n blocker.style.width = \"100%\";\n blocker.style.height = \"100%\";\n blocker.style.zIndex = \"9\";\n blocker.style.pointerEvents = \"none\";\n blocker.style.display = \"none\";\n blocker.style.background = \"rgba(0,0,0,0)\";\n blocker.style.cursor = \"pointer\";\n\n const activeZone = this.document.createElement(\"div\");\n activeZone.className = \"plyr-recommendation-blocker__zone\";\n activeZone.style.position = \"absolute\";\n activeZone.style.top = \"0\";\n activeZone.style.left = \"0\";\n activeZone.style.width = \"100%\";\n activeZone.style.bottom = `20px`;\n activeZone.style.pointerEvents = \"auto\";\n activeZone.style.background = \"rgba(0,0,0,0)\";\n activeZone.style.cursor = \"pointer\";\n activeZone.addEventListener(\"pointerdown\", this.onTopBlockerPointerDown);\n activeZone.addEventListener(\"click\", this.onRecommendationBlockerClick);\n blocker.appendChild(activeZone);\n\n wrapper.appendChild(blocker);\n this.recommendationBlocker = blocker;\n this.recommendationBlockerActiveZone = activeZone;\n this.updateRecommendationBlockerSafeZone();\n return blocker;\n }\n\n private toggleRecommendationBlocker(active: boolean) {\n if (this.config.video_host !== \"youtube\") {\n return;\n }\n const blocker = this.ensureRecommendationBlocker();\n if (!blocker) return;\n blocker.style.display = active ? \"block\" : \"none\";\n blocker.style.pointerEvents = \"none\";\n this.updateRecommendationBlockerSafeZone();\n }\n\n private updateRecommendationBlockerSafeZone() {\n if (this.recommendationBlockerActiveZone) {\n this.recommendationBlockerActiveZone.style.pointerEvents = this\n .overlayBlockAll\n ? \"auto\"\n : \"none\";\n }\n this.updateTopClickBlockerSafeZone();\n }\n\n private ensureTopClickBlocker() {\n if (this.config.video_host !== \"youtube\") {\n return;\n }\n const wrapper = this.getVideoWrapper();\n if (!wrapper) return;\n if (this.topClickBlocker && this.topClickBlocker.isConnected) {\n this.updateTopClickBlockerSafeZone();\n return;\n }\n const blocker = this.document.createElement(\"div\");\n blocker.className = \"plyr-top-click-blocker\";\n blocker.style.position = \"absolute\";\n blocker.style.top = \"0\";\n blocker.style.left = \"0\";\n blocker.style.right = \"0\";\n blocker.style.width = \"100%\";\n blocker.style.zIndex = \"12\";\n blocker.style.pointerEvents = \"auto\";\n blocker.style.background = \"rgba(0,0,0,0)\";\n blocker.style.touchAction = \"none\";\n blocker.style.cursor = \"default\";\n blocker.addEventListener(\"pointerdown\", this.onTopBlockerPointerDown);\n blocker.addEventListener(\"click\", this.onTopBlockerClick);\n wrapper.appendChild(blocker);\n this.topClickBlocker = blocker;\n this.updateTopClickBlockerSafeZone();\n }\n\n private updateTopClickBlockerSafeZone() {\n if (!this.topClickBlocker) return;\n const height = Math.max(48, Math.ceil(this.getOverlaySafeZone()));\n this.topClickBlocker.style.height = `${height}px`;\n this.topClickBlocker.style.pointerEvents = this.overlayBlockAll\n ? \"auto\"\n : \"none\";\n }\n\n private observeMenuChanges() {\n this.menuObserver?.disconnect();\n const container = this.plyr?.elements?.container as HTMLElement | undefined;\n if (!container) {\n this.menuObserver = undefined;\n return;\n }\n const observer = new MutationObserver(() => {\n this.updateRecommendationBlockerSafeZone();\n });\n observer.observe(container, {\n subtree: true,\n attributes: true,\n attributeFilter: [\"aria-hidden\", \"class\", \"style\"],\n });\n this.menuObserver = observer;\n }\n\n private hasReachedEndThreshold(): boolean {\n const duration = this.plyr?.duration;\n if (!Number.isFinite(duration) || !duration || duration <= 0) {\n return false;\n }\n const current = this.plyr?.currentTime || 0;\n const remaining = duration - current;\n const percent = duration > 0 ? current / duration : 0;\n if (this.config?.video_host === \"youtube\") {\n return percent >= 0.95 || remaining <= 1.5;\n }\n return percent >= 0.98 || remaining <= 0.75;\n }\n\n private forceLivePlaybackResume() {\n try {\n const maybePromise = this.plyr?.play?.();\n if (maybePromise && typeof maybePromise.then === \"function\") {\n maybePromise.catch(() => {});\n }\n } catch {}\n }\n\n private updateLiveInteractionBlocker(isLive: boolean) {\n if (!isLive) {\n this.detachLiveInteractionBlocker();\n return;\n }\n const container = (this.plyr?.elements?.container ??\n null) as HTMLElement | null;\n if (!container) {\n return;\n }\n if (this.liveInteractionBlocker?.isConnected) {\n return;\n }\n const blocker = this.document.createElement(\"div\");\n blocker.className = \"plyr__live-interaction-blocker\";\n blocker.setAttribute(\"aria-hidden\", \"true\");\n container.appendChild(blocker);\n this.liveInteractionBlocker = blocker;\n }\n\n private detachLiveInteractionBlocker() {\n if (this.liveInteractionBlocker?.parentNode) {\n try {\n this.liveInteractionBlocker.parentNode.removeChild(\n this.liveInteractionBlocker,\n );\n } catch {}\n }\n this.liveInteractionBlocker = null;\n }\n\n private bindFullscreenBehavior() {\n const onEnterFullscreen = () => {\n console.log(\"event: enterfullscreen\");\n parent.postMessage(\"event: fullscreen_enter', '*'\");\n };\n\n const onExitFullscreen = () => {\n console.log(\"event: exitfullscreen\");\n parent.postMessage(\"event: fullscreen_exit', '*'\");\n };\n\n this.plyr.on(\"enterfullscreen\", onEnterFullscreen as any);\n this.plyr.on(\"exitfullscreen\", onExitFullscreen as any);\n }\n\n private setupPlayer() {\n if (!this.videoRef) return;\n\n this.hls?.destroy();\n this.controlsVisibilityCleanup?.();\n this.controlsVisibilityCleanup = undefined;\n this.plyr?.destroy();\n this.recommendationBlocker = null;\n const speedOptions = [1, 1.25, 1.5, 2];\n const locale = \"pt-BR\";\n const captionsLanguage = \"pt\";\n\n const isLive = !!this.config?.is_live;\n\n const youtubePlayerVars: Record<string, any> = {\n rel: 0,\n modestbranding: 1,\n noCookie: true,\n };\n\n youtubePlayerVars['playerVars'] = {\n hl: locale,\n cc_lang_pref: captionsLanguage || locale.split(\"-\")[0]?.toLowerCase(),\n playsinline: 1,\n autoplay: isLive ? 1 : 0,\n showInfo: 0,\n rel: 0,\n vq: \"hd1080\",\n iv_load_policy: 3,\n modestbranding: 1,\n noCookie: false,\n };\n // Legenda OFF por padrão: cc_lang_pref define o idioma quando o usuário\n // ligar pelo botão CC, mas cc_load_policy=0 não exibe legenda ao carregar.\n youtubePlayerVars['playerVars'].cc_load_policy = 0;\n\n const defaultControls = [\n \"play-large\",\n \"play\",\n \"progress\",\n \"current-time\",\n \"duration\",\n \"mute\",\n \"volume\",\n \"captions\",\n \"settings\",\n \"pip\",\n \"airplay\",\n \"fullscreen\",\n ];\n const liveControls: string[] = [];\n const plyrOptions: any = {\n controls: isLive ? liveControls : defaultControls,\n fullscreen: {\n enabled: true,\n fallback: true,\n iosNative: !isLive,\n container: null,\n },\n i18n: {\n speed: \"Velocidade\",\n },\n speed: {\n selected: 1,\n options: speedOptions,\n },\n clickToPlay: true,\n hideControls: true,\n keyboard: { focused: !isLive, global: false },\n autoplay: isLive ? true : false,\n muted: false,\n disableContextMenu: true,\n captions: { active: false, update: false, language: \"auto\" },\n // Desliga a persistência do Plyr em localStorage. Sem isso, o Plyr\n // restaura \"captions:true\" de uma sessão anterior e LIGA legenda sozinho\n // em qualquer vídeo (inclusive ASR), por fora do nosso controle.\n storage: { enabled: false },\n };\n\n plyrOptions.hl = locale;\n if (captionsLanguage) {\n // Mantém active:false — senão o Plyr ativa legenda por padrão.\n plyrOptions.captions = {\n active: false,\n update: false,\n language: captionsLanguage,\n };\n }\n\n if (this.config.video_host === \"youtube\") {\n plyrOptions.youtube = youtubePlayerVars;\n }\n\n this.plyr = new (Plyr as any).default(\n this.videoRef.nativeElement,\n plyrOptions,\n );\n if (typeof this.plyr?.toggleControls === \"function\") {\n this.plyr.toggleControls(!isLive);\n }\n this.updateLiveInteractionBlocker(isLive);\n this.bindFullscreenBehavior();\n this.ensureTopClickBlocker();\n this.observeMenuChanges();\n this.playbackEnded = false;\n this.overlayBlockAll = false;\n window.removeEventListener(\"resize\", this.onResize);\n window.addEventListener(\"resize\", this.onResize);\n this.bindEvents();\n this.loadSource(this.videoRef.nativeElement).then(() => {});\n }\n\n private bindEvents() {\n const THROTTLE_MS = 300;\n let lastEmit = 0;\n\n const emitProgress = () => {\n const t = this.plyr.currentTime || 0;\n const d = this.plyr.duration || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({\n currentTime: t,\n duration: d,\n percent: p,\n });\n };\n\n const onTimeUpdate = () => {\n const now = performance.now();\n if (now - lastEmit >= THROTTLE_MS) {\n lastEmit = now;\n emitProgress();\n }\n const current = Math.floor(this.plyr.currentTime || 0);\n const duration = Math.floor(this.plyr.duration || 0);\n parent.postMessage(\"currentTime:\" + current, \"*\");\n console.log(\"event: current_time \" + current);\n console.log(\"event: duration \" + duration);\n this.postCastEvent({\n event: \"current_time\",\n currentTime: current,\n duration,\n });\n };\n\n const onPlay = () => {\n this.playbackEnded = false;\n this.overlayBlockAll = false;\n this.updateRecommendationBlockerSafeZone();\n this.toggleRecommendationBlocker(false);\n if (!this.hasJumped) {\n this.jumpToLastTime();\n }\n parent.postMessage(\"playing_video\", \"*\");\n this.postCastEvent({\n event: \"play\",\n currentTime: this.plyr.currentTime || 0,\n });\n };\n\n const onPause = () => {\n if (this.config?.is_live) {\n this.forceLivePlaybackResume();\n return;\n }\n emitProgress();\n console.log(\"event: pause\");\n parent.postMessage(\"paused_video\", \"*\");\n this.postCastEvent({\n event: \"pause\",\n currentTime: this.plyr.currentTime || 0,\n });\n this.overlayBlockAll = true;\n this.updateRecommendationBlockerSafeZone();\n this.toggleRecommendationBlocker(true);\n };\n\n const onEnded = () => {\n emitProgress();\n emitProgress();\n if (!this.hasReachedEndThreshold()) {\n console.warn(\n \"Ignoring premature ended event\",\n this.plyr?.currentTime,\n this.plyr?.duration,\n );\n return;\n }\n this.playbackEnded = true;\n this.overlayBlockAll = true;\n this.updateRecommendationBlockerSafeZone();\n console.log(\"event: ended\");\n parent.postMessage(\"event: ended\", \"*\");\n this.postCastEvent({\n event: \"ended\",\n currentTime: this.plyr.currentTime || 0,\n });\n this.progressService.ended$.next();\n this.toggleRecommendationBlocker(true);\n };\n\n this.plyr?.on?.(\"timeupdate\", onTimeUpdate);\n this.plyr?.on?.(\"play\", onPlay);\n this.plyr?.on?.(\"pause\", onPause);\n this.plyr?.on?.(\"ended\", onEnded);\n }\n\n private hasJumped = false;\n\n private jumpToLastTime() {\n if (this.hasJumped || !this.plyr || !this.config) {\n return;\n }\n\n if (shouldResetProgressToBeginning(this.config)) {\n console.log('Vídeo já assistido, iniciando do começo');\n this.hasJumped = true;\n return;\n }\n\n const lastTime = this.config.last_time || 0;\n\n if (lastTime > MIN_SEEK_SECONDS) {\n // Usa o seek direto para evitar o forward 0\n this.plyr.currentTime = lastTime;\n console.log(`Buscando para o tempo salvo: ${lastTime}s`);\n }\n\n this.hasJumped = true; // Marca como executado para não repetir\n }\n\n /**\n * Indica se uma faixa de legenda do YouTube é gerada automaticamente (ASR).\n * Faixas ASR vêm com kind === \"asr\" ou vss_id começando com \"a.\".\n */\n private isYoutubeAsrTrack(track: any): boolean {\n if (!track) return false;\n const kind = (track.kind || \"\").toLowerCase();\n const vss = (track.vss_id || track.vssId || \"\").toString();\n return kind === \"asr\" || vss.startsWith(\"a.\");\n }\n\n /**\n * Retorna SOMENTE as faixas de legenda publicadas (não-ASR) do vídeo, via API\n * do iframe. Legenda gerada automaticamente é deliberadamente excluída — não\n * queremos ativá-la de forma alguma para YouTube.\n *\n * Usa apenas o módulo \"captions\" (HTML5). O módulo legado \"cc\" é evitado de\n * propósito: ativar os dois juntos pode renderizar legenda em duplicidade.\n */\n private getYoutubePublishedTracks(yt: any): any[] {\n if (!yt || typeof yt.getOption !== \"function\") return [];\n try {\n yt.loadModule?.(\"captions\");\n const list = yt.getOption?.(\"captions\", \"tracklist\");\n if (Array.isArray(list)) {\n return list.filter((t: any) => !this.isYoutubeAsrTrack(t));\n }\n } catch {}\n return [];\n }\n\n /**\n * Injeta um botão de legenda (CC) customizado na barra do Plyr para YouTube,\n * SOMENTE quando o vídeo tem legenda PUBLICADA (não-ASR). Legenda gerada\n * automaticamente nunca é ativada nem ganha botão. Nada é forçado.\n *\n * O tracklist costuma popular só após o onApiChange, então tentamos algumas\n * vezes antes de desistir.\n */\n private injectCaptionToggle(attempt = 0) {\n if (this.config?.video_host !== \"youtube\") return;\n const controls = (this.plyr as any)?.elements?.controls as\n | HTMLElement\n | undefined;\n const yt: any = (this.plyr as any)?.embed;\n if (!controls || !yt) {\n if (attempt < 6) {\n setTimeout(() => this.injectCaptionToggle(attempt + 1), 700);\n }\n return;\n }\n if (controls.querySelector(\".plyr__control--yt-captions\")) return;\n\n // Só exibe o botão se houver faixa publicada (não-ASR). Caso contrário, não\n // injeta nada — inclui vídeos só com legenda automática (tracklist vazio).\n const published = this.getYoutubePublishedTracks(yt);\n if (!published.length) {\n if (attempt < 6) {\n setTimeout(() => this.injectCaptionToggle(attempt + 1), 700);\n }\n return;\n }\n\n // Garante legenda desligada por padrão (não exibe ao carregar).\n try {\n yt.setOption?.(\"captions\", \"track\", {});\n } catch {}\n\n // Remove o botão de legenda nativo do Plyr (normalmente já fica oculto para\n // YouTube) para garantir que nunca haja dois botões CC, em qualquer iOS.\n controls\n .querySelectorAll('[data-plyr=\"captions\"]')\n .forEach((el) => el.remove());\n\n const btn = this.document.createElement(\"button\");\n btn.type = \"button\";\n // plyr__control--pressed: o Plyr usa ESTA classe (não o aria-pressed) para\n // alternar entre o ícone .icon--pressed (legenda on) e .icon--not-pressed.\n btn.className =\n \"plyr__control plyr__control--yt-captions\" +\n (this.captionsEnabled ? \" plyr__control--pressed\" : \"\");\n btn.setAttribute(\"data-plyr\", \"yt-captions\");\n btn.setAttribute(\"aria-label\", \"Legendas\");\n btn.setAttribute(\"aria-pressed\", String(this.captionsEnabled));\n // Reaproveita o sprite de ícones do Plyr (captions on/off) e as classes\n // .icon--pressed/.icon--not-pressed que o próprio Plyr alterna via aria-pressed.\n btn.innerHTML = `\n <svg class=\"icon--pressed\" aria-hidden=\"true\" focusable=\"false\"><use xlink:href=\"#plyr-captions-on\"></use></svg>\n <svg class=\"icon--not-pressed\" aria-hidden=\"true\" focusable=\"false\"><use xlink:href=\"#plyr-captions-off\"></use></svg>\n <span class=\"label--pressed plyr__sr-only\">Desativar legendas</span>\n <span class=\"label--not-pressed plyr__sr-only\">Ativar legendas</span>\n `;\n btn.addEventListener(\"click\", () => this.toggleYoutubeCaptions());\n\n const ref =\n (controls.querySelector(\n '[data-plyr=\"settings\"], .plyr__menu',\n ) as HTMLElement | null) ||\n (controls.querySelector(\n '[data-plyr=\"fullscreen\"]',\n ) as HTMLElement | null);\n if (ref && ref.parentElement === controls) {\n controls.insertBefore(btn, ref);\n } else {\n controls.appendChild(btn);\n }\n this.captionToggleBtn = btn;\n }\n\n private toggleYoutubeCaptions() {\n const yt: any = (this.plyr as any)?.embed;\n if (!yt) return;\n this.captionsEnabled = !this.captionsEnabled;\n // Usa SOMENTE o módulo \"captions\" (uma única ativação) para não duplicar.\n try {\n if (this.captionsEnabled) {\n yt.loadModule?.(\"captions\");\n // Só faixas publicadas (não-ASR). Sem fallback por languageCode, para\n // nunca ativar legenda automática.\n const tracks = this.getYoutubePublishedTracks(yt);\n const match =\n tracks.find((t: any) =>\n (t?.languageCode || \"\").toLowerCase().startsWith(\"pt\"),\n ) || tracks[0];\n if (match) {\n yt.setOption?.(\"captions\", \"track\", match);\n }\n } else {\n // Objeto vazio remove a faixa de legenda no player do YouTube.\n yt.setOption?.(\"captions\", \"track\", {});\n }\n } catch {}\n this.captionToggleBtn?.setAttribute(\n \"aria-pressed\",\n String(this.captionsEnabled),\n );\n // Alterna a classe que o Plyr usa para trocar o ícone on/off.\n this.captionToggleBtn?.classList.toggle(\n \"plyr__control--pressed\",\n this.captionsEnabled,\n );\n }\n\n private loadSource(video: HTMLVideoElement): Promise<void> {\n return new Promise((resolve) => {\n if (!this.config) {\n return resolve();\n }\n\n if (this.hls) {\n this.hls.destroy();\n this.hls = undefined;\n }\n\n if (this.config.video_host === \"youtube\") {\n const onReady = () => {\n this.plyr.pause();\n parent.postMessage(\"playerIsReadyToPlay\", \"*\");\n parent.postMessage(\"duration:\" + this.plyr.duration, \"*\");\n console.log(\"event: current_time \" + this.plyr.currentTime);\n console.log(\"event: duration \" + this.plyr.duration);\n console.log(\"event: ready\");\n this.postCastEvent({\n event: \"ready\",\n duration: this.plyr.duration || 0,\n currentTime: this.plyr.currentTime || 0,\n });\n\n if (this.config.is_live) {\n this.plyr?.on(\"playing\", function () {\n console.log(\"event: playing_live\");\n parent.postMessage(\"event: playing_live\", \"*\");\n });\n }\n\n if (this.config.mirror) {\n setTimeout(() => {\n document\n .querySelector(`.plyr__video-embed iframe`)\n ?.classList.add(\"mirror\");\n }, 1000);\n }\n this.injectCaptionToggle();\n this.ready.emit();\n };\n\n this.plyr.on(\"ready\", onReady);\n }\n\n if (this.config.video_host === \"youtube\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_id, provider: \"youtube\" }],\n };\n } else if (this.config.video_host === \"mp4\") {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: this.config.video_external_id, type: \"video/mp4\" }],\n };\n } else if (this.config.video_host === \"hls\") {\n let sourceX = \"\";\n try {\n sourceX = atob(this.config.video_id || \"\");\n } catch (e) {\n sourceX = this.config.video_id || \"\";\n }\n const canNative = video.canPlayType(\"application/vnd.apple.mpegurl\");\n\n if (canNative) {\n this.plyr.source = {\n type: \"video\",\n sources: [{ src: sourceX, type: \"application/vnd.apple.mpegurl\" }],\n };\n const onLoadedMeta = () => {\n video.removeEventListener(\"loadedmetadata\", onLoadedMeta);\n };\n video.addEventListener(\"loadedmetadata\", onLoadedMeta);\n } else if (Hls.isSupported()) {\n this.hls = new Hls({ enableWorker: true, lowLatencyMode: true });\n this.hls.attachMedia(video);\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls!.loadSource(sourceX);\n });\n this.hls.on(Hls.Events.MANIFEST_PARSED, () => {});\n this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n this.hls!.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n this.hls!.recoverMediaError();\n break;\n default:\n try {\n this.hls!.destroy();\n } catch {}\n break;\n }\n }\n });\n } else {\n this.plyr.source = { type: \"video\", sources: [{ src: sourceX }] };\n }\n }\n resolve();\n });\n }\n\n private postCastEvent(payload: Record<string, unknown>) {\n parent.postMessage(JSON.stringify(payload), \"*\");\n }\n\n private onCastMessage = (evt: MessageEvent) => {\n let data = evt.data;\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {}\n }\n if (data?.action === \"request-iframe-media-metadata\") {\n this.postCastEvent({\n event: \"metadata\",\n duration: this.plyr?.duration || 0,\n currentTime: this.plyr?.currentTime || 0,\n });\n }\n if (data?.action === \"play\") {\n this.plyr?.play();\n }\n if (data?.action === \"pause\") {\n this.plyr?.pause();\n }\n if (data?.action === \"seek\" && typeof data.time === \"number\") {\n this.plyr && (this.plyr.currentTime = data.time);\n }\n };\n\n ngOnDestroy() {\n this.hls?.destroy();\n this.controlsVisibilityCleanup?.();\n this.controlsVisibilityCleanup = undefined;\n this.detachLiveInteractionBlocker();\n if (this.recommendationBlocker?.parentElement) {\n try {\n this.recommendationBlocker.parentElement.removeChild(\n this.recommendationBlocker,\n );\n } catch {}\n }\n if (this.recommendationBlockerActiveZone) {\n try {\n this.recommendationBlockerActiveZone.removeEventListener(\n \"pointerdown\",\n this.onTopBlockerPointerDown,\n );\n this.recommendationBlockerActiveZone.removeEventListener(\n \"click\",\n this.onRecommendationBlockerClick,\n );\n } catch {}\n }\n this.recommendationBlocker = null;\n this.recommendationBlockerActiveZone = null;\n if (this.topClickBlocker?.parentElement) {\n try {\n this.topClickBlocker.removeEventListener(\n \"pointerdown\",\n this.onTopBlockerPointerDown,\n );\n this.topClickBlocker.removeEventListener(\n \"click\",\n this.onTopBlockerClick,\n );\n this.topClickBlocker.parentElement.removeChild(this.topClickBlocker);\n } catch {}\n }\n this.topClickBlocker = null;\n this.menuObserver?.disconnect();\n this.menuObserver = undefined;\n window.removeEventListener(\"resize\", this.onResize);\n this.plyr?.destroy();\n window.removeEventListener(\"message\", this.onCastMessage);\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport * as Plyr from 'plyr';\nimport 'plyr/dist/plyr.css';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { WebplayerProgressService } from '../../progress.service';\nimport { shouldResetProgressToBeginning } from '../../utils/playback-reset';\n\n@Component({\n selector: 'app-vimeo-player',\n standalone: true,\n imports: [CommonModule],\n host: {\n '[class.overlay-visible]': 'endedOverlayVisible',\n },\n template: `\n <div class=\"vimeo-wrapper\">\n <video #video playsinline></video>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n --plyr-color-main: var(--theme-alert, #19a6d9);\n --plyr-color-hover: var(--theme-alert, #2dbbff);\n --plyr-progress-buffer-background: var(\n --theme-progress-view-off,\n rgba(255, 255, 255, 0.25)\n );\n --plyr-control-background: var(--theme-bg, rgba(0, 0, 0, 0.8));\n --plyr-control-color: var(--theme-player-controls, #fff);\n --plyr-control-button-color: var(--theme-font-bt, #fff);\n --plyr-menu-text-color: var(--theme-text-color, #fff);\n }\n :host ::ng-deep .plyr__controls {\n color: var(--plyr-control-color) !important;\n transition: opacity 0.2s ease, transform 0.2s ease;\n z-index: 5;\n }\n :host ::ng-deep .plyr__controls button {\n color: var(--plyr-control-color) !important;\n }\n :host ::ng-deep .plyr__progress__buffer {\n background-color: var(--plyr-progress-buffer-background) !important;\n }\n .vimeo-wrapper {\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep .plyr,\n :host ::ng-deep .plyr__video-wrapper,\n :host ::ng-deep .plyr__video-embed,\n :host ::ng-deep .plyr__video-embed > iframe {\n width: 100% !important;\n height: 100% !important;\n top: 0 !important;\n left: 0 !important;\n background: #000 !important;\n }\n :host ::ng-deep .plyr__video-embed > iframe,\n :host ::ng-deep video {\n max-height: 100% !important;\n object-fit: contain !important;\n }\n :host ::ng-deep .plyr__video-wrapper {\n position: relative;\n z-index: 1;\n }\n :host(.overlay-visible) ::ng-deep .plyr__video-wrapper::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 40px;\n pointer-events: none;\n background: radial-gradient(\n circle at 30% 20%,\n rgba(255, 255, 255, 0.12),\n transparent 45%\n ),\n radial-gradient(\n circle at 70% 30%,\n rgba(255, 255, 255, 0.09),\n transparent 45%\n ),\n rgba(0, 0, 0, 0.92);\n z-index: 2;\n }\n :host ::ng-deep .plyr--video .plyr__control.plyr__tab-focus,\n :host ::ng-deep .plyr--video .plyr__control:hover,\n :host ::ng-deep .plyr--video .plyr__control[aria-expanded='true'] {\n background: var(--plyr-color-hover) !important;\n color: var(--plyr-control-button-color) !important;\n }\n :host ::ng-deep .plyr--full-ui input[type='range'] {\n color: var(--plyr-color-main) !important;\n }\n :host\n ::ng-deep\n .plyr__menu__container\n .plyr__control[role='menuitemradio'][aria-checked='true']::before {\n background: var(--plyr-color-main) !important;\n }\n :host ::ng-deep .plyr__menu__container {\n background: var(--plyr-control-background) !important;\n color: var(--plyr-menu-text-color) !important;\n z-index: 7 !important;\n }\n :host ::ng-deep .plyr__menu__container .plyr__control {\n color: var(--plyr-menu-text-color) !important;\n }\n :host ::ng-deep .plyr__control--overlaid {\n position: fixed !important;\n z-index: 4 !important;\n }\n :host ::ng-deep .plyr--auto-hide-controls .plyr__controls {\n opacity: 0 !important;\n pointer-events: none !important;\n transform: translateY(12px);\n }\n :host ::ng-deep .ytp-more-videos-view .ytp-suggestions {\n pointer-events: none !important;\n }\n\n :host ::ng-deep .plyr--vimeo .plyr__video-wrapper.plyr__video-embed{ \n aspect-ratio: 16 / 9 !important; \n width: 100% !important; \n height: auto !important;\n }\n\n :host ::ng-deep .plyr__control--overlaid, :host ::ng-deep .plyr--video .plyr__control.plyr__control--overlaid:hover {\n background: #fff !important;\n color: #000 !important;\n }\n :host ::ng-deep .plyr--vimeo .plyr__captions {\n display: none !important;\n }\n `,\n ],\n})\nexport class VimeoPlayerComponent\n implements OnInit, AfterViewInit, OnDestroy, OnChanges\n{\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n @ViewChild('video', { static: true })\n videoRef!: ElementRef<HTMLVideoElement>;\n\n private plyr?: any;\n private startTimeApplied = false;\n private pendingStartTime?: number;\n private endedLoggedOnPause = false;\n private iosFullscreenCleanup?: () => void;\n private castListenerAttached = false;\n private unmuteForCast() {\n try {\n const videoEl = this.videoRef?.nativeElement;\n if (videoEl) {\n videoEl.muted = false;\n videoEl.volume = 1;\n }\n if (this.plyr) {\n this.plyr.muted = false;\n this.plyr.volume = 1;\n }\n } catch {}\n }\n private readonly onCastMessage = (event: MessageEvent) => {\n let data = event.data;\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch {}\n }\n if (data?.action === 'request-iframe-media-metadata') {\n console.log('Received request-iframe-media-metadata message');\n setTimeout(() => {\n this.postCastEvent({\n event: 'metadata',\n duration: this.plyr?.duration || 0,\n currentTime: this.plyr?.currentTime || 0,\n }); \n }, 100);\n \n }\n if (data?.action === 'play') {\n this.unmuteForCast();\n this.plyr?.play?.();\n }\n if (data?.action === 'pause') {\n this.plyr?.pause?.();\n }\n if (data?.action === 'seek' && typeof data.time === 'number') {\n this.plyr && (this.plyr.currentTime = data.time);\n }\n };\n endedOverlayVisible = false;\n constructor(\n private progressService: WebplayerProgressService,\n @Inject(DOCUMENT) private document: Document\n ) {}\n\n ngOnInit(): void {\n this.applyTheme(this.config?.ui?.colors);\n }\n\n ngAfterViewInit(): void {\n this.ensureCastMessageListener();\n this.setupPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.plyr) {\n this.ensureCastMessageListener();\n this.setupPlayer();\n }\n }\n\n private setupPlayer() {\n if (!this.videoRef) {\n return;\n }\n const videoElement = this.videoRef.nativeElement;\n const isIOS = this.isIOSContext();\n this.applyInlineAttributes(videoElement, isIOS);\n\n this.plyr?.destroy();\n this.startTimeApplied = false;\n this.pendingStartTime = undefined;\n this.endedLoggedOnPause = false;\n this.endedOverlayVisible = false;\n const shouldAutoplay = false;\n const startMuted = shouldAutoplay;\n const speedOptions = [1, 1.25, 1.5, 2];\n const baseControls = [\n 'play-large',\n 'play',\n 'progress',\n 'current-time',\n 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ];\n const options: any = {\n controls: isIOS ? baseControls.filter((c) => c !== 'fullscreen') : baseControls,\n clickToPlay: true,\n autoplay: shouldAutoplay,\n muted: startMuted,\n keyboard: { focused: true, global: false },\n hideControls: true,\n i18n: {\n speed: \"Velocidade\",\n },\n speed: {\n selected: 1,\n options: speedOptions,\n }, \n fullscreen: {\n enabled: !isIOS,\n fallback: !isIOS,\n iosNative: true,\n container: null,\n },\n };\n options.vimeo = {\n autopause: true,\n autoplay: shouldAutoplay,\n muted: startMuted,\n playsinline: true,\n byline: false,\n portrait: false,\n title: false,\n pip: false,\n controls: false,\n };\n\n this.plyr = new (Plyr as any).default(videoElement, options);\n this.plyr.source = {\n type: 'video',\n sources: [{ src: this.config.video_id, provider: 'vimeo' }],\n };\n\n this.bindIOSFullscreenLogging(videoElement, isIOS);\n this.bindEvents();\n }\n\n private bindEvents() {\n if (!this.plyr) return;\n let durationPosted = false;\n const THROTTLE_MS = 300;\n let lastEmit = 0;\n const onTimeUpdate = () => {\n setTimeout(() => {\n const currentReal = this.plyr.currentTime || 0;\n const durationReal = this.plyr.duration || 0;\n const current = Math.floor(currentReal);\n const duration = Math.floor(this.plyr.duration);\n if (!durationPosted && duration > 0) {\n durationPosted = true;\n console.log('event: duration ' + duration);\n parent.postMessage('duration:' + duration, '*');\n }\n const percent = duration > 0 ? +((current / duration) * 100).toFixed(2) : 0;\n const now = performance.now();\n if (now - lastEmit >= THROTTLE_MS) {\n lastEmit = now;\n this.progressService.progress$.next({ currentTime: currentReal, duration: durationReal, percent });\n }\n parent.postMessage('currentTime:' + current, '*');\n console.log('event: current_time ' + current);\n console.log('event: duration ' + duration);\n this.postCastEvent({\n event: 'current_time',\n currentTime: current,\n duration,\n });\n this.tryApplyPendingStartTime();\n }, 0);\n \n };\n\n this.plyr.on('ready', () => {\n this.applySavedStartTime();\n const duration = this.plyr.duration || 0;\n console.log('event: ready');\n if (duration > 0) {\n parent.postMessage('duration:' + duration, '*');\n }\n parent.postMessage('playerIsReadyToPlay', '*');\n this.postCastEvent({\n event: 'ready',\n duration,\n currentTime: this.plyr.currentTime || 0,\n });\n this.ready.emit();\n });\n\n const reapplyStartTime = () => {\n if (typeof this.pendingStartTime === 'number' || !this.startTimeApplied) {\n this.applySavedStartTime(true);\n }\n if (this.startTimeApplied) {\n this.plyr?.off?.('loadedmetadata', reapplyStartTime);\n this.plyr?.off?.('durationchange', reapplyStartTime);\n }\n };\n\n this.plyr.on('timeupdate', onTimeUpdate);\n this.plyr.on('loadedmetadata', reapplyStartTime);\n this.plyr.on('durationchange', reapplyStartTime);\n this.plyr.on('play', () => {\n this.endedLoggedOnPause = false;\n this.tryApplyPendingStartTime();\n //this.jumpToPendingStartTime();\n this.endedOverlayVisible = false;\n this.progressService.ended$.next();\n console.log('event: playing_video');\n if (this.config?.is_live) {\n console.log('event: playing_live');\n parent.postMessage('event: playing_live', '*');\n }\n parent.postMessage('playing_video', '*');\n this.postCastEvent({\n event: 'play',\n currentTime: this.plyr.currentTime || 0,\n });\n onTimeUpdate();\n });\n this.plyr.on('pause', () => {\n this.endedOverlayVisible = false;\n console.log('event: pause');\n parent.postMessage('paused_video', '*');\n this.postCastEvent({\n event: 'pause',\n currentTime: this.plyr.currentTime || 0,\n });\n onTimeUpdate();\n if (this.shouldEmitEndedOnPause()) {\n this.handleEnded(true);\n }\n this.unlockPlayerInteraction();\n });\n this.plyr.on('ended', () => {\n onTimeUpdate();\n this.handleEnded();\n });\n this.plyr.on('enterfullscreen', () => {\n console.log('event: enterfullscreen');\n parent.postMessage('event: fullscreen_enter', '*');\n this.postCastEvent({ event: 'enterfullscreen' });\n });\n this.plyr.on('exitfullscreen', () => {\n console.log('event: exitfullscreen');\n parent.postMessage('event: fullscreen_exit', '*');\n this.postCastEvent({ event: 'exitfullscreen' });\n });\n }\n\n private resolveStartTime(\n last_time: any,\n last_percent: any,\n duration: number\n ): number {\n if (shouldResetProgressToBeginning(this.config)) {\n return 0;\n }\n const dur = Number(duration) || 0;\n if (dur <= 0) {\n if (last_time && Number(last_time) > 0) {\n return Number(last_time);\n }\n return 0;\n }\n if (last_time && Number(last_time) > 0) {\n return Math.min(Number(last_time), dur - 2);\n }\n if (last_percent && Number(last_percent) > 0) {\n let percent = Number(last_percent);\n if (percent > 1) {\n percent = percent / 100;\n }\n return Math.min(percent * dur, dur - 2);\n }\n return 0;\n }\n\n\n private isIOSDevice(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const iOS = /iPad|iPhone|iPod/.test(ua);\n const iPadOS =\n navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n return iOS || iPadOS;\n }\n\n private applySavedStartTime(force = false) {\n if (!this.plyr) return;\n if (this.startTimeApplied && !force) return;\n const duration = this.plyr.duration || 0;\n const start = this.resolveStartTime(\n this.config?.last_time,\n this.config?.last_percent,\n duration\n );\n if (!(start > 0)) {\n this.pendingStartTime = undefined;\n return;\n }\n if (duration > 0) {\n this.pendingStartTime = start;\n this.startTimeApplied = false;\n this.jumpToPendingStartTime();\n this.resumeAfterPendingSeek();\n } else {\n this.pendingStartTime = start;\n this.startTimeApplied = false;\n }\n }\n\n ngOnDestroy(): void {\n this.plyr?.destroy();\n this.removeIOSFullscreenLogging();\n if (typeof window !== 'undefined') {\n if (this.castListenerAttached) {\n window.removeEventListener('message', this.onCastMessage);\n this.castListenerAttached = false;\n }\n window.removeEventListener('message', this.onCastMessage);\n }\n }\n\n private postCastEvent(payload: Record<string, unknown>) {\n parent.postMessage(JSON.stringify(payload), '*');\n }\n\n private applyTheme(colors?: { [key: string]: string }) {\n if (!colors) return;\n const STYLE_ID = 'webplayer-theme-vars';\n let styleEl = this.document.getElementById(\n STYLE_ID\n ) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = this.document.createElement('style');\n styleEl.id = STYLE_ID;\n this.document.head.appendChild(styleEl);\n }\n\n const rootStyle = this.document.documentElement.style;\n const allPairs: Array<[string, string]> = [];\n\n for (const key in colors) {\n if (Object.prototype.hasOwnProperty.call(colors, key)) {\n const cssVarName = `--theme-${key.replace('progresss-', 'progress-')}`;\n const cssVarValue = String(colors[key]);\n allPairs.push([cssVarName, cssVarValue]);\n try {\n rootStyle.setProperty(cssVarName, cssVarValue);\n } catch {}\n }\n }\n\n const cssRule = `:root{\n${allPairs.map(([n, v]) => ` ${n}: ${v};`).join('\\n')}\n}`;\n styleEl.textContent = cssRule;\n }\n\n private seekTo(time: number) {\n if (!this.plyr) return;\n const target = Math.max(0, Number(time) || 0);\n try {\n this.plyr.currentTime = target;\n } catch {}\n }\n\n private tryApplyPendingStartTime() {\n if (this.startTimeApplied) return;\n if (!this.plyr) return;\n const pending = this.pendingStartTime;\n if (typeof pending !== 'number' || !(pending > 0)) {\n return;\n }\n const duration = this.plyr.duration || 0;\n if (!(duration > 0)) {\n return;\n }\n const current = this.plyr.currentTime || 0;\n const tolerance = 0.35;\n const nearingTarget = Math.abs(current - pending) <= tolerance;\n if (nearingTarget && duration > 0) {\n this.startTimeApplied = true;\n this.pendingStartTime = undefined;\n return;\n }\n this.jumpToPendingStartTime();\n }\n\n private jumpToPendingStartTime() {\n if (this.startTimeApplied) return;\n if (!this.plyr) return;\n const pending = this.pendingStartTime;\n if (typeof pending !== 'number' || !(pending > 0)) {\n return;\n }\n const restoreMute = this.temporarilyMuteForSeek();\n this.seekTo(pending);\n if (restoreMute) {\n setTimeout(() => restoreMute(), 300);\n }\n this.pendingStartTime = undefined;\n this.startTimeApplied = true;\n }\n\n private resumeAfterPendingSeek() {\n if (!this.plyr) return;\n const resume = () => {\n this.plyr?.off?.('seeked', resume);\n try {\n const maybePromise = this.plyr?.play?.();\n if (maybePromise && typeof maybePromise.then === 'function') {\n maybePromise.catch(() => {});\n }\n } catch {}\n };\n try {\n this.plyr?.pause?.();\n } catch {}\n this.plyr?.off?.('seeked', resume);\n this.plyr?.on?.('seeked', resume);\n }\n\n private shouldEmitEndedOnPause(): boolean {\n if (!this.isIOSContext()) {\n return false;\n }\n if (this.endedLoggedOnPause) {\n return false;\n }\n const duration = this.plyr?.duration;\n if (!Number.isFinite(duration) || !duration || duration <= 0) {\n return false;\n }\n const current = this.plyr?.currentTime || 0;\n return duration - current < 1;\n }\n\n private handleEnded(triggeredByPause = false) {\n if (triggeredByPause && this.endedLoggedOnPause) {\n return;\n }\n if (!triggeredByPause) {\n this.endedOverlayVisible = true;\n }\n console.log('event: ended');\n parent.postMessage('event: ended', '*');\n this.postCastEvent({\n event: 'ended',\n currentTime: this.plyr?.currentTime || 0,\n });\n this.progressService.ended$.next();\n this.endedLoggedOnPause = true;\n }\n\n private isIOSContext(): boolean {\n if (this.isIOSDevice()) {\n return true;\n }\n if (typeof window === 'undefined') {\n return false;\n }\n try {\n const params = new URLSearchParams(window.location.search);\n const os = params.get('os');\n if (os && os.toLowerCase() === 'ios') {\n return true;\n }\n } catch {}\n return false;\n }\n\n private temporarilyMuteForSeek(): (() => void) | null {\n const video = this.videoRef?.nativeElement ?? null;\n const prevVideoMuted = video?.muted ?? false;\n const prevPlyrMuted = !!this.plyr?.muted;\n try {\n if (video) {\n video.muted = true;\n }\n if (this.plyr) {\n this.plyr.muted = true;\n }\n } catch {}\n\n return () => {\n try {\n if (video) {\n video.muted = prevVideoMuted;\n }\n } catch {}\n try {\n if (this.plyr) {\n this.plyr.muted = prevPlyrMuted;\n }\n } catch {}\n this.unlockPlayerInteraction();\n };\n }\n\n private applyInlineAttributes(videoElement: HTMLVideoElement, isIOS: boolean) {\n try {\n videoElement.setAttribute('playsinline', 'true');\n videoElement.setAttribute('webkit-playsinline', 'true');\n if (isIOS) {\n videoElement.setAttribute('x5-playsinline', 'true');\n videoElement.setAttribute('x5-video-player-type', 'h5');\n }\n } catch {}\n }\n\n private bindIOSFullscreenLogging(videoElement: HTMLVideoElement, isIOS: boolean) {\n this.removeIOSFullscreenLogging();\n if (!isIOS) return;\n const logEvent = (name: string) => {\n console.log(`event: ${name}`);\n try {\n parent.postMessage(`event: ${name}`, '*');\n } catch {}\n };\n const onEnter = () => logEvent('webkit_enterfullscreen');\n const onExit = () => logEvent('webkit_exitfullscreen');\n try {\n videoElement.addEventListener('webkitbeginfullscreen', onEnter);\n videoElement.addEventListener('webkitendfullscreen', onExit);\n this.iosFullscreenCleanup = () => {\n try {\n videoElement.removeEventListener('webkitbeginfullscreen', onEnter);\n videoElement.removeEventListener('webkitendfullscreen', onExit);\n } catch {}\n this.iosFullscreenCleanup = undefined;\n };\n } catch {}\n }\n\n private removeIOSFullscreenLogging() {\n try {\n this.iosFullscreenCleanup?.();\n } catch {}\n this.iosFullscreenCleanup = undefined;\n }\n\n private ensureCastMessageListener() {\n if (typeof window === 'undefined') {\n return;\n }\n if (this.castListenerAttached) {\n return;\n }\n window.addEventListener('message', this.onCastMessage);\n this.castListenerAttached = true;\n }\n\n private unlockPlayerInteraction() {\n try {\n const controls = this.plyr?.elements?.controls as HTMLElement | undefined;\n if (controls) {\n controls.style.pointerEvents = 'auto';\n }\n const overlay = this.plyr?.elements?.buttons?.play as HTMLElement | undefined;\n if (overlay) {\n overlay.style.pointerEvents = 'auto';\n }\n } catch {}\n }\n\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerConfig } from '../../webplayer.types';\nimport { WebplayerProgressService } from '../../progress.service';\nimport { shouldResetProgressToBeginning } from '../../utils/playback-reset';\n\ndeclare global {\n interface Window {\n pandascripttag?: any[];\n PandaPlayer?: any;\n }\n}\n\n@Component({\n selector: 'app-panda-player',\n template: '', // O conteúdo do DOM é gerenciado programaticamente\n standalone: true,\n imports: [CommonModule],\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep .panda-player,\n :host ::ng-deep iframe[src*=\"pandavideo.com.br\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n border: none !important;\n }\n `]\n})\nexport class PandaPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n\n private pandaPlayer?: any;\n private pandaContainer?: HTMLDivElement;\n private pandaProgressThrottle = 0;\n private primaryColor?: string;\n private controlsColor?: string;\n\n constructor(\n private elementRef: ElementRef,\n private progressService: WebplayerProgressService,\n ) {}\n\n ngOnInit() {\n if (this.config?.video_host !== 'panda') {\n return;\n }\n this.applyTheme();\n this.loadPandaPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && this.pandaPlayer) {\n this.loadPandaPlayer();\n }\n }\n\n private applyTheme() {\n if (this.config?.ui?.colors) {\n this.primaryColor = this.config.ui.colors['progress-view-off'];\n this.controlsColor = this.config.ui.colors['text-color'];\n }\n }\n\n private loadPandaPlayer() {\n if (!this.config.embed) {\n return;\n }\n\n this.ensurePandaScript().then(() => {\n const host: HTMLElement = this.elementRef.nativeElement;\n console.log('Panda Player Config:', this.config, host);\n if (!this.pandaContainer) {\n this.pandaContainer = document.createElement(\"div\");\n this.pandaContainer.style.width = \"100%\";\n this.pandaContainer.style.height = \"100%\";\n this.pandaContainer.id = `panda-${this.config.video_id || Math.random().toString(36).slice(2)}`;\n host.appendChild(this.pandaContainer);\n }\n\n try {\n this.pandaPlayer?.destroy?.();\n } catch {}\n\n const videoId = this.config.video_external_id || (this.config.embed ? this.extractPandaVideoId(this.config.embed) : undefined);\n const libraryId = (this.config.embed ? this.extractPandaLibraryId(this.config.embed) : undefined);\n\n window.pandascripttag = window.pandascripttag || [];\n window.pandascripttag.push(() => {\n this.pandaPlayer = new (window as any).PandaPlayer(\n this.pandaContainer!.id,\n {\n video_external_id: videoId,\n library_id: libraryId,\n onReady: () => {\n if (this.primaryColor) {\n try { this.pandaPlayer.setColor('primary', this.primaryColor); } catch {}\n }\n if (this.controlsColor) {\n try { this.pandaPlayer.setColor('secondary', this.controlsColor); } catch {}\n }\n\n const dur = this.pandaPlayer?.getDuration?.() || 0;\n const start = this.resolveStartTime(this.config.last_time, this.config.last_percent, dur);\n if (start > 0) {\n try { this.pandaPlayer.setCurrentTime(start); } catch {}\n }\n if (this.config.autoplay) {\n try { this.pandaPlayer.play(); } catch {}\n }\n this.ready.emit();\n },\n playerConfigs: {\n autoplay: !!this.config.autoplay,\n smartAutoplay: !!this.config.autoplay,\n },\n \n }\n );\n\n this.pandaPlayer.onEvent((event: any) => {\n this.handlePandaEvent(event);\n });\n });\n });\n }\n\n ngOnDestroy() {\n try {\n this.pandaPlayer?.destroy?.();\n } catch {}\n try {\n this.pandaContainer?.remove?.();\n } catch {}\n }\n\n private async ensurePandaScript(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (window.PandaPlayer) return resolve();\n const existing = document.querySelector(\n 'script[src^=\"https://player.pandavideo.com.br/api.v2.js\"]'\n ) as HTMLScriptElement;\n if (existing) {\n existing.addEventListener(\"load\", () => resolve());\n if ((existing as any).readyState === \"complete\") resolve();\n return;\n }\n const script = document.createElement(\"script\");\n script.src = \"https://player.pandavideo.com.br/api.v2.js\";\n script.async = true;\n script.onload = () => resolve();\n document.head.appendChild(script);\n });\n }\n\n private extractPandaVideoId(url: string): string | undefined {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n try {\n u = new URL(decodeURIComponent(url));\n } catch {\n return undefined;\n }\n }\n try {\n const v = u.searchParams.get(\"v\") || undefined;\n return v || undefined;\n } catch {\n return undefined;\n }\n }\n\n private extractPandaLibraryId(url: string): string | undefined {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n try {\n u = new URL(decodeURIComponent(url));\n } catch {\n return undefined;\n }\n }\n try {\n const { hostname } = u;\n const firstLabel = hostname.split(\".\")[0] || \"\";\n const maybeLib = firstLabel.startsWith(\"player-\")\n ? firstLabel.slice(\"player-\".length)\n : firstLabel;\n return maybeLib || undefined;\n } catch {\n return undefined;\n }\n }\n\n private handlePandaEvent(evt: any) {\n const type = evt?.message || evt?.type;\n const THROTTLE_MS = 300;\n const now = performance.now();\n\n if (type === \"panda_timeupdate\") {\n if (now - this.pandaProgressThrottle >= THROTTLE_MS) {\n this.pandaProgressThrottle = now;\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n }\n }\n\n if (type === \"panda_play\") {\n const snapshot = this.safeProgressSnapshot();\n if (snapshot) {\n this.progressService.progress$.next(snapshot);\n }\n this.notifyParentPlaybackEvent('play', snapshot ?? {});\n }\n\n if (type === \"panda_pause\") {\n try {\n const t = this.pandaPlayer?.getCurrentTime?.() || 0;\n const d = this.pandaPlayer?.getDuration?.() || 0;\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.progressService.progress$.next({ currentTime: t, duration: d, percent: p });\n } catch {}\n this.notifyParentPlaybackEvent('pause', this.safeProgressSnapshot());\n }\n\n if (type === \"panda_ended\") {\n const snapshot = this.safeProgressSnapshot();\n if (snapshot) {\n this.progressService.progress$.next(snapshot);\n }\n this.progressService.ended$.next();\n this.notifyParentPlaybackEvent('ended', snapshot ?? {});\n }\n }\n\n private resolveStartTime(\n last_time: any,\n last_percent: any,\n duration: number,\n opts: { minStartSec?: number; endGuardSec?: number } = {}\n ): number {\n if (shouldResetProgressToBeginning(this.config)) {\n return 0;\n }\n\n const minStartSec = opts.minStartSec ?? 3;\n const endGuardSec = opts.endGuardSec ?? 2;\n\n const dur = Number(duration) || 0;\n if (dur <= 0) return 0;\n\n const hasTime =\n last_time !== undefined && last_time !== null && last_time !== \"\";\n if (hasTime) {\n let t = Number(last_time);\n if (!isFinite(t) || t < 0) t = 0;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n const hasPercent =\n last_percent !== undefined &&\n last_percent !== null &&\n last_percent !== \"\";\n if (hasPercent) {\n let p = Number(last_percent);\n if (!isFinite(p) || p < 0) p = 0;\n if (p > 1) p = p / 100;\n let t = dur * p;\n if (t < minStartSec) return 0;\n return Math.min(dur - endGuardSec, t);\n }\n\n return 0;\n }\n\n private safeProgressSnapshot():\n | { currentTime: number; duration: number; percent: number }\n | null {\n try {\n const currentTime = this.pandaPlayer?.getCurrentTime?.() || 0;\n const duration = this.pandaPlayer?.getDuration?.() || 0;\n const percent =\n duration > 0 ? +((currentTime / duration) * 100).toFixed(2) : 0;\n return { currentTime, duration, percent };\n } catch {\n return null;\n }\n }\n\n private notifyParentPlaybackEvent(event: string, extra: any = {}) {\n if (typeof window === 'undefined') return;\n const target = typeof parent !== 'undefined' ? parent : null;\n if (!target || target === window) return;\n const payload = { event, ...extra };\n try {\n target.postMessage(`event: ${event}`, '*');\n } catch {}\n try {\n target.postMessage(JSON.stringify(payload), '*');\n } catch {}\n }\n}\n","import {\n Component,\n ElementRef,\n Input,\n OnDestroy,\n OnInit,\n OnChanges,\n SimpleChanges,\n Output,\n EventEmitter,\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { WebplayerConfig } from \"../../webplayer.types\";\nimport { WebplayerProgressService } from \"../../progress.service\";\nimport { shouldResetProgressToBeginning } from \"../../utils/playback-reset\";\n\n@Component({\n selector: \"app-scaleup-player\",\n template: \"\", // O conteúdo do DOM é gerenciado programaticamente\n standalone: true,\n imports: [CommonModule],\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n }\n :host ::ng-deep iframe[src*=\"scaleup.com.br\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n border: none !important;\n }\n `,\n ],\n})\nexport class ScaleupPlayerComponent implements OnInit, OnDestroy, OnChanges {\n @Input() config!: WebplayerConfig;\n @Output() ready = new EventEmitter<void>();\n private scaleupIframe?: HTMLIFrameElement;\n private scaleupMessageHandler?: (e: MessageEvent) => void;\n private scaleupProgressThrottle = 0;\n private castMessageHandler?: (e: MessageEvent) => void;\n private lastDuration = 0;\n private lastCurrentTime = 0;\n\n constructor(\n private elementRef: ElementRef,\n private progressService: WebplayerProgressService,\n ) {}\n\n ngOnInit() {\n if (this.config?.video_host !== \"scaleup\") {\n return;\n }\n this.loadScaleupPlayer();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes[\"config\"] && this.scaleupIframe) {\n this.loadScaleupPlayer();\n }\n }\n\n private loadScaleupPlayer() {\n const videoId = this.config.video_id;\n const lastTime = shouldResetProgressToBeginning(this.config)\n ? 0\n : Math.max(0, Math.floor(Number(this.config.last_time) || 0));\n const eventsList = this.resolveEventsList();\n const params = new URLSearchParams({\n seekTo: String(lastTime),\n events: eventsList,\n autoplay: String(!!this.config.autoplay),\n });\n if (this.isIOSContext()) {\n params.set(\"fullscreen\", \"0\");\n }\n const scaleupSrc = `https://player.scaleup.com.br/embed/${videoId}?${params.toString()}`;\n\n const host: HTMLElement = this.elementRef.nativeElement;\n\n if (this.scaleupIframe) {\n this.scaleupIframe.remove();\n }\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = scaleupSrc;\n iframe.allow = \"autoplay; encrypted-media; picture-in-picture; web-share\";\n iframe.referrerPolicy = \"origin-when-cross-origin\";\n iframe.allowFullscreen = false;\n iframe.frameBorder = \"0\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.position = \"absolute\";\n iframe.style.top = \"0\";\n iframe.style.left = \"0\";\n\n host.appendChild(iframe);\n this.scaleupIframe = iframe;\n this.ensureCastMessageHandler();\n\n // Emite evento ready quando o iframe carregar\n iframe.onload = () => {\n this.ready.emit();\n };\n\n if (this.scaleupMessageHandler) {\n window.removeEventListener(\"message\", this.scaleupMessageHandler);\n }\n\n this.scaleupMessageHandler = (e: MessageEvent) => {\n try {\n const originOk =\n typeof e.origin === \"string\" && e.origin.includes(\"scaleup.com.br\");\n console.log(\"Scaleup message received:\", e);\n console.log(\"Origin OK:\", originOk);\n if (!originOk) return;\n\n const data =\n typeof e.data === \"string\"\n ? (() => {\n try {\n return JSON.parse(e.data);\n } catch {\n return undefined;\n }\n })()\n : e.data;\n console.log(\"Parsed data:\", data);\n if (!data || typeof data !== \"object\") return;\n\n const type = (\n data.event ||\n data.type ||\n data.message ||\n data.eventName ||\n \"\"\n )\n .toString()\n .toLowerCase();\n console.log(\"Event type:\", type);\n if (!type) return;\n\n if (type.includes(\"fullscreen\") || type.includes(\"fullwindow\")) {\n try {\n console.log(`scaleup event: ${type}`);\n } catch {}\n }\n\n const t = Number((data.currentTime ?? data.time ?? data.position) || 0);\n const d = Number((data.duration ?? data.totalDuration) || 0);\n const p = d > 0 ? +((t / d) * 100).toFixed(2) : 0;\n this.lastCurrentTime = t;\n this.lastDuration = d;\n this.postCastProgress(t, d);\n\n const THROTTLE_MS = 300;\n const now = performance.now();\n\n if (\n type.includes(\"timeupdate\") ||\n type === \"playing\" ||\n type === \"progress\"\n ) {\n if (now - this.scaleupProgressThrottle >= THROTTLE_MS) {\n this.scaleupProgressThrottle = now;\n this.progressService.progress$.next({\n currentTime: t,\n duration: d,\n percent: p,\n });\n }\n }\n if (type === \"pause\" || type === \"paused\") {\n this.progressService.progress$.next({\n currentTime: t,\n duration: d,\n percent: p,\n });\n }\n if (type === \"ended\" || type === \"end\" || type === \"complete\") {\n this.progressService.progress$.next({\n currentTime: t,\n duration: d,\n percent: p,\n });\n this.progressService.ended$.next();\n console.log(\"event: ended\");\n try {\n parent.postMessage(\"event: ended\", \"*\");\n } catch {}\n }\n } catch {}\n };\n window.addEventListener(\"message\", this.scaleupMessageHandler);\n }\n\n ngOnDestroy() {\n try {\n this.scaleupIframe?.remove();\n } catch {}\n if (this.scaleupMessageHandler) {\n window.removeEventListener(\"message\", this.scaleupMessageHandler);\n this.scaleupMessageHandler = undefined;\n }\n if (this.castMessageHandler) {\n window.removeEventListener(\"message\", this.castMessageHandler);\n this.castMessageHandler = undefined;\n }\n }\n\n private postCastProgress(currentTime: number, duration: number) {\n try {\n parent.postMessage({ currentTime, duration }, \"*\");\n } catch {}\n try {\n parent.postMessage(\"currentTime:\" + currentTime, \"*\");\n parent.postMessage(\"duration:\" + duration, \"*\");\n console.log(\"event: current_time \" + currentTime);\n console.log(\"event: duration \" + duration);\n } catch {}\n }\n\n private sendScaleupCommand(cmd: any) {\n try {\n console.log(\"Scaleup -> iframe command\", cmd);\n const target = this.scaleupIframe?.contentWindow;\n if (!target) return;\n target.postMessage(cmd, \"*\");\n if (cmd?.action && typeof cmd.action === \"string\") {\n target.postMessage({ type: cmd.action }, \"*\");\n target.postMessage(cmd.action, \"*\");\n }\n } catch {}\n }\n\n private ensureCastMessageHandler() {\n if (this.castMessageHandler) return;\n\n this.castMessageHandler = (event: MessageEvent) => {\n console.log(\"Cast message received (Scaleup)\", event.data);\n const data = event?.data;\n if (!data) return;\n\n let payload: any = data;\n if (typeof data === \"string\") {\n try {\n payload = JSON.parse(data);\n } catch {\n payload = { action: data };\n }\n }\n const actionRaw = payload?.action ?? payload?.type ?? \"\";\n const action =\n typeof actionRaw === \"string\" ? actionRaw.toLowerCase() : \"\";\n console.log(\"Cast normalized action\", action);\n\n if (action === \"request-iframe-media-metadata\") {\n const duration = this.lastDuration || 0;\n const currentTime = this.lastCurrentTime || 0;\n this.postCastProgress(currentTime, duration);\n return;\n }\n\n if (action === \"play\") {\n this.sendScaleupCommand({ action: \"play\" });\n return;\n }\n\n if (action === \"pause\") {\n this.sendScaleupCommand({ action: \"pause\" });\n return;\n }\n\n if (action === \"seek\" && typeof payload.time === \"number\") {\n this.sendScaleupCommand({ action: \"seek\", time: payload.time });\n return;\n }\n };\n\n window.addEventListener(\"message\", this.castMessageHandler);\n }\n\n private resolveEventsList(): string {\n const baseEvents = [\n \"controlsdisabled\",\n \"controlsenabled\",\n \"dispose\",\n \"durationchange\",\n \"ended\",\n \"enterpictureinpicture\",\n \"error\",\n \"firstplay\",\n \"leavepictureinpicture\",\n \"loadedmetadata\",\n \"loadstart\",\n \"pause\",\n \"play\",\n \"playerreset\",\n \"playerresize\",\n \"playing\",\n \"posterchange\",\n \"progress\",\n \"ratechange\",\n \"ready\",\n \"resize\",\n \"seeked\",\n \"seeking\",\n \"textdata\",\n \"timeupdate\",\n \"useractive\",\n \"userinactive\",\n \"volumechange\",\n \"waiting\",\n ];\n if (!this.isIOSContext()) {\n return baseEvents.join(\",\");\n }\n return baseEvents\n .filter(\n (name) =>\n !name.toLowerCase().includes(\"fullscreen\") &&\n !name.toLowerCase().includes(\"fullwindow\") &&\n !name.toLowerCase().includes(\"airplay\"),\n )\n .join(\",\");\n }\n\n private isIOSDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent || \"\";\n const iOS = /iPad|iPhone|iPod/.test(ua);\n const iPadOS =\n navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1;\n return iOS || iPadOS;\n }\n\n private isIOSContext(): boolean {\n if (this.isIOSDevice()) {\n return true;\n }\n return false;\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GlobalLoadingService {\n private loadingElement: HTMLElement | null;\n\n constructor(@Inject(DOCUMENT) private document: Document) {\n this.loadingElement = this.document.getElementById('global-loading');\n }\n\n public hide() {\n if (this.loadingElement) {\n this.loadingElement.style.opacity = '0';\n setTimeout(() => {\n if (this.loadingElement) {\n this.loadingElement.style.display = 'none';\n }\n }, 500); // Duração da transição do CSS\n }\n }\n\n public show() {\n if (this.loadingElement) {\n this.loadingElement.style.display = 'flex';\n this.loadingElement.style.opacity = '1';\n }\n }\n}","import { CommonModule } from \"@angular/common\";\nimport { Component, Inject, Input } from \"@angular/core\";\n\nimport { PlyrPlayerComponent } from \"../players/plyr-player/plyr-player.component\";\nimport { VimeoPlayerComponent } from \"../players/vimeo-player/vimeo-player.component\";\nimport { PandaPlayerComponent } from \"../players/panda-player/panda-player.component\";\nimport { ScaleupPlayerComponent } from \"../players/scaleup-player/scaleup-player.component\";\n\nimport { WebplayerConfig, WEPLAYER_CONFIG } from \"../webplayer.types\";\nimport { GlobalLoadingService } from \"../global.service\";\n\n@Component({\n selector: \"app-player-loader\",\n template: `\n <div style=\"width: 100%; height: 100%;\">\n <div [ngSwitch]=\"config?.video_host\" style=\"width: 100%; height: 100%;\">\n <app-plyr-player\n *ngSwitchCase=\"'hls'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'mp4'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-plyr-player\n *ngSwitchCase=\"'youtube'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-plyr-player>\n <app-vimeo-player\n *ngSwitchCase=\"'vimeo'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-vimeo-player>\n <app-panda-player\n *ngSwitchCase=\"'panda'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-panda-player>\n <app-scaleup-player\n *ngSwitchCase=\"'scaleup'\"\n [config]=\"config\"\n (ready)=\"onPlayerReady()\"\n ></app-scaleup-player>\n <div *ngSwitchDefault>\n <p>Player não suportado ou configuração não fornecida.</p>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n `,\n ],\n standalone: true,\n imports: [\n CommonModule,\n PlyrPlayerComponent,\n VimeoPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n ],\n})\nexport class PlayerLoaderComponent {\n @Input() config!: WebplayerConfig | any;\n playerType: \"plyr\" | \"panda\" | \"scaleup\" | null = null;\n\n constructor(\n @Inject(WEPLAYER_CONFIG) private defaultConfig: WebplayerConfig,\n private globalLoading: GlobalLoadingService\n ) {\n this.config = { ...this.defaultConfig, ...this.config };\n this.playerType = this.getPlayerType(this.config.videoUrl);\n }\n\n private getPlayerType(videoUrl: string): \"plyr\" | \"panda\" | \"scaleup\" | null {\n if (videoUrl?.includes(\"panda\")) return \"panda\";\n if (videoUrl?.includes(\"scaleup\")) return \"scaleup\";\n if (\n videoUrl?.includes(\"vimeo\") ||\n videoUrl?.includes(\"youtube\") ||\n videoUrl?.includes(\".m3u8\") ||\n videoUrl?.includes(\".mp4\")\n )\n return \"plyr\";\n return \"plyr\";\n }\n\n onPlayerReady() {\n this.globalLoading.hide();\n }\n}\n","import { Component, Output, EventEmitter, OnDestroy, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { WebplayerConfig } from './webplayer.types';\nimport { WebplayerConfigService } from './webplayer-config.service';\nimport { WebplayerProgress, WebplayerProgressService } from './progress.service';\nimport { PlayerLoaderComponent } from './player-loader/player-loader.component';\n\n@Component({\n selector: 'edm-webplayer',\n template: `\n <app-player-loader [config]=\"config\" *ngIf=\"config\"></app-player-loader>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n `,\n ],\n standalone: true,\n imports: [CommonModule, PlayerLoaderComponent],\n})\nexport class WebplayerComponent implements OnInit, OnDestroy {\n @Output('playProgress') progress = new EventEmitter<WebplayerProgress>();\n @Output('playEnded') ended = new EventEmitter<void>();\n\n config: WebplayerConfig | null = null;\n private subscriptions = new Subscription();\n\n constructor(\n private configService: WebplayerConfigService,\n private progressService: WebplayerProgressService\n ) {}\n\n ngOnInit(): void {\n this.subscriptions.add(\n this.configService.config$.subscribe(config => {\n this.config = config;\n })\n );\n\n this.subscriptions.add(\n this.progressService.progress$.subscribe(p => this.progress.emit(p))\n );\n\n this.subscriptions.add(\n this.progressService.ended$.subscribe(() => this.ended.emit())\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'timeFormat', standalone: true })\nexport class TimeFormatPipe implements PipeTransform {\n transform(seconds: number | null | undefined): string {\n const val = typeof seconds === 'number' && isFinite(seconds) ? seconds : 0;\n const sec = Math.floor(val % 60).toString().padStart(2, '0');\n const min = Math.floor(val / 60).toString().padStart(2, '0');\n const hrs = Math.floor(val / 3600);\n if (hrs > 0) {\n const mm = Math.floor((val % 3600) / 60).toString().padStart(2, '0');\n return `${hrs}:${mm}:${sec}`;\n }\n return `${min}:${sec}`;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WebplayerComponent } from './webplayer.component';\nimport { TimeFormatPipe } from './utils/time-format.pipe';\nimport { PlayerLoaderComponent } from './player-loader/player-loader.component';\nimport { PlyrPlayerComponent } from './players/plyr-player/plyr-player.component';\nimport { PandaPlayerComponent } from './players/panda-player/panda-player.component';\nimport { ScaleupPlayerComponent } from './players/scaleup-player/scaleup-player.component';\n\n@NgModule({\n imports: [\n CommonModule,\n WebplayerComponent,\n PlayerLoaderComponent,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n TimeFormatPipe,\n ],\n exports: [\n WebplayerComponent,\n PlayerLoaderComponent,\n PlyrPlayerComponent,\n PandaPlayerComponent,\n ScaleupPlayerComponent,\n TimeFormatPipe,\n ]\n})\nexport class WebplayerModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WebplayerProgressService","i1.GlobalLoadingService","i1.WebplayerConfigService","i2.WebplayerProgressService"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edm-webplayer/webplayer-angular",
3
- "version": "0.2.30",
3
+ "version": "0.2.31",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.14",
6
6
  "@angular/core": "^19.2.14",