@hopeplayer/core 1.5.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 (159) hide show
  1. package/dist/HopePlayerElement.d.ts +47 -0
  2. package/dist/HopePlayerElement.d.ts.map +1 -1
  3. package/dist/chunks/adTriggers-DVqgm92F.js +420 -0
  4. package/dist/chunks/adTriggers-DVqgm92F.js.map +1 -0
  5. package/dist/chunks/{ads-C4tDPsUs.js → ads-eSKyiH1o.js} +2 -2
  6. package/dist/chunks/{ads-C4tDPsUs.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-Baxvu76A.js → cast-DEowHmqA.js} +29 -28
  10. package/dist/chunks/{cast-Baxvu76A.js.map → cast-DEowHmqA.js.map} +1 -1
  11. package/dist/chunks/docPip-Bh6BWPk-.js +92 -0
  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-CvydU0aN.js → history-ZSdDDsRF.js} +35 -34
  16. package/dist/chunks/{history-CvydU0aN.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/{loopSection-CvF4l5uf.js → loopSection-Bwk4W8vz.js} +16 -16
  20. package/dist/chunks/loopSection-Bwk4W8vz.js.map +1 -0
  21. package/dist/chunks/{markers-Dr4-CCxE.js → markers-D32rI-x-.js} +53 -51
  22. package/dist/chunks/markers-D32rI-x-.js.map +1 -0
  23. package/dist/chunks/multiview-CL1WfJKt.js +295 -0
  24. package/dist/chunks/multiview-CL1WfJKt.js.map +1 -0
  25. package/dist/chunks/{pauseAd-BQQe21X4.js → pauseAd-DF7KGwUs.js} +32 -31
  26. package/dist/chunks/{pauseAd-BQQe21X4.js.map → pauseAd-DF7KGwUs.js.map} +1 -1
  27. package/dist/chunks/{player-DV4Hf5Cw.js → player-B7mYS--8.js} +1580 -1284
  28. package/dist/chunks/player-B7mYS--8.js.map +1 -0
  29. package/dist/chunks/{playlist-DJsdK6xm.js → playlist-BkhIOfCy.js} +2 -2
  30. package/dist/chunks/{playlist-DJsdK6xm.js.map → playlist-BkhIOfCy.js.map} +1 -1
  31. package/dist/chunks/plugin-style-CPJELe-i.js +17 -0
  32. package/dist/chunks/plugin-style-CPJELe-i.js.map +1 -0
  33. package/dist/chunks/{pluginHost-GxNfyP5E.js → pluginHost-CXqkjNV1.js} +2 -2
  34. package/dist/chunks/{pluginHost-GxNfyP5E.js.map → pluginHost-CXqkjNV1.js.map} +1 -1
  35. package/dist/chunks/redirectScreen-DgmjFVJH.js +251 -0
  36. package/dist/chunks/redirectScreen-DgmjFVJH.js.map +1 -0
  37. package/dist/chunks/rewardedUnlock-BL97P5ht.js +265 -0
  38. package/dist/chunks/{rewardedUnlock-jFOdzfSq.js.map → rewardedUnlock-BL97P5ht.js.map} +1 -1
  39. package/dist/chunks/segments-CuQQEIAX.js +66 -0
  40. package/dist/chunks/segments-CuQQEIAX.js.map +1 -0
  41. package/dist/chunks/share-BdqQ8sGE.js +216 -0
  42. package/dist/chunks/share-BdqQ8sGE.js.map +1 -0
  43. package/dist/chunks/{skipSegments-vJMhdiJn.js → skipSegments-BbepQ4Y6.js} +2 -2
  44. package/dist/chunks/{skipSegments-vJMhdiJn.js.map → skipSegments-BbepQ4Y6.js.map} +1 -1
  45. package/dist/chunks/sponsorship-DoAZBbHE.js +241 -0
  46. package/dist/chunks/{sponsorship-BT21uwN5.js.map → sponsorship-DoAZBbHE.js.map} +1 -1
  47. package/dist/chunks/{spriteThumbnails-BoxVY--_.js → spriteThumbnails-BYg-DHx4.js} +28 -28
  48. package/dist/chunks/spriteThumbnails-BYg-DHx4.js.map +1 -0
  49. package/dist/chunks/{sticky-D_eLCNFk.js → sticky-BDStzjBM.js} +27 -26
  50. package/dist/chunks/sticky-BDStzjBM.js.map +1 -0
  51. package/dist/chunks/{story-BRkhSDhR.js → story-DcBG6jUg.js} +2 -2
  52. package/dist/chunks/{story-BRkhSDhR.js.map → story-DcBG6jUg.js.map} +1 -1
  53. package/dist/chunks/transcript-CHPQ6S6E.js +206 -0
  54. package/dist/chunks/transcript-CHPQ6S6E.js.map +1 -0
  55. package/dist/controls/ContextMenu.d.ts +1 -0
  56. package/dist/controls/ContextMenu.d.ts.map +1 -1
  57. package/dist/controls/ControlBar.d.ts +6 -0
  58. package/dist/controls/ControlBar.d.ts.map +1 -1
  59. package/dist/controls/SeekBar.d.ts +5 -2
  60. package/dist/controls/SeekBar.d.ts.map +1 -1
  61. package/dist/controls/SettingsMenu.d.ts +2 -1
  62. package/dist/controls/SettingsMenu.d.ts.map +1 -1
  63. package/dist/hls/SourceManager.d.ts +2 -0
  64. package/dist/hls/SourceManager.d.ts.map +1 -1
  65. package/dist/hope-player.js +3 -3
  66. package/dist/i18n/index.d.ts +9 -0
  67. package/dist/i18n/index.d.ts.map +1 -1
  68. package/dist/i18n/locales/en.d.ts +2 -2
  69. package/dist/i18n/locales/en.d.ts.map +1 -1
  70. package/dist/i18n/locales/tr.d.ts +2 -2
  71. package/dist/i18n/locales/tr.d.ts.map +1 -1
  72. package/dist/i18n/types.d.ts +52 -0
  73. package/dist/i18n/types.d.ts.map +1 -1
  74. package/dist/index.d.ts +1 -1
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/plugins/ad-triggers/AdTriggers.d.ts +5 -0
  77. package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
  78. package/dist/plugins/ad-triggers/index.d.ts.map +1 -1
  79. package/dist/plugins/audio-description/AudioDescription.d.ts +52 -0
  80. package/dist/plugins/audio-description/AudioDescription.d.ts.map +1 -0
  81. package/dist/plugins/audio-description/index.d.ts +6 -0
  82. package/dist/plugins/audio-description/index.d.ts.map +1 -0
  83. package/dist/plugins/audio-description/strings.d.ts +8 -0
  84. package/dist/plugins/audio-description/strings.d.ts.map +1 -0
  85. package/dist/plugins/cast/index.d.ts.map +1 -1
  86. package/dist/plugins/doc-pip/DocumentPip.d.ts +44 -0
  87. package/dist/plugins/doc-pip/DocumentPip.d.ts.map +1 -0
  88. package/dist/plugins/doc-pip/index.d.ts +5 -0
  89. package/dist/plugins/doc-pip/index.d.ts.map +1 -0
  90. package/dist/plugins/doc-pip/strings.d.ts +8 -0
  91. package/dist/plugins/doc-pip/strings.d.ts.map +1 -0
  92. package/dist/plugins/heatmap/Heatmap.d.ts +44 -0
  93. package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -0
  94. package/dist/plugins/heatmap/index.d.ts +6 -0
  95. package/dist/plugins/heatmap/index.d.ts.map +1 -0
  96. package/dist/plugins/heatmap/strings.d.ts +8 -0
  97. package/dist/plugins/heatmap/strings.d.ts.map +1 -0
  98. package/dist/plugins/history/index.d.ts.map +1 -1
  99. package/dist/plugins/interactive/Interactive.d.ts +45 -0
  100. package/dist/plugins/interactive/Interactive.d.ts.map +1 -0
  101. package/dist/plugins/interactive/index.d.ts +6 -0
  102. package/dist/plugins/interactive/index.d.ts.map +1 -0
  103. package/dist/plugins/interactive/strings.d.ts +8 -0
  104. package/dist/plugins/interactive/strings.d.ts.map +1 -0
  105. package/dist/plugins/markers/MarkProgress.d.ts +3 -1
  106. package/dist/plugins/markers/MarkProgress.d.ts.map +1 -1
  107. package/dist/plugins/multiview/Multiview.d.ts +92 -0
  108. package/dist/plugins/multiview/Multiview.d.ts.map +1 -0
  109. package/dist/plugins/multiview/index.d.ts +6 -0
  110. package/dist/plugins/multiview/index.d.ts.map +1 -0
  111. package/dist/plugins/multiview/strings.d.ts +8 -0
  112. package/dist/plugins/multiview/strings.d.ts.map +1 -0
  113. package/dist/plugins/pause-ad/index.d.ts.map +1 -1
  114. package/dist/plugins/redirect-screen/RedirectScreen.d.ts +3 -1
  115. package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
  116. package/dist/plugins/redirect-screen/index.d.ts.map +1 -1
  117. package/dist/plugins/redirect-screen/strings.d.ts +8 -0
  118. package/dist/plugins/redirect-screen/strings.d.ts.map +1 -0
  119. package/dist/plugins/rewarded/index.d.ts.map +1 -1
  120. package/dist/plugins/segments/Segments.d.ts +1 -0
  121. package/dist/plugins/segments/Segments.d.ts.map +1 -1
  122. package/dist/plugins/share/Share.d.ts +45 -0
  123. package/dist/plugins/share/Share.d.ts.map +1 -0
  124. package/dist/plugins/share/index.d.ts +6 -0
  125. package/dist/plugins/share/index.d.ts.map +1 -0
  126. package/dist/plugins/share/strings.d.ts +8 -0
  127. package/dist/plugins/share/strings.d.ts.map +1 -0
  128. package/dist/plugins/skip-segments/index.d.ts.map +1 -1
  129. package/dist/plugins/sponsorship/index.d.ts.map +1 -1
  130. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +1 -0
  131. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
  132. package/dist/plugins/sticky/StickyManager.d.ts +2 -0
  133. package/dist/plugins/sticky/StickyManager.d.ts.map +1 -1
  134. package/dist/plugins/transcript/Transcript.d.ts +65 -0
  135. package/dist/plugins/transcript/Transcript.d.ts.map +1 -0
  136. package/dist/plugins/transcript/index.d.ts +6 -0
  137. package/dist/plugins/transcript/index.d.ts.map +1 -0
  138. package/dist/plugins/transcript/strings.d.ts +8 -0
  139. package/dist/plugins/transcript/strings.d.ts.map +1 -0
  140. package/dist/subtitles/attachTracks.d.ts +6 -0
  141. package/dist/subtitles/attachTracks.d.ts.map +1 -1
  142. package/dist/types/index.d.ts +257 -12
  143. package/dist/types/index.d.ts.map +1 -1
  144. package/dist/utils/plugin-style.d.ts +5 -0
  145. package/dist/utils/plugin-style.d.ts.map +1 -0
  146. package/package.json +1 -1
  147. package/dist/chunks/adTriggers-DXmtF4t2.js +0 -410
  148. package/dist/chunks/adTriggers-DXmtF4t2.js.map +0 -1
  149. package/dist/chunks/loopSection-CvF4l5uf.js.map +0 -1
  150. package/dist/chunks/markers-Dr4-CCxE.js.map +0 -1
  151. package/dist/chunks/player-DV4Hf5Cw.js.map +0 -1
  152. package/dist/chunks/redirectScreen-BT_26-5g.js +0 -208
  153. package/dist/chunks/redirectScreen-BT_26-5g.js.map +0 -1
  154. package/dist/chunks/rewardedUnlock-jFOdzfSq.js +0 -264
  155. package/dist/chunks/segments--hl_QVrI.js +0 -63
  156. package/dist/chunks/segments--hl_QVrI.js.map +0 -1
  157. package/dist/chunks/sponsorship-BT21uwN5.js +0 -240
  158. package/dist/chunks/spriteThumbnails-BoxVY--_.js.map +0 -1
  159. package/dist/chunks/sticky-D_eLCNFk.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"skipSegments-vJMhdiJn.js","sources":["../../src/plugins/skip-segments/SkipSegments.ts","../../src/plugins/skip-segments/index.ts"],"sourcesContent":["import type { SkipSegment, SkipSegmentType } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\nimport { vodSeekTarget } from '../../utils/seek-by';\n\nexport interface SkipSegmentsPlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayContainerEl: HTMLElement;\n isAdActive(): boolean;\n i18n: HopeLocaleStrings;\n}\n\n/** Bölüm sonuna bu kadar kala buton kalkar — sona yaklaşırken bir an görünüp kaybolmasın. */\nconst END_MARGIN_SEC = 0.25;\n\ninterface Active {\n index: number;\n segment: SkipSegment;\n end: number;\n /** Butonun göründüğü video zamanı — `hideAfter` / `autoSkip` geri sayımı video zamanıyla işler (duraklatınca durur). */\n shownAt: number;\n /** Kullanıcı bölüme sararak girdi ya da bölüm içinde geri sardı → bu gösterimde otomatik atlama yok. */\n autoCancelled: boolean;\n}\n\n/**\n * \"İntroyu atla\" / \"Özeti atla\" / \"Jeneriği atla\": bölüm oynarken köşede bir buton, basınca bölümün sonuna atlar.\n * `autoSkip` ile basılmadan (isteğe bağlı geri sayımla) atlar; `hideAfter` ile bir süre sonra çekilir, kontroller\n * açılınca geri gelir. Reklam sırasında görünmez. `hp:skip` (`skip`) iptal edilebilir.\n */\nexport class SkipSegments {\n private active: Active | null = null;\n private button: HTMLButtonElement | null = null;\n private labelEl: HTMLSpanElement | null = null;\n /** Kullanıcının (bizim değil) yaptığı sarma — bir sonraki timeupdate'te işlenir. */\n private userSeeked = false;\n private ownSeek = false;\n\n constructor(\n private readonly ctx: SkipSegmentsPlayerContext,\n private readonly segments: SkipSegment[]\n ) {\n const v = ctx.videoEl;\n v.addEventListener('timeupdate', this.update);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('seeked', this.update);\n v.addEventListener('loadstart', this.onSourceChange);\n ctx.hostEl.addEventListener('hp:adstart', this.update);\n ctx.hostEl.addEventListener('hp:adend', this.update);\n this.update();\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('timeupdate', this.update);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('seeked', this.update);\n v.removeEventListener('loadstart', this.onSourceChange);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.update);\n this.ctx.hostEl.removeEventListener('hp:adend', this.update);\n this.hide();\n }\n\n refreshLabels(): void {\n if (this.active && this.labelEl) this.labelEl.textContent = this.label(this.active.segment);\n }\n\n private label(s: SkipSegment): string {\n if (s.label) return s.label;\n const t = this.ctx.i18n;\n const byType: Record<SkipSegmentType, string> = { intro: t.skipIntro, recap: t.skipRecap, credits: t.skipCredits, custom: t.skipSegment };\n return byType[s.type ?? 'intro'] ?? t.skipSegment;\n }\n\n /** Bölümün sonu: `end` yoksa videonun sonu (süre bilinmiyorsa bölüm yok sayılır). */\n private endOf(s: SkipSegment): number | null {\n if (Number.isFinite(s.end)) return s.end!;\n const d = this.ctx.videoEl.duration;\n return Number.isFinite(d) && d > 0 ? d : null;\n }\n\n private readonly onSeeking = (): void => {\n if (this.ownSeek) this.ownSeek = false;\n else this.userSeeked = true;\n };\n\n private readonly onSourceChange = (): void => {\n this.hide();\n this.userSeeked = false;\n };\n\n private readonly update = (): void => {\n const v = this.ctx.videoEl;\n const t = v.currentTime;\n const seeked = this.userSeeked;\n this.userSeeked = false;\n\n let found: { index: number; segment: SkipSegment; end: number } | null = null;\n if (!this.ctx.isAdActive()) {\n for (let i = 0; i < this.segments.length; i++) {\n const s = this.segments[i]!;\n const end = this.endOf(s);\n if (end === null || !Number.isFinite(s.start)) continue;\n const from = Math.max(s.start, Number.isFinite(s.showFrom) ? s.showFrom! : s.start);\n const until = Number.isFinite(s.showUntil) ? Math.min(s.showUntil!, end) : end;\n if (t >= from && t < until - END_MARGIN_SEC) {\n found = { index: i, segment: s, end };\n break;\n }\n }\n }\n\n if (!found) {\n this.hide();\n return;\n }\n if (this.active?.index !== found.index) {\n this.hide();\n this.active = { ...found, shownAt: t, autoCancelled: seeked };\n this.show();\n this.emit('shown');\n } else if (seeked) {\n // Bölüm içinde sarma: geri sardıysa (kullanıcı bölümü izlemek istiyor) otomatik atlama bu gösterimde kapanır.\n this.active.autoCancelled = true;\n this.active.shownAt = Math.min(this.active.shownAt, t);\n }\n this.tick(t);\n };\n\n /** `hideAfter` (çekilme) ve `autoSkip` geri sayımı. */\n private tick(t: number): void {\n const a = this.active;\n if (!a || !this.button) return;\n const elapsed = Math.max(0, t - a.shownAt);\n const hideAfter = a.segment.hideAfter ?? 0;\n this.button.toggleAttribute('data-faded', hideAfter > 0 && elapsed >= hideAfter);\n\n const auto = a.segment.autoSkip;\n if (!auto || a.autoCancelled) {\n this.button.removeAttribute('data-auto');\n return;\n }\n const delay = auto === true ? 0 : Math.max(0, auto);\n if (elapsed >= delay) {\n this.skip('auto');\n return;\n }\n this.button.setAttribute('data-auto', '');\n this.button.style.setProperty('--hp-skip-progress', String(delay ? elapsed / delay : 1));\n }\n\n private show(): void {\n const a = this.active!;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'hp-skip-segment';\n btn.setAttribute('part', 'skip-segment');\n btn.setAttribute('data-position', a.segment.position ?? 'bottom-right');\n btn.setAttribute('data-type', a.segment.type ?? 'intro');\n const label = document.createElement('span');\n label.className = 'hp-skip-segment-label';\n label.textContent = this.label(a.segment);\n btn.append(label, createIcon('skip-forward', 'hp-skip-segment-icon'));\n btn.addEventListener('click', () => this.skip('click'));\n // Oynat/duraklat ve çift tık tam ekran alttaki video alanına geçmesin.\n for (const ev of ['pointerdown', 'pointerup', 'click', 'dblclick'] as const) btn.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(btn);\n this.button = btn;\n this.labelEl = label;\n }\n\n private hide(): void {\n this.button?.remove();\n this.button = null;\n this.labelEl = null;\n this.active = null;\n }\n\n private emit(state: 'shown' | 'skip', reason?: 'click' | 'auto'): boolean {\n const a = this.active!;\n return this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:skip', {\n detail: { state, type: a.segment.type ?? 'intro', start: a.segment.start, end: a.end, reason },\n cancelable: state === 'skip',\n })\n );\n }\n\n private skip(reason: 'click' | 'auto'): void {\n const a = this.active;\n if (!a) return;\n const focused = !!this.button?.matches(':focus');\n if (!this.emit('skip', reason)) {\n // Entegratör kendisi halletti — bu gösterim için otomatik atlama tekrar tetiklenmesin.\n a.autoCancelled = true;\n this.button?.removeAttribute('data-auto');\n return;\n }\n const v = this.ctx.videoEl;\n this.hide();\n this.ownSeek = true;\n v.currentTime = vodSeekTarget(v, a.end);\n // Klavyeyle basıldıysa odak kaybolmasın — player'a dön (kısayollar çalışmaya devam etsin).\n if (focused) this.ctx.hostEl.focus({ preventScroll: true });\n }\n}\n","import { SkipSegments, type SkipSegmentsPlayerContext } from './SkipSegments';\nimport type { SkipSegment } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { definePlugin } from '../../plugin-api/registry';\n\nexport function installSkipSegments(ctx: SkipSegmentsPlayerContext, segments: SkipSegment[]): SkipSegments {\n return new SkipSegments(ctx, segments);\n}\n\n/** \"İntroyu atla\", herkese açık eklenti API'si üzerinden. */\nexport const skipSegmentsPlugin = definePlugin<SkipSegment[]>({\n name: 'hope:skip-segments',\n setup(player, segments) {\n const layer = player.ui.addLayer({ position: 'fill' });\n const skip = new SkipSegments(\n {\n hostEl: player.element,\n videoEl: player.video,\n overlayContainerEl: layer.el,\n isAdActive: () => player.isAdPlaying,\n i18n: player.labels as unknown as HopeLocaleStrings,\n },\n segments\n );\n player.onLocaleChange(() => skip.refreshLabels());\n return () => skip.destroy();\n },\n});\n\nexport { SkipSegments };\nexport type { SkipSegmentsPlayerContext };\n"],"names":["END_MARGIN_SEC","SkipSegments","ctx","segments","__publicField","seeked","found","i","s","end","from","until","_a","v","d","t","a","elapsed","hideAfter","auto","delay","btn","label","createIcon","ev","e","state","reason","focused","_b","vodSeekTarget","skipSegmentsPlugin","definePlugin","player","layer","skip"],"mappings":"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"}
