@hopeplayer/core 1.6.0 → 1.7.0

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.
Files changed (117) hide show
  1. package/dist/HopePlayerElement.d.ts +23 -0
  2. package/dist/HopePlayerElement.d.ts.map +1 -1
  3. package/dist/chunks/{adTriggers-BIAWe8o4.js → adTriggers-DVqgm92F.js} +94 -93
  4. package/dist/chunks/{adTriggers-BIAWe8o4.js.map → adTriggers-DVqgm92F.js.map} +1 -1
  5. package/dist/chunks/{ads-DlpHPpR9.js → ads-eSKyiH1o.js} +2 -2
  6. package/dist/chunks/{ads-DlpHPpR9.js.map → ads-eSKyiH1o.js.map} +1 -1
  7. package/dist/chunks/audioDescription-cpprKeB-.js +146 -0
  8. package/dist/chunks/audioDescription-cpprKeB-.js.map +1 -0
  9. package/dist/chunks/{cast-vHyi7oV_.js → cast-DEowHmqA.js} +29 -28
  10. package/dist/chunks/{cast-vHyi7oV_.js.map → cast-DEowHmqA.js.map} +1 -1
  11. package/dist/chunks/{docPip-wybMVP1H.js → docPip-Bh6BWPk-.js} +30 -20
  12. package/dist/chunks/docPip-Bh6BWPk-.js.map +1 -0
  13. package/dist/chunks/heatmap-Bz_EMQFk.js +117 -0
  14. package/dist/chunks/heatmap-Bz_EMQFk.js.map +1 -0
  15. package/dist/chunks/{history-CwqLXiZi.js → history-ZSdDDsRF.js} +35 -34
  16. package/dist/chunks/{history-CwqLXiZi.js.map → history-ZSdDDsRF.js.map} +1 -1
  17. package/dist/chunks/interactive-ClJC5Vyo.js +213 -0
  18. package/dist/chunks/interactive-ClJC5Vyo.js.map +1 -0
  19. package/dist/chunks/{markers-L69W3kj6.js → markers-D32rI-x-.js} +2 -2
  20. package/dist/chunks/{markers-L69W3kj6.js.map → markers-D32rI-x-.js.map} +1 -1
  21. package/dist/chunks/multiview-CL1WfJKt.js +295 -0
  22. package/dist/chunks/multiview-CL1WfJKt.js.map +1 -0
  23. package/dist/chunks/{pauseAd-BQQe21X4.js → pauseAd-DF7KGwUs.js} +32 -31
  24. package/dist/chunks/{pauseAd-BQQe21X4.js.map → pauseAd-DF7KGwUs.js.map} +1 -1
  25. package/dist/chunks/{player-D2_HRzot.js → player-B7mYS--8.js} +754 -682
  26. package/dist/chunks/player-B7mYS--8.js.map +1 -0
  27. package/dist/chunks/{playlist-CHfStNbQ.js → playlist-BkhIOfCy.js} +2 -2
  28. package/dist/chunks/{playlist-CHfStNbQ.js.map → playlist-BkhIOfCy.js.map} +1 -1
  29. package/dist/chunks/{pluginHost-cN2uGFeG.js → pluginHost-CXqkjNV1.js} +2 -2
  30. package/dist/chunks/{pluginHost-cN2uGFeG.js.map → pluginHost-CXqkjNV1.js.map} +1 -1
  31. package/dist/chunks/{redirectScreen-TIqLdvBY.js → redirectScreen-DgmjFVJH.js} +51 -39
  32. package/dist/chunks/redirectScreen-DgmjFVJH.js.map +1 -0
  33. package/dist/chunks/rewardedUnlock-BL97P5ht.js +265 -0
  34. package/dist/chunks/{rewardedUnlock-DUqYwXTr.js.map → rewardedUnlock-BL97P5ht.js.map} +1 -1
  35. package/dist/chunks/{segments-Ds-c1b5e.js → segments-CuQQEIAX.js} +2 -2
  36. package/dist/chunks/{segments-Ds-c1b5e.js.map → segments-CuQQEIAX.js.map} +1 -1
  37. package/dist/chunks/share-BdqQ8sGE.js +216 -0
  38. package/dist/chunks/share-BdqQ8sGE.js.map +1 -0
  39. package/dist/chunks/{skipSegments-ByNoF1qZ.js → skipSegments-BbepQ4Y6.js} +2 -2
  40. package/dist/chunks/{skipSegments-ByNoF1qZ.js.map → skipSegments-BbepQ4Y6.js.map} +1 -1
  41. package/dist/chunks/sponsorship-DoAZBbHE.js +241 -0
  42. package/dist/chunks/{sponsorship-BT21uwN5.js.map → sponsorship-DoAZBbHE.js.map} +1 -1
  43. package/dist/chunks/{spriteThumbnails-Cr9UmkM9.js → spriteThumbnails-BYg-DHx4.js} +2 -2
  44. package/dist/chunks/{spriteThumbnails-Cr9UmkM9.js.map → spriteThumbnails-BYg-DHx4.js.map} +1 -1
  45. package/dist/chunks/{story-CodA2dfn.js → story-DcBG6jUg.js} +2 -2
  46. package/dist/chunks/{story-CodA2dfn.js.map → story-DcBG6jUg.js.map} +1 -1
  47. package/dist/chunks/{transcript-LG7E9UYE.js → transcript-CHPQ6S6E.js} +33 -13
  48. package/dist/chunks/transcript-CHPQ6S6E.js.map +1 -0
  49. package/dist/controls/SeekBar.d.ts.map +1 -1
  50. package/dist/hls/SourceManager.d.ts +2 -0
  51. package/dist/hls/SourceManager.d.ts.map +1 -1
  52. package/dist/hope-player.js +3 -3
  53. package/dist/i18n/index.d.ts +9 -0
  54. package/dist/i18n/index.d.ts.map +1 -1
  55. package/dist/i18n/locales/en.d.ts +2 -2
  56. package/dist/i18n/locales/en.d.ts.map +1 -1
  57. package/dist/i18n/locales/tr.d.ts +2 -2
  58. package/dist/i18n/locales/tr.d.ts.map +1 -1
  59. package/dist/i18n/types.d.ts +27 -0
  60. package/dist/i18n/types.d.ts.map +1 -1
  61. package/dist/index.d.ts +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/plugins/ad-triggers/index.d.ts.map +1 -1
  64. package/dist/plugins/audio-description/AudioDescription.d.ts +52 -0
  65. package/dist/plugins/audio-description/AudioDescription.d.ts.map +1 -0
  66. package/dist/plugins/audio-description/index.d.ts +6 -0
  67. package/dist/plugins/audio-description/index.d.ts.map +1 -0
  68. package/dist/plugins/audio-description/strings.d.ts +8 -0
  69. package/dist/plugins/audio-description/strings.d.ts.map +1 -0
  70. package/dist/plugins/cast/index.d.ts.map +1 -1
  71. package/dist/plugins/doc-pip/index.d.ts.map +1 -1
  72. package/dist/plugins/doc-pip/strings.d.ts +8 -0
  73. package/dist/plugins/doc-pip/strings.d.ts.map +1 -0
  74. package/dist/plugins/heatmap/Heatmap.d.ts +8 -0
  75. package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -1
  76. package/dist/plugins/heatmap/index.d.ts.map +1 -1
  77. package/dist/plugins/heatmap/strings.d.ts +8 -0
  78. package/dist/plugins/heatmap/strings.d.ts.map +1 -0
  79. package/dist/plugins/history/index.d.ts.map +1 -1
  80. package/dist/plugins/interactive/index.d.ts.map +1 -1
  81. package/dist/plugins/interactive/strings.d.ts +8 -0
  82. package/dist/plugins/interactive/strings.d.ts.map +1 -0
  83. package/dist/plugins/multiview/Multiview.d.ts +92 -0
  84. package/dist/plugins/multiview/Multiview.d.ts.map +1 -0
  85. package/dist/plugins/multiview/index.d.ts +6 -0
  86. package/dist/plugins/multiview/index.d.ts.map +1 -0
  87. package/dist/plugins/multiview/strings.d.ts +8 -0
  88. package/dist/plugins/multiview/strings.d.ts.map +1 -0
  89. package/dist/plugins/pause-ad/index.d.ts.map +1 -1
  90. package/dist/plugins/redirect-screen/index.d.ts.map +1 -1
  91. package/dist/plugins/redirect-screen/strings.d.ts +8 -0
  92. package/dist/plugins/redirect-screen/strings.d.ts.map +1 -0
  93. package/dist/plugins/rewarded/index.d.ts.map +1 -1
  94. package/dist/plugins/share/Share.d.ts +45 -0
  95. package/dist/plugins/share/Share.d.ts.map +1 -0
  96. package/dist/plugins/share/index.d.ts +6 -0
  97. package/dist/plugins/share/index.d.ts.map +1 -0
  98. package/dist/plugins/share/strings.d.ts +8 -0
  99. package/dist/plugins/share/strings.d.ts.map +1 -0
  100. package/dist/plugins/skip-segments/index.d.ts.map +1 -1
  101. package/dist/plugins/sponsorship/index.d.ts.map +1 -1
  102. package/dist/plugins/transcript/index.d.ts.map +1 -1
  103. package/dist/plugins/transcript/strings.d.ts +8 -0
  104. package/dist/plugins/transcript/strings.d.ts.map +1 -0
  105. package/dist/types/index.d.ts +93 -0
  106. package/dist/types/index.d.ts.map +1 -1
  107. package/package.json +1 -1
  108. package/dist/chunks/docPip-wybMVP1H.js.map +0 -1
  109. package/dist/chunks/heatmap-Bb7neaYU.js +0 -92
  110. package/dist/chunks/heatmap-Bb7neaYU.js.map +0 -1
  111. package/dist/chunks/interactive-CgltIneu.js +0 -189
  112. package/dist/chunks/interactive-CgltIneu.js.map +0 -1
  113. package/dist/chunks/player-D2_HRzot.js.map +0 -1
  114. package/dist/chunks/redirectScreen-TIqLdvBY.js.map +0 -1
  115. package/dist/chunks/rewardedUnlock-DUqYwXTr.js +0 -264
  116. package/dist/chunks/sponsorship-BT21uwN5.js +0 -240
  117. package/dist/chunks/transcript-LG7E9UYE.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  var A = Object.defineProperty;