1
+ {"version":3,"file":"skipSegments-BbepQ4Y6.js","sources":["../../src/plugins/skip-segments/SkipSegments.ts","../../src/plugins/skip-segments/index.ts"],"sourcesContent":["import type { SkipSegment, SkipSegmentType } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\nimport { vodSeekTarget } from '../../utils/seek-by';\n\nexport interface SkipSegmentsPlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayContainerEl: HTMLElement;\n isAdActive(): boolean;\n i18n: HopeLocaleStrings;\n}\n\n/** Bölüm sonuna bu kadar kala buton kalkar — sona yaklaşırken bir an görünüp kaybolmasın. */\nconst END_MARGIN_SEC = 0.25;\n\ninterface Active {\n index: number;\n segment: SkipSegment;\n end: number;\n /** Butonun göründüğü video zamanı — `hideAfter` / `autoSkip` geri sayımı video zamanıyla işler (duraklatınca durur). */\n shownAt: number;\n /** Kullanıcı bölüme sararak girdi ya da bölüm içinde geri sardı → bu gösterimde otomatik atlama yok. */\n autoCancelled: boolean;\n}\n\n/**\n * \"İntroyu atla\" / \"Özeti atla\" / \"Jeneriği atla\": bölüm oynarken köşede bir buton, basınca bölümün sonuna atlar.\n * `autoSkip` ile basılmadan (isteğe bağlı geri sayımla) atlar; `hideAfter` ile bir süre sonra çekilir, kontroller\n * açılınca geri gelir. Reklam sırasında görünmez. `hp:skip` (`skip`) iptal edilebilir.\n */\nexport class SkipSegments {\n private active: Active | null = null;\n private button: HTMLButtonElement | null = null;\n private labelEl: HTMLSpanElement | null = null;\n /** Kullanıcının (bizim değil) yaptığı sarma — bir sonraki timeupdate'te işlenir. */\n private userSeeked = false;\n private ownSeek = false;\n\n constructor(\n private readonly ctx: SkipSegmentsPlayerContext,\n private readonly segments: SkipSegment[]\n ) {\n const v = ctx.videoEl;\n v.addEventListener('timeupdate', this.update);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('seeked', this.update);\n v.addEventListener('loadstart', this.onSourceChange);\n ctx.hostEl.addEventListener('hp:adstart', this.update);\n ctx.hostEl.addEventListener('hp:adend', this.update);\n this.update();\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('timeupdate', this.update);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('seeked', this.update);\n v.removeEventListener('loadstart', this.onSourceChange);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.update);\n this.ctx.hostEl.removeEventListener('hp:adend', this.update);\n this.hide();\n }\n\n refreshLabels(): void {\n if (this.active && this.labelEl) this.labelEl.textContent = this.label(this.active.segment);\n }\n\n private label(s: SkipSegment): string {\n if (s.label) return s.label;\n const t = this.ctx.i18n;\n const byType: Record<SkipSegmentType, string> = { intro: t.skipIntro, recap: t.skipRecap, credits: t.skipCredits, custom: t.skipSegment };\n return byType[s.type ?? 'intro'] ?? t.skipSegment;\n }\n\n /** Bölümün sonu: `end` yoksa videonun sonu (süre bilinmiyorsa bölüm yok sayılır). */\n private endOf(s: SkipSegment): number | null {\n if (Number.isFinite(s.end)) return s.end!;\n const d = this.ctx.videoEl.duration;\n return Number.isFinite(d) && d > 0 ? d : null;\n }\n\n private readonly onSeeking = (): void => {\n if (this.ownSeek) this.ownSeek = false;\n else this.userSeeked = true;\n };\n\n private readonly onSourceChange = (): void => {\n this.hide();\n this.userSeeked = false;\n };\n\n private readonly update = (): void => {\n const v = this.ctx.videoEl;\n const t = v.currentTime;\n const seeked = this.userSeeked;\n this.userSeeked = false;\n\n let found: { index: number; segment: SkipSegment; end: number } | null = null;\n if (!this.ctx.isAdActive()) {\n for (let i = 0; i < this.segments.length; i++) {\n const s = this.segments[i]!;\n const end = this.endOf(s);\n if (end === null || !Number.isFinite(s.start)) continue;\n const from = Math.max(s.start, Number.isFinite(s.showFrom) ? s.showFrom! : s.start);\n const until = Number.isFinite(s.showUntil) ? Math.min(s.showUntil!, end) : end;\n if (t >= from && t < until - END_MARGIN_SEC) {\n found = { index: i, segment: s, end };\n break;\n }\n }\n }\n\n if (!found) {\n this.hide();\n return;\n }\n if (this.active?.index !== found.index) {\n this.hide();\n this.active = { ...found, shownAt: t, autoCancelled: seeked };\n this.show();\n this.emit('shown');\n } else if (seeked) {\n // Bölüm içinde sarma: geri sardıysa (kullanıcı bölümü izlemek istiyor) otomatik atlama bu gösterimde kapanır.\n this.active.autoCancelled = true;\n this.active.shownAt = Math.min(this.active.shownAt, t);\n }\n this.tick(t);\n };\n\n /** `hideAfter` (çekilme) ve `autoSkip` geri sayımı. */\n private tick(t: number): void {\n const a = this.active;\n if (!a || !this.button) return;\n const elapsed = Math.max(0, t - a.shownAt);\n const hideAfter = a.segment.hideAfter ?? 0;\n this.button.toggleAttribute('data-faded', hideAfter > 0 && elapsed >= hideAfter);\n\n const auto = a.segment.autoSkip;\n if (!auto || a.autoCancelled) {\n this.button.removeAttribute('data-auto');\n return;\n }\n const delay = auto === true ? 0 : Math.max(0, auto);\n if (elapsed >= delay) {\n this.skip('auto');\n return;\n }\n this.button.setAttribute('data-auto', '');\n this.button.style.setProperty('--hp-skip-progress', String(delay ? elapsed / delay : 1));\n }\n\n private show(): void {\n const a = this.active!;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'hp-skip-segment';\n btn.setAttribute('part', 'skip-segment');\n btn.setAttribute('data-position', a.segment.position ?? 'bottom-right');\n btn.setAttribute('data-type', a.segment.type ?? 'intro');\n const label = document.createElement('span');\n label.className = 'hp-skip-segment-label';\n label.textContent = this.label(a.segment);\n btn.append(label, createIcon('skip-forward', 'hp-skip-segment-icon'));\n btn.addEventListener('click', () => this.skip('click'));\n // Oynat/duraklat ve çift tık tam ekran alttaki video alanına geçmesin.\n for (const ev of ['pointerdown', 'pointerup', 'click', 'dblclick'] as const) btn.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(btn);\n this.button = btn;\n this.labelEl = label;\n }\n\n private hide(): void {\n this.button?.remove();\n this.button = null;\n this.labelEl = null;\n this.active = null;\n }\n\n private emit(state: 'shown' | 'skip', reason?: 'click' | 'auto'): boolean {\n const a = this.active!;\n return this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:skip', {\n detail: { state, type: a.segment.type ?? 'intro', start: a.segment.start, end: a.end, reason },\n cancelable: state === 'skip',\n })\n );\n }\n\n private skip(reason: 'click' | 'auto'): void {\n const a = this.active;\n if (!a) return;\n const focused = !!this.button?.matches(':focus');\n if (!this.emit('skip', reason)) {\n // Entegratör kendisi halletti — bu gösterim için otomatik atlama tekrar tetiklenmesin.\n a.autoCancelled = true;\n this.button?.removeAttribute('data-auto');\n return;\n }\n const v = this.ctx.videoEl;\n this.hide();\n this.ownSeek = true;\n v.currentTime = vodSeekTarget(v, a.end);\n // Klavyeyle basıldıysa odak kaybolmasın — player'a dön (kısayollar çalışmaya devam etsin).\n if (focused) this.ctx.hostEl.focus({ preventScroll: true });\n }\n}\n","import { adoptStyle } from '../../utils/plugin-style';\nimport css from './skip-segments.css?inline';\nimport { SkipSegments, type SkipSegmentsPlayerContext } from './SkipSegments';\nimport type { SkipSegment } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { definePlugin } from '../../plugin-api/registry';\n\nexport function installSkipSegments(ctx: SkipSegmentsPlayerContext, segments: SkipSegment[]): SkipSegments {\n adoptStyle(ctx.videoEl, 'skip-segments', css);\n return new SkipSegments(ctx, segments);\n}\n\n/** \"İntroyu atla\", herkese açık eklenti API'si üzerinden. */\nexport const skipSegmentsPlugin = definePlugin<SkipSegment[]>({\n name: 'hope:skip-segments',\n setup(player, segments) {\n const layer = player.ui.addLayer({ position: 'fill' });\n const skip = new SkipSegments(\n {\n hostEl: player.element,\n videoEl: player.video,\n overlayContainerEl: layer.el,\n isAdActive: () => player.isAdPlaying,\n i18n: player.labels as unknown as HopeLocaleStrings,\n },\n segments\n );\n player.onLocaleChange(() => skip.refreshLabels());\n return () => skip.destroy();\n },\n});\n\nexport { SkipSegments };\nexport type { SkipSegmentsPlayerContext };\n"],"names":["END_MARGIN_SEC","SkipSegments","ctx","segments","__publicField","seeked","found","i","s","end","from","until","_a","v","d","t","a","elapsed","hideAfter","auto","delay","btn","label","createIcon","ev","e","state","reason","focused","_b","vodSeekTarget","skipSegmentsPlugin","definePlugin","player","layer","skip"],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ var k = Object.defineProperty;
2
+ var S = (i, t, o) => t in i ? k(i, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : i[t] = o;
3
+ var a = (i, t, o) => S(i, typeof t != "symbol" ? t + "" : t, o);
4
+ import { a as A } from "./plugin-style-CPJELe-i.js";
5
+ import { f as u } from "./trackingPixel-D2wxdCEz.js";
6
+ const C = ".hp-sponsor-logo{position:absolute;z-index:21;display:flex;flex-direction:column;align-items:center;gap:4px;width:var(--hp-sponsor-logo-w, 96px);color:#fff;text-decoration:none;filter:drop-shadow(0 2px 6px rgba(0,0,0,.55));transition:opacity .25s,right .35s cubic-bezier(.2,.8,.2,1),bottom .35s cubic-bezier(.2,.8,.2,1);animation:hp-rw-fade .4s ease-out}.hp-sponsor-logo[data-position=top-left]{top:12px;left:12px}.hp-sponsor-logo[data-position=top-right]{top:12px;right:var(--hp-sponsor-avoid-right, 12px)}.hp-sponsor-logo[data-position=bottom-left]{bottom:var(--hp-sponsor-avoid-bottom, 76px);left:12px}.hp-sponsor-logo[data-position=bottom-right]{bottom:var(--hp-sponsor-avoid-bottom, 76px);right:12px}.video-area[data-chrome-hidden] .hp-sponsor-logo[data-position=top-right]{right:12px}.video-area[data-chrome-hidden] .hp-sponsor-logo[data-position=bottom-left],.video-area[data-chrome-hidden] .hp-sponsor-logo[data-position=bottom-right]{bottom:12px}.hp-sponsor-logo img{display:block;width:100%;height:auto}.hp-sponsor-label{max-width:100%;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:600 10px/1 system-ui,-apple-system,sans-serif;letter-spacing:.08em;text-transform:uppercase;opacity:.85}.video-area:has(.hp-rw-button:not([hidden])) .hp-sponsor-logo[data-position=top-left]{top:52px}.hp-sponsor-intro{position:absolute;left:50%;bottom:84px;z-index:22;display:flex;align-items:center;gap:10px;max-width:calc(100% - 32px);padding:8px 16px 8px 8px;border-radius:999px;background:#0c0c10d1;color:#fff;font:600 14px/1.2 system-ui,-apple-system,sans-serif;transform:translate(-50%);box-shadow:0 12px 30px -12px #000c;pointer-events:none;animation:hp-sponsor-in .45s cubic-bezier(.2,.8,.2,1);transition:opacity .35s,transform .35s}.hp-sponsor-intro[data-leaving]{opacity:0;transform:translate(-50%,8px)}.hp-sponsor-intro img{height:28px;width:auto;max-width:96px;border-radius:6px}.hp-sponsor-intro span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes hp-sponsor-in{0%{opacity:0;transform:translate(-50%,12px) scale(.96)}}:host([data-sponsor-hidden]) .hp-sponsor-logo,:host([data-sponsor-hidden]) .hp-sponsor-intro{display:none}@media(prefers-reduced-motion:reduce){.hp-sponsor-intro{animation:none}}@media(hover:none)and (pointer:coarse){.video-area:has(.hp-unmute-badge[data-visible]) .hp-sponsor-logo[data-position=top-left]{top:52px}.video-area:has(.hp-unmute-badge[data-visible]):has(.hp-rw-button:not([hidden])) .hp-sponsor-logo[data-position=top-left]{top:92px}}.hp-sponsor-logo[data-compact]{width:min(var(--hp-sponsor-logo-w, 96px),48px);gap:2px}.hp-sponsor-logo[data-compact] .hp-sponsor-label{font-size:8.5px}:host([data-sponsor-intro]) .hp-sponsor-logo{opacity:0!important;pointer-events:none}", M = 5e3, E = 96, w = 3500, T = {
7
+ accent: "--hp-color-accent",
8
+ onAccent: "--hp-color-on-accent",
9
+ surface: "--hp-color-surface",
10
+ onSurface: "--hp-color-on-surface"
11
+ }, L = ["top-left", "top-right", "bottom-left", "bottom-right"];
12
+ function f(i) {
13
+ if (typeof i != "string" || !i.trim()) return null;
14
+ try {
15
+ const t = new URL(i, document.baseURI);
16
+ return t.protocol === "https:" || t.protocol === "http:" ? t.href : null;
17
+ } catch {
18
+ return null;
19
+ }
20
+ }
21
+ function I(i) {
22
+ return typeof i == "string" && i.length < 64 && CSS.supports("color", i) ? i : null;
23
+ }
24
+ function g(i, t, o, e) {
25
+ return typeof i == "number" && Number.isFinite(i) ? Math.min(o, Math.max(t, i)) : e;
26
+ }
27
+ function P(i) {
28
+ var h, p, n, d, v, b, y, x;
29
+ if (!i || typeof i != "object") return null;
30
+ const t = i;
31
+ if (t.active !== !0 || !t.sponsor || typeof t.sponsor.name != "string" || !t.sponsor.name.trim()) return null;
32
+ const o = Date.now(), e = t.validFrom ? Date.parse(t.validFrom) : NaN, s = t.validUntil ? Date.parse(t.validUntil) : NaN;
33
+ if (Number.isFinite(e) && o < e || Number.isFinite(s) && o > s) return null;
34
+ const r = {};
35
+ for (const c of Object.keys(T)) {
36
+ const m = I((h = t.theme) == null ? void 0 : h[c]);
37
+ m && (r[c] = m);
38
+ }
39
+ const l = (c) => Array.isArray(c) ? c.map(f).filter((m) => !!m).slice(0, 10) : [];
40
+ return {
41
+ active: !0,
42
+ id: typeof t.id == "string" ? t.id.slice(0, 120) : void 0,
43
+ sponsor: {
44
+ name: t.sponsor.name.slice(0, 80),
45
+ logo: f(t.sponsor.logo) ?? void 0,
46
+ url: f(t.sponsor.url) ?? void 0
47
+ },
48
+ theme: r,
49
+ logo: {
50
+ position: L.includes((p = t.logo) == null ? void 0 : p.position) ? t.logo.position : "top-left",
51
+ width: g((n = t.logo) == null ? void 0 : n.width, 32, 240, E),
52
+ opacity: g((d = t.logo) == null ? void 0 : d.opacity, 0.2, 1, 0.9),
53
+ label: typeof ((v = t.logo) == null ? void 0 : v.label) == "string" ? t.logo.label.slice(0, 40) : void 0
54
+ },
55
+ intro: t.intro ? {
56
+ text: typeof t.intro.text == "string" ? t.intro.text.slice(0, 120) : void 0,
57
+ durationMs: g(t.intro.durationMs, 1e3, 15e3, w),
58
+ repeatMinutes: typeof t.intro.repeatMinutes == "number" && t.intro.repeatMinutes > 0 ? Math.min(240, Math.max(1, t.intro.repeatMinutes)) : void 0,
59
+ maxShows: typeof t.intro.maxShows == "number" && t.intro.maxShows >= 1 ? Math.min(100, Math.floor(t.intro.maxShows)) : void 0
60
+ } : void 0,
61
+ tracking: { impression: l((b = t.tracking) == null ? void 0 : b.impression), click: l((y = t.tracking) == null ? void 0 : y.click), intro: l((x = t.tracking) == null ? void 0 : x.intro) }
62
+ };
63
+ }
64
+ class O {
65
+ constructor(t, o) {
66
+ a(this, "options");
67
+ a(this, "config", null);
68
+ a(this, "logoEl", null);
69
+ a(this, "introEl", null);
70
+ a(this, "introTimer", null);
71
+ a(this, "refreshTimer", null);
72
+ /** Player boyutu / kontrol düzeni değişince logo kontrollerin üstüne binmesin diye yeniden konumlanır. */
73
+ a(this, "resizeObserver");
74
+ /** Uygulanan tema değişkenlerinin önceki satır içi değerleri — katman kalkınca geri yüklenir. */
75
+ a(this, "previousTokens", /* @__PURE__ */ new Map());
76
+ /** Gösterim pikseli kampanya başına bir kez. */
77
+ a(this, "impressed", /* @__PURE__ */ new Set());
78
+ /** Kampanya başına giriş gösterim sayısı. */
79
+ a(this, "introCount", /* @__PURE__ */ new Map());
80
+ /** Son girişten bu yana gerçek izleme süresi (ms) — intro.repeatMinutes için. */
81
+ a(this, "watchedSinceIntro", 0);
82
+ a(this, "lastTick", 0);
83
+ a(this, "tickTimer");
84
+ a(this, "destroyed", !1);
85
+ a(this, "requestSeq", 0);
86
+ /** Oynatma başladı: kampanya başına bir kez gösterim pikseli + "X sunar" kartı. */
87
+ a(this, "onPlay", () => {
88
+ var e;
89
+ const t = this.config;
90
+ if (!t) return;
91
+ const o = this.key(t);
92
+ this.impressed.has(o) || (this.impressed.add(o), u((e = t.tracking) == null ? void 0 : e.impression), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorimpression", { detail: { id: t.id, sponsor: t.sponsor.name } }))), t.intro && !this.introCount.has(o) && this.showIntro(t);
93
+ });
94
+ /**
95
+ * intro.repeatMinutes: yalnızca gerçekten izlenirken sayar (oynuyor, sekme önde, reklam yok); süre dolunca giriş
96
+ * tekrar gösterilir — maxShows'a kadar.
97
+ */
98
+ a(this, "tick", () => {
99
+ var h, p;
100
+ const t = performance.now(), o = Math.min(2e3, Math.max(0, t - this.lastTick));
101
+ this.lastTick = t;
102
+ const e = this.config, s = (h = e == null ? void 0 : e.intro) == null ? void 0 : h.repeatMinutes;
103
+ if (!e || !s || !(!this.ctx.videoEl.paused && !this.ctx.videoEl.ended && !document.hidden && !this.ctx.hostEl.hasAttribute("data-sponsor-hidden")) || !this.introCount.has(this.key(e)) || (this.watchedSinceIntro += o, this.watchedSinceIntro < s * 6e4)) return;
104
+ const l = (p = e.intro) == null ? void 0 : p.maxShows;
105
+ l && (this.introCount.get(this.key(e)) ?? 0) >= l || this.showIntro(e);
106
+ });
107
+ /** Lineer reklam sırasında logo / giriş gizlenir (reklamın üstüne binmesin). */
108
+ a(this, "onAdStart", (t) => {
109
+ var o;
110
+ ((o = t.detail) == null ? void 0 : o.linear) !== !1 && this.ctx.hostEl.setAttribute("data-sponsor-hidden", "");
111
+ });
112
+ a(this, "onAdEnd", (t) => {
113
+ var o;
114
+ ((o = t.detail) == null ? void 0 : o.linear) !== !1 && this.ctx.hostEl.removeAttribute("data-sponsor-hidden");
115
+ });
116
+ var s, r;
117
+ this.ctx = t, this.options = o, t.videoEl.addEventListener("play", this.onPlay), t.hostEl.addEventListener("hp:adstart", this.onAdStart), t.hostEl.addEventListener("hp:adend", this.onAdEnd), this.lastTick = performance.now(), this.tickTimer = setInterval(this.tick, 1e3), this.resizeObserver = typeof ResizeObserver < "u" ? new ResizeObserver(() => this.positionLogo()) : null, (s = this.resizeObserver) == null || s.observe(t.overlayEl);
118
+ const e = t.overlayEl.querySelector(".hp-top-bar");
119
+ e && ((r = this.resizeObserver) == null || r.observe(e)), this.load(), this.scheduleRefresh();
120
+ }
121
+ update(t) {
122
+ const o = t.endpoint !== this.options.endpoint || JSON.stringify(t.params) !== JSON.stringify(this.options.params), e = t.refreshSeconds !== this.options.refreshSeconds;
123
+ this.options = t, o && this.load(), e && this.scheduleRefresh();
124
+ }
125
+ /** Şu an uygulanan kampanya (yoksa null). */
126
+ get current() {
127
+ return this.config;
128
+ }
129
+ scheduleRefresh() {
130
+ this.refreshTimer && clearInterval(this.refreshTimer), this.refreshTimer = null;
131
+ const t = this.options.refreshSeconds;
132
+ typeof t == "number" && t >= 10 && (this.refreshTimer = setInterval(() => void this.load(), t * 1e3));
133
+ }
134
+ buildUrl() {
135
+ const t = new URL(this.options.endpoint, document.baseURI);
136
+ for (const [o, e] of Object.entries(this.options.params ?? {})) t.searchParams.set(o, e);
137
+ return t.href;
138
+ }
139
+ async load() {
140
+ const t = ++this.requestSeq, o = typeof AbortController < "u" ? new AbortController() : null, e = setTimeout(() => o == null ? void 0 : o.abort(), this.options.timeoutMs ?? M);
141
+ let s = "";
142
+ try {
143
+ s = this.buildUrl();
144
+ const r = await fetch(s, { ...this.options.fetchInit, signal: o == null ? void 0 : o.signal });
145
+ if (!r.ok) throw new Error(`HTTP ${r.status}`);
146
+ const l = await r.json();
147
+ if (this.destroyed || t !== this.requestSeq) return;
148
+ this.apply(P(l));
149
+ } catch (r) {
150
+ if (this.destroyed || t !== this.requestSeq) return;
151
+ this.ctx.log({ message: `Sponsorship API failed: ${String(r)}`, details: { url: s } });
152
+ } finally {
153
+ clearTimeout(e);
154
+ }
155
+ }
156
+ apply(t) {
157
+ const o = this.key(this.config);
158
+ this.config = t, this.applyTheme((t == null ? void 0 : t.theme) ?? null), this.renderLogo(), this.ctx.hostEl.toggleAttribute("data-sponsored", !!t), this.key(t) !== o && (this.watchedSinceIntro = 0, this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorship", { detail: { config: t } })), t && !this.ctx.videoEl.paused && this.onPlay());
159
+ }
160
+ key(t) {
161
+ return t ? t.id || t.sponsor.name : "";
162
+ }
163
+ applyTheme(t) {
164
+ const o = this.ctx.hostEl.style;
165
+ for (const [e, s] of this.previousTokens)
166
+ s ? o.setProperty(e, s) : o.removeProperty(e);
167
+ if (this.previousTokens.clear(), !!t)
168
+ for (const [e, s] of Object.entries(T)) {
169
+ const r = t[e];
170
+ r && (this.previousTokens.set(s, o.getPropertyValue(s)), o.setProperty(s, r));
171
+ }
172
+ }
173
+ renderLogo() {
174
+ var e, s, r, l, h, p;
175
+ (e = this.logoEl) == null || e.remove(), this.logoEl = null;
176
+ const t = this.config;
177
+ if (!t || !t.sponsor.logo && !((s = t.logo) != null && s.label)) return;
178
+ const o = t.sponsor.url ? document.createElement("a") : document.createElement("div");
179
+ if (o.className = "hp-sponsor-logo", o.setAttribute("part", "sponsor-logo"), o.setAttribute("data-position", ((r = t.logo) == null ? void 0 : r.position) ?? "top-left"), o.style.setProperty("--hp-sponsor-logo-w", `${((l = t.logo) == null ? void 0 : l.width) ?? E}px`), o.style.opacity = String(((h = t.logo) == null ? void 0 : h.opacity) ?? 0.9), o instanceof HTMLAnchorElement && (o.href = t.sponsor.url, o.target = "_blank", o.rel = "noopener sponsored", o.addEventListener("click", (n) => {
180
+ var d;
181
+ n.stopPropagation(), u((d = t.tracking) == null ? void 0 : d.click), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorclick", { detail: { id: t.id, sponsor: t.sponsor.name } }));
182
+ })), o.setAttribute("aria-label", t.sponsor.name), t.sponsor.logo) {
183
+ const n = document.createElement("img");
184
+ n.src = t.sponsor.logo, n.alt = t.sponsor.name, n.decoding = "async", n.addEventListener("error", () => n.remove()), o.appendChild(n);
185
+ }
186
+ if ((p = t.logo) != null && p.label) {
187
+ const n = document.createElement("span");
188
+ n.className = "hp-sponsor-label", n.textContent = t.logo.label, o.appendChild(n);
189
+ }
190
+ for (const n of ["pointerdown", "dblclick"]) o.addEventListener(n, (d) => d.stopPropagation());
191
+ this.ctx.overlayEl.appendChild(o), this.logoEl = o, this.positionLogo();
192
+ }
193
+ /**
194
+ * Logo kontrollerin üstüne binmesin: sağ üstte (dar player'da ayarlar / PiP oraya taşınır) üst çubuğun soluna,
195
+ * altta seek bar'ın hemen üstüne yerleşir. Dar player'da logo en fazla 48 px.
196
+ */
197
+ positionLogo() {
198
+ var l, h;
199
+ const t = this.logoEl;
200
+ if (!t) return;
201
+ const o = this.ctx.overlayEl, e = o.hasAttribute("data-compact"), s = t.getAttribute("data-position");
202
+ t.style.removeProperty("--hp-sponsor-avoid-right"), t.style.removeProperty("--hp-sponsor-avoid-bottom"), t.toggleAttribute("data-compact", e);
203
+ const r = o.getBoundingClientRect();
204
+ if (s === "top-right") {
205
+ const p = (l = o.querySelector(".hp-top-bar")) == null ? void 0 : l.getBoundingClientRect();
206
+ p && p.width > 0 && t.style.setProperty("--hp-sponsor-avoid-right", `${Math.round(r.right - p.left + 8)}px`);
207
+ } else if (s === "bottom-left" || s === "bottom-right") {
208
+ const p = (h = o.querySelector('[part="seek-bar"]')) == null ? void 0 : h.getBoundingClientRect();
209
+ p && p.height > 0 && t.style.setProperty("--hp-sponsor-avoid-bottom", `${Math.round(r.bottom - p.top + 6)}px`);
210
+ }
211
+ }
212
+ showIntro(t) {
213
+ var l, h, p, n;
214
+ const o = this.key(t), e = (this.introCount.get(o) ?? 0) + 1;
215
+ this.introCount.set(o, e), this.watchedSinceIntro = 0, u((l = t.tracking) == null ? void 0 : l.intro), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorintro", { detail: { id: t.id, sponsor: t.sponsor.name, count: e } })), this.introTimer && clearTimeout(this.introTimer), (h = this.introEl) == null || h.remove();
216
+ const s = document.createElement("div");
217
+ if (s.className = "hp-sponsor-intro", s.setAttribute("part", "sponsor-intro"), s.setAttribute("role", "status"), t.sponsor.logo) {
218
+ const d = document.createElement("img");
219
+ d.src = t.sponsor.logo, d.alt = "", d.addEventListener("error", () => d.remove()), s.appendChild(d);
220
+ }
221
+ const r = document.createElement("span");
222
+ r.textContent = ((p = t.intro) == null ? void 0 : p.text) || this.ctx.i18n.sponsorPresents.replace("{name}", t.sponsor.name), s.appendChild(r), this.ctx.overlayEl.appendChild(s), this.introEl = s, this.ctx.hostEl.setAttribute("data-sponsor-intro", ""), this.introTimer = setTimeout(() => {
223
+ s.setAttribute("data-leaving", ""), this.ctx.hostEl.removeAttribute("data-sponsor-intro"), this.introTimer = setTimeout(() => {
224
+ s.remove(), this.introEl === s && (this.introEl = null);
225
+ }, 400);
226
+ }, ((n = t.intro) == null ? void 0 : n.durationMs) ?? w);
227
+ }
228
+ destroy() {
229
+ var t, o, e;
230
+ this.destroyed = !0, clearInterval(this.tickTimer), (t = this.resizeObserver) == null || t.disconnect(), this.refreshTimer && clearInterval(this.refreshTimer), this.introTimer && clearTimeout(this.introTimer), this.ctx.videoEl.removeEventListener("play", this.onPlay), this.ctx.hostEl.removeEventListener("hp:adstart", this.onAdStart), this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.applyTheme(null), (o = this.logoEl) == null || o.remove(), (e = this.introEl) == null || e.remove(), this.ctx.hostEl.removeAttribute("data-sponsored"), this.ctx.hostEl.removeAttribute("data-sponsor-hidden"), this.ctx.hostEl.removeAttribute("data-sponsor-intro");
231
+ }
232
+ }
233
+ function U(i, t) {
234
+ return A(i.videoEl, "sponsorship", C), new O(i, t);
235
+ }
236
+ export {
237
+ O as SponsorshipLayer,
238
+ U as installSponsorship,
239
+ P as normalizeSponsorship
240
+ };
241
+ //# sourceMappingURL=sponsorship-DoAZBbHE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sponsorship-BT21uwN5.js","sources":["../../src/plugins/sponsorship/SponsorshipLayer.ts","../../src/plugins/sponsorship/index.ts"],"sourcesContent":["import type { SponsorshipConfig, SponsorshipOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { firePixels as fire } from '../shared/trackingPixel';\n\nexport interface SponsorshipContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Logo ve giriş kartının ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; fatal?: boolean; details?: Record<string, string | number | boolean | undefined> }): void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst DEFAULT_LOGO_WIDTH = 96;\nconst DEFAULT_INTRO_MS = 3500;\n/** API'den gelen tema değerleri → player'ın CSS değişkenleri. */\nconst THEME_TOKENS: Record<keyof NonNullable<SponsorshipConfig['theme']>, string> = {\n accent: '--hp-color-accent',\n onAccent: '--hp-color-on-accent',\n surface: '--hp-color-surface',\n onSurface: '--hp-color-on-surface',\n};\nconst POSITIONS = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n\n/** Yalnızca http(s) ya da göreli adresler — `javascript:` / `data:` gibi şemalar reddedilir. */\nfunction safeUrl(value: unknown): string | null {\n if (typeof value !== 'string' || !value.trim()) return null;\n try {\n const u = new URL(value, document.baseURI);\n return u.protocol === 'https:' || u.protocol === 'http:' ? u.href : null;\n } catch {\n return null;\n }\n}\n\nfunction safeColor(value: unknown): string | null {\n return typeof value === 'string' && value.length < 64 && CSS.supports('color', value) ? value : null;\n}\n\nfunction clamp(n: unknown, min: number, max: number, fallback: number): number {\n return typeof n === 'number' && Number.isFinite(n) ? Math.min(max, Math.max(min, n)) : fallback;\n}\n\n/** API yanıtını doğrular, geçersiz alanları atar; katman kapalıysa null. */\nexport function normalizeSponsorship(raw: unknown): SponsorshipConfig | null {\n if (!raw || typeof raw !== 'object') return null;\n const r = raw as Partial<SponsorshipConfig>;\n if (r.active !== true || !r.sponsor || typeof r.sponsor.name !== 'string' || !r.sponsor.name.trim()) return null;\n const now = Date.now();\n const from = r.validFrom ? Date.parse(r.validFrom) : NaN;\n const until = r.validUntil ? Date.parse(r.validUntil) : NaN;\n if ((Number.isFinite(from) && now < from) || (Number.isFinite(until) && now > until)) return null;\n const theme: NonNullable<SponsorshipConfig['theme']> = {};\n for (const key of Object.keys(THEME_TOKENS) as Array<keyof typeof THEME_TOKENS>) {\n const c = safeColor(r.theme?.[key]);\n if (c) theme[key] = c;\n }\n const urls = (list: unknown): string[] => (Array.isArray(list) ? list.map(safeUrl).filter((u): u is string => !!u).slice(0, 10) : []);\n return {\n active: true,\n id: typeof r.id === 'string' ? r.id.slice(0, 120) : undefined,\n sponsor: {\n name: r.sponsor.name.slice(0, 80),\n logo: safeUrl(r.sponsor.logo) ?? undefined,\n url: safeUrl(r.sponsor.url) ?? undefined,\n },\n theme,\n logo: {\n position: POSITIONS.includes(r.logo?.position as (typeof POSITIONS)[number]) ? r.logo!.position : 'top-left',\n width: clamp(r.logo?.width, 32, 240, DEFAULT_LOGO_WIDTH),\n opacity: clamp(r.logo?.opacity, 0.2, 1, 0.9),\n label: typeof r.logo?.label === 'string' ? r.logo.label.slice(0, 40) : undefined,\n },\n intro: r.intro\n ? {\n text: typeof r.intro.text === 'string' ? r.intro.text.slice(0, 120) : undefined,\n durationMs: clamp(r.intro.durationMs, 1000, 15000, DEFAULT_INTRO_MS),\n repeatMinutes: typeof r.intro.repeatMinutes === 'number' && r.intro.repeatMinutes > 0 ? Math.min(240, Math.max(1, r.intro.repeatMinutes)) : undefined,\n maxShows: typeof r.intro.maxShows === 'number' && r.intro.maxShows >= 1 ? Math.min(100, Math.floor(r.intro.maxShows)) : undefined,\n }\n : undefined,\n tracking: { impression: urls(r.tracking?.impression), click: urls(r.tracking?.click), intro: urls(r.tracking?.intro) },\n };\n}\n\n\n/**\n * Sponsorluk katmanı: `endpoint`'ten JSON çeker (SponsorshipConfig), player renklerini değiştirir, köşeye logo koyar,\n * oynatma başlarken \"X sunar\" kartını gösterir. Canlıda `refreshSeconds` ile kampanya değişimi izlenir. API hatasında\n * son geçerli ayar korunur; hiç alınamadıysa katman kapalı kalır — player normal çalışır.\n */\nexport class SponsorshipLayer {\n private options: SponsorshipOptions;\n private config: SponsorshipConfig | null = null;\n private logoEl: HTMLAnchorElement | HTMLDivElement | null = null;\n private introEl: HTMLDivElement | null = null;\n private introTimer: ReturnType<typeof setTimeout> | null = null;\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n /** Player boyutu / kontrol düzeni değişince logo kontrollerin üstüne binmesin diye yeniden konumlanır. */\n private readonly resizeObserver: ResizeObserver | null;\n /** Uygulanan tema değişkenlerinin önceki satır içi değerleri — katman kalkınca geri yüklenir. */\n private previousTokens = new Map<string, string>();\n /** Gösterim pikseli kampanya başına bir kez. */\n private impressed = new Set<string>();\n /** Kampanya başına giriş gösterim sayısı. */\n private introCount = new Map<string, number>();\n /** Son girişten bu yana gerçek izleme süresi (ms) — intro.repeatMinutes için. */\n private watchedSinceIntro = 0;\n private lastTick = 0;\n private readonly tickTimer: ReturnType<typeof setInterval>;\n private destroyed = false;\n private requestSeq = 0;\n\n constructor(\n private readonly ctx: SponsorshipContext,\n options: SponsorshipOptions\n ) {\n this.options = options;\n ctx.videoEl.addEventListener('play', this.onPlay);\n ctx.hostEl.addEventListener('hp:adstart', this.onAdStart);\n ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n this.lastTick = performance.now();\n this.tickTimer = setInterval(this.tick, 1000);\n this.resizeObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(() => this.positionLogo()) : null;\n this.resizeObserver?.observe(ctx.overlayEl);\n const topBar = ctx.overlayEl.querySelector('.hp-top-bar');\n if (topBar) this.resizeObserver?.observe(topBar);\n void this.load();\n this.scheduleRefresh();\n }\n\n update(options: SponsorshipOptions): void {\n const changed = options.endpoint !== this.options.endpoint || JSON.stringify(options.params) !== JSON.stringify(this.options.params);\n const refreshChanged = options.refreshSeconds !== this.options.refreshSeconds;\n this.options = options;\n if (changed) void this.load();\n if (refreshChanged) this.scheduleRefresh();\n }\n\n /** Şu an uygulanan kampanya (yoksa null). */\n get current(): SponsorshipConfig | null {\n return this.config;\n }\n\n private scheduleRefresh(): void {\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n const s = this.options.refreshSeconds;\n if (typeof s === 'number' && s >= 10) this.refreshTimer = setInterval(() => void this.load(), s * 1000);\n }\n\n private buildUrl(): string {\n const u = new URL(this.options.endpoint, document.baseURI);\n for (const [k, v] of Object.entries(this.options.params ?? {})) u.searchParams.set(k, v);\n return u.href;\n }\n\n private async load(): Promise<void> {\n const seq = ++this.requestSeq;\n const ctrl = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = setTimeout(() => ctrl?.abort(), this.options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n let url = '';\n try {\n url = this.buildUrl();\n const res = await fetch(url, { ...this.options.fetchInit, signal: ctrl?.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json: unknown = await res.json();\n if (this.destroyed || seq !== this.requestSeq) return; // daha yeni bir istek var\n this.apply(normalizeSponsorship(json));\n } catch (err) {\n if (this.destroyed || seq !== this.requestSeq) return;\n // Son geçerli kampanya korunur — geçici API hatası katmanı söndürmesin.\n this.ctx.log({ message: `Sponsorship API failed: ${String(err)}`, details: { url } });\n } finally {\n clearTimeout(timer);\n }\n }\n\n private apply(config: SponsorshipConfig | null): void {\n const prevKey = this.key(this.config);\n this.config = config;\n this.applyTheme(config?.theme ?? null);\n this.renderLogo();\n this.ctx.hostEl.toggleAttribute('data-sponsored', !!config);\n if (this.key(config) !== prevKey) {\n this.watchedSinceIntro = 0;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorship', { detail: { config } }));\n // Yeni kampanya oynarken geldiyse (canlı yenileme) girişi hemen göster.\n if (config && !this.ctx.videoEl.paused) this.onPlay();\n }\n }\n\n private key(c: SponsorshipConfig | null): string {\n return c ? c.id || c.sponsor.name : '';\n }\n\n private applyTheme(theme: SponsorshipConfig['theme'] | null): void {\n const style = this.ctx.hostEl.style;\n // Önce önceki kampanyanın değerlerini geri al.\n for (const [prop, value] of this.previousTokens) {\n if (value) style.setProperty(prop, value);\n else style.removeProperty(prop);\n }\n this.previousTokens.clear();\n if (!theme) return;\n for (const [key, prop] of Object.entries(THEME_TOKENS) as Array<[keyof typeof THEME_TOKENS, string]>) {\n const value = theme[key];\n if (!value) continue;\n this.previousTokens.set(prop, style.getPropertyValue(prop));\n style.setProperty(prop, value);\n }\n }\n\n private renderLogo(): void {\n this.logoEl?.remove();\n this.logoEl = null;\n const c = this.config;\n if (!c || (!c.sponsor.logo && !c.logo?.label)) return;\n const el = c.sponsor.url ? document.createElement('a') : document.createElement('div');\n el.className = 'hp-sponsor-logo';\n el.setAttribute('part', 'sponsor-logo');\n el.setAttribute('data-position', c.logo?.position ?? 'top-left');\n el.style.setProperty('--hp-sponsor-logo-w', `${c.logo?.width ?? DEFAULT_LOGO_WIDTH}px`);\n el.style.opacity = String(c.logo?.opacity ?? 0.9);\n if (el instanceof HTMLAnchorElement) {\n el.href = c.sponsor.url!;\n el.target = '_blank';\n el.rel = 'noopener sponsored';\n el.addEventListener('click', (e) => {\n e.stopPropagation();\n fire(c.tracking?.click);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorclick', { detail: { id: c.id, sponsor: c.sponsor.name } }));\n });\n }\n el.setAttribute('aria-label', c.sponsor.name);\n if (c.sponsor.logo) {\n const img = document.createElement('img');\n img.src = c.sponsor.logo;\n img.alt = c.sponsor.name;\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n // Etiket logonun altında, ortalı.\n if (c.logo?.label) {\n const label = document.createElement('span');\n label.className = 'hp-sponsor-label';\n label.textContent = c.logo.label;\n el.appendChild(label);\n }\n for (const t of ['pointerdown', 'dblclick'] as const) el.addEventListener(t, (e) => e.stopPropagation());\n this.ctx.overlayEl.appendChild(el);\n this.logoEl = el;\n this.positionLogo();\n }\n\n /**\n * Logo kontrollerin üstüne binmesin: sağ üstte (dar player'da ayarlar / PiP oraya taşınır) üst çubuğun soluna,\n * altta seek bar'ın hemen üstüne yerleşir. Dar player'da logo en fazla 48 px.\n */\n private positionLogo(): void {\n const el = this.logoEl;\n if (!el) return;\n const area = this.ctx.overlayEl;\n const compact = area.hasAttribute('data-compact');\n const position = el.getAttribute('data-position');\n // Kontroller görünürken kaçınılacak mesafe CSS değişkenine yazılır; kontroller gizliyken CSS logoyu köşeye\n // alır (bkz. :host([data-chrome-hidden])) ve geçiş animasyonlu olur.\n el.style.removeProperty('--hp-sponsor-avoid-right');\n el.style.removeProperty('--hp-sponsor-avoid-bottom');\n el.toggleAttribute('data-compact', compact);\n const a = area.getBoundingClientRect();\n if (position === 'top-right') {\n const bar = area.querySelector('.hp-top-bar')?.getBoundingClientRect();\n if (bar && bar.width > 0) el.style.setProperty('--hp-sponsor-avoid-right', `${Math.round(a.right - bar.left + 8)}px`);\n } else if (position === 'bottom-left' || position === 'bottom-right') {\n const seek = area.querySelector('[part=\"seek-bar\"]')?.getBoundingClientRect();\n if (seek && seek.height > 0) el.style.setProperty('--hp-sponsor-avoid-bottom', `${Math.round(a.bottom - seek.top + 6)}px`);\n }\n }\n\n /** Oynatma başladı: kampanya başına bir kez gösterim pikseli + \"X sunar\" kartı. */\n private readonly onPlay = (): void => {\n const c = this.config;\n if (!c) return;\n const key = this.key(c);\n if (!this.impressed.has(key)) {\n this.impressed.add(key);\n fire(c.tracking?.impression);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorimpression', { detail: { id: c.id, sponsor: c.sponsor.name } }));\n }\n if (c.intro && !this.introCount.has(key)) this.showIntro(c);\n };\n\n /**\n * intro.repeatMinutes: yalnızca gerçekten izlenirken sayar (oynuyor, sekme önde, reklam yok); süre dolunca giriş\n * tekrar gösterilir — maxShows'a kadar.\n */\n private readonly tick = (): void => {\n const now = performance.now();\n // Sekme uyuyunca setInterval seyrekleşir — tek seferde en fazla 2 sn sayılır.\n const delta = Math.min(2000, Math.max(0, now - this.lastTick));\n this.lastTick = now;\n const c = this.config;\n const repeat = c?.intro?.repeatMinutes;\n if (!c || !repeat) return;\n const watching =\n !this.ctx.videoEl.paused && !this.ctx.videoEl.ended && !document.hidden && !this.ctx.hostEl.hasAttribute('data-sponsor-hidden');\n if (!watching || !this.introCount.has(this.key(c))) return;\n this.watchedSinceIntro += delta;\n if (this.watchedSinceIntro < repeat * 60_000) return;\n const max = c.intro?.maxShows;\n if (max && (this.introCount.get(this.key(c)) ?? 0) >= max) return;\n this.showIntro(c);\n };\n\n private showIntro(c: SponsorshipConfig): void {\n const key = this.key(c);\n const count = (this.introCount.get(key) ?? 0) + 1;\n this.introCount.set(key, count);\n this.watchedSinceIntro = 0;\n fire(c.tracking?.intro);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorintro', { detail: { id: c.id, sponsor: c.sponsor.name, count } }));\n if (this.introTimer) clearTimeout(this.introTimer);\n this.introEl?.remove();\n const el = document.createElement('div');\n el.className = 'hp-sponsor-intro';\n el.setAttribute('part', 'sponsor-intro');\n el.setAttribute('role', 'status');\n if (c.sponsor.logo) {\n const img = document.createElement('img');\n img.src = c.sponsor.logo;\n img.alt = '';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n const text = document.createElement('span');\n text.textContent = c.intro?.text || this.ctx.i18n.sponsorPresents.replace('{name}', c.sponsor.name);\n el.appendChild(text);\n this.ctx.overlayEl.appendChild(el);\n this.introEl = el;\n // Giriş kartı sponsoru zaten gösteriyor — kart görünürken köşe logosu gizli (küçük player'da üst üste binmesin).\n this.ctx.hostEl.setAttribute('data-sponsor-intro', '');\n this.introTimer = setTimeout(() => {\n el.setAttribute('data-leaving', '');\n this.ctx.hostEl.removeAttribute('data-sponsor-intro');\n this.introTimer = setTimeout(() => {\n el.remove();\n if (this.introEl === el) this.introEl = null;\n }, 400);\n }, c.intro?.durationMs ?? DEFAULT_INTRO_MS);\n }\n\n /** Lineer reklam sırasında logo / giriş gizlenir (reklamın üstüne binmesin). */\n private readonly onAdStart = (e: Event): void => {\n if ((e as CustomEvent<{ linear?: boolean }>).detail?.linear === false) return;\n this.ctx.hostEl.setAttribute('data-sponsor-hidden', '');\n };\n\n private readonly onAdEnd = (e: Event): void => {\n if ((e as CustomEvent<{ linear?: boolean }>).detail?.linear === false) return;\n this.ctx.hostEl.removeAttribute('data-sponsor-hidden');\n };\n\n destroy(): void {\n this.destroyed = true;\n clearInterval(this.tickTimer);\n this.resizeObserver?.disconnect();\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n if (this.introTimer) clearTimeout(this.introTimer);\n this.ctx.videoEl.removeEventListener('play', this.onPlay);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.onAdStart);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.applyTheme(null);\n this.logoEl?.remove();\n this.introEl?.remove();\n this.ctx.hostEl.removeAttribute('data-sponsored');\n this.ctx.hostEl.removeAttribute('data-sponsor-hidden');\n this.ctx.hostEl.removeAttribute('data-sponsor-intro');\n }\n}\n","import { SponsorshipLayer, normalizeSponsorship, type SponsorshipContext } from './SponsorshipLayer';\nimport type { SponsorshipOptions } from '../../types';\n\n/** Sponsorluk katmanını kurar (ayarları `endpoint`'ten alır). */\nexport function installSponsorship(ctx: SponsorshipContext, options: SponsorshipOptions): SponsorshipLayer {\n return new SponsorshipLayer(ctx, options);\n}\n\nexport { SponsorshipLayer, normalizeSponsorship };\nexport type { SponsorshipContext };\n"],"names":["DEFAULT_TIMEOUT_MS","DEFAULT_LOGO_WIDTH","DEFAULT_INTRO_MS","THEME_TOKENS","POSITIONS","safeUrl","value","u","safeColor","clamp","n","min","max","fallback","normalizeSponsorship","raw","r","now","from","until","theme","key","c","_a","urls","list","_b","_c","_d","_e","_f","_g","_h","SponsorshipLayer","ctx","options","__publicField","fire","delta","repeat","e","topBar","changed","refreshChanged","s","k","v","seq","ctrl","timer","url","res","json","err","config","prevKey","style","prop","el","img","label","t","area","compact","position","a","bar","seek","count","text","installSponsorship"],"mappings":"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"}
1
+ {"version":3,"file":"sponsorship-DoAZBbHE.js","sources":["../../src/plugins/sponsorship/SponsorshipLayer.ts","../../src/plugins/sponsorship/index.ts"],"sourcesContent":["import type { SponsorshipConfig, SponsorshipOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { firePixels as fire } from '../shared/trackingPixel';\n\nexport interface SponsorshipContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Logo ve giriş kartının ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; fatal?: boolean; details?: Record<string, string | number | boolean | undefined> }): void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst DEFAULT_LOGO_WIDTH = 96;\nconst DEFAULT_INTRO_MS = 3500;\n/** API'den gelen tema değerleri → player'ın CSS değişkenleri. */\nconst THEME_TOKENS: Record<keyof NonNullable<SponsorshipConfig['theme']>, string> = {\n accent: '--hp-color-accent',\n onAccent: '--hp-color-on-accent',\n surface: '--hp-color-surface',\n onSurface: '--hp-color-on-surface',\n};\nconst POSITIONS = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n\n/** Yalnızca http(s) ya da göreli adresler — `javascript:` / `data:` gibi şemalar reddedilir. */\nfunction safeUrl(value: unknown): string | null {\n if (typeof value !== 'string' || !value.trim()) return null;\n try {\n const u = new URL(value, document.baseURI);\n return u.protocol === 'https:' || u.protocol === 'http:' ? u.href : null;\n } catch {\n return null;\n }\n}\n\nfunction safeColor(value: unknown): string | null {\n return typeof value === 'string' && value.length < 64 && CSS.supports('color', value) ? value : null;\n}\n\nfunction clamp(n: unknown, min: number, max: number, fallback: number): number {\n return typeof n === 'number' && Number.isFinite(n) ? Math.min(max, Math.max(min, n)) : fallback;\n}\n\n/** API yanıtını doğrular, geçersiz alanları atar; katman kapalıysa null. */\nexport function normalizeSponsorship(raw: unknown): SponsorshipConfig | null {\n if (!raw || typeof raw !== 'object') return null;\n const r = raw as Partial<SponsorshipConfig>;\n if (r.active !== true || !r.sponsor || typeof r.sponsor.name !== 'string' || !r.sponsor.name.trim()) return null;\n const now = Date.now();\n const from = r.validFrom ? Date.parse(r.validFrom) : NaN;\n const until = r.validUntil ? Date.parse(r.validUntil) : NaN;\n if ((Number.isFinite(from) && now < from) || (Number.isFinite(until) && now > until)) return null;\n const theme: NonNullable<SponsorshipConfig['theme']> = {};\n for (const key of Object.keys(THEME_TOKENS) as Array<keyof typeof THEME_TOKENS>) {\n const c = safeColor(r.theme?.[key]);\n if (c) theme[key] = c;\n }\n const urls = (list: unknown): string[] => (Array.isArray(list) ? list.map(safeUrl).filter((u): u is string => !!u).slice(0, 10) : []);\n return {\n active: true,\n id: typeof r.id === 'string' ? r.id.slice(0, 120) : undefined,\n sponsor: {\n name: r.sponsor.name.slice(0, 80),\n logo: safeUrl(r.sponsor.logo) ?? undefined,\n url: safeUrl(r.sponsor.url) ?? undefined,\n },\n theme,\n logo: {\n position: POSITIONS.includes(r.logo?.position as (typeof POSITIONS)[number]) ? r.logo!.position : 'top-left',\n width: clamp(r.logo?.width, 32, 240, DEFAULT_LOGO_WIDTH),\n opacity: clamp(r.logo?.opacity, 0.2, 1, 0.9),\n label: typeof r.logo?.label === 'string' ? r.logo.label.slice(0, 40) : undefined,\n },\n intro: r.intro\n ? {\n text: typeof r.intro.text === 'string' ? r.intro.text.slice(0, 120) : undefined,\n durationMs: clamp(r.intro.durationMs, 1000, 15000, DEFAULT_INTRO_MS),\n repeatMinutes: typeof r.intro.repeatMinutes === 'number' && r.intro.repeatMinutes > 0 ? Math.min(240, Math.max(1, r.intro.repeatMinutes)) : undefined,\n maxShows: typeof r.intro.maxShows === 'number' && r.intro.maxShows >= 1 ? Math.min(100, Math.floor(r.intro.maxShows)) : undefined,\n }\n : undefined,\n tracking: { impression: urls(r.tracking?.impression), click: urls(r.tracking?.click), intro: urls(r.tracking?.intro) },\n };\n}\n\n\n/**\n * Sponsorluk katmanı: `endpoint`'ten JSON çeker (SponsorshipConfig), player renklerini değiştirir, köşeye logo koyar,\n * oynatma başlarken \"X sunar\" kartını gösterir. Canlıda `refreshSeconds` ile kampanya değişimi izlenir. API hatasında\n * son geçerli ayar korunur; hiç alınamadıysa katman kapalı kalır — player normal çalışır.\n */\nexport class SponsorshipLayer {\n private options: SponsorshipOptions;\n private config: SponsorshipConfig | null = null;\n private logoEl: HTMLAnchorElement | HTMLDivElement | null = null;\n private introEl: HTMLDivElement | null = null;\n private introTimer: ReturnType<typeof setTimeout> | null = null;\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n /** Player boyutu / kontrol düzeni değişince logo kontrollerin üstüne binmesin diye yeniden konumlanır. */\n private readonly resizeObserver: ResizeObserver | null;\n /** Uygulanan tema değişkenlerinin önceki satır içi değerleri — katman kalkınca geri yüklenir. */\n private previousTokens = new Map<string, string>();\n /** Gösterim pikseli kampanya başına bir kez. */\n private impressed = new Set<string>();\n /** Kampanya başına giriş gösterim sayısı. */\n private introCount = new Map<string, number>();\n /** Son girişten bu yana gerçek izleme süresi (ms) — intro.repeatMinutes için. */\n private watchedSinceIntro = 0;\n private lastTick = 0;\n private readonly tickTimer: ReturnType<typeof setInterval>;\n private destroyed = false;\n private requestSeq = 0;\n\n constructor(\n private readonly ctx: SponsorshipContext,\n options: SponsorshipOptions\n ) {\n this.options = options;\n ctx.videoEl.addEventListener('play', this.onPlay);\n ctx.hostEl.addEventListener('hp:adstart', this.onAdStart);\n ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n this.lastTick = performance.now();\n this.tickTimer = setInterval(this.tick, 1000);\n this.resizeObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(() => this.positionLogo()) : null;\n this.resizeObserver?.observe(ctx.overlayEl);\n const topBar = ctx.overlayEl.querySelector('.hp-top-bar');\n if (topBar) this.resizeObserver?.observe(topBar);\n void this.load();\n this.scheduleRefresh();\n }\n\n update(options: SponsorshipOptions): void {\n const changed = options.endpoint !== this.options.endpoint || JSON.stringify(options.params) !== JSON.stringify(this.options.params);\n const refreshChanged = options.refreshSeconds !== this.options.refreshSeconds;\n this.options = options;\n if (changed) void this.load();\n if (refreshChanged) this.scheduleRefresh();\n }\n\n /** Şu an uygulanan kampanya (yoksa null). */\n get current(): SponsorshipConfig | null {\n return this.config;\n }\n\n private scheduleRefresh(): void {\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n const s = this.options.refreshSeconds;\n if (typeof s === 'number' && s >= 10) this.refreshTimer = setInterval(() => void this.load(), s * 1000);\n }\n\n private buildUrl(): string {\n const u = new URL(this.options.endpoint, document.baseURI);\n for (const [k, v] of Object.entries(this.options.params ?? {})) u.searchParams.set(k, v);\n return u.href;\n }\n\n private async load(): Promise<void> {\n const seq = ++this.requestSeq;\n const ctrl = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = setTimeout(() => ctrl?.abort(), this.options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n let url = '';\n try {\n url = this.buildUrl();\n const res = await fetch(url, { ...this.options.fetchInit, signal: ctrl?.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json: unknown = await res.json();\n if (this.destroyed || seq !== this.requestSeq) return; // daha yeni bir istek var\n this.apply(normalizeSponsorship(json));\n } catch (err) {\n if (this.destroyed || seq !== this.requestSeq) return;\n // Son geçerli kampanya korunur — geçici API hatası katmanı söndürmesin.\n this.ctx.log({ message: `Sponsorship API failed: ${String(err)}`, details: { url } });\n } finally {\n clearTimeout(timer);\n }\n }\n\n private apply(config: SponsorshipConfig | null): void {\n const prevKey = this.key(this.config);\n this.config = config;\n this.applyTheme(config?.theme ?? null);\n this.renderLogo();\n this.ctx.hostEl.toggleAttribute('data-sponsored', !!config);\n if (this.key(config) !== prevKey) {\n this.watchedSinceIntro = 0;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorship', { detail: { config } }));\n // Yeni kampanya oynarken geldiyse (canlı yenileme) girişi hemen göster.\n if (config && !this.ctx.videoEl.paused) this.onPlay();\n }\n }\n\n private key(c: SponsorshipConfig | null): string {\n return c ? c.id || c.sponsor.name : '';\n }\n\n private applyTheme(theme: SponsorshipConfig['theme'] | null): void {\n const style = this.ctx.hostEl.style;\n // Önce önceki kampanyanın değerlerini geri al.\n for (const [prop, value] of this.previousTokens) {\n if (value) style.setProperty(prop, value);\n else style.removeProperty(prop);\n }\n this.previousTokens.clear();\n if (!theme) return;\n for (const [key, prop] of Object.entries(THEME_TOKENS) as Array<[keyof typeof THEME_TOKENS, string]>) {\n const value = theme[key];\n if (!value) continue;\n this.previousTokens.set(prop, style.getPropertyValue(prop));\n style.setProperty(prop, value);\n }\n }\n\n private renderLogo(): void {\n this.logoEl?.remove();\n this.logoEl = null;\n const c = this.config;\n if (!c || (!c.sponsor.logo && !c.logo?.label)) return;\n const el = c.sponsor.url ? document.createElement('a') : document.createElement('div');\n el.className = 'hp-sponsor-logo';\n el.setAttribute('part', 'sponsor-logo');\n el.setAttribute('data-position', c.logo?.position ?? 'top-left');\n el.style.setProperty('--hp-sponsor-logo-w', `${c.logo?.width ?? DEFAULT_LOGO_WIDTH}px`);\n el.style.opacity = String(c.logo?.opacity ?? 0.9);\n if (el instanceof HTMLAnchorElement) {\n el.href = c.sponsor.url!;\n el.target = '_blank';\n el.rel = 'noopener sponsored';\n el.addEventListener('click', (e) => {\n e.stopPropagation();\n fire(c.tracking?.click);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorclick', { detail: { id: c.id, sponsor: c.sponsor.name } }));\n });\n }\n el.setAttribute('aria-label', c.sponsor.name);\n if (c.sponsor.logo) {\n const img = document.createElement('img');\n img.src = c.sponsor.logo;\n img.alt = c.sponsor.name;\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n // Etiket logonun altında, ortalı.\n if (c.logo?.label) {\n const label = document.createElement('span');\n label.className = 'hp-sponsor-label';\n label.textContent = c.logo.label;\n el.appendChild(label);\n }\n for (const t of ['pointerdown', 'dblclick'] as const) el.addEventListener(t, (e) => e.stopPropagation());\n this.ctx.overlayEl.appendChild(el);\n this.logoEl = el;\n this.positionLogo();\n }\n\n /**\n * Logo kontrollerin üstüne binmesin: sağ üstte (dar player'da ayarlar / PiP oraya taşınır) üst çubuğun soluna,\n * altta seek bar'ın hemen üstüne yerleşir. Dar player'da logo en fazla 48 px.\n */\n private positionLogo(): void {\n const el = this.logoEl;\n if (!el) return;\n const area = this.ctx.overlayEl;\n const compact = area.hasAttribute('data-compact');\n const position = el.getAttribute('data-position');\n // Kontroller görünürken kaçınılacak mesafe CSS değişkenine yazılır; kontroller gizliyken CSS logoyu köşeye\n // alır (bkz. :host([data-chrome-hidden])) ve geçiş animasyonlu olur.\n el.style.removeProperty('--hp-sponsor-avoid-right');\n el.style.removeProperty('--hp-sponsor-avoid-bottom');\n el.toggleAttribute('data-compact', compact);\n const a = area.getBoundingClientRect();\n if (position === 'top-right') {\n const bar = area.querySelector('.hp-top-bar')?.getBoundingClientRect();\n if (bar && bar.width > 0) el.style.setProperty('--hp-sponsor-avoid-right', `${Math.round(a.right - bar.left + 8)}px`);\n } else if (position === 'bottom-left' || position === 'bottom-right') {\n const seek = area.querySelector('[part=\"seek-bar\"]')?.getBoundingClientRect();\n if (seek && seek.height > 0) el.style.setProperty('--hp-sponsor-avoid-bottom', `${Math.round(a.bottom - seek.top + 6)}px`);\n }\n }\n\n /** Oynatma başladı: kampanya başına bir kez gösterim pikseli + \"X sunar\" kartı. */\n private readonly onPlay = (): void => {\n const c = this.config;\n if (!c) return;\n const key = this.key(c);\n if (!this.impressed.has(key)) {\n this.impressed.add(key);\n fire(c.tracking?.impression);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorimpression', { detail: { id: c.id, sponsor: c.sponsor.name } }));\n }\n if (c.intro && !this.introCount.has(key)) this.showIntro(c);\n };\n\n /**\n * intro.repeatMinutes: yalnızca gerçekten izlenirken sayar (oynuyor, sekme önde, reklam yok); süre dolunca giriş\n * tekrar gösterilir — maxShows'a kadar.\n */\n private readonly tick = (): void => {\n const now = performance.now();\n // Sekme uyuyunca setInterval seyrekleşir — tek seferde en fazla 2 sn sayılır.\n const delta = Math.min(2000, Math.max(0, now - this.lastTick));\n this.lastTick = now;\n const c = this.config;\n const repeat = c?.intro?.repeatMinutes;\n if (!c || !repeat) return;\n const watching =\n !this.ctx.videoEl.paused && !this.ctx.videoEl.ended && !document.hidden && !this.ctx.hostEl.hasAttribute('data-sponsor-hidden');\n if (!watching || !this.introCount.has(this.key(c))) return;\n this.watchedSinceIntro += delta;\n if (this.watchedSinceIntro < repeat * 60_000) return;\n const max = c.intro?.maxShows;\n if (max && (this.introCount.get(this.key(c)) ?? 0) >= max) return;\n this.showIntro(c);\n };\n\n private showIntro(c: SponsorshipConfig): void {\n const key = this.key(c);\n const count = (this.introCount.get(key) ?? 0) + 1;\n this.introCount.set(key, count);\n this.watchedSinceIntro = 0;\n fire(c.tracking?.intro);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorintro', { detail: { id: c.id, sponsor: c.sponsor.name, count } }));\n if (this.introTimer) clearTimeout(this.introTimer);\n this.introEl?.remove();\n const el = document.createElement('div');\n el.className = 'hp-sponsor-intro';\n el.setAttribute('part', 'sponsor-intro');\n el.setAttribute('role', 'status');\n if (c.sponsor.logo) {\n const img = document.createElement('img');\n img.src = c.sponsor.logo;\n img.alt = '';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n const text = document.createElement('span');\n text.textContent = c.intro?.text || this.ctx.i18n.sponsorPresents.replace('{name}', c.sponsor.name);\n el.appendChild(text);\n this.ctx.overlayEl.appendChild(el);\n this.introEl = el;\n // Giriş kartı sponsoru zaten gösteriyor — kart görünürken köşe logosu gizli (küçük player'da üst üste binmesin).\n this.ctx.hostEl.setAttribute('data-sponsor-intro', '');\n this.introTimer = setTimeout(() => {\n el.setAttribute('data-leaving', '');\n this.ctx.hostEl.removeAttribute('data-sponsor-intro');\n this.introTimer = setTimeout(() => {\n el.remove();\n if (this.introEl === el) this.introEl = null;\n }, 400);\n }, c.intro?.durationMs ?? DEFAULT_INTRO_MS);\n }\n\n /** Lineer reklam sırasında logo / giriş gizlenir (reklamın üstüne binmesin). */\n private readonly onAdStart = (e: Event): void => {\n if ((e as CustomEvent<{ linear?: boolean }>).detail?.linear === false) return;\n this.ctx.hostEl.setAttribute('data-sponsor-hidden', '');\n };\n\n private readonly onAdEnd = (e: Event): void => {\n if ((e as CustomEvent<{ linear?: boolean }>).detail?.linear === false) return;\n this.ctx.hostEl.removeAttribute('data-sponsor-hidden');\n };\n\n destroy(): void {\n this.destroyed = true;\n clearInterval(this.tickTimer);\n this.resizeObserver?.disconnect();\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n if (this.introTimer) clearTimeout(this.introTimer);\n this.ctx.videoEl.removeEventListener('play', this.onPlay);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.onAdStart);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.applyTheme(null);\n this.logoEl?.remove();\n this.introEl?.remove();\n this.ctx.hostEl.removeAttribute('data-sponsored');\n this.ctx.hostEl.removeAttribute('data-sponsor-hidden');\n this.ctx.hostEl.removeAttribute('data-sponsor-intro');\n }\n}\n","import { adoptStyle } from '../../utils/plugin-style';\nimport css from './sponsorship.css?inline';\nimport { SponsorshipLayer, normalizeSponsorship, type SponsorshipContext } from './SponsorshipLayer';\nimport type { SponsorshipOptions } from '../../types';\n\n/** Sponsorluk katmanını kurar (ayarları `endpoint`'ten alır). */\nexport function installSponsorship(ctx: SponsorshipContext, options: SponsorshipOptions): SponsorshipLayer {\n adoptStyle(ctx.videoEl, 'sponsorship', css);\n return new SponsorshipLayer(ctx, options);\n}\n\nexport { SponsorshipLayer, normalizeSponsorship };\nexport type { SponsorshipContext };\n"],"names":["DEFAULT_TIMEOUT_MS","DEFAULT_LOGO_WIDTH","DEFAULT_INTRO_MS","THEME_TOKENS","POSITIONS","safeUrl","value","u","safeColor","clamp","n","min","max","fallback","normalizeSponsorship","raw","r","now","from","until","theme","key","c","_a","urls","list","_b","_c","_d","_e","_f","_g","_h","SponsorshipLayer","ctx","options","__publicField","fire","delta","repeat","e","topBar","changed","refreshChanged","s","k","v","seq","ctrl","timer","url","res","json","err","config","prevKey","style","prop","el","img","label","t","area","compact","position","a","bar","seek","count","text","installSponsorship","adoptStyle","css"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- var w = Object.defineProperty;
2
- var E = (u, t, e) => t in u ? w(u, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : u[t] = e;
3
- var l = (u, t, e) => E(u, typeof t != "symbol" ? t + "" : t, e);
4
- import { f as y } from "./player-DV4Hf5Cw.js";
5
- const x = 8, v = /%(0(\d+))?d/;
1
+ var E = Object.defineProperty;
2
+ var y = (u, t, e) => t in u ? E(u, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : u[t] = e;
3
+ var l = (u, t, e) => y(u, typeof t != "symbol" ? t + "" : t, e);
4
+ import { f as v } from "./player-B7mYS--8.js";
5
+ const x = 8, g = /%(0(\d+))?d/;
6
6
  class S {
7
7
  constructor(t, e) {
8
8
  l(this, "tooltip");
@@ -57,22 +57,22 @@ class S {
57
57
  }
58
58
  // ── çizim ──
59
59
  render() {
60
- var h;
60
+ var d, p, f;
61
61
  if (!this.hovering || this.destroyed) return;
62
62
  const t = this.ctx.videoEl.duration;
63
63
  if (!Number.isFinite(t) || t <= 0) return;
64
- const e = this.ctx.seekBar.ratioAtClientX(this.lastClientX) * t;
65
- this.timeEl.textContent = y(e);
66
- const i = this.isNetworkEligible() ? this.frameAt(e, t) : null;
67
- i && (this.lastFrameWidth = i.w);
68
- const s = i ?? this.lowResFrameAt(e, t), n = i ? this.sheets.get(i.url).img : (h = this.lowSheet) == null ? void 0 : h.img;
69
- if (s && n) {
70
- const d = (this.options.displayWidth ?? (i ? i.w : this.options.width || this.lastFrameWidth || s.w)) * this.scale(), c = d / s.w;
71
- this.imageEl.style.display = "", this.imageEl.toggleAttribute("data-lowres", !i), this.imageEl.style.width = `${d}px`, this.imageEl.style.height = `${s.h * c}px`, this.imageEl.style.backgroundImage = `url("${s.url}")`, this.imageEl.style.backgroundSize = `${n.naturalWidth * c}px ${n.naturalHeight * c}px`, this.imageEl.style.backgroundPosition = `${-s.x * c}px ${-s.y * c}px`;
64
+ const e = this.ctx.seekBar.ratioAtClientX(this.lastClientX) * t, i = (p = (d = this.ctx.seekBar).markerLabelAt) == null ? void 0 : p.call(d, this.lastClientX);
65
+ this.timeEl.textContent = i ? `${i} · ${v(e)}` : v(e);
66
+ const s = this.isNetworkEligible() ? this.frameAt(e, t) : null;
67
+ s && (this.lastFrameWidth = s.w);
68
+ const n = s ?? this.lowResFrameAt(e, t), r = s ? this.sheets.get(s.url).img : (f = this.lowSheet) == null ? void 0 : f.img;
69
+ if (n && r) {
70
+ const c = (this.options.displayWidth ?? (s ? s.w : this.options.width || this.lastFrameWidth || n.w)) * this.scale(), m = c / n.w;
71
+ this.imageEl.style.display = "", this.imageEl.toggleAttribute("data-lowres", !s), this.imageEl.style.width = `${c}px`, this.imageEl.style.height = `${n.h * m}px`, this.imageEl.style.backgroundImage = `url("${n.url}")`, this.imageEl.style.backgroundSize = `${r.naturalWidth * m}px ${r.naturalHeight * m}px`, this.imageEl.style.backgroundPosition = `${-n.x * m}px ${-n.y * m}px`;
72
72
  } else this.imageEl.style.backgroundImage || (this.imageEl.style.display = "none");
73
73
  this.tooltip.setAttribute("data-visible", "");
74
- const r = this.ctx.seekBar.el.getBoundingClientRect(), o = this.tooltip.offsetWidth, a = Math.min(Math.max(this.lastClientX - r.left - o / 2, 0), Math.max(r.width - o, 0));
75
- this.tooltip.style.transform = `translateX(${a}px)`;
74
+ const o = this.ctx.seekBar.el.getBoundingClientRect(), a = this.tooltip.offsetWidth, h = Math.min(Math.max(this.lastClientX - o.left - a / 2, 0), Math.max(o.width - a, 0));
75
+ this.tooltip.style.transform = `translateX(${h}px)`;
76
76
  }
77
77
  scale() {
78
78
  const t = this.options.responsive, e = this.ctx.playerWidth();
@@ -98,7 +98,7 @@ class S {
98
98
  }
99
99
  isMultiSheet() {
100
100
  var t;
101
- return !!((t = this.options.sheets) != null && t.length) || v.test(this.options.url ?? "");
101
+ return !!((t = this.options.sheets) != null && t.length) || g.test(this.options.url ?? "");
102
102
  }
103
103
  /** Tek sheet → Infinity (tüm video); çok parçalı → verilen ya da ilk sheet'ten hesaplanan süre; henüz bilinmiyorsa null. */
104
104
  sheetDuration() {
@@ -116,7 +116,7 @@ class S {
116
116
  var s;
117
117
  if ((s = this.options.sheets) != null && s.length) return this.options.sheets[Math.min(t, this.options.sheets.length - 1)];
118
118
  const e = this.options.url ?? "", i = t + (this.options.firstSheetIndex ?? 1);
119
- return e.replace(v, (n, r, o) => String(i).padStart(o ? Number(o) : 0, "0"));
119
+ return e.replace(g, (n, r, o) => String(i).padStart(o ? Number(o) : 0, "0"));
120
120
  }
121
121
  gridFrameAt(t, e) {
122
122
  const { width: i, height: s } = this.options;
@@ -130,8 +130,8 @@ class S {
130
130
  if (!(d != null && d.ready))
131
131
  return this.ensureSheet(h), null;
132
132
  this.touch(h);
133
- const c = Math.max(1, Math.floor(d.img.naturalWidth / i)), p = Math.max(1, Math.floor(d.img.naturalHeight / s)), m = r === 1 / 0 ? t : t - a * r, f = Math.min(Math.max(0, Math.floor(m / n)), c * p - 1);
134
- return { url: h, x: f % c * i, y: Math.floor(f / c) * s, w: i, h: s };
133
+ const p = Math.max(1, Math.floor(d.img.naturalWidth / i)), f = Math.max(1, Math.floor(d.img.naturalHeight / s)), c = r === 1 / 0 ? t : t - a * r, m = Math.min(Math.max(0, Math.floor(c / n)), p * f - 1);
134
+ return { url: h, x: m % p * i, y: Math.floor(m / p) * s, w: i, h: s };
135
135
  }
136
136
  preloadAround(t, e) {
137
137
  const i = this.options.preloadSheets ?? 1;
@@ -216,7 +216,7 @@ class S {
216
216
  }), this.vttLoading;
217
217
  }
218
218
  }
219
- function g(u) {
219
+ function w(u) {
220
220
  return u.trim().split(":").map(Number).reduce((e, i) => e * 60 + i, 0);
221
221
  }
222
222
  function M(u, t) {
@@ -224,16 +224,16 @@ function M(u, t) {
224
224
  const e = [], i = u.replace(/\r/g, "").split(/\n\n+/);
225
225
  for (const n of i) {
226
226
  const r = n.split(`
227
- `).filter(Boolean), o = r.findIndex((f) => f.includes("-->"));
227
+ `).filter(Boolean), o = r.findIndex((m) => m.includes("-->"));
228
228
  if (o === -1) continue;
229
229
  const [a, h] = r[o].split("-->"), d = (s = r[o + 1]) == null ? void 0 : s.trim();
230
230
  if (!a || !h || !d) continue;
231
- const [c, p] = d.split("#"), m = p == null ? void 0 : p.match(/xywh=(\d+),(\d+),(\d+),(\d+)/);
231
+ const [p, f] = d.split("#"), c = f == null ? void 0 : f.match(/xywh=(\d+),(\d+),(\d+),(\d+)/);
232
232
  e.push({
233
- start: g(a),
234
- end: g(h.trim().split(/\s+/)[0]),
235
- url: new URL(c, t).href,
236
- rect: m ? { x: +m[1], y: +m[2], w: +m[3], h: +m[4] } : null
233
+ start: w(a),
234
+ end: w(h.trim().split(/\s+/)[0]),
235
+ url: new URL(p, t).href,
236
+ rect: c ? { x: +c[1], y: +c[2], w: +c[3], h: +c[4] } : null
237
237
  });
238
238
  }
239
239
  return e.sort((n, r) => n.start - r.start);
@@ -245,4 +245,4 @@ export {
245
245
  S as SpriteThumbnails,
246
246
  A as installSpriteThumbnails
247
247
  };
248
- //# sourceMappingURL=spriteThumbnails-BoxVY--_.js.map
248
+ //# sourceMappingURL=spriteThumbnails-BYg-DHx4.js.map