2
2
  var g = (l, t, e) => t in l ? A(l, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : l[t] = e;
3
3
  var n = (l, t, e) => g(l, typeof t != "symbol" ? t + "" : t, e);
4
- import { i as b, c as P } from "./player-D2_HRzot.js";
4
+ import { i as b, c as P } from "./player-B7mYS--8.js";
5
5
  const I = {
6
6
  startMode: "after_current",
7
7
  startIndex: 0,
@@ -241,4 +241,4 @@ export {
241
241
  w as PlaylistRunner,
242
242
  N as installPlaylist
243
243
  };
244
- //# sourceMappingURL=playlist-CHfStNbQ.js.map
244
+ //# sourceMappingURL=playlist-BkhIOfCy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"playlist-CHfStNbQ.js","sources":["../../src/plugins/playlist/PlaylistRunner.ts","../../src/plugins/playlist/index.ts"],"sourcesContent":["import { createIcon } from '../../icons/Icon';\nimport type { PlayableItem, PlaylistOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { isAudioOutputError } from '../../utils/media-error';\n\nexport interface PlaylistPlayerContext {\n videoEl: HTMLVideoElement;\n hostEl: HTMLElement;\n /** Liste UI'ının monte edileceği, shadow root içindeki panel. */\n panelEl: HTMLElement;\n loadSource(src: string, type?: string): Promise<void>;\n setPoster(url: string): void;\n /** AdsController varsa retry/VMAP durumunu sıfırlayıp item'ın (varsa) kendi adTagPreroll'üyle yeniden reklam ister — yoksa no-op. */\n requestFreshAd(prerollTag?: string): void;\n /** Postroll sürüyorsa sonraki öğe `hp:adend`'i bekler. */\n isAdActive?(): boolean;\n i18n: HopeLocaleStrings;\n}\n\ntype SourceMode = 'hls' | 'mp4';\n\ninterface Attempt {\n id: number;\n index: number;\n mode: SourceMode;\n tried: Set<SourceMode>;\n mp4Index: number;\n}\n\nconst DEFAULTS: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>> = {\n startMode: 'after_current',\n startIndex: 0,\n loop: false,\n autoplayNext: true,\n preferHls: true,\n adsOnItemChange: true,\n};\n\n/** Tek player üzerinde sıralı oynatma listesi (startMode, loop, hata fallback zinciri). */\nexport class PlaylistRunner {\n private readonly options: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>>;\n private readonly items: PlayableItem[];\n\n private index: number;\n private destroyed = false;\n private switching = false;\n private playlistActive = false;\n private startPendingAfterCurrent = false;\n private attemptId = 0;\n private attempt: Attempt | null = null;\n private lastErrorAt = 0;\n private lastAdsIndex: number | null = null;\n private lastDispatchedIndex: number | null = null;\n private userHasStartedPlayback = false;\n\n private readonly ui: {\n root: HTMLElement;\n titleEl: HTMLElement;\n listEl: HTMLElement;\n prevBtn: HTMLButtonElement;\n nextBtn: HTMLButtonElement;\n itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }>;\n };\n\n constructor(\n private readonly ctx: PlaylistPlayerContext,\n private readonly rawOptions: PlaylistOptions\n ) {\n this.options = { ...DEFAULTS, ...rawOptions };\n this.items = Array.isArray(rawOptions.items) ? rawOptions.items : [];\n this.index = this.clampIndex(this.options.startIndex);\n\n this.ui = this.buildUi();\n this.bindPlayerEvents();\n this.init();\n }\n\n // ── lifecycle ──\n\n private init(): void {\n if (!this.items.length) return;\n\n if (this.options.startMode === 'after_current') {\n this.startPendingAfterCurrent = true;\n this.playlistActive = false;\n this.setActive(this.index);\n return;\n }\n\n this.playlistActive = true;\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n refreshLabels(): void {\n this.ui.titleEl.textContent = this.playlistTitleText();\n this.ui.prevBtn.setAttribute('aria-label', this.ctx.i18n.playlistPrev);\n this.ui.nextBtn.setAttribute('aria-label', this.ctx.i18n.playlistNext);\n this.ui.itemEls.forEach((entry, idx) => {\n const item = this.items[idx];\n if (item && !item.title) entry.titleRow.textContent = this.ctx.i18n.videoFallbackTitle(idx);\n });\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.ctx.videoEl.removeEventListener('ended', this.onEnded);\n this.ctx.videoEl.removeEventListener('error', this.onError);\n this.ctx.videoEl.removeEventListener('play', this.onUserPlay);\n this.ui.root.remove();\n }\n\n // ── public api ──\n\n start(opts: { index?: number } = {}): void {\n if (this.destroyed || !this.items.length) return;\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.index = this.clampIndex(opts.index ?? this.index);\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n next(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n\n if (this.index < this.items.length - 1) this.index++;\n else if (this.options.loop) this.index = 0;\n else return;\n\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n prev(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n if (this.index === 0) return;\n this.index--;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n setIndex(i: number): void {\n if (this.destroyed || !this.items.length) return;\n this.index = this.clampIndex(i);\n this.setActive(this.index);\n if (!this.playlistActive) return this.start({ index: this.index });\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n getIndex(): number {\n return this.index;\n }\n\n isActive(): boolean {\n return this.playlistActive;\n }\n\n // ── player events ──\n\n private bindPlayerEvents(): void {\n this.ctx.videoEl.addEventListener('ended', this.onEnded);\n this.ctx.videoEl.addEventListener('error', this.onError);\n this.ctx.videoEl.addEventListener('play', this.onUserPlay);\n this.ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n private readonly onUserPlay = (): void => {\n this.userHasStartedPlayback = true;\n };\n\n private readonly onEnded = (): void => {\n if (this.ctx.isAdActive?.()) {\n const host = this.ctx.hostEl;\n const resume = (): void => {\n host.removeEventListener('hp:adend', resume);\n if (!this.destroyed && this.ctx.videoEl.ended) this.onEnded();\n };\n host.addEventListener('hp:adend', resume);\n return;\n }\n if (this.startPendingAfterCurrent && !this.playlistActive) {\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true, isPlaylistStart: true });\n return;\n }\n if (this.playlistActive) this.next();\n };\n\n private readonly onError = (): void => {\n if (this.destroyed || !this.playlistActive) return;\n // Ses aygıtı yok (Firefox): video sessiz oynamaya devam ediyor — sonraki öğeye atlama.\n if (isAudioOutputError(this.ctx.videoEl.error)) return;\n const now = Date.now();\n if (now - this.lastErrorAt < 200) return;\n this.lastErrorAt = now;\n void this.fallbackOrSkip();\n };\n\n private readonly onTimeUpdate = (): void => {\n this.updateProgress();\n };\n\n // ── core load ──\n\n private async loadAndPlay(\n i: number,\n opts: { userInitiated?: boolean; forceMode?: SourceMode | null; forceMp4Index?: number | null; isFallback?: boolean; isPlaylistStart?: boolean } = {}\n ): Promise<void> {\n if (this.destroyed || this.switching || !this.playlistActive) return;\n this.switching = true;\n\n const item = this.items[i];\n if (!item) {\n this.switching = false;\n return;\n }\n const attemptId = ++this.attemptId;\n const mode = opts.forceMode ?? this.resolveMode(item);\n\n let tried = new Set<SourceMode>([mode]);\n let mp4Index = opts.forceMp4Index ?? 0;\n if (opts.isFallback && this.attempt?.index === i && this.attempt?.tried) {\n tried = new Set(this.attempt.tried);\n tried.add(mode);\n if (opts.forceMp4Index == null) mp4Index = this.attempt.mp4Index ?? 0;\n }\n this.attempt = { id: attemptId, index: i, mode, tried, mp4Index };\n\n try {\n const payload = this.buildPayload(item, mode, mp4Index);\n if (!payload) throw new Error('No playable source');\n\n this.setActive(i);\n this.ctx.videoEl.pause();\n if (item.image) this.ctx.setPoster(item.image);\n await this.ctx.loadSource(payload.src, payload.type);\n\n if (this.options.adsOnItemChange) this.maybeRequestAds(i, item, !!opts.isFallback);\n\n if (this.shouldAutoPlay(!!opts.userInitiated)) {\n try {\n await this.ctx.videoEl.play();\n } catch {\n /* autoplay engellendi — sessizce geç */\n }\n }\n this.updateProgress();\n } finally {\n this.switching = false;\n }\n }\n\n private async fallbackOrSkip(): Promise<void> {\n if (this.destroyed || !this.attempt) return;\n const item = this.items[this.attempt.index];\n if (!item) return;\n\n if (this.attempt.mode === 'mp4') {\n const mp4List = (item.mp4 || []).filter((v) => v?.src);\n const nextMp4 = (this.attempt.mp4Index ?? 0) + 1;\n if (nextMp4 < mp4List.length) {\n await this.loadAndPlay(this.attempt.index, { forceMode: 'mp4', forceMp4Index: nextMp4, isFallback: true });\n return;\n }\n }\n\n const otherMode: SourceMode = this.attempt.mode === 'hls' ? 'mp4' : 'hls';\n if (this.hasMode(item, otherMode) && !this.attempt.tried.has(otherMode)) {\n await this.loadAndPlay(this.attempt.index, { forceMode: otherMode, isFallback: true });\n return;\n }\n\n this.next();\n }\n\n // ── ads ──\n\n private maybeRequestAds(index: number, item: PlayableItem, _isFallback: boolean): void {\n if (this.lastAdsIndex === index) return;\n this.lastAdsIndex = index;\n this.ctx.requestFreshAd(item.adTagPreroll || this.rawOptions.adTagPreroll);\n }\n\n // ── sources ──\n\n private resolveMode(item: PlayableItem): SourceMode {\n if (this.options.preferHls) return this.hasMode(item, 'hls') ? 'hls' : this.hasMode(item, 'mp4') ? 'mp4' : 'hls';\n return this.hasMode(item, 'mp4') ? 'mp4' : this.hasMode(item, 'hls') ? 'hls' : 'mp4';\n }\n\n private hasMode(item: PlayableItem, mode: SourceMode): boolean {\n return Array.isArray(item[mode]) && item[mode]!.some((v) => v?.src);\n }\n\n private buildPayload(item: PlayableItem, mode: SourceMode, mp4Index = 0): { src: string; type?: string } | null {\n const list = (item[mode] || []).filter((v) => v?.src);\n if (!list.length) return null;\n\n let src;\n if (mode === 'mp4') {\n src = mp4Index > 0 ? list[mp4Index] || list[0] : list.find((v) => v.selected) || list[0];\n } else {\n src = list[0];\n }\n return { src: src!.src, type: src!.type || (mode === 'hls' ? 'application/x-mpegURL' : 'video/mp4') };\n }\n\n private shouldAutoPlay(userInitiated: boolean): boolean {\n if (userInitiated) return true;\n return this.options.autoplayNext && this.userHasStartedPlayback;\n }\n\n private clampIndex(i: number): number {\n if (!Number.isFinite(i) || !this.items.length) return 0;\n return Math.max(0, Math.min(this.items.length - 1, Math.trunc(i)));\n }\n\n // ── ui ──\n\n private buildUi() {\n const ui = this.rawOptions.ui ?? {};\n const root = document.createElement('div');\n root.setAttribute('part', 'playlist-panel');\n root.className = 'hp:flex hp:flex-col hp:gap-2 hp:p-3 hp:bg-surface-elev hp:max-h-80 hp:overflow-y-auto';\n\n const header = document.createElement('div');\n header.className = 'hp:flex hp:items-center hp:justify-between hp:gap-2 hp:mb-1';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'hp:text-sm hp:font-semibold hp:text-on-surface';\n titleEl.textContent = this.playlistTitleText();\n header.appendChild(titleEl);\n\n const navWrap = document.createElement('div');\n navWrap.className = 'hp:flex hp:gap-1';\n const prevBtn = this.navButton('chevron-left', this.ctx.i18n.playlistPrev, () => this.prev());\n const nextBtn = this.navButton('chevron-left', this.ctx.i18n.playlistNext, () => this.next());\n nextBtn.style.transform = 'rotate(180deg)';\n navWrap.append(prevBtn, nextBtn);\n header.appendChild(navWrap);\n\n root.appendChild(header);\n\n const listEl = document.createElement('ul');\n listEl.className = 'hp:flex hp:flex-col hp:gap-1 hp:list-none hp:m-0 hp:p-0';\n root.appendChild(listEl);\n\n const itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }> = [];\n this.items.forEach((item, idx) => {\n const li = document.createElement('li');\n li.className =\n 'hp:flex hp:items-center hp:gap-2 hp:p-2 hp:rounded hp:cursor-pointer hp:text-on-surface-muted hp:text-sm ' +\n 'hp:hover:bg-on-surface/5 hp:data-[active=true]:bg-accent/15 hp:data-[active=true]:text-on-surface';\n\n if (item.image) {\n const img = document.createElement('img');\n img.src = item.image;\n img.loading = 'lazy';\n img.className = 'hp:w-16 hp:aspect-video hp:object-cover hp:rounded hp:shrink-0';\n li.appendChild(img);\n }\n\n const body = document.createElement('div');\n body.className = 'hp:flex-1 hp:min-w-0';\n const titleRow = document.createElement('div');\n titleRow.className = 'hp:truncate hp:font-medium';\n titleRow.textContent = item.title || this.ctx.i18n.videoFallbackTitle(idx);\n body.appendChild(titleRow);\n\n let progressFill: HTMLElement | null = null;\n let timeEl: HTMLElement | null = null;\n if (ui.showMeta !== false) {\n const metaRow = document.createElement('div');\n metaRow.className = 'hp:flex hp:items-center hp:gap-2 hp:text-xs hp:opacity-70 hp:mt-0.5';\n timeEl = document.createElement('span');\n timeEl.textContent = '';\n metaRow.appendChild(timeEl);\n\n const bar = document.createElement('div');\n bar.className = 'hp:flex-1 hp:h-0.5 hp:bg-on-surface/20 hp:rounded-full hp:overflow-hidden';\n progressFill = document.createElement('div');\n progressFill.className = 'hp:h-full hp:bg-accent';\n progressFill.style.width = '0%';\n bar.appendChild(progressFill);\n metaRow.appendChild(bar);\n body.appendChild(metaRow);\n }\n\n li.appendChild(body);\n li.addEventListener('click', () => this.setIndex(idx));\n listEl.appendChild(li);\n itemEls.push({ li, titleRow, progressFill, timeEl });\n });\n\n this.ctx.panelEl.appendChild(root);\n return { root, titleEl, listEl, prevBtn, nextBtn, itemEls };\n }\n\n private playlistTitleText(): string {\n const ui = this.rawOptions.ui ?? {};\n const title = ui.title || this.ctx.i18n.playlistTitle;\n return ui.showCount === false ? title : `${title} (${this.items.length})`;\n }\n\n private navButton(iconName: string, label: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('aria-label', label);\n btn.className = 'hp:flex hp:items-center hp:justify-center hp:w-6 hp:h-6 hp:text-on-surface hp:bg-transparent hp:border-0 hp:cursor-pointer';\n btn.appendChild(createIcon(iconName, 'hp:text-sm'));\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private setActive(index: number): void {\n this.ui.itemEls.forEach((entry, idx) => {\n if (idx === index) entry.li.setAttribute('data-active', 'true');\n else entry.li.removeAttribute('data-active');\n });\n // loadAndPlay() hem anlık UI geri bildirimi için önceden (next/prev/setIndex\n // içinden) hem de kaynak gerçekten yüklendiğinde setActive() çağırıyor —\n // aynı index için event'i yalnızca BİR kez yaymak için guard.\n if (this.lastDispatchedIndex !== index) {\n this.lastDispatchedIndex = index;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:itemchange', { detail: { index, source: 'playlist' } }));\n }\n }\n\n private updateProgress(): void {\n const active = this.ui.itemEls[this.index];\n if (!active) return;\n const duration = this.ctx.videoEl.duration;\n const current = this.ctx.videoEl.currentTime;\n if (active.timeEl) active.timeEl.textContent = this.formatTime(current);\n if (active.progressFill && Number.isFinite(duration) && duration > 0) {\n active.progressFill.style.width = `${Math.min(100, (current / duration) * 100)}%`;\n }\n }\n\n private formatTime(sec: number): string {\n const s = Math.max(0, Math.floor(sec || 0));\n const m = Math.floor(s / 60);\n const r = s % 60;\n return `${m}:${String(r).padStart(2, '0')}`;\n }\n}\n","import { PlaylistRunner, type PlaylistPlayerContext } from './PlaylistRunner';\nimport type { PlaylistOptions } from '../../types';\n\nexport function installPlaylist(ctx: PlaylistPlayerContext, options: PlaylistOptions): PlaylistRunner {\n return new PlaylistRunner(ctx, options);\n}\n\nexport { PlaylistRunner };\nexport type { PlaylistPlayerContext };\n"],"names":["DEFAULTS","PlaylistRunner","ctx","rawOptions","__publicField","_b","_a","host","resume","isAudioOutputError","now","entry","idx","item","opts","i","attemptId","mode","tried","mp4Index","payload","mp4List","v","nextMp4","otherMode","index","_isFallback","list","src","userInitiated","ui","root","header","titleEl","navWrap","prevBtn","nextBtn","listEl","itemEls","li","img","body","titleRow","progressFill","timeEl","metaRow","bar","title","iconName","label","onClick","btn","createIcon","active","duration","current","sec","s","m","r","installPlaylist","options"],"mappings":"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"}
1
+ {"version":3,"file":"playlist-BkhIOfCy.js","sources":["../../src/plugins/playlist/PlaylistRunner.ts","../../src/plugins/playlist/index.ts"],"sourcesContent":["import { createIcon } from '../../icons/Icon';\nimport type { PlayableItem, PlaylistOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { isAudioOutputError } from '../../utils/media-error';\n\nexport interface PlaylistPlayerContext {\n videoEl: HTMLVideoElement;\n hostEl: HTMLElement;\n /** Liste UI'ının monte edileceği, shadow root içindeki panel. */\n panelEl: HTMLElement;\n loadSource(src: string, type?: string): Promise<void>;\n setPoster(url: string): void;\n /** AdsController varsa retry/VMAP durumunu sıfırlayıp item'ın (varsa) kendi adTagPreroll'üyle yeniden reklam ister — yoksa no-op. */\n requestFreshAd(prerollTag?: string): void;\n /** Postroll sürüyorsa sonraki öğe `hp:adend`'i bekler. */\n isAdActive?(): boolean;\n i18n: HopeLocaleStrings;\n}\n\ntype SourceMode = 'hls' | 'mp4';\n\ninterface Attempt {\n id: number;\n index: number;\n mode: SourceMode;\n tried: Set<SourceMode>;\n mp4Index: number;\n}\n\nconst DEFAULTS: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>> = {\n startMode: 'after_current',\n startIndex: 0,\n loop: false,\n autoplayNext: true,\n preferHls: true,\n adsOnItemChange: true,\n};\n\n/** Tek player üzerinde sıralı oynatma listesi (startMode, loop, hata fallback zinciri). */\nexport class PlaylistRunner {\n private readonly options: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>>;\n private readonly items: PlayableItem[];\n\n private index: number;\n private destroyed = false;\n private switching = false;\n private playlistActive = false;\n private startPendingAfterCurrent = false;\n private attemptId = 0;\n private attempt: Attempt | null = null;\n private lastErrorAt = 0;\n private lastAdsIndex: number | null = null;\n private lastDispatchedIndex: number | null = null;\n private userHasStartedPlayback = false;\n\n private readonly ui: {\n root: HTMLElement;\n titleEl: HTMLElement;\n listEl: HTMLElement;\n prevBtn: HTMLButtonElement;\n nextBtn: HTMLButtonElement;\n itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }>;\n };\n\n constructor(\n private readonly ctx: PlaylistPlayerContext,\n private readonly rawOptions: PlaylistOptions\n ) {\n this.options = { ...DEFAULTS, ...rawOptions };\n this.items = Array.isArray(rawOptions.items) ? rawOptions.items : [];\n this.index = this.clampIndex(this.options.startIndex);\n\n this.ui = this.buildUi();\n this.bindPlayerEvents();\n this.init();\n }\n\n // ── lifecycle ──\n\n private init(): void {\n if (!this.items.length) return;\n\n if (this.options.startMode === 'after_current') {\n this.startPendingAfterCurrent = true;\n this.playlistActive = false;\n this.setActive(this.index);\n return;\n }\n\n this.playlistActive = true;\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n refreshLabels(): void {\n this.ui.titleEl.textContent = this.playlistTitleText();\n this.ui.prevBtn.setAttribute('aria-label', this.ctx.i18n.playlistPrev);\n this.ui.nextBtn.setAttribute('aria-label', this.ctx.i18n.playlistNext);\n this.ui.itemEls.forEach((entry, idx) => {\n const item = this.items[idx];\n if (item && !item.title) entry.titleRow.textContent = this.ctx.i18n.videoFallbackTitle(idx);\n });\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.ctx.videoEl.removeEventListener('ended', this.onEnded);\n this.ctx.videoEl.removeEventListener('error', this.onError);\n this.ctx.videoEl.removeEventListener('play', this.onUserPlay);\n this.ui.root.remove();\n }\n\n // ── public api ──\n\n start(opts: { index?: number } = {}): void {\n if (this.destroyed || !this.items.length) return;\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.index = this.clampIndex(opts.index ?? this.index);\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n next(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n\n if (this.index < this.items.length - 1) this.index++;\n else if (this.options.loop) this.index = 0;\n else return;\n\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n prev(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n if (this.index === 0) return;\n this.index--;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n setIndex(i: number): void {\n if (this.destroyed || !this.items.length) return;\n this.index = this.clampIndex(i);\n this.setActive(this.index);\n if (!this.playlistActive) return this.start({ index: this.index });\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n getIndex(): number {\n return this.index;\n }\n\n isActive(): boolean {\n return this.playlistActive;\n }\n\n // ── player events ──\n\n private bindPlayerEvents(): void {\n this.ctx.videoEl.addEventListener('ended', this.onEnded);\n this.ctx.videoEl.addEventListener('error', this.onError);\n this.ctx.videoEl.addEventListener('play', this.onUserPlay);\n this.ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n private readonly onUserPlay = (): void => {\n this.userHasStartedPlayback = true;\n };\n\n private readonly onEnded = (): void => {\n if (this.ctx.isAdActive?.()) {\n const host = this.ctx.hostEl;\n const resume = (): void => {\n host.removeEventListener('hp:adend', resume);\n if (!this.destroyed && this.ctx.videoEl.ended) this.onEnded();\n };\n host.addEventListener('hp:adend', resume);\n return;\n }\n if (this.startPendingAfterCurrent && !this.playlistActive) {\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true, isPlaylistStart: true });\n return;\n }\n if (this.playlistActive) this.next();\n };\n\n private readonly onError = (): void => {\n if (this.destroyed || !this.playlistActive) return;\n // Ses aygıtı yok (Firefox): video sessiz oynamaya devam ediyor — sonraki öğeye atlama.\n if (isAudioOutputError(this.ctx.videoEl.error)) return;\n const now = Date.now();\n if (now - this.lastErrorAt < 200) return;\n this.lastErrorAt = now;\n void this.fallbackOrSkip();\n };\n\n private readonly onTimeUpdate = (): void => {\n this.updateProgress();\n };\n\n // ── core load ──\n\n private async loadAndPlay(\n i: number,\n opts: { userInitiated?: boolean; forceMode?: SourceMode | null; forceMp4Index?: number | null; isFallback?: boolean; isPlaylistStart?: boolean } = {}\n ): Promise<void> {\n if (this.destroyed || this.switching || !this.playlistActive) return;\n this.switching = true;\n\n const item = this.items[i];\n if (!item) {\n this.switching = false;\n return;\n }\n const attemptId = ++this.attemptId;\n const mode = opts.forceMode ?? this.resolveMode(item);\n\n let tried = new Set<SourceMode>([mode]);\n let mp4Index = opts.forceMp4Index ?? 0;\n if (opts.isFallback && this.attempt?.index === i && this.attempt?.tried) {\n tried = new Set(this.attempt.tried);\n tried.add(mode);\n if (opts.forceMp4Index == null) mp4Index = this.attempt.mp4Index ?? 0;\n }\n this.attempt = { id: attemptId, index: i, mode, tried, mp4Index };\n\n try {\n const payload = this.buildPayload(item, mode, mp4Index);\n if (!payload) throw new Error('No playable source');\n\n this.setActive(i);\n this.ctx.videoEl.pause();\n if (item.image) this.ctx.setPoster(item.image);\n await this.ctx.loadSource(payload.src, payload.type);\n\n if (this.options.adsOnItemChange) this.maybeRequestAds(i, item, !!opts.isFallback);\n\n if (this.shouldAutoPlay(!!opts.userInitiated)) {\n try {\n await this.ctx.videoEl.play();\n } catch {\n /* autoplay engellendi — sessizce geç */\n }\n }\n this.updateProgress();\n } finally {\n this.switching = false;\n }\n }\n\n private async fallbackOrSkip(): Promise<void> {\n if (this.destroyed || !this.attempt) return;\n const item = this.items[this.attempt.index];\n if (!item) return;\n\n if (this.attempt.mode === 'mp4') {\n const mp4List = (item.mp4 || []).filter((v) => v?.src);\n const nextMp4 = (this.attempt.mp4Index ?? 0) + 1;\n if (nextMp4 < mp4List.length) {\n await this.loadAndPlay(this.attempt.index, { forceMode: 'mp4', forceMp4Index: nextMp4, isFallback: true });\n return;\n }\n }\n\n const otherMode: SourceMode = this.attempt.mode === 'hls' ? 'mp4' : 'hls';\n if (this.hasMode(item, otherMode) && !this.attempt.tried.has(otherMode)) {\n await this.loadAndPlay(this.attempt.index, { forceMode: otherMode, isFallback: true });\n return;\n }\n\n this.next();\n }\n\n // ── ads ──\n\n private maybeRequestAds(index: number, item: PlayableItem, _isFallback: boolean): void {\n if (this.lastAdsIndex === index) return;\n this.lastAdsIndex = index;\n this.ctx.requestFreshAd(item.adTagPreroll || this.rawOptions.adTagPreroll);\n }\n\n // ── sources ──\n\n private resolveMode(item: PlayableItem): SourceMode {\n if (this.options.preferHls) return this.hasMode(item, 'hls') ? 'hls' : this.hasMode(item, 'mp4') ? 'mp4' : 'hls';\n return this.hasMode(item, 'mp4') ? 'mp4' : this.hasMode(item, 'hls') ? 'hls' : 'mp4';\n }\n\n private hasMode(item: PlayableItem, mode: SourceMode): boolean {\n return Array.isArray(item[mode]) && item[mode]!.some((v) => v?.src);\n }\n\n private buildPayload(item: PlayableItem, mode: SourceMode, mp4Index = 0): { src: string; type?: string } | null {\n const list = (item[mode] || []).filter((v) => v?.src);\n if (!list.length) return null;\n\n let src;\n if (mode === 'mp4') {\n src = mp4Index > 0 ? list[mp4Index] || list[0] : list.find((v) => v.selected) || list[0];\n } else {\n src = list[0];\n }\n return { src: src!.src, type: src!.type || (mode === 'hls' ? 'application/x-mpegURL' : 'video/mp4') };\n }\n\n private shouldAutoPlay(userInitiated: boolean): boolean {\n if (userInitiated) return true;\n return this.options.autoplayNext && this.userHasStartedPlayback;\n }\n\n private clampIndex(i: number): number {\n if (!Number.isFinite(i) || !this.items.length) return 0;\n return Math.max(0, Math.min(this.items.length - 1, Math.trunc(i)));\n }\n\n // ── ui ──\n\n private buildUi() {\n const ui = this.rawOptions.ui ?? {};\n const root = document.createElement('div');\n root.setAttribute('part', 'playlist-panel');\n root.className = 'hp:flex hp:flex-col hp:gap-2 hp:p-3 hp:bg-surface-elev hp:max-h-80 hp:overflow-y-auto';\n\n const header = document.createElement('div');\n header.className = 'hp:flex hp:items-center hp:justify-between hp:gap-2 hp:mb-1';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'hp:text-sm hp:font-semibold hp:text-on-surface';\n titleEl.textContent = this.playlistTitleText();\n header.appendChild(titleEl);\n\n const navWrap = document.createElement('div');\n navWrap.className = 'hp:flex hp:gap-1';\n const prevBtn = this.navButton('chevron-left', this.ctx.i18n.playlistPrev, () => this.prev());\n const nextBtn = this.navButton('chevron-left', this.ctx.i18n.playlistNext, () => this.next());\n nextBtn.style.transform = 'rotate(180deg)';\n navWrap.append(prevBtn, nextBtn);\n header.appendChild(navWrap);\n\n root.appendChild(header);\n\n const listEl = document.createElement('ul');\n listEl.className = 'hp:flex hp:flex-col hp:gap-1 hp:list-none hp:m-0 hp:p-0';\n root.appendChild(listEl);\n\n const itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }> = [];\n this.items.forEach((item, idx) => {\n const li = document.createElement('li');\n li.className =\n 'hp:flex hp:items-center hp:gap-2 hp:p-2 hp:rounded hp:cursor-pointer hp:text-on-surface-muted hp:text-sm ' +\n 'hp:hover:bg-on-surface/5 hp:data-[active=true]:bg-accent/15 hp:data-[active=true]:text-on-surface';\n\n if (item.image) {\n const img = document.createElement('img');\n img.src = item.image;\n img.loading = 'lazy';\n img.className = 'hp:w-16 hp:aspect-video hp:object-cover hp:rounded hp:shrink-0';\n li.appendChild(img);\n }\n\n const body = document.createElement('div');\n body.className = 'hp:flex-1 hp:min-w-0';\n const titleRow = document.createElement('div');\n titleRow.className = 'hp:truncate hp:font-medium';\n titleRow.textContent = item.title || this.ctx.i18n.videoFallbackTitle(idx);\n body.appendChild(titleRow);\n\n let progressFill: HTMLElement | null = null;\n let timeEl: HTMLElement | null = null;\n if (ui.showMeta !== false) {\n const metaRow = document.createElement('div');\n metaRow.className = 'hp:flex hp:items-center hp:gap-2 hp:text-xs hp:opacity-70 hp:mt-0.5';\n timeEl = document.createElement('span');\n timeEl.textContent = '';\n metaRow.appendChild(timeEl);\n\n const bar = document.createElement('div');\n bar.className = 'hp:flex-1 hp:h-0.5 hp:bg-on-surface/20 hp:rounded-full hp:overflow-hidden';\n progressFill = document.createElement('div');\n progressFill.className = 'hp:h-full hp:bg-accent';\n progressFill.style.width = '0%';\n bar.appendChild(progressFill);\n metaRow.appendChild(bar);\n body.appendChild(metaRow);\n }\n\n li.appendChild(body);\n li.addEventListener('click', () => this.setIndex(idx));\n listEl.appendChild(li);\n itemEls.push({ li, titleRow, progressFill, timeEl });\n });\n\n this.ctx.panelEl.appendChild(root);\n return { root, titleEl, listEl, prevBtn, nextBtn, itemEls };\n }\n\n private playlistTitleText(): string {\n const ui = this.rawOptions.ui ?? {};\n const title = ui.title || this.ctx.i18n.playlistTitle;\n return ui.showCount === false ? title : `${title} (${this.items.length})`;\n }\n\n private navButton(iconName: string, label: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('aria-label', label);\n btn.className = 'hp:flex hp:items-center hp:justify-center hp:w-6 hp:h-6 hp:text-on-surface hp:bg-transparent hp:border-0 hp:cursor-pointer';\n btn.appendChild(createIcon(iconName, 'hp:text-sm'));\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private setActive(index: number): void {\n this.ui.itemEls.forEach((entry, idx) => {\n if (idx === index) entry.li.setAttribute('data-active', 'true');\n else entry.li.removeAttribute('data-active');\n });\n // loadAndPlay() hem anlık UI geri bildirimi için önceden (next/prev/setIndex\n // içinden) hem de kaynak gerçekten yüklendiğinde setActive() çağırıyor —\n // aynı index için event'i yalnızca BİR kez yaymak için guard.\n if (this.lastDispatchedIndex !== index) {\n this.lastDispatchedIndex = index;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:itemchange', { detail: { index, source: 'playlist' } }));\n }\n }\n\n private updateProgress(): void {\n const active = this.ui.itemEls[this.index];\n if (!active) return;\n const duration = this.ctx.videoEl.duration;\n const current = this.ctx.videoEl.currentTime;\n if (active.timeEl) active.timeEl.textContent = this.formatTime(current);\n if (active.progressFill && Number.isFinite(duration) && duration > 0) {\n active.progressFill.style.width = `${Math.min(100, (current / duration) * 100)}%`;\n }\n }\n\n private formatTime(sec: number): string {\n const s = Math.max(0, Math.floor(sec || 0));\n const m = Math.floor(s / 60);\n const r = s % 60;\n return `${m}:${String(r).padStart(2, '0')}`;\n }\n}\n","import { PlaylistRunner, type PlaylistPlayerContext } from './PlaylistRunner';\nimport type { PlaylistOptions } from '../../types';\n\nexport function installPlaylist(ctx: PlaylistPlayerContext, options: PlaylistOptions): PlaylistRunner {\n return new PlaylistRunner(ctx, options);\n}\n\nexport { PlaylistRunner };\nexport type { PlaylistPlayerContext };\n"],"names":["DEFAULTS","PlaylistRunner","ctx","rawOptions","__publicField","_b","_a","host","resume","isAudioOutputError","now","entry","idx","item","opts","i","attemptId","mode","tried","mp4Index","payload","mp4List","v","nextMp4","otherMode","index","_isFallback","list","src","userInitiated","ui","root","header","titleEl","navWrap","prevBtn","nextBtn","listEl","itemEls","li","img","body","titleRow","progressFill","timeEl","metaRow","bar","title","iconName","label","onClick","btn","createIcon","active","duration","current","sec","s","m","r","installPlaylist","options"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  var k = Object.defineProperty;
2
2
  var A = (d, e, t) => e in d ? k(d, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : d[e] = t;
3
3
  var c = (d, e, t) => A(d, typeof e != "symbol" ? e + "" : e, t);
4
- import { P as b, c as S } from "./player-D2_HRzot.js";
4
+ import { P as b, c as S } from "./player-B7mYS--8.js";
5
5
  const w = 6e4, x = 15e3, $ = 300, C = /* @__PURE__ */ new Set([" ", "k", "j", "l", "ArrowLeft", "ArrowRight", ",", "."]);
6
6
  class K {
7
7
  constructor(e) {
@@ -563,4 +563,4 @@ export {
563
563
  b as PLUGIN_API_VERSION,
564
564
  B as PluginHost
565
565
  };
566
- //# sourceMappingURL=pluginHost-cN2uGFeG.js.map
566
+ //# sourceMappingURL=pluginHost-CXqkjNV1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pluginHost-cN2uGFeG.js","sources":["../../src/plugin-api/PluginAds.ts","../../src/plugin-api/PluginHost.ts"],"sourcesContent":["// Eklenti reklam API'si: reklam arası, preroll kapısı, midroll noktaları, duraklatma / bitiş kancaları, tag dönüşümü.\nimport type { PluginAdBreak, PluginAdBreakOptions, PluginAdBreakType, PluginCleanup } from './types';\n\nexport interface PluginAdsContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n isAdPlaying(): boolean;\n /** Player'ın reklam kilidi (kontroller gizli, isAdPlaying true). */\n blockAds(): void;\n unblockAds(): void;\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\nconst DEFAULT_BREAK_TIMEOUT_MS = 60_000;\nconst PREROLL_GATE_TIMEOUT_MS = 15_000;\nconst DEFAULT_PAUSE_DELAY_MS = 300;\n/** Reklam arasında engellenen içerik kısayolları. */\nconst BLOCKED_KEYS = new Set([' ', 'k', 'j', 'l', 'ArrowLeft', 'ArrowRight', ',', '.']);\n\ntype Guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void;\n\ninterface Mid {\n owner: string;\n marks: number[];\n fired: Set<number>;\n seekPast: 'last' | 'skip';\n fire: (mark: number) => void;\n}\n\ninterface Active {\n owner: string;\n finish: () => void;\n}\n\nexport class PluginAds {\n private active: Active | null = null;\n private prerolls: Array<{ owner: string; run: () => unknown }> = [];\n private mids: Mid[] = [];\n private pauses: Array<{ owner: string; run: () => unknown; delayMs: number }> = [];\n private endeds: Array<{ owner: string; run: () => void }> = [];\n private transforms: Array<{ owner: string; fn: (url: string, type: PluginAdBreakType) => string }> = [];\n private prerollDone = false;\n private gateRunning = false;\n private contentStarted = false;\n private lastPos = 0;\n private seekPending = false;\n private pauseTimer: ReturnType<typeof setTimeout> | null = null;\n private pauseCleanups: Array<() => void> = [];\n\n constructor(private readonly ctx: PluginAdsContext) {\n const v = ctx.video;\n v.addEventListener('loadstart', this.onLoadStart);\n v.addEventListener('play', this.onPlay, true);\n v.addEventListener('playing', this.onPlaying);\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('pause', this.onPause);\n // Capture: playlist / yönlendirme dinleyicilerinden önce — postroll arası onlar çalışmadan başlar.\n v.addEventListener('ended', this.onEnded, true);\n ctx.element.addEventListener('keydown', this.onKeyDown, true);\n }\n\n destroy(): void {\n const v = this.ctx.video;\n v.removeEventListener('loadstart', this.onLoadStart);\n v.removeEventListener('play', this.onPlay, true);\n v.removeEventListener('playing', this.onPlaying);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onEnded, true);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown, true);\n this.active?.finish();\n this.clearPause();\n }\n\n /** Eklenti kaldırılınca onun kayıtları ve süren arası. */\n removeOwner(owner: string): void {\n this.prerolls = this.prerolls.filter((x) => x.owner !== owner);\n this.mids = this.mids.filter((x) => x.owner !== owner);\n this.pauses = this.pauses.filter((x) => x.owner !== owner);\n this.endeds = this.endeds.filter((x) => x.owner !== owner);\n this.transforms = this.transforms.filter((x) => x.owner !== owner);\n if (this.active?.owner === owner) this.active.finish();\n }\n\n /** IMA isteği öncesi tüm eklentilerin dönüşümleri. */\n transformTag(url: string, type: PluginAdBreakType): string {\n let out = url;\n for (const t of this.transforms) {\n try {\n const next = t.fn(out, type);\n if (typeof next === 'string' && next) out = next;\n } catch (err) {\n this.ctx.log(`Plugin \"${t.owner}\" failed in ads.transformTag: ${(err as Error)?.message ?? err}`, { plugin: t.owner });\n }\n }\n return out;\n }\n\n /** Bir eklentiye verilen `ads` nesnesi. */\n api(owner: string, guard: Guard) {\n const add = <T>(list: T[], item: T): (() => void) => {\n list.push(item);\n return () => {\n const i = list.indexOf(item);\n if (i >= 0) list.splice(i, 1);\n };\n };\n return {\n requestBreak: (run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions) => this.requestBreak(owner, run, options),\n beforeContent: (run: () => unknown) => add(this.prerolls, { owner, run }),\n atTime: (seconds: number | number[], run: (s: number) => unknown, options?: { seekPast?: 'last' | 'skip' }) => {\n const marks = (Array.isArray(seconds) ? seconds : [seconds]).filter((s) => Number.isFinite(s) && s >= 0).sort((a, b) => a - b);\n const fire = guard((m: number) => run(m), 'ads.atTime');\n return add(this.mids, { owner, marks, fired: new Set<number>(), seekPast: options?.seekPast ?? 'last', fire });\n },\n onPause: (run: () => void | PluginCleanup, options?: { delayMs?: number }) =>\n add(this.pauses, { owner, run: () => run(), delayMs: options?.delayMs ?? DEFAULT_PAUSE_DELAY_MS }),\n onEnded: (run: () => unknown) => add(this.endeds, { owner, run: guard(() => run(), 'ads.onEnded') }),\n transformTag: (fn: (url: string, type: PluginAdBreakType) => string) => add(this.transforms, { owner, fn }),\n };\n }\n\n // ── Reklam arası ──\n\n private requestBreak(owner: string, run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions): Promise<boolean> {\n if (this.active || this.ctx.isAdPlaying()) return Promise.resolve(false);\n const v = this.ctx.video;\n const type: PluginAdBreakType = options?.type ?? (v.ended ? 'postroll' : !this.contentStarted ? 'preroll' : 'midroll');\n const wasPlaying = !v.paused && !v.ended;\n if (!v.paused) v.pause();\n this.ctx.blockAds();\n\n const layer = document.createElement('div');\n layer.className = 'hp-plugin-layer hp-plugin-ad';\n layer.setAttribute('part', `plugin-ad plugin-${owner}`);\n layer.dataset.plugin = owner;\n layer.dataset.position = 'fill';\n layer.toggleAttribute('data-above', true);\n layer.toggleAttribute('data-interactive', true);\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) layer.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.videoArea.appendChild(layer);\n\n const ctrl = new AbortController();\n this.emit('hp:adstart', type, owner);\n\n return new Promise<boolean>((resolve) => {\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n ctrl.abort();\n layer.remove();\n this.active = null;\n this.ctx.unblockAds();\n this.emit('hp:adend', type, owner);\n if (wasPlaying && type !== 'postroll') void v.play().catch(() => {});\n resolve(true);\n };\n const timer = setTimeout(() => {\n this.ctx.log(`Plugin \"${owner}\" ad break timed out`, { plugin: owner, type });\n finish();\n }, options?.timeoutMs ?? DEFAULT_BREAK_TIMEOUT_MS);\n this.active = { owner, finish };\n const fail = (err: unknown): void => {\n this.ctx.log(`Plugin \"${owner}\" failed in ads.requestBreak: ${(err as Error)?.message ?? err}`, { plugin: owner, type });\n finish();\n };\n try {\n Promise.resolve(run({ type, layer, signal: ctrl.signal, end: finish })).then(finish, fail);\n } catch (err) {\n fail(err);\n }\n });\n }\n\n private emit(name: 'hp:adstart' | 'hp:adend', type: PluginAdBreakType, plugin: string): void {\n this.ctx.element.dispatchEvent(new CustomEvent(name, { detail: { type, linear: true, plugin } }));\n }\n\n // ── Olaylar ──\n\n private readonly onLoadStart = (): void => {\n this.prerollDone = false;\n this.contentStarted = false;\n this.lastPos = 0;\n for (const m of this.mids) m.fired.clear();\n this.clearPause();\n };\n\n private readonly onPlay = (): void => {\n const v = this.ctx.video;\n // Reklam arasında / preroll beklenirken içerik oynamaz.\n if (this.active || this.gateRunning) {\n v.pause();\n return;\n }\n this.clearPause();\n if (this.prerollDone || !this.prerolls.length || this.ctx.isAdPlaying()) return;\n this.prerollDone = true;\n v.pause();\n void this.runPrerolls();\n };\n\n private async runPrerolls(): Promise<void> {\n this.gateRunning = true;\n const all = Promise.all(\n this.prerolls.map((p) =>\n Promise.resolve()\n .then(() => p.run())\n .catch((err) => this.ctx.log(`Plugin \"${p.owner}\" failed in ads.beforeContent: ${(err as Error)?.message ?? err}`, { plugin: p.owner }))\n )\n );\n await Promise.race([all, new Promise((r) => setTimeout(r, PREROLL_GATE_TIMEOUT_MS))]);\n // Süren bir ara varsa onun bitmesini bekle.\n while (this.active) await new Promise((r) => setTimeout(r, 100));\n this.gateRunning = false;\n void this.ctx.video.play().catch(() => {});\n }\n\n private readonly onPlaying = (): void => {\n if (!this.active && !this.ctx.isAdPlaying()) this.contentStarted = true;\n };\n\n private readonly onSeeking = (): void => {\n this.seekPending = true;\n };\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.video;\n const pos = v.currentTime;\n const prev = this.lastPos;\n this.lastPos = pos;\n const seeked = this.seekPending;\n this.seekPending = false;\n if (this.active || this.ctx.isAdPlaying() || v.paused || v.seeking || pos <= prev) return;\n for (const m of this.mids) {\n const crossed = m.marks.filter((s) => prev < s && s <= pos && !m.fired.has(s));\n if (!crossed.length) continue;\n for (const s of crossed) m.fired.add(s);\n // İleri sarınca geçilen noktalardan yalnızca sonuncusu (ya da hiçbiri).\n if (seeked && m.seekPast === 'skip') continue;\n m.fire(crossed[crossed.length - 1]!);\n }\n };\n\n private readonly onPause = (): void => {\n const v = this.ctx.video;\n if (!this.pauses.length || v.ended || v.seeking || this.active || this.gateRunning || this.ctx.isAdPlaying()) return;\n this.clearPause();\n const delay = Math.min(...this.pauses.map((p) => p.delayMs));\n this.pauseTimer = setTimeout(() => {\n this.pauseTimer = null;\n if (!v.paused || v.ended || this.active || this.ctx.isAdPlaying()) return;\n for (const p of this.pauses) {\n try {\n const cleanup = p.run();\n if (typeof cleanup === 'function') this.pauseCleanups.push(cleanup as () => void);\n } catch (err) {\n this.ctx.log(`Plugin \"${p.owner}\" failed in ads.onPause: ${(err as Error)?.message ?? err}`, { plugin: p.owner });\n }\n }\n }, delay);\n };\n\n private clearPause(): void {\n if (this.pauseTimer) clearTimeout(this.pauseTimer);\n this.pauseTimer = null;\n for (const c of this.pauseCleanups.splice(0)) {\n try {\n c();\n } catch {\n /* yok say */\n }\n }\n }\n\n private readonly onEnded = (): void => {\n this.clearPause();\n for (const e of this.endeds) e.run();\n };\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if ((this.active || this.gateRunning) && BLOCKED_KEYS.has(e.key)) e.preventDefault();\n };\n}\n","// Eklentileri kurar / kaldırır; eklenenleri izler ve temizler, hataları yakalar.\nimport { createIcon } from '../icons/Icon';\nimport { PluginAds } from './PluginAds';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../controls/SettingsMenu';\nimport {\n PLUGIN_API_VERSION,\n type HopePlugin,\n type PlayerApi,\n type PluginButtonHandle,\n type PluginButtonOptions,\n type PluginCleanup,\n type PluginEntry,\n type PluginLabel,\n type PluginLayerHandle,\n type PluginLayerOptions,\n type PluginLoader,\n type PluginSettingsHandle,\n} from './types';\n\n/** Player → PluginHost bağlamı (eklentiler görmez). */\nexport interface PluginHostContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n /** Alt katmanlar bunun önüne eklenir. */\n chromeEl: HTMLElement;\n labels: Readonly<Record<string, unknown>>;\n locale(): string;\n currentSrc(): string | null;\n isAdPlaying(): boolean;\n /** Reklam kilidi (`blockChrome('ads')`). */\n blockAds(): void;\n unblockAds(): void;\n isFullscreen(): boolean;\n addControlButton(button: HTMLButtonElement, position: 'left' | 'right'): void;\n settings: {\n registerToggle(row: { key: string; label: string; getValueLabel(): string; onToggle(): void }): void;\n unregisterToggle(key: string): void;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n };\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\ninterface Instance {\n plugin: HopePlugin<any>;\n optionsKey: string;\n api: PlayerApi;\n disposers: Array<() => void>;\n /** Dil değişince yeniden çizilecekler. */\n relabel: Array<() => void>;\n localeHandlers: Array<(locale: string) => void>;\n cleanup: PluginCleanup | null;\n removed: boolean;\n}\n\n/** `Shift+W` gibi kısayol. */\ninterface KeySpec {\n key: string;\n shift: boolean | null;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n}\n\nexport interface PluginShortcut {\n keys: string[];\n description: string;\n}\n\nconst resolve = (label: PluginLabel): string => (typeof label === 'function' ? label() : label);\n\nfunction parseKey(spec: string): KeySpec {\n const parts = spec.split('+');\n // \"Shift++\" gibi: son parça boşsa tuş \"+\".\n const key = (parts.pop() || '+').toLowerCase();\n const mods = parts.map((p) => p.toLowerCase());\n const letter = /^[a-z]$/.test(key);\n return { key, shift: mods.includes('shift') ? true : letter ? false : null, alt: mods.includes('alt'), ctrl: mods.includes('ctrl') || mods.includes('control'), meta: mods.includes('meta') || mods.includes('cmd') };\n}\n\nfunction matches(spec: KeySpec, e: KeyboardEvent): boolean {\n return (\n e.key.toLowerCase() === spec.key &&\n e.altKey === spec.alt &&\n e.ctrlKey === spec.ctrl &&\n e.metaKey === spec.meta &&\n (spec.shift === null || e.shiftKey === spec.shift)\n );\n}\n\nexport class PluginHost {\n private readonly instances = new Map<string, Instance>();\n private readonly shortcutList: Array<{ owner: string; spec: KeySpec; label: string; description: PluginLabel | undefined; handler: (e: KeyboardEvent) => void }> = [];\n private syncSeq = 0;\n private toastEl: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n /** Ayar satırı anahtarları. */\n private keySeq = 0;\n private readonly ads: PluginAds;\n\n constructor(private readonly ctx: PluginHostContext) {\n ctx.element.addEventListener('keydown', this.onKeyDown);\n this.ads = new PluginAds(ctx);\n }\n\n /** IMA tag'i eklenti dönüşümlerinden geçirir. */\n transformAdTag(url: string, type: 'preroll' | 'midroll' | 'postroll'): string {\n return this.ads.transformTag(url, type);\n }\n\n /** Listeye eşitler: kurar, kaldırır, günceller (aynı adlıda sonraki kazanır). */\n async sync(builtin: PluginEntry[], user: PluginEntry[]): Promise<void> {\n const seq = ++this.syncSeq;\n const resolved = await Promise.all([...builtin, ...user].map((e) => this.resolveEntry(e)));\n if (seq !== this.syncSeq) return; // daha yenisi başladı\n const wanted = new Map<string, { plugin: HopePlugin<any>; options: unknown }>();\n for (const r of resolved) if (r) wanted.set(r.plugin.name, r);\n\n for (const [name, inst] of this.instances) if (!wanted.has(name)) this.dispose(name, inst);\n for (const [name, { plugin, options }] of wanted) {\n const key = optionsKey(options);\n const inst = this.instances.get(name);\n if (inst && inst.plugin === plugin) {\n if (inst.optionsKey === key) continue;\n if (plugin.update) {\n inst.optionsKey = key;\n this.guard(name, () => plugin.update!(options))();\n continue;\n }\n }\n if (inst) this.dispose(name, inst);\n await this.install(plugin, options, key);\n }\n }\n\n /** Dil değişince. */\n refreshLabels(): void {\n for (const [name, inst] of this.instances) {\n for (const fn of inst.relabel) this.guard(name, fn)();\n for (const fn of inst.localeHandlers) this.guard(name, () => fn(this.ctx.locale()))();\n }\n }\n\n /** `?` listesi için. */\n shortcuts(): PluginShortcut[] {\n return this.shortcutList.filter((s) => s.description !== undefined).map((s) => ({ keys: [s.label], description: resolve(s.description!) }));\n }\n\n has(name: string): boolean {\n return this.instances.has(name);\n }\n\n destroy(): void {\n ++this.syncSeq;\n for (const [name, inst] of this.instances) this.dispose(name, inst);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown);\n this.ads.destroy();\n this.toastEl?.remove();\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n // ── Kurulum ──\n\n private async resolveEntry(entry: PluginEntry): Promise<{ plugin: HopePlugin<any>; options: unknown } | null> {\n const [target, options] = Array.isArray(entry) ? entry : [entry, undefined];\n try {\n if (typeof target === 'function') {\n const mod = await (target as PluginLoader)();\n const plugin = 'setup' in mod ? mod : 'default' in mod ? mod.default : mod.plugin;\n return plugin && typeof plugin.setup === 'function' ? { plugin, options } : null;\n }\n return target && typeof target.setup === 'function' && typeof target.name === 'string' ? { plugin: target, options } : null;\n } catch (err) {\n this.ctx.log(`Plugin could not be loaded: ${(err as Error)?.message ?? err}`, { plugin: typeof target === 'function' ? 'loader' : String((target as HopePlugin)?.name) });\n return null;\n }\n }\n\n private async install(plugin: HopePlugin<any>, options: unknown, key: string): Promise<void> {\n const name = plugin.name;\n if (plugin.apiVersion && plugin.apiVersion > PLUGIN_API_VERSION) {\n this.ctx.log(`Plugin \"${name}\" was written for plugin API v${plugin.apiVersion}; this player has v${PLUGIN_API_VERSION}`, { plugin: name });\n }\n const inst: Instance = { plugin, optionsKey: key, api: null as unknown as PlayerApi, disposers: [], relabel: [], localeHandlers: [], cleanup: null, removed: false };\n inst.api = this.createApi(inst);\n this.instances.set(name, inst);\n try {\n const result = await plugin.setup(inst.api, options);\n if (inst.removed) {\n if (typeof result === 'function') this.guard(name, result)();\n return;\n }\n if (typeof result === 'function') inst.cleanup = result;\n } catch (err) {\n this.report(name, err, 'setup');\n this.dispose(name, inst);\n }\n }\n\n private dispose(name: string, inst: Instance): void {\n if (inst.removed) return;\n inst.removed = true;\n if (this.instances.get(name) === inst) this.instances.delete(name);\n if (inst.cleanup) this.guard(name, inst.cleanup)();\n // Ters sırada kaldır.\n for (const d of inst.disposers.reverse()) {\n try {\n d();\n } catch {\n /* yok say */\n }\n }\n inst.disposers = [];\n this.ads.removeOwner(name);\n for (let i = this.shortcutList.length - 1; i >= 0; i--) if (this.shortcutList[i]!.owner === name) this.shortcutList.splice(i, 1);\n }\n\n private report(name: string, err: unknown, where: string): void {\n const message = (err as Error)?.message ?? String(err);\n this.ctx.log(`Plugin \"${name}\" failed in ${where}: ${message}`, { plugin: name });\n console.error(`[hope-player] plugin \"${name}\" (${where}):`, err);\n }\n\n /** Eklenti kodu hep bundan çağrılır; hata player'a geçmez. */\n private guard<A extends unknown[]>(name: string, fn: (...args: A) => unknown, where = 'handler'): (...args: A) => void {\n return (...args: A) => {\n try {\n const r = fn(...args);\n if (r instanceof Promise) r.catch((err) => this.report(name, err, where));\n } catch (err) {\n this.report(name, err, where);\n }\n };\n }\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n // Player'ın kendi tuşları önce; işlendiyse karışma.\n if (e.defaultPrevented) return;\n const target = e.composedPath()[0];\n if (target instanceof HTMLElement && (target.isContentEditable || /^(input|textarea|select)$/i.test(target.tagName))) return;\n for (const s of this.shortcutList) {\n if (matches(s.spec, e)) {\n e.preventDefault();\n s.handler(e);\n return;\n }\n }\n };\n\n // ── PlayerApi ──\n\n private createApi(inst: Instance): PlayerApi {\n const ctx = this.ctx;\n const name = inst.plugin.name;\n const track = (dispose: () => void): void => {\n if (inst.removed) dispose();\n else inst.disposers.push(dispose);\n };\n const guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => this.guard(name, fn, where);\n const strings: Record<string, Record<string, string>> = {};\n const host = this;\n\n const on = (event: string, handler: (event: Event) => void, once = false): (() => void) => {\n // `x:y` olayları elementte, diğerleri videoda.\n const target: EventTarget = event.includes(':') ? ctx.element : ctx.video;\n const wrapped = guard((ev: Event) => {\n if (once) off();\n handler(ev);\n }, `on(${event})`);\n target.addEventListener(event, wrapped);\n let done = false;\n const off = (): void => {\n if (done) return;\n done = true;\n target.removeEventListener(event, wrapped);\n };\n track(off);\n return off;\n };\n\n const api: PlayerApi = {\n plugin: name,\n apiVersion: PLUGIN_API_VERSION,\n element: ctx.element,\n video: ctx.video,\n get locale() {\n return ctx.locale();\n },\n labels: ctx.labels,\n get currentTime() {\n return ctx.video.currentTime;\n },\n get duration() {\n return ctx.video.duration;\n },\n get paused() {\n return ctx.video.paused;\n },\n get isLive() {\n return ctx.video.duration === Infinity;\n },\n get isAdPlaying() {\n return ctx.isAdPlaying();\n },\n get isFullscreen() {\n return ctx.isFullscreen();\n },\n get src() {\n return ctx.currentSrc();\n },\n play: () => ctx.video.play(),\n pause: () => ctx.video.pause(),\n seek: (time: number) => {\n if (Number.isFinite(time)) ctx.video.currentTime = Math.max(0, time);\n },\n on: (event, handler) => on(event, handler),\n once: (event, handler) => on(event, handler, true),\n emit: (event, detail) => {\n ctx.element.dispatchEvent(new CustomEvent(`${name}:${event}`, { detail, bubbles: true, composed: true }));\n },\n onSourceChange: (handler) => on('loadstart', () => handler(ctx.currentSrc())),\n onLocaleChange: (handler) => {\n inst.localeHandlers.push(handler);\n const off = (): void => {\n const i = inst.localeHandlers.indexOf(handler);\n if (i >= 0) inst.localeHandlers.splice(i, 1);\n };\n track(off);\n return off;\n },\n onDestroy: (handler) => track(guard(handler, 'onDestroy')),\n setTimeout: (handler, ms) => {\n const id = window.setTimeout(guard(handler, 'setTimeout'), ms);\n track(() => clearTimeout(id));\n return id;\n },\n setInterval: (handler, ms) => {\n const id = window.setInterval(guard(handler, 'setInterval'), ms);\n track(() => clearInterval(id));\n return id;\n },\n ui: {\n addButton: (o) => host.addButton(inst, o, track, guard),\n addLayer: (o) => host.addLayer(inst, o ?? {}, track),\n toast: (message, o) => host.toast(message, o?.durationMs),\n },\n settings: {\n addToggle: (o) => {\n const key = `plugin:${name}:toggle:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerToggle({\n key,\n label: resolve(o.label),\n getValueLabel: () => (o.get() ? onOff(ctx.labels, true) : onOff(ctx.labels, false)),\n onToggle: guard(() => o.set(!o.get()), 'settings.toggle'),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterToggle(key));\n return settingsHandle(register, () => ctx.settings.unregisterToggle(key));\n },\n addSelect: (o) => {\n const key = `plugin:${name}:select:${++host.keySeq}`;\n const list = () => (typeof o.options === 'function' ? o.options() : o.options);\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => {\n const current = list().find((x) => x.value === o.get());\n return current ? resolve(current.label) : '';\n },\n getItems: () => list().map((x) => ({ label: resolve(x.label), active: x.value === o.get(), onSelect: guard(() => o.set(x.value), 'settings.select') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n addSubmenu: (o) => {\n const key = `plugin:${name}:submenu:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => (o.value ? o.value() : ''),\n getItems: (): SettingsSubmenuItem[] =>\n o.items().map((x) => ({ label: resolve(x.label), active: !!x.active, onSelect: guard(() => x.onSelect(), 'settings.submenu') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n },\n keys: {\n add: (key, handler, description) => {\n const entry = { owner: name, spec: parseKey(key), label: key, description, handler: guard(handler, `keys(${key})`) };\n host.shortcutList.push(entry);\n const off = (): void => {\n const i = host.shortcutList.indexOf(entry);\n if (i >= 0) host.shortcutList.splice(i, 1);\n };\n track(off);\n return off;\n },\n },\n i18n: {\n add: (more) => {\n for (const [locale, values] of Object.entries(more)) strings[locale] = { ...strings[locale], ...values };\n },\n t: (key, fallback) => strings[ctx.locale()]?.[key] ?? strings.en?.[key] ?? fallback ?? key,\n },\n storage: {\n get: <T>(key: string, fallback?: T): T | undefined => {\n try {\n const raw = localStorage.getItem(storageKey(name, key));\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n },\n set: (key, value) => {\n try {\n localStorage.setItem(storageKey(name, key), JSON.stringify(value));\n } catch {\n /* yok say */\n }\n },\n remove: (key) => {\n try {\n localStorage.removeItem(storageKey(name, key));\n } catch {\n /* yok say */\n }\n },\n },\n ads: (() => {\n const raw = host.ads.api(name, guard);\n // Dönen kaldırıcılar eklenti kaldırılınca da çağrılır.\n const tracked = <F extends (...a: any[]) => () => void>(fn: F) =>\n ((...a: Parameters<F>) => {\n const off = fn(...a);\n track(off);\n return off;\n }) as F;\n return {\n requestBreak: raw.requestBreak,\n beforeContent: tracked(raw.beforeContent),\n atTime: tracked(raw.atTime),\n onPause: tracked(raw.onPause),\n onEnded: tracked(raw.onEnded),\n transformTag: tracked(raw.transformTag),\n };\n })(),\n log: (message, details) => ctx.log(message, { plugin: name, ...details }),\n };\n return api;\n }\n\n private addButton(\n inst: Instance,\n o: PluginButtonOptions,\n track: (d: () => void) => void,\n guard: <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void\n ): PluginButtonHandle {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-plugin-btn hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer hp:shrink-0';\n btn.setAttribute('part', `plugin-button plugin-${inst.plugin.name}`);\n btn.dataset.plugin = inst.plugin.name;\n let label: PluginLabel = o.label;\n let active = !!o.active;\n const setIcon = (icon: string): void => {\n btn.textContent = '';\n if (icon.trim().startsWith('<')) {\n btn.insertAdjacentHTML('beforeend', icon);\n btn.querySelector('svg')?.setAttribute('aria-hidden', 'true');\n } else btn.appendChild(createIcon(icon, 'hp:text-[length:var(--hp-ctrl-icon-size)]'));\n };\n const applyLabel = (): void => btn.setAttribute('aria-label', resolve(label));\n const applyActive = (): void => {\n if (o.active !== undefined) btn.setAttribute('aria-pressed', String(active));\n };\n setIcon(o.icon);\n applyLabel();\n applyActive();\n inst.relabel.push(applyLabel);\n const handle: PluginButtonHandle = {\n el: btn,\n get active() {\n return active;\n },\n setLabel: (l) => {\n label = l;\n applyLabel();\n },\n setIcon,\n setActive: (a) => {\n active = a;\n btn.setAttribute('aria-pressed', String(a));\n },\n show: () => {\n btn.style.display = '';\n },\n hide: () => {\n btn.style.display = 'none';\n },\n remove: () => btn.remove(),\n };\n if (o.onClick) {\n const click = guard((e: MouseEvent) => o.onClick!(e, handle), 'button.onClick');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n click(e);\n });\n }\n this.ctx.addControlButton(btn, o.position ?? 'right');\n track(() => btn.remove());\n return handle;\n }\n\n private addLayer(inst: Instance, o: PluginLayerOptions, track: (d: () => void) => void): PluginLayerHandle {\n const el = document.createElement('div');\n el.className = 'hp-plugin-layer';\n el.setAttribute('part', `plugin-layer plugin-${inst.plugin.name}`);\n el.dataset.plugin = inst.plugin.name;\n el.dataset.position = o.position ?? 'fill';\n el.toggleAttribute('data-autohide', !!o.autoHide);\n el.toggleAttribute('data-interactive', !!o.interactive);\n el.toggleAttribute('data-above', !!o.above);\n let visible = o.visible !== false;\n el.hidden = !visible;\n\n if (o.above) this.ctx.videoArea.appendChild(el);\n else this.ctx.videoArea.insertBefore(el, this.ctx.chromeEl);\n // Stil katmanın dışında: `el.innerHTML` silmesin.\n let style: HTMLStyleElement | null = null;\n if (o.css) {\n style = document.createElement('style');\n style.textContent = o.css;\n el.before(style);\n }\n const removeAll = (): void => {\n el.remove();\n style?.remove();\n };\n if (o.interactive) {\n // Tıklama videoya geçmesin.\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n }\n track(removeAll);\n const set = (v: boolean): void => {\n visible = v;\n el.hidden = !v;\n };\n return {\n el,\n get visible() {\n return visible;\n },\n show: () => set(true),\n hide: () => set(false),\n toggle: (force) => set(force ?? !visible),\n remove: removeAll,\n };\n }\n\n private toast(message: string, durationMs = 2500): void {\n if (!this.toastEl) {\n this.toastEl = document.createElement('div');\n this.toastEl.className = 'hp-plugin-toast';\n this.toastEl.setAttribute('part', 'plugin-toast');\n this.toastEl.setAttribute('role', 'status');\n this.toastEl.setAttribute('aria-live', 'polite');\n this.ctx.videoArea.appendChild(this.toastEl);\n }\n this.toastEl.textContent = message;\n this.toastEl.setAttribute('data-visible', '');\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toastTimer = setTimeout(() => this.toastEl?.removeAttribute('data-visible'), Math.max(500, durationMs));\n }\n}\n\nfunction settingsHandle(register: () => void, remove: () => void): PluginSettingsHandle {\n return { refresh: register, remove };\n}\n\nfunction onOff(labels: Readonly<Record<string, unknown>>, on: boolean): string {\n const value = on ? labels.a11yOn : labels.a11yOff;\n return typeof value === 'string' ? value : on ? 'On' : 'Off';\n}\n\nfunction storageKey(plugin: string, key: string): string {\n return `hp-plugin:${plugin}:${key}`;\n}\n\n/** Seçenek karşılaştırma anahtarı. */\nfunction optionsKey(options: unknown): string {\n try {\n return JSON.stringify(options ?? null, (_k, v: unknown) => (typeof v === 'function' ? `fn:${(v as { name?: string }).name ?? ''}` : v));\n } catch {\n return String(Math.random());\n }\n}\n\nexport { PLUGIN_API_VERSION };\nexport type { PluginShortcut as Shortcut };\n"],"names":["DEFAULT_BREAK_TIMEOUT_MS","PREROLL_GATE_TIMEOUT_MS","DEFAULT_PAUSE_DELAY_MS","BLOCKED_KEYS","PluginAds","ctx","__publicField","m","v","pos","prev","seeked","crossed","s","delay","p","cleanup","err","_a","owner","x","url","type","out","t","next","guard","add","list","item","i","run","options","seconds","marks","a","b","fire","fn","wasPlaying","layer","ev","e","ctrl","resolve","done","finish","timer","fail","name","plugin","all","r","c","label","parseKey","spec","parts","key","mods","letter","matches","PluginHost","target","builtin","user","seq","resolved","wanted","inst","optionsKey","entry","mod","PLUGIN_API_VERSION","result","d","where","message","args","track","dispose","strings","host","on","event","handler","once","wrapped","off","time","detail","ms","id","o","register","onOff","settingsHandle","current","description","more","locale","values","fallback","_b","raw","storageKey","value","tracked","details","btn","active","setIcon","icon","createIcon","applyLabel","applyActive","handle","click","el","visible","style","removeAll","set","force","durationMs","remove","labels","_k"],"mappings":"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"}
1
+ {"version":3,"file":"pluginHost-CXqkjNV1.js","sources":["../../src/plugin-api/PluginAds.ts","../../src/plugin-api/PluginHost.ts"],"sourcesContent":["// Eklenti reklam API'si: reklam arası, preroll kapısı, midroll noktaları, duraklatma / bitiş kancaları, tag dönüşümü.\nimport type { PluginAdBreak, PluginAdBreakOptions, PluginAdBreakType, PluginCleanup } from './types';\n\nexport interface PluginAdsContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n isAdPlaying(): boolean;\n /** Player'ın reklam kilidi (kontroller gizli, isAdPlaying true). */\n blockAds(): void;\n unblockAds(): void;\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\nconst DEFAULT_BREAK_TIMEOUT_MS = 60_000;\nconst PREROLL_GATE_TIMEOUT_MS = 15_000;\nconst DEFAULT_PAUSE_DELAY_MS = 300;\n/** Reklam arasında engellenen içerik kısayolları. */\nconst BLOCKED_KEYS = new Set([' ', 'k', 'j', 'l', 'ArrowLeft', 'ArrowRight', ',', '.']);\n\ntype Guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void;\n\ninterface Mid {\n owner: string;\n marks: number[];\n fired: Set<number>;\n seekPast: 'last' | 'skip';\n fire: (mark: number) => void;\n}\n\ninterface Active {\n owner: string;\n finish: () => void;\n}\n\nexport class PluginAds {\n private active: Active | null = null;\n private prerolls: Array<{ owner: string; run: () => unknown }> = [];\n private mids: Mid[] = [];\n private pauses: Array<{ owner: string; run: () => unknown; delayMs: number }> = [];\n private endeds: Array<{ owner: string; run: () => void }> = [];\n private transforms: Array<{ owner: string; fn: (url: string, type: PluginAdBreakType) => string }> = [];\n private prerollDone = false;\n private gateRunning = false;\n private contentStarted = false;\n private lastPos = 0;\n private seekPending = false;\n private pauseTimer: ReturnType<typeof setTimeout> | null = null;\n private pauseCleanups: Array<() => void> = [];\n\n constructor(private readonly ctx: PluginAdsContext) {\n const v = ctx.video;\n v.addEventListener('loadstart', this.onLoadStart);\n v.addEventListener('play', this.onPlay, true);\n v.addEventListener('playing', this.onPlaying);\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('pause', this.onPause);\n // Capture: playlist / yönlendirme dinleyicilerinden önce — postroll arası onlar çalışmadan başlar.\n v.addEventListener('ended', this.onEnded, true);\n ctx.element.addEventListener('keydown', this.onKeyDown, true);\n }\n\n destroy(): void {\n const v = this.ctx.video;\n v.removeEventListener('loadstart', this.onLoadStart);\n v.removeEventListener('play', this.onPlay, true);\n v.removeEventListener('playing', this.onPlaying);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onEnded, true);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown, true);\n this.active?.finish();\n this.clearPause();\n }\n\n /** Eklenti kaldırılınca onun kayıtları ve süren arası. */\n removeOwner(owner: string): void {\n this.prerolls = this.prerolls.filter((x) => x.owner !== owner);\n this.mids = this.mids.filter((x) => x.owner !== owner);\n this.pauses = this.pauses.filter((x) => x.owner !== owner);\n this.endeds = this.endeds.filter((x) => x.owner !== owner);\n this.transforms = this.transforms.filter((x) => x.owner !== owner);\n if (this.active?.owner === owner) this.active.finish();\n }\n\n /** IMA isteği öncesi tüm eklentilerin dönüşümleri. */\n transformTag(url: string, type: PluginAdBreakType): string {\n let out = url;\n for (const t of this.transforms) {\n try {\n const next = t.fn(out, type);\n if (typeof next === 'string' && next) out = next;\n } catch (err) {\n this.ctx.log(`Plugin \"${t.owner}\" failed in ads.transformTag: ${(err as Error)?.message ?? err}`, { plugin: t.owner });\n }\n }\n return out;\n }\n\n /** Bir eklentiye verilen `ads` nesnesi. */\n api(owner: string, guard: Guard) {\n const add = <T>(list: T[], item: T): (() => void) => {\n list.push(item);\n return () => {\n const i = list.indexOf(item);\n if (i >= 0) list.splice(i, 1);\n };\n };\n return {\n requestBreak: (run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions) => this.requestBreak(owner, run, options),\n beforeContent: (run: () => unknown) => add(this.prerolls, { owner, run }),\n atTime: (seconds: number | number[], run: (s: number) => unknown, options?: { seekPast?: 'last' | 'skip' }) => {\n const marks = (Array.isArray(seconds) ? seconds : [seconds]).filter((s) => Number.isFinite(s) && s >= 0).sort((a, b) => a - b);\n const fire = guard((m: number) => run(m), 'ads.atTime');\n return add(this.mids, { owner, marks, fired: new Set<number>(), seekPast: options?.seekPast ?? 'last', fire });\n },\n onPause: (run: () => void | PluginCleanup, options?: { delayMs?: number }) =>\n add(this.pauses, { owner, run: () => run(), delayMs: options?.delayMs ?? DEFAULT_PAUSE_DELAY_MS }),\n onEnded: (run: () => unknown) => add(this.endeds, { owner, run: guard(() => run(), 'ads.onEnded') }),\n transformTag: (fn: (url: string, type: PluginAdBreakType) => string) => add(this.transforms, { owner, fn }),\n };\n }\n\n // ── Reklam arası ──\n\n private requestBreak(owner: string, run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions): Promise<boolean> {\n if (this.active || this.ctx.isAdPlaying()) return Promise.resolve(false);\n const v = this.ctx.video;\n const type: PluginAdBreakType = options?.type ?? (v.ended ? 'postroll' : !this.contentStarted ? 'preroll' : 'midroll');\n const wasPlaying = !v.paused && !v.ended;\n if (!v.paused) v.pause();\n this.ctx.blockAds();\n\n const layer = document.createElement('div');\n layer.className = 'hp-plugin-layer hp-plugin-ad';\n layer.setAttribute('part', `plugin-ad plugin-${owner}`);\n layer.dataset.plugin = owner;\n layer.dataset.position = 'fill';\n layer.toggleAttribute('data-above', true);\n layer.toggleAttribute('data-interactive', true);\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) layer.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.videoArea.appendChild(layer);\n\n const ctrl = new AbortController();\n this.emit('hp:adstart', type, owner);\n\n return new Promise<boolean>((resolve) => {\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n ctrl.abort();\n layer.remove();\n this.active = null;\n this.ctx.unblockAds();\n this.emit('hp:adend', type, owner);\n if (wasPlaying && type !== 'postroll') void v.play().catch(() => {});\n resolve(true);\n };\n const timer = setTimeout(() => {\n this.ctx.log(`Plugin \"${owner}\" ad break timed out`, { plugin: owner, type });\n finish();\n }, options?.timeoutMs ?? DEFAULT_BREAK_TIMEOUT_MS);\n this.active = { owner, finish };\n const fail = (err: unknown): void => {\n this.ctx.log(`Plugin \"${owner}\" failed in ads.requestBreak: ${(err as Error)?.message ?? err}`, { plugin: owner, type });\n finish();\n };\n try {\n Promise.resolve(run({ type, layer, signal: ctrl.signal, end: finish })).then(finish, fail);\n } catch (err) {\n fail(err);\n }\n });\n }\n\n private emit(name: 'hp:adstart' | 'hp:adend', type: PluginAdBreakType, plugin: string): void {\n this.ctx.element.dispatchEvent(new CustomEvent(name, { detail: { type, linear: true, plugin } }));\n }\n\n // ── Olaylar ──\n\n private readonly onLoadStart = (): void => {\n this.prerollDone = false;\n this.contentStarted = false;\n this.lastPos = 0;\n for (const m of this.mids) m.fired.clear();\n this.clearPause();\n };\n\n private readonly onPlay = (): void => {\n const v = this.ctx.video;\n // Reklam arasında / preroll beklenirken içerik oynamaz.\n if (this.active || this.gateRunning) {\n v.pause();\n return;\n }\n this.clearPause();\n if (this.prerollDone || !this.prerolls.length || this.ctx.isAdPlaying()) return;\n this.prerollDone = true;\n v.pause();\n void this.runPrerolls();\n };\n\n private async runPrerolls(): Promise<void> {\n this.gateRunning = true;\n const all = Promise.all(\n this.prerolls.map((p) =>\n Promise.resolve()\n .then(() => p.run())\n .catch((err) => this.ctx.log(`Plugin \"${p.owner}\" failed in ads.beforeContent: ${(err as Error)?.message ?? err}`, { plugin: p.owner }))\n )\n );\n await Promise.race([all, new Promise((r) => setTimeout(r, PREROLL_GATE_TIMEOUT_MS))]);\n // Süren bir ara varsa onun bitmesini bekle.\n while (this.active) await new Promise((r) => setTimeout(r, 100));\n this.gateRunning = false;\n void this.ctx.video.play().catch(() => {});\n }\n\n private readonly onPlaying = (): void => {\n if (!this.active && !this.ctx.isAdPlaying()) this.contentStarted = true;\n };\n\n private readonly onSeeking = (): void => {\n this.seekPending = true;\n };\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.video;\n const pos = v.currentTime;\n const prev = this.lastPos;\n this.lastPos = pos;\n const seeked = this.seekPending;\n this.seekPending = false;\n if (this.active || this.ctx.isAdPlaying() || v.paused || v.seeking || pos <= prev) return;\n for (const m of this.mids) {\n const crossed = m.marks.filter((s) => prev < s && s <= pos && !m.fired.has(s));\n if (!crossed.length) continue;\n for (const s of crossed) m.fired.add(s);\n // İleri sarınca geçilen noktalardan yalnızca sonuncusu (ya da hiçbiri).\n if (seeked && m.seekPast === 'skip') continue;\n m.fire(crossed[crossed.length - 1]!);\n }\n };\n\n private readonly onPause = (): void => {\n const v = this.ctx.video;\n if (!this.pauses.length || v.ended || v.seeking || this.active || this.gateRunning || this.ctx.isAdPlaying()) return;\n this.clearPause();\n const delay = Math.min(...this.pauses.map((p) => p.delayMs));\n this.pauseTimer = setTimeout(() => {\n this.pauseTimer = null;\n if (!v.paused || v.ended || this.active || this.ctx.isAdPlaying()) return;\n for (const p of this.pauses) {\n try {\n const cleanup = p.run();\n if (typeof cleanup === 'function') this.pauseCleanups.push(cleanup as () => void);\n } catch (err) {\n this.ctx.log(`Plugin \"${p.owner}\" failed in ads.onPause: ${(err as Error)?.message ?? err}`, { plugin: p.owner });\n }\n }\n }, delay);\n };\n\n private clearPause(): void {\n if (this.pauseTimer) clearTimeout(this.pauseTimer);\n this.pauseTimer = null;\n for (const c of this.pauseCleanups.splice(0)) {\n try {\n c();\n } catch {\n /* yok say */\n }\n }\n }\n\n private readonly onEnded = (): void => {\n this.clearPause();\n for (const e of this.endeds) e.run();\n };\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if ((this.active || this.gateRunning) && BLOCKED_KEYS.has(e.key)) e.preventDefault();\n };\n}\n","// Eklentileri kurar / kaldırır; eklenenleri izler ve temizler, hataları yakalar.\nimport { createIcon } from '../icons/Icon';\nimport { PluginAds } from './PluginAds';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../controls/SettingsMenu';\nimport {\n PLUGIN_API_VERSION,\n type HopePlugin,\n type PlayerApi,\n type PluginButtonHandle,\n type PluginButtonOptions,\n type PluginCleanup,\n type PluginEntry,\n type PluginLabel,\n type PluginLayerHandle,\n type PluginLayerOptions,\n type PluginLoader,\n type PluginSettingsHandle,\n} from './types';\n\n/** Player → PluginHost bağlamı (eklentiler görmez). */\nexport interface PluginHostContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n /** Alt katmanlar bunun önüne eklenir. */\n chromeEl: HTMLElement;\n labels: Readonly<Record<string, unknown>>;\n locale(): string;\n currentSrc(): string | null;\n isAdPlaying(): boolean;\n /** Reklam kilidi (`blockChrome('ads')`). */\n blockAds(): void;\n unblockAds(): void;\n isFullscreen(): boolean;\n addControlButton(button: HTMLButtonElement, position: 'left' | 'right'): void;\n settings: {\n registerToggle(row: { key: string; label: string; getValueLabel(): string; onToggle(): void }): void;\n unregisterToggle(key: string): void;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n };\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\ninterface Instance {\n plugin: HopePlugin<any>;\n optionsKey: string;\n api: PlayerApi;\n disposers: Array<() => void>;\n /** Dil değişince yeniden çizilecekler. */\n relabel: Array<() => void>;\n localeHandlers: Array<(locale: string) => void>;\n cleanup: PluginCleanup | null;\n removed: boolean;\n}\n\n/** `Shift+W` gibi kısayol. */\ninterface KeySpec {\n key: string;\n shift: boolean | null;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n}\n\nexport interface PluginShortcut {\n keys: string[];\n description: string;\n}\n\nconst resolve = (label: PluginLabel): string => (typeof label === 'function' ? label() : label);\n\nfunction parseKey(spec: string): KeySpec {\n const parts = spec.split('+');\n // \"Shift++\" gibi: son parça boşsa tuş \"+\".\n const key = (parts.pop() || '+').toLowerCase();\n const mods = parts.map((p) => p.toLowerCase());\n const letter = /^[a-z]$/.test(key);\n return { key, shift: mods.includes('shift') ? true : letter ? false : null, alt: mods.includes('alt'), ctrl: mods.includes('ctrl') || mods.includes('control'), meta: mods.includes('meta') || mods.includes('cmd') };\n}\n\nfunction matches(spec: KeySpec, e: KeyboardEvent): boolean {\n return (\n e.key.toLowerCase() === spec.key &&\n e.altKey === spec.alt &&\n e.ctrlKey === spec.ctrl &&\n e.metaKey === spec.meta &&\n (spec.shift === null || e.shiftKey === spec.shift)\n );\n}\n\nexport class PluginHost {\n private readonly instances = new Map<string, Instance>();\n private readonly shortcutList: Array<{ owner: string; spec: KeySpec; label: string; description: PluginLabel | undefined; handler: (e: KeyboardEvent) => void }> = [];\n private syncSeq = 0;\n private toastEl: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n /** Ayar satırı anahtarları. */\n private keySeq = 0;\n private readonly ads: PluginAds;\n\n constructor(private readonly ctx: PluginHostContext) {\n ctx.element.addEventListener('keydown', this.onKeyDown);\n this.ads = new PluginAds(ctx);\n }\n\n /** IMA tag'i eklenti dönüşümlerinden geçirir. */\n transformAdTag(url: string, type: 'preroll' | 'midroll' | 'postroll'): string {\n return this.ads.transformTag(url, type);\n }\n\n /** Listeye eşitler: kurar, kaldırır, günceller (aynı adlıda sonraki kazanır). */\n async sync(builtin: PluginEntry[], user: PluginEntry[]): Promise<void> {\n const seq = ++this.syncSeq;\n const resolved = await Promise.all([...builtin, ...user].map((e) => this.resolveEntry(e)));\n if (seq !== this.syncSeq) return; // daha yenisi başladı\n const wanted = new Map<string, { plugin: HopePlugin<any>; options: unknown }>();\n for (const r of resolved) if (r) wanted.set(r.plugin.name, r);\n\n for (const [name, inst] of this.instances) if (!wanted.has(name)) this.dispose(name, inst);\n for (const [name, { plugin, options }] of wanted) {\n const key = optionsKey(options);\n const inst = this.instances.get(name);\n if (inst && inst.plugin === plugin) {\n if (inst.optionsKey === key) continue;\n if (plugin.update) {\n inst.optionsKey = key;\n this.guard(name, () => plugin.update!(options))();\n continue;\n }\n }\n if (inst) this.dispose(name, inst);\n await this.install(plugin, options, key);\n }\n }\n\n /** Dil değişince. */\n refreshLabels(): void {\n for (const [name, inst] of this.instances) {\n for (const fn of inst.relabel) this.guard(name, fn)();\n for (const fn of inst.localeHandlers) this.guard(name, () => fn(this.ctx.locale()))();\n }\n }\n\n /** `?` listesi için. */\n shortcuts(): PluginShortcut[] {\n return this.shortcutList.filter((s) => s.description !== undefined).map((s) => ({ keys: [s.label], description: resolve(s.description!) }));\n }\n\n has(name: string): boolean {\n return this.instances.has(name);\n }\n\n destroy(): void {\n ++this.syncSeq;\n for (const [name, inst] of this.instances) this.dispose(name, inst);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown);\n this.ads.destroy();\n this.toastEl?.remove();\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n // ── Kurulum ──\n\n private async resolveEntry(entry: PluginEntry): Promise<{ plugin: HopePlugin<any>; options: unknown } | null> {\n const [target, options] = Array.isArray(entry) ? entry : [entry, undefined];\n try {\n if (typeof target === 'function') {\n const mod = await (target as PluginLoader)();\n const plugin = 'setup' in mod ? mod : 'default' in mod ? mod.default : mod.plugin;\n return plugin && typeof plugin.setup === 'function' ? { plugin, options } : null;\n }\n return target && typeof target.setup === 'function' && typeof target.name === 'string' ? { plugin: target, options } : null;\n } catch (err) {\n this.ctx.log(`Plugin could not be loaded: ${(err as Error)?.message ?? err}`, { plugin: typeof target === 'function' ? 'loader' : String((target as HopePlugin)?.name) });\n return null;\n }\n }\n\n private async install(plugin: HopePlugin<any>, options: unknown, key: string): Promise<void> {\n const name = plugin.name;\n if (plugin.apiVersion && plugin.apiVersion > PLUGIN_API_VERSION) {\n this.ctx.log(`Plugin \"${name}\" was written for plugin API v${plugin.apiVersion}; this player has v${PLUGIN_API_VERSION}`, { plugin: name });\n }\n const inst: Instance = { plugin, optionsKey: key, api: null as unknown as PlayerApi, disposers: [], relabel: [], localeHandlers: [], cleanup: null, removed: false };\n inst.api = this.createApi(inst);\n this.instances.set(name, inst);\n try {\n const result = await plugin.setup(inst.api, options);\n if (inst.removed) {\n if (typeof result === 'function') this.guard(name, result)();\n return;\n }\n if (typeof result === 'function') inst.cleanup = result;\n } catch (err) {\n this.report(name, err, 'setup');\n this.dispose(name, inst);\n }\n }\n\n private dispose(name: string, inst: Instance): void {\n if (inst.removed) return;\n inst.removed = true;\n if (this.instances.get(name) === inst) this.instances.delete(name);\n if (inst.cleanup) this.guard(name, inst.cleanup)();\n // Ters sırada kaldır.\n for (const d of inst.disposers.reverse()) {\n try {\n d();\n } catch {\n /* yok say */\n }\n }\n inst.disposers = [];\n this.ads.removeOwner(name);\n for (let i = this.shortcutList.length - 1; i >= 0; i--) if (this.shortcutList[i]!.owner === name) this.shortcutList.splice(i, 1);\n }\n\n private report(name: string, err: unknown, where: string): void {\n const message = (err as Error)?.message ?? String(err);\n this.ctx.log(`Plugin \"${name}\" failed in ${where}: ${message}`, { plugin: name });\n console.error(`[hope-player] plugin \"${name}\" (${where}):`, err);\n }\n\n /** Eklenti kodu hep bundan çağrılır; hata player'a geçmez. */\n private guard<A extends unknown[]>(name: string, fn: (...args: A) => unknown, where = 'handler'): (...args: A) => void {\n return (...args: A) => {\n try {\n const r = fn(...args);\n if (r instanceof Promise) r.catch((err) => this.report(name, err, where));\n } catch (err) {\n this.report(name, err, where);\n }\n };\n }\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n // Player'ın kendi tuşları önce; işlendiyse karışma.\n if (e.defaultPrevented) return;\n const target = e.composedPath()[0];\n if (target instanceof HTMLElement && (target.isContentEditable || /^(input|textarea|select)$/i.test(target.tagName))) return;\n for (const s of this.shortcutList) {\n if (matches(s.spec, e)) {\n e.preventDefault();\n s.handler(e);\n return;\n }\n }\n };\n\n // ── PlayerApi ──\n\n private createApi(inst: Instance): PlayerApi {\n const ctx = this.ctx;\n const name = inst.plugin.name;\n const track = (dispose: () => void): void => {\n if (inst.removed) dispose();\n else inst.disposers.push(dispose);\n };\n const guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => this.guard(name, fn, where);\n const strings: Record<string, Record<string, string>> = {};\n const host = this;\n\n const on = (event: string, handler: (event: Event) => void, once = false): (() => void) => {\n // `x:y` olayları elementte, diğerleri videoda.\n const target: EventTarget = event.includes(':') ? ctx.element : ctx.video;\n const wrapped = guard((ev: Event) => {\n if (once) off();\n handler(ev);\n }, `on(${event})`);\n target.addEventListener(event, wrapped);\n let done = false;\n const off = (): void => {\n if (done) return;\n done = true;\n target.removeEventListener(event, wrapped);\n };\n track(off);\n return off;\n };\n\n const api: PlayerApi = {\n plugin: name,\n apiVersion: PLUGIN_API_VERSION,\n element: ctx.element,\n video: ctx.video,\n get locale() {\n return ctx.locale();\n },\n labels: ctx.labels,\n get currentTime() {\n return ctx.video.currentTime;\n },\n get duration() {\n return ctx.video.duration;\n },\n get paused() {\n return ctx.video.paused;\n },\n get isLive() {\n return ctx.video.duration === Infinity;\n },\n get isAdPlaying() {\n return ctx.isAdPlaying();\n },\n get isFullscreen() {\n return ctx.isFullscreen();\n },\n get src() {\n return ctx.currentSrc();\n },\n play: () => ctx.video.play(),\n pause: () => ctx.video.pause(),\n seek: (time: number) => {\n if (Number.isFinite(time)) ctx.video.currentTime = Math.max(0, time);\n },\n on: (event, handler) => on(event, handler),\n once: (event, handler) => on(event, handler, true),\n emit: (event, detail) => {\n ctx.element.dispatchEvent(new CustomEvent(`${name}:${event}`, { detail, bubbles: true, composed: true }));\n },\n onSourceChange: (handler) => on('loadstart', () => handler(ctx.currentSrc())),\n onLocaleChange: (handler) => {\n inst.localeHandlers.push(handler);\n const off = (): void => {\n const i = inst.localeHandlers.indexOf(handler);\n if (i >= 0) inst.localeHandlers.splice(i, 1);\n };\n track(off);\n return off;\n },\n onDestroy: (handler) => track(guard(handler, 'onDestroy')),\n setTimeout: (handler, ms) => {\n const id = window.setTimeout(guard(handler, 'setTimeout'), ms);\n track(() => clearTimeout(id));\n return id;\n },\n setInterval: (handler, ms) => {\n const id = window.setInterval(guard(handler, 'setInterval'), ms);\n track(() => clearInterval(id));\n return id;\n },\n ui: {\n addButton: (o) => host.addButton(inst, o, track, guard),\n addLayer: (o) => host.addLayer(inst, o ?? {}, track),\n toast: (message, o) => host.toast(message, o?.durationMs),\n },\n settings: {\n addToggle: (o) => {\n const key = `plugin:${name}:toggle:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerToggle({\n key,\n label: resolve(o.label),\n getValueLabel: () => (o.get() ? onOff(ctx.labels, true) : onOff(ctx.labels, false)),\n onToggle: guard(() => o.set(!o.get()), 'settings.toggle'),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterToggle(key));\n return settingsHandle(register, () => ctx.settings.unregisterToggle(key));\n },\n addSelect: (o) => {\n const key = `plugin:${name}:select:${++host.keySeq}`;\n const list = () => (typeof o.options === 'function' ? o.options() : o.options);\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => {\n const current = list().find((x) => x.value === o.get());\n return current ? resolve(current.label) : '';\n },\n getItems: () => list().map((x) => ({ label: resolve(x.label), active: x.value === o.get(), onSelect: guard(() => o.set(x.value), 'settings.select') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n addSubmenu: (o) => {\n const key = `plugin:${name}:submenu:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => (o.value ? o.value() : ''),\n getItems: (): SettingsSubmenuItem[] =>\n o.items().map((x) => ({ label: resolve(x.label), active: !!x.active, onSelect: guard(() => x.onSelect(), 'settings.submenu') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n },\n keys: {\n add: (key, handler, description) => {\n const entry = { owner: name, spec: parseKey(key), label: key, description, handler: guard(handler, `keys(${key})`) };\n host.shortcutList.push(entry);\n const off = (): void => {\n const i = host.shortcutList.indexOf(entry);\n if (i >= 0) host.shortcutList.splice(i, 1);\n };\n track(off);\n return off;\n },\n },\n i18n: {\n add: (more) => {\n for (const [locale, values] of Object.entries(more)) strings[locale] = { ...strings[locale], ...values };\n },\n t: (key, fallback) => strings[ctx.locale()]?.[key] ?? strings.en?.[key] ?? fallback ?? key,\n },\n storage: {\n get: <T>(key: string, fallback?: T): T | undefined => {\n try {\n const raw = localStorage.getItem(storageKey(name, key));\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n },\n set: (key, value) => {\n try {\n localStorage.setItem(storageKey(name, key), JSON.stringify(value));\n } catch {\n /* yok say */\n }\n },\n remove: (key) => {\n try {\n localStorage.removeItem(storageKey(name, key));\n } catch {\n /* yok say */\n }\n },\n },\n ads: (() => {\n const raw = host.ads.api(name, guard);\n // Dönen kaldırıcılar eklenti kaldırılınca da çağrılır.\n const tracked = <F extends (...a: any[]) => () => void>(fn: F) =>\n ((...a: Parameters<F>) => {\n const off = fn(...a);\n track(off);\n return off;\n }) as F;\n return {\n requestBreak: raw.requestBreak,\n beforeContent: tracked(raw.beforeContent),\n atTime: tracked(raw.atTime),\n onPause: tracked(raw.onPause),\n onEnded: tracked(raw.onEnded),\n transformTag: tracked(raw.transformTag),\n };\n })(),\n log: (message, details) => ctx.log(message, { plugin: name, ...details }),\n };\n return api;\n }\n\n private addButton(\n inst: Instance,\n o: PluginButtonOptions,\n track: (d: () => void) => void,\n guard: <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void\n ): PluginButtonHandle {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-plugin-btn hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer hp:shrink-0';\n btn.setAttribute('part', `plugin-button plugin-${inst.plugin.name}`);\n btn.dataset.plugin = inst.plugin.name;\n let label: PluginLabel = o.label;\n let active = !!o.active;\n const setIcon = (icon: string): void => {\n btn.textContent = '';\n if (icon.trim().startsWith('<')) {\n btn.insertAdjacentHTML('beforeend', icon);\n btn.querySelector('svg')?.setAttribute('aria-hidden', 'true');\n } else btn.appendChild(createIcon(icon, 'hp:text-[length:var(--hp-ctrl-icon-size)]'));\n };\n const applyLabel = (): void => btn.setAttribute('aria-label', resolve(label));\n const applyActive = (): void => {\n if (o.active !== undefined) btn.setAttribute('aria-pressed', String(active));\n };\n setIcon(o.icon);\n applyLabel();\n applyActive();\n inst.relabel.push(applyLabel);\n const handle: PluginButtonHandle = {\n el: btn,\n get active() {\n return active;\n },\n setLabel: (l) => {\n label = l;\n applyLabel();\n },\n setIcon,\n setActive: (a) => {\n active = a;\n btn.setAttribute('aria-pressed', String(a));\n },\n show: () => {\n btn.style.display = '';\n },\n hide: () => {\n btn.style.display = 'none';\n },\n remove: () => btn.remove(),\n };\n if (o.onClick) {\n const click = guard((e: MouseEvent) => o.onClick!(e, handle), 'button.onClick');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n click(e);\n });\n }\n this.ctx.addControlButton(btn, o.position ?? 'right');\n track(() => btn.remove());\n return handle;\n }\n\n private addLayer(inst: Instance, o: PluginLayerOptions, track: (d: () => void) => void): PluginLayerHandle {\n const el = document.createElement('div');\n el.className = 'hp-plugin-layer';\n el.setAttribute('part', `plugin-layer plugin-${inst.plugin.name}`);\n el.dataset.plugin = inst.plugin.name;\n el.dataset.position = o.position ?? 'fill';\n el.toggleAttribute('data-autohide', !!o.autoHide);\n el.toggleAttribute('data-interactive', !!o.interactive);\n el.toggleAttribute('data-above', !!o.above);\n let visible = o.visible !== false;\n el.hidden = !visible;\n\n if (o.above) this.ctx.videoArea.appendChild(el);\n else this.ctx.videoArea.insertBefore(el, this.ctx.chromeEl);\n // Stil katmanın dışında: `el.innerHTML` silmesin.\n let style: HTMLStyleElement | null = null;\n if (o.css) {\n style = document.createElement('style');\n style.textContent = o.css;\n el.before(style);\n }\n const removeAll = (): void => {\n el.remove();\n style?.remove();\n };\n if (o.interactive) {\n // Tıklama videoya geçmesin.\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n }\n track(removeAll);\n const set = (v: boolean): void => {\n visible = v;\n el.hidden = !v;\n };\n return {\n el,\n get visible() {\n return visible;\n },\n show: () => set(true),\n hide: () => set(false),\n toggle: (force) => set(force ?? !visible),\n remove: removeAll,\n };\n }\n\n private toast(message: string, durationMs = 2500): void {\n if (!this.toastEl) {\n this.toastEl = document.createElement('div');\n this.toastEl.className = 'hp-plugin-toast';\n this.toastEl.setAttribute('part', 'plugin-toast');\n this.toastEl.setAttribute('role', 'status');\n this.toastEl.setAttribute('aria-live', 'polite');\n this.ctx.videoArea.appendChild(this.toastEl);\n }\n this.toastEl.textContent = message;\n this.toastEl.setAttribute('data-visible', '');\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toastTimer = setTimeout(() => this.toastEl?.removeAttribute('data-visible'), Math.max(500, durationMs));\n }\n}\n\nfunction settingsHandle(register: () => void, remove: () => void): PluginSettingsHandle {\n return { refresh: register, remove };\n}\n\nfunction onOff(labels: Readonly<Record<string, unknown>>, on: boolean): string {\n const value = on ? labels.a11yOn : labels.a11yOff;\n return typeof value === 'string' ? value : on ? 'On' : 'Off';\n}\n\nfunction storageKey(plugin: string, key: string): string {\n return `hp-plugin:${plugin}:${key}`;\n}\n\n/** Seçenek karşılaştırma anahtarı. */\nfunction optionsKey(options: unknown): string {\n try {\n return JSON.stringify(options ?? null, (_k, v: unknown) => (typeof v === 'function' ? `fn:${(v as { name?: string }).name ?? ''}` : v));\n } catch {\n return String(Math.random());\n }\n}\n\nexport { PLUGIN_API_VERSION };\nexport type { PluginShortcut as Shortcut };\n"],"names":["DEFAULT_BREAK_TIMEOUT_MS","PREROLL_GATE_TIMEOUT_MS","DEFAULT_PAUSE_DELAY_MS","BLOCKED_KEYS","PluginAds","ctx","__publicField","m","v","pos","prev","seeked","crossed","s","delay","p","cleanup","err","_a","owner","x","url","type","out","t","next","guard","add","list","item","i","run","options","seconds","marks","a","b","fire","fn","wasPlaying","layer","ev","e","ctrl","resolve","done","finish","timer","fail","name","plugin","all","r","c","label","parseKey","spec","parts","key","mods","letter","matches","PluginHost","target","builtin","user","seq","resolved","wanted","inst","optionsKey","entry","mod","PLUGIN_API_VERSION","result","d","where","message","args","track","dispose","strings","host","on","event","handler","once","wrapped","off","time","detail","ms","id","o","register","onOff","settingsHandle","current","description","more","locale","values","fallback","_b","raw","storageKey","value","tracked","details","btn","active","setIcon","icon","createIcon","applyLabel","applyActive","handle","click","el","visible","style","removeAll","set","force","durationMs","remove","labels","_k"],"mappings":"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"}