@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
@@ -0,0 +1,295 @@
1
+ var g = Object.defineProperty;
2
+ var w = (c, t, e) => t in c ? g(c, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : c[t] = e;
3
+ var l = (c, t, e) => w(c, typeof t != "symbol" ? t + "" : t, e);
4
+ import { r as x } from "./player-B7mYS--8.js";
5
+ import { a as E } from "./plugin-style-CPJELe-i.js";
6
+ const A = {
7
+ tr: {
8
+ multiviewLayout: "Bölünmüş ekran",
9
+ multiviewCameras: "Kameralar",
10
+ multiviewWatching: "İzleniyor",
11
+ multiviewSwitch: (c) => `${c} kamerasına geç`,
12
+ multiviewNotStarted: "Henüz başlamadı"
13
+ },
14
+ en: {
15
+ multiviewLayout: "Split view",
16
+ multiviewCameras: "Cameras",
17
+ multiviewWatching: "Watching",
18
+ multiviewSwitch: (c) => `Switch to ${c}`,
19
+ multiviewNotStarted: "Not started yet"
20
+ }
21
+ }, L = ".hp-mv{position:absolute;z-index:19;pointer-events:none}.hp-mv[data-ad]{display:none}.hp-mv-tile{position:relative;display:block;overflow:hidden;padding:0;border:2px solid transparent;border-radius:8px;background:#0b0b0f;color:#fff;font:600 12px/1.3 system-ui,-apple-system,sans-serif;cursor:pointer;pointer-events:auto;transition:border-color .15s,transform .15s,opacity .2s}.hp-mv-tile:hover{border-color:#ffffff8c}.hp-mv-tile[data-active]{border-color:var(--hp-color-accent, #fff);cursor:default}.hp-mv-tile:focus-visible{outline:2px solid var(--hp-color-accent, #fff);outline-offset:2px}.hp-mv-media{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;object-fit:cover;pointer-events:none}.hp-mv-tile[data-waiting] .hp-mv-media{opacity:.35}.hp-mv-label,.hp-mv-badge{position:absolute;max-width:calc(100% - 12px);overflow:hidden;padding:2px 6px;border-radius:4px;background:#0009;white-space:nowrap;text-overflow:ellipsis;line-height:1.4}.hp-mv-label{left:6px;bottom:6px}.hp-mv-badge{top:6px;right:6px;font-size:10.5px;letter-spacing:.04em;text-transform:uppercase}.hp-mv-badge:empty{display:none}.hp-mv-tile[data-active] .hp-mv-badge{background:var(--hp-color-accent, #fff);color:var(--hp-color-on-accent, #000)}.hp-mv[data-layout=focus]{display:flex;gap:8px;left:12px;right:12px;bottom:76px;justify-content:center;transition:opacity .2s ease}.hp-mv[data-layout=focus] .hp-mv-tile{flex:0 1 140px;min-width:84px;aspect-ratio:16 / 9}.video-area[data-chrome-hidden] .hp-mv[data-layout=focus]{opacity:0}.video-area[data-chrome-hidden] .hp-mv[data-layout=focus] .hp-mv-tile{pointer-events:none}.hp-mv[data-layout=focus][data-thumbs=right]{flex-direction:column;left:auto;top:12px;width:min(140px,22%);justify-content:flex-start}.hp-mv[data-layout=focus][data-thumbs=right] .hp-mv-tile{flex:none;width:100%;min-width:0}.video-area[data-compact] .hp-mv[data-layout=focus]{bottom:56px;left:8px;right:8px;gap:6px}.hp-mv[data-layout=grid]{top:0;right:0;bottom:0;left:0}.hp-mv[data-layout=grid] .hp-mv-tile{position:absolute;border-radius:0;border-width:1px;border-color:#0009}.hp-mv[data-layout=grid] .hp-mv-tile:hover{border-color:#ffffff8c}.hp-mv[data-layout=grid] .hp-mv-media{object-fit:contain}.video-area[data-mv-grid] .media-layer{background:#000}.video-area[data-mv-grid] .media-layer>video{position:absolute;left:var(--hp-mv-x);top:var(--hp-mv-y);width:var(--hp-mv-w);height:var(--hp-mv-h)}.hp-mv-frame{position:absolute;box-sizing:border-box;border:2px solid var(--hp-color-accent, #fff);pointer-events:none}.hp-mv-frame .hp-mv-label{background:var(--hp-color-accent, #fff);color:var(--hp-color-on-accent, #000);font:600 12px/1.4 system-ui,-apple-system,sans-serif}.video-area[data-compact] .hp-mv[data-layout=focus] .hp-mv-tile{min-width:60px;border-radius:6px;font-size:10px}.video-area[data-compact] .hp-mv[data-layout=focus] .hp-mv-badge{display:none}.video-area[data-compact] .hp-mv-label{left:3px;bottom:3px;padding:1px 4px}@media(prefers-reduced-motion:reduce){.hp-mv-tile,.hp-mv[data-layout=focus]{transition:none}}", T = {
22
+ 2: [
23
+ [0, 25, 50, 50],
24
+ [50, 25, 50, 50]
25
+ ],
26
+ 3: [
27
+ [0, 0, 50, 50],
28
+ [50, 0, 50, 50],
29
+ [25, 50, 50, 50]
30
+ ],
31
+ 4: [
32
+ [0, 0, 50, 50],
33
+ [50, 0, 50, 50],
34
+ [0, 50, 50, 50],
35
+ [50, 50, 50, 50]
36
+ ]
37
+ }, f = 0.6, k = (c) => c.type === "application/x-mpegURL" || /\.m3u8(\?|#|$)/i.test(c.src);
38
+ function v(c, t) {
39
+ var s, a, o, r, h;
40
+ if (t) {
41
+ const n = ((a = (s = t.levels) == null ? void 0 : s[Math.max(0, t.currentLevel)]) == null ? void 0 : a.details) ?? ((r = (o = t.levels) == null ? void 0 : o.find((m) => m.details)) == null ? void 0 : r.details), d = n == null ? void 0 : n.fragments.find((m) => m.programDateTime);
42
+ return d != null && d.programDateTime ? { pos: d.start, date: d.programDateTime } : null;
43
+ }
44
+ const e = (h = c.getStartDate) == null ? void 0 : h.call(c), i = e == null ? void 0 : e.getTime();
45
+ return i !== void 0 && Number.isFinite(i) ? { pos: 0, date: i } : null;
46
+ }
47
+ function b(c, t) {
48
+ const e = c.seekable;
49
+ return e.length ? Math.min(Math.max(t, e.start(0)), Math.max(e.start(0), e.end(e.length - 1) - 0.3)) : Math.max(0, t);
50
+ }
51
+ class M {
52
+ constructor(t, e) {
53
+ l(this, "cams");
54
+ l(this, "active");
55
+ l(this, "layout");
56
+ l(this, "root");
57
+ l(this, "frame");
58
+ l(this, "frameLabel");
59
+ l(this, "tiles", /* @__PURE__ */ new Map());
60
+ l(this, "button", null);
61
+ l(this, "syncTimer", null);
62
+ l(this, "posterTimer", null);
63
+ l(this, "switching", !1);
64
+ l(this, "destroyed", !1);
65
+ l(this, "HlsCtor", null);
66
+ l(this, "ro");
67
+ /** Önizlemeleri ana kameranın anına hizalar; oynat / duraklat / hızı izler. */
68
+ l(this, "sync", () => {
69
+ if (this.destroyed || this.switching || this.options.sync === !1) return;
70
+ const t = this.ctx.videoEl, e = v(t, this.ctx.mainHls()), i = e ? e.date + (t.currentTime - e.pos) * 1e3 : null, s = t.currentTime + (this.active.offset ?? 0);
71
+ for (const a of this.tiles.values()) {
72
+ const o = a.video;
73
+ if (!o || o.readyState < 1) continue;
74
+ const r = v(o, a.hls), h = i !== null && r ? r.pos + (i - r.date) / 1e3 : s - (a.cam.offset ?? 0), n = o.seekable, d = n.length ? h < n.start(0) - 0.2 : h < -0.2, m = n.length ? h > n.end(n.length - 1) + 0.2 : !1, p = d || m;
75
+ if (a.el.hasAttribute("data-waiting") !== p && (a.el.toggleAttribute("data-waiting", p), this.labelTile(a)), p) {
76
+ o.paused || o.pause();
77
+ continue;
78
+ }
79
+ o.readyState >= 3 && !o.seeking && Math.abs(o.currentTime - h) > f && (o.currentTime = b(o, h)), o.playbackRate = t.playbackRate || 1, t.paused || this.ctx.isAdActive() ? o.paused || o.pause() : o.paused && o.play().catch(() => {
80
+ });
81
+ }
82
+ });
83
+ l(this, "onMainPlay", () => this.sync());
84
+ l(this, "onMainPause", () => {
85
+ var t;
86
+ for (const e of this.tiles.values()) (t = e.video) == null || t.pause();
87
+ });
88
+ l(this, "onRate", () => this.sync());
89
+ l(this, "onAdStart", () => {
90
+ this.root.setAttribute("data-ad", ""), this.onMainPause();
91
+ });
92
+ l(this, "onAdEnd", () => {
93
+ this.root.removeAttribute("data-ad"), this.sync();
94
+ });
95
+ /** Canlı yayın posterleri: önbelleği atlayarak yenile. */
96
+ l(this, "refreshPosters", () => {
97
+ for (const t of this.tiles.values()) {
98
+ if (!t.img || !t.cam.poster) continue;
99
+ const e = new URL(t.cam.poster, location.href);
100
+ e.searchParams.set("_hp", String(Date.now())), t.img.src = e.toString();
101
+ }
102
+ });
103
+ this.ctx = t, this.options = e, E(t.videoAreaEl, "multiview", L), this.cams = e.sources.filter((s) => s.id && s.src), this.active = this.cams.find((s) => s.id === e.start) ?? this.cams[0], this.layout = e.layout === "grid" ? "grid" : "focus", this.root = document.createElement("div"), this.root.className = "hp-mv", this.root.setAttribute("part", "multiview"), this.root.setAttribute("data-thumbs", e.thumbnails === "right" ? "right" : "bottom"), this.root.setAttribute("role", "group"), this.frame = document.createElement("div"), this.frame.className = "hp-mv-frame", this.frameLabel = document.createElement("span"), this.frameLabel.className = "hp-mv-label", this.frame.appendChild(this.frameLabel);
104
+ for (const s of ["pointerdown", "click", "dblclick"]) this.root.addEventListener(s, (a) => a.stopPropagation());
105
+ if (t.videoAreaEl.appendChild(this.root), e.button !== !1 && this.cams.length > 1) {
106
+ const { btn: s } = t.addButton(t.i18n.multiviewLayout, "grid", () => this.setLayout(this.layout === "grid" ? "focus" : "grid"));
107
+ s.setAttribute("aria-pressed", "false"), this.button = s;
108
+ }
109
+ const i = t.videoEl;
110
+ i.addEventListener("play", this.onMainPlay), i.addEventListener("pause", this.onMainPause), i.addEventListener("seeked", this.sync), i.addEventListener("ratechange", this.onRate), t.hostEl.addEventListener("hp:adstart", this.onAdStart), t.hostEl.addEventListener("hp:adend", this.onAdEnd), this.ro = new ResizeObserver(() => this.render()), this.ro.observe(t.videoAreaEl), e.sync !== !1 && (this.syncTimer = setInterval(this.sync, 1e3)), e.posterRefresh && e.posterRefresh > 0 && (this.posterTimer = setInterval(this.refreshPosters, e.posterRefresh * 1e3)), this.refreshLabels(), this.render();
111
+ }
112
+ get activeId() {
113
+ return this.active.id;
114
+ }
115
+ refreshLabels() {
116
+ var e;
117
+ const t = this.ctx.i18n;
118
+ this.root.setAttribute("aria-label", t.multiviewCameras), (e = this.button) == null || e.setAttribute("aria-label", t.multiviewLayout);
119
+ for (const i of this.tiles.values()) this.labelTile(i);
120
+ }
121
+ setLayout(t) {
122
+ t !== this.layout && (this.layout = t, this.render(), this.emit("layout"));
123
+ }
124
+ /** Kamerayı değiştir: yeni yayın mevcut kameranın gerçek saatine hizalanır. */
125
+ async switchTo(t) {
126
+ const e = this.cams.find((m) => m.id === t);
127
+ if (!e || e === this.active || this.switching || this.ctx.isAdActive()) return;
128
+ this.switching = !0;
129
+ const i = this.ctx.videoEl, s = this.active, a = i.paused, o = i.playbackRate || 1, r = performance.now(), h = v(i, this.ctx.mainHls()), n = h ? h.date + (i.currentTime - h.pos) * 1e3 : null, d = i.currentTime + (s.offset ?? 0);
130
+ this.active = e, this.dropTile(e.id), this.render();
131
+ try {
132
+ if (await this.ctx.loadSource(e.src, e.type), await this.waitFor(i, "loadedmetadata", 1e4), this.options.sync !== !1) {
133
+ const m = n !== null ? await this.waitClock(i) : null, p = () => {
134
+ const u = a ? 0 : (performance.now() - r) / 1e3 * o;
135
+ return b(i, n !== null && m ? m.pos + (n + u * 1e3 - m.date) / 1e3 : d + u - (e.offset ?? 0));
136
+ };
137
+ await this.waitFor(i, "canplay", 5e3);
138
+ for (let u = 0; u < 3 && (i.currentTime = p(), await this.waitFor(i, "seeked", 3e3), !(Math.abs(i.currentTime - p()) <= f)); u++)
139
+ ;
140
+ }
141
+ i.playbackRate = o, a || await i.play().catch(() => {
142
+ });
143
+ } finally {
144
+ this.switching = !1;
145
+ }
146
+ this.destroyed || (this.render(), this.emit("switch", s.id));
147
+ }
148
+ destroy() {
149
+ var e;
150
+ this.destroyed = !0;
151
+ const t = this.ctx.videoEl;
152
+ t.removeEventListener("play", this.onMainPlay), t.removeEventListener("pause", this.onMainPause), t.removeEventListener("seeked", this.sync), t.removeEventListener("ratechange", this.onRate), this.ctx.hostEl.removeEventListener("hp:adstart", this.onAdStart), this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.syncTimer && clearInterval(this.syncTimer), this.posterTimer && clearInterval(this.posterTimer), this.ro.disconnect();
153
+ for (const i of [...this.tiles.keys()]) this.dropTile(i);
154
+ this.root.remove(), (e = this.button) == null || e.remove(), this.setMainRect(null);
155
+ }
156
+ emit(t, e) {
157
+ this.ctx.hostEl.dispatchEvent(
158
+ new CustomEvent("hp:multiview", { detail: { state: t, id: this.active.id, ...e ? { from: e } : {}, layout: this.layout } })
159
+ );
160
+ }
161
+ /** Dar / dokunmatik ekran: akış sayısı sınırlı, önizleme poster. */
162
+ isMobile() {
163
+ return this.ctx.videoAreaEl.clientWidth < 560 || matchMedia("(pointer: coarse)").matches;
164
+ }
165
+ wantsVideo() {
166
+ const t = this.options.previews ?? "auto";
167
+ return t === "video" || t === "auto" && !this.isMobile();
168
+ }
169
+ /** Görünür kameralar: grid'de ana dahil en fazla 4 (mobilde maxMobileStreams); focus'ta hepsi. */
170
+ visibleOthers() {
171
+ const t = this.cams.filter((i) => i !== this.active);
172
+ if (this.layout === "focus") return t;
173
+ const e = this.isMobile() ? Math.max(2, this.options.maxMobileStreams ?? 2) : 4;
174
+ return t.slice(0, e - 1);
175
+ }
176
+ render() {
177
+ var o;
178
+ if (this.destroyed) return;
179
+ const t = this.layout === "grid" && this.cams.length > 1;
180
+ this.root.setAttribute("data-layout", t ? "grid" : "focus"), this.ctx.videoAreaEl.setAttribute("data-mv", t ? "grid" : "focus"), (o = this.button) == null || o.setAttribute("aria-pressed", String(t));
181
+ const e = this.visibleOthers(), i = new Set(e.map((r) => r.id));
182
+ t || i.add(this.active.id);
183
+ for (const r of [...this.tiles.keys()]) i.has(r) || this.dropTile(r);
184
+ const s = t ? e : this.cams, a = T[e.length + 1];
185
+ if (this.setMainRect(t && a ? a[0] : null), t && a) {
186
+ const [r, h, n, d] = a[0];
187
+ Object.assign(this.frame.style, { left: `${r}%`, top: `${h}%`, width: `${n}%`, height: `${d}%` }), this.frameLabel.textContent = `${this.active.label} · ${this.ctx.i18n.multiviewWatching}`, this.root.appendChild(this.frame);
188
+ } else
189
+ this.frame.remove();
190
+ s.forEach((r, h) => {
191
+ const n = this.tiles.get(r.id) ?? this.makeTile(r), d = r === this.active;
192
+ if (n.el.toggleAttribute("data-active", d), n.el.setAttribute("aria-pressed", String(d)), t && a) {
193
+ const [m, p, u, y] = a[h + 1];
194
+ Object.assign(n.el.style, { left: `${m}%`, top: `${p}%`, width: `${u}%`, height: `${y}%` });
195
+ } else
196
+ n.el.style.cssText = "";
197
+ this.root.appendChild(n.el), this.setPreview(n, !d && (t || this.wantsVideo()));
198
+ }), this.labelTiles(), this.sync();
199
+ }
200
+ /** Grid'de ana videonun hücresi (CSS değişkenleri); null → tam alan. */
201
+ setMainRect(t) {
202
+ const e = this.ctx.videoAreaEl;
203
+ if (!t) {
204
+ e.removeAttribute("data-mv-grid");
205
+ for (const r of ["x", "y", "w", "h"]) e.style.removeProperty(`--hp-mv-${r}`);
206
+ if (!this.destroyed) return;
207
+ e.removeAttribute("data-mv");
208
+ return;
209
+ }
210
+ e.setAttribute("data-mv-grid", "");
211
+ const [i, s, a, o] = t;
212
+ e.style.setProperty("--hp-mv-x", `${i}%`), e.style.setProperty("--hp-mv-y", `${s}%`), e.style.setProperty("--hp-mv-w", `${a}%`), e.style.setProperty("--hp-mv-h", `${o}%`);
213
+ }
214
+ makeTile(t) {
215
+ const e = document.createElement("button");
216
+ e.type = "button", e.className = "hp-mv-tile", e.setAttribute("data-cam", t.id);
217
+ const i = document.createElement("span");
218
+ i.className = "hp-mv-label", i.textContent = t.label;
219
+ const s = document.createElement("span");
220
+ s.className = "hp-mv-badge", e.append(i, s), e.addEventListener("click", () => void this.switchTo(t.id));
221
+ const a = { cam: t, el: e, video: null, hls: null, img: null };
222
+ return this.tiles.set(t.id, a), a;
223
+ }
224
+ labelTile(t) {
225
+ const e = this.ctx.i18n, i = t.cam === this.active;
226
+ t.el.setAttribute("aria-label", i ? `${t.cam.label} — ${e.multiviewWatching}` : e.multiviewSwitch(t.cam.label));
227
+ const s = t.el.querySelector(".hp-mv-badge");
228
+ s.textContent = i ? e.multiviewWatching : t.el.hasAttribute("data-waiting") ? e.multiviewNotStarted : "";
229
+ }
230
+ labelTiles() {
231
+ for (const t of this.tiles.values()) this.labelTile(t);
232
+ }
233
+ dropTile(t) {
234
+ const e = this.tiles.get(t);
235
+ e && (this.stopVideo(e), e.el.remove(), this.tiles.delete(t));
236
+ }
237
+ stopVideo(t) {
238
+ var e;
239
+ (e = t.hls) == null || e.destroy(), t.hls = null, t.video && (t.video.pause(), t.video.removeAttribute("src"), t.video.load(), t.video.remove(), t.video = null);
240
+ }
241
+ /** Önizleme: video (sessiz, en düşük kalite) ya da poster. */
242
+ setPreview(t, e) {
243
+ if (!e) {
244
+ if (this.stopVideo(t), !t.img && t.cam.poster) {
245
+ const s = document.createElement("img");
246
+ s.className = "hp-mv-media", s.alt = "", s.decoding = "async", s.src = t.cam.poster, s.addEventListener("error", () => s.remove()), t.el.prepend(s), t.img = s;
247
+ }
248
+ return;
249
+ }
250
+ if (t.video) return;
251
+ const i = document.createElement("video");
252
+ i.className = "hp-mv-media", i.muted = !0, i.playsInline = !0, i.setAttribute("playsinline", ""), i.preload = "auto", t.cam.poster && (i.poster = t.cam.poster), t.el.prepend(i), t.video = i, this.attach(t, i);
253
+ }
254
+ async attach(t, e) {
255
+ const i = t.cam, s = typeof window.MediaSource < "u" || "ManagedMediaSource" in window;
256
+ if (k(i) && s) {
257
+ if (this.HlsCtor || (this.HlsCtor = (await import("./hlsLight-CCe_8eOw.js")).default), t.video !== e) return;
258
+ const a = new this.HlsCtor({ startLevel: 0, capLevelToPlayerSize: !0, maxBufferLength: 8, maxMaxBufferLength: 16, backBufferLength: 4 });
259
+ a.on("hlsManifestParsed", () => {
260
+ a.autoLevelCapping = 0;
261
+ }), a.attachMedia(e), a.loadSource(i.src), t.hls = a;
262
+ } else
263
+ e.src = i.src;
264
+ e.addEventListener("loadedmetadata", () => this.sync(), { once: !0 });
265
+ }
266
+ waitFor(t, e, i) {
267
+ const s = t;
268
+ return e === "loadedmetadata" && s.readyState >= 1 || e === "canplay" && s.readyState >= 3 || e === "seeked" && !s.seeking ? Promise.resolve() : new Promise((a) => {
269
+ const o = () => {
270
+ clearTimeout(r), t.removeEventListener(e, o), a();
271
+ }, r = setTimeout(o, i);
272
+ t.addEventListener(e, o, { once: !0 });
273
+ });
274
+ }
275
+ /** Yeni yayının saat bilgisi (hls.js'te playlist yüklenince gelir) — en fazla 2 sn beklenir. */
276
+ async waitClock(t) {
277
+ var e;
278
+ for (let i = 0; i < 20; i++) {
279
+ const s = this.ctx.mainHls(), a = v(t, s);
280
+ if (a) return a;
281
+ if (!s || (e = s.levels) != null && e.some((o) => o.details)) return null;
282
+ await new Promise((o) => setTimeout(o, 100));
283
+ }
284
+ return null;
285
+ }
286
+ }
287
+ x(A);
288
+ function C(c, t) {
289
+ return new M(c, t);
290
+ }
291
+ export {
292
+ M as Multiview,
293
+ C as installMultiview
294
+ };
295
+ //# sourceMappingURL=multiview-CL1WfJKt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiview-CL1WfJKt.js","sources":["../../src/plugins/multiview/strings.ts","../../src/plugins/multiview/Multiview.ts","../../src/plugins/multiview/index.ts"],"sourcesContent":["// Bu eklentinin metinleri — ana pakete girmez, eklenti yüklenince sözlüğe eklenir (bkz. i18n/index.ts).\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\ntype Strings = Pick<HopeLocaleStrings, 'multiviewLayout' | 'multiviewCameras' | 'multiviewWatching' | 'multiviewSwitch' | 'multiviewNotStarted'>;\n\nexport const strings: { tr: Strings; en: Strings } = {\n tr: {\n multiviewLayout: 'Bölünmüş ekran',\n multiviewCameras: 'Kameralar',\n multiviewWatching: 'İzleniyor',\n multiviewSwitch: (label) => `${label} kamerasına geç`,\n multiviewNotStarted: 'Henüz başlamadı',\n },\n en: {\n multiviewLayout: 'Split view',\n multiviewCameras: 'Cameras',\n multiviewWatching: 'Watching',\n multiviewSwitch: (label) => `Switch to ${label}`,\n multiviewNotStarted: 'Not started yet',\n },\n};\n","import type { MultiviewOptions, MultiviewSource } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { adoptStyle } from '../../utils/plugin-style';\nimport css from './multiview.css?inline';\n\n/** hls.js'ten kullanılan kısım (ana player'ınki ve önizlemelerinki). */\nexport interface HlsLike {\n levels: { details?: { fragments: { start: number; programDateTime: number | null }[] } }[];\n currentLevel: number;\n autoLevelCapping: number;\n loadSource(src: string): void;\n attachMedia(video: HTMLVideoElement): void;\n on(event: string, fn: () => void): void;\n destroy(): void;\n}\n\nexport interface MultiviewPlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n videoAreaEl: HTMLElement;\n i18n: HopeLocaleStrings;\n isAdActive(): boolean;\n loadSource(src: string, type?: string): Promise<void>;\n mainHls(): HlsLike | null;\n addButton(label: string, iconName: string, onClick: () => void): { btn: HTMLButtonElement; icon: HTMLElement };\n}\n\ninterface Tile {\n cam: MultiviewSource;\n el: HTMLButtonElement;\n video: HTMLVideoElement | null;\n hls: HlsLike | null;\n img: HTMLImageElement | null;\n}\n\ntype Rect = [x: number, y: number, w: number, h: number];\n\n/** Bölünmüş ekran hücreleri (% — oynatıcı 16:9'da her hücre de 16:9). İlk hücre seçili kameranın. */\nconst GRID: Record<number, Rect[]> = {\n 2: [\n [0, 25, 50, 50],\n [50, 25, 50, 50],\n ],\n 3: [\n [0, 0, 50, 50],\n [50, 0, 50, 50],\n [25, 50, 50, 50],\n ],\n 4: [\n [0, 0, 50, 50],\n [50, 0, 50, 50],\n [0, 50, 50, 50],\n [50, 50, 50, 50],\n ],\n};\n\n/** Senkron eşiği: önizleme bu kadardan fazla kayarsa yeniden hizalanır (sn). */\nconst DRIFT = 0.6;\n\nconst isHls = (cam: MultiviewSource): boolean => cam.type === 'application/x-mpegURL' || /\\.m3u8(\\?|#|$)/i.test(cam.src);\n\n/** Konum ↔ gerçek saat eşlemesi: hls.js'te EXT-X-PROGRAM-DATE-TIME'lı ilk segment, Safari'de getStartDate(). */\nfunction clockOf(video: HTMLVideoElement, hls: HlsLike | null): { pos: number; date: number } | null {\n if (hls) {\n const details = hls.levels?.[Math.max(0, hls.currentLevel)]?.details ?? hls.levels?.find((l) => l.details)?.details;\n const frag = details?.fragments.find((f) => f.programDateTime);\n return frag?.programDateTime ? { pos: frag.start, date: frag.programDateTime } : null;\n }\n const start = (video as HTMLVideoElement & { getStartDate?(): Date }).getStartDate?.();\n const t = start?.getTime();\n return t !== undefined && Number.isFinite(t) ? { pos: 0, date: t } : null;\n}\n\nfunction clamp(video: HTMLVideoElement, pos: number): number {\n const s = video.seekable;\n if (!s.length) return Math.max(0, pos);\n return Math.min(Math.max(pos, s.start(0)), Math.max(s.start(0), s.end(s.length - 1) - 0.3));\n}\n\n/**\n * Çoklu kamera: aynı etkinliğin birden fazla yayını. Seçili kamera player'ın kendi videosunda oynar (kontroller,\n * altyazı, reklam ona bağlı); diğerleri sessiz, düşük kaliteli önizleme olarak akar. Kamera değişince yeni yayın\n * mevcut kameranın gerçek saatine (PROGRAM-DATE-TIME ya da `offset`) hizalanıp oradan devam eder.\n */\nexport class Multiview {\n private readonly cams: MultiviewSource[];\n private active: MultiviewSource;\n private layout: 'focus' | 'grid';\n private readonly root: HTMLDivElement;\n private readonly frame: HTMLDivElement;\n private readonly frameLabel: HTMLSpanElement;\n private tiles = new Map<string, Tile>();\n private button: HTMLButtonElement | null = null;\n private syncTimer: ReturnType<typeof setInterval> | null = null;\n private posterTimer: ReturnType<typeof setInterval> | null = null;\n private switching = false;\n private destroyed = false;\n private HlsCtor: (new (config: object) => HlsLike) | null = null;\n private readonly ro: ResizeObserver;\n\n constructor(\n private readonly ctx: MultiviewPlayerContext,\n private readonly options: MultiviewOptions\n ) {\n adoptStyle(ctx.videoAreaEl, 'multiview', css);\n this.cams = options.sources.filter((c) => c.id && c.src);\n this.active = this.cams.find((c) => c.id === options.start) ?? this.cams[0]!;\n this.layout = options.layout === 'grid' ? 'grid' : 'focus';\n\n this.root = document.createElement('div');\n this.root.className = 'hp-mv';\n this.root.setAttribute('part', 'multiview');\n this.root.setAttribute('data-thumbs', options.thumbnails === 'right' ? 'right' : 'bottom');\n this.root.setAttribute('role', 'group');\n this.frame = document.createElement('div');\n this.frame.className = 'hp-mv-frame';\n this.frameLabel = document.createElement('span');\n this.frameLabel.className = 'hp-mv-label';\n this.frame.appendChild(this.frameLabel);\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) this.root.addEventListener(ev, (e) => e.stopPropagation());\n ctx.videoAreaEl.appendChild(this.root);\n\n if (options.button !== false && this.cams.length > 1) {\n const { btn } = ctx.addButton(ctx.i18n.multiviewLayout, 'grid', () => this.setLayout(this.layout === 'grid' ? 'focus' : 'grid'));\n btn.setAttribute('aria-pressed', 'false');\n this.button = btn;\n }\n\n const v = ctx.videoEl;\n v.addEventListener('play', this.onMainPlay);\n v.addEventListener('pause', this.onMainPause);\n v.addEventListener('seeked', this.sync);\n v.addEventListener('ratechange', this.onRate);\n ctx.hostEl.addEventListener('hp:adstart', this.onAdStart);\n ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n this.ro = new ResizeObserver(() => this.render());\n this.ro.observe(ctx.videoAreaEl);\n if (options.sync !== false) this.syncTimer = setInterval(this.sync, 1000);\n if (options.posterRefresh && options.posterRefresh > 0) this.posterTimer = setInterval(this.refreshPosters, options.posterRefresh * 1000);\n\n this.refreshLabels();\n this.render();\n }\n\n get activeId(): string {\n return this.active.id;\n }\n\n refreshLabels(): void {\n const i18n = this.ctx.i18n;\n this.root.setAttribute('aria-label', i18n.multiviewCameras);\n this.button?.setAttribute('aria-label', i18n.multiviewLayout);\n for (const t of this.tiles.values()) this.labelTile(t);\n }\n\n setLayout(layout: 'focus' | 'grid'): void {\n if (layout === this.layout) return;\n this.layout = layout;\n this.render();\n this.emit('layout');\n }\n\n /** Kamerayı değiştir: yeni yayın mevcut kameranın gerçek saatine hizalanır. */\n async switchTo(id: string): Promise<void> {\n const next = this.cams.find((c) => c.id === id);\n if (!next || next === this.active || this.switching || this.ctx.isAdActive()) return;\n this.switching = true;\n const v = this.ctx.videoEl;\n const from = this.active;\n const wasPaused = v.paused;\n const rate = v.playbackRate || 1;\n const startedAt = performance.now();\n // Şu anki an: gerçek saat (varsa) ve etkinlik saniyesi (offset ile).\n const clock = clockOf(v, this.ctx.mainHls());\n const nowDate = clock ? clock.date + (v.currentTime - clock.pos) * 1000 : null;\n const nowEvent = v.currentTime + (from.offset ?? 0);\n\n this.active = next;\n this.dropTile(next.id);\n this.render();\n try {\n await this.ctx.loadSource(next.src, next.type);\n await this.waitFor(v, 'loadedmetadata', 10_000);\n if (this.options.sync !== false) {\n const c = nowDate !== null ? await this.waitClock(v) : null;\n // Hedef her an yeniden hesaplanır: beklerken geçen süre de eklenir.\n const target = (): number => {\n const elapsed = wasPaused ? 0 : ((performance.now() - startedAt) / 1000) * rate;\n return clamp(v, nowDate !== null && c ? c.pos + (nowDate + elapsed * 1000 - c.date) / 1000 : nowEvent + elapsed - (next.offset ?? 0));\n };\n // hls.js ilk segmentte kendi başlangıç konumuna sarar — yavaş tarayıcıda bizim sarmamızı ezerdi.\n // Hizalama video oynamaya hazır olunca yapılır ve tutana kadar (en fazla 3 kez) tekrarlanır.\n await this.waitFor(v, 'canplay', 5000);\n for (let i = 0; i < 3; i++) {\n v.currentTime = target();\n await this.waitFor(v, 'seeked', 3000);\n if (Math.abs(v.currentTime - target()) <= DRIFT) break;\n }\n }\n v.playbackRate = rate;\n if (!wasPaused) await v.play().catch(() => {});\n } finally {\n this.switching = false;\n }\n if (this.destroyed) return;\n this.render();\n this.emit('switch', from.id);\n }\n\n destroy(): void {\n this.destroyed = true;\n const v = this.ctx.videoEl;\n v.removeEventListener('play', this.onMainPlay);\n v.removeEventListener('pause', this.onMainPause);\n v.removeEventListener('seeked', this.sync);\n v.removeEventListener('ratechange', this.onRate);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.onAdStart);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n if (this.syncTimer) clearInterval(this.syncTimer);\n if (this.posterTimer) clearInterval(this.posterTimer);\n this.ro.disconnect();\n for (const id of [...this.tiles.keys()]) this.dropTile(id);\n this.root.remove();\n this.button?.remove();\n this.setMainRect(null);\n }\n\n private emit(state: 'switch' | 'layout', from?: string): void {\n this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:multiview', { detail: { state, id: this.active.id, ...(from ? { from } : {}), layout: this.layout } })\n );\n }\n\n /** Dar / dokunmatik ekran: akış sayısı sınırlı, önizleme poster. */\n private isMobile(): boolean {\n return this.ctx.videoAreaEl.clientWidth < 560 || matchMedia('(pointer: coarse)').matches;\n }\n\n private wantsVideo(): boolean {\n const p = this.options.previews ?? 'auto';\n return p === 'video' || (p === 'auto' && !this.isMobile());\n }\n\n /** Görünür kameralar: grid'de ana dahil en fazla 4 (mobilde maxMobileStreams); focus'ta hepsi. */\n private visibleOthers(): MultiviewSource[] {\n const others = this.cams.filter((c) => c !== this.active);\n if (this.layout === 'focus') return others;\n const max = this.isMobile() ? Math.max(2, this.options.maxMobileStreams ?? 2) : 4;\n return others.slice(0, max - 1);\n }\n\n private render(): void {\n if (this.destroyed) return;\n const grid = this.layout === 'grid' && this.cams.length > 1;\n this.root.setAttribute('data-layout', grid ? 'grid' : 'focus');\n this.ctx.videoAreaEl.setAttribute('data-mv', grid ? 'grid' : 'focus');\n this.button?.setAttribute('aria-pressed', String(grid));\n\n const others = this.visibleOthers();\n // Görünmeyen önizlemeler kapanır (bant genişliği).\n const keep = new Set(others.map((c) => c.id));\n if (!grid) keep.add(this.active.id);\n for (const id of [...this.tiles.keys()]) if (!keep.has(id)) this.dropTile(id);\n\n const order = grid ? others : this.cams;\n const cells = GRID[others.length + 1];\n this.setMainRect(grid && cells ? cells[0]! : null);\n // Grid'de sesi açık (ana) hücrenin çerçevesi + adı.\n if (grid && cells) {\n const [x, y, w, h] = cells[0]!;\n Object.assign(this.frame.style, { left: `${x}%`, top: `${y}%`, width: `${w}%`, height: `${h}%` });\n this.frameLabel.textContent = `${this.active.label} · ${this.ctx.i18n.multiviewWatching}`;\n this.root.appendChild(this.frame);\n } else {\n this.frame.remove();\n }\n order.forEach((cam, i) => {\n const tile = this.tiles.get(cam.id) ?? this.makeTile(cam);\n const isActive = cam === this.active;\n tile.el.toggleAttribute('data-active', isActive);\n tile.el.setAttribute('aria-pressed', String(isActive));\n if (grid && cells) {\n const [x, y, w, h] = cells[i + 1]!;\n Object.assign(tile.el.style, { left: `${x}%`, top: `${y}%`, width: `${w}%`, height: `${h}%` });\n } else {\n tile.el.style.cssText = '';\n }\n this.root.appendChild(tile.el); // sırayı koru\n // Seçili kamera önizlemede akmaz (zaten büyük oynuyor); diğerleri ayara göre video ya da poster.\n this.setPreview(tile, !isActive && (grid || this.wantsVideo()));\n });\n this.labelTiles();\n this.sync();\n }\n\n /** Grid'de ana videonun hücresi (CSS değişkenleri); null → tam alan. */\n private setMainRect(rect: Rect | null): void {\n const area = this.ctx.videoAreaEl;\n if (!rect) {\n area.removeAttribute('data-mv-grid');\n for (const k of ['x', 'y', 'w', 'h']) area.style.removeProperty(`--hp-mv-${k}`);\n if (!this.destroyed) return;\n area.removeAttribute('data-mv');\n return;\n }\n area.setAttribute('data-mv-grid', '');\n const [x, y, w, h] = rect;\n area.style.setProperty('--hp-mv-x', `${x}%`);\n area.style.setProperty('--hp-mv-y', `${y}%`);\n area.style.setProperty('--hp-mv-w', `${w}%`);\n area.style.setProperty('--hp-mv-h', `${h}%`);\n }\n\n private makeTile(cam: MultiviewSource): Tile {\n const el = document.createElement('button');\n el.type = 'button';\n el.className = 'hp-mv-tile';\n el.setAttribute('data-cam', cam.id);\n const label = document.createElement('span');\n label.className = 'hp-mv-label';\n label.textContent = cam.label;\n const badge = document.createElement('span');\n badge.className = 'hp-mv-badge';\n el.append(label, badge);\n el.addEventListener('click', () => void this.switchTo(cam.id));\n const tile: Tile = { cam, el, video: null, hls: null, img: null };\n this.tiles.set(cam.id, tile);\n return tile;\n }\n\n private labelTile(t: Tile): void {\n const i18n = this.ctx.i18n;\n const active = t.cam === this.active;\n t.el.setAttribute('aria-label', active ? `${t.cam.label} — ${i18n.multiviewWatching}` : i18n.multiviewSwitch(t.cam.label));\n const badge = t.el.querySelector('.hp-mv-badge')!;\n badge.textContent = active ? i18n.multiviewWatching : t.el.hasAttribute('data-waiting') ? i18n.multiviewNotStarted : '';\n }\n\n private labelTiles(): void {\n for (const t of this.tiles.values()) this.labelTile(t);\n }\n\n private dropTile(id: string): void {\n const t = this.tiles.get(id);\n if (!t) return;\n this.stopVideo(t);\n t.el.remove();\n this.tiles.delete(id);\n }\n\n private stopVideo(t: Tile): void {\n t.hls?.destroy();\n t.hls = null;\n if (t.video) {\n t.video.pause();\n t.video.removeAttribute('src');\n t.video.load();\n t.video.remove();\n t.video = null;\n }\n }\n\n /** Önizleme: video (sessiz, en düşük kalite) ya da poster. */\n private setPreview(t: Tile, video: boolean): void {\n if (!video) {\n this.stopVideo(t);\n if (!t.img && t.cam.poster) {\n const img = document.createElement('img');\n img.className = 'hp-mv-media';\n img.alt = '';\n img.decoding = 'async';\n img.src = t.cam.poster;\n img.addEventListener('error', () => img.remove());\n t.el.prepend(img);\n t.img = img;\n }\n return;\n }\n if (t.video) return;\n const v = document.createElement('video');\n v.className = 'hp-mv-media';\n v.muted = true;\n v.playsInline = true;\n v.setAttribute('playsinline', '');\n v.preload = 'auto';\n if (t.cam.poster) v.poster = t.cam.poster;\n t.el.prepend(v);\n t.video = v;\n void this.attach(t, v);\n }\n\n private async attach(t: Tile, v: HTMLVideoElement): Promise<void> {\n const cam = t.cam;\n const mse = typeof window.MediaSource !== 'undefined' || 'ManagedMediaSource' in window;\n if (isHls(cam) && mse) {\n if (!this.HlsCtor) this.HlsCtor = (await import('hls.js/light')).default as unknown as new (config: object) => HlsLike;\n if (t.video !== v) return;\n // Önizleme: en düşük kalite, kısa tampon.\n const hls = new this.HlsCtor({ startLevel: 0, capLevelToPlayerSize: true, maxBufferLength: 8, maxMaxBufferLength: 16, backBufferLength: 4 });\n hls.on('hlsManifestParsed', () => {\n hls.autoLevelCapping = 0;\n });\n hls.attachMedia(v);\n hls.loadSource(cam.src);\n t.hls = hls;\n } else {\n v.src = cam.src;\n }\n v.addEventListener('loadedmetadata', () => this.sync(), { once: true });\n }\n\n /** Önizlemeleri ana kameranın anına hizalar; oynat / duraklat / hızı izler. */\n private readonly sync = (): void => {\n if (this.destroyed || this.switching || this.options.sync === false) return;\n const main = this.ctx.videoEl;\n const clock = clockOf(main, this.ctx.mainHls());\n const mainDate = clock ? clock.date + (main.currentTime - clock.pos) * 1000 : null;\n const mainEvent = main.currentTime + (this.active.offset ?? 0);\n for (const t of this.tiles.values()) {\n const v = t.video;\n if (!v || v.readyState < 1) continue;\n const c = clockOf(v, t.hls);\n const want = mainDate !== null && c ? c.pos + (mainDate - c.date) / 1000 : mainEvent - (t.cam.offset ?? 0);\n // Kamera bu anda henüz yayında değil (etkinliğe sonra katıldı) ya da bitti.\n const s = v.seekable;\n const before = s.length ? want < s.start(0) - 0.2 : want < -0.2;\n const after = s.length ? want > s.end(s.length - 1) + 0.2 : false;\n const waiting = before || after;\n if (t.el.hasAttribute('data-waiting') !== waiting) {\n t.el.toggleAttribute('data-waiting', waiting);\n this.labelTile(t);\n }\n if (waiting) {\n if (!v.paused) v.pause();\n continue;\n }\n // Oynamaya hazır olmadan sarılmaz (hls.js ilk segmentte başlangıç konumuna sarıp ezerdi).\n if (v.readyState >= 3 && !v.seeking && Math.abs(v.currentTime - want) > DRIFT) v.currentTime = clamp(v, want);\n v.playbackRate = main.playbackRate || 1;\n if (main.paused || this.ctx.isAdActive()) {\n if (!v.paused) v.pause();\n } else if (v.paused) {\n void v.play().catch(() => {});\n }\n }\n };\n\n private readonly onMainPlay = (): void => this.sync();\n private readonly onMainPause = (): void => {\n for (const t of this.tiles.values()) t.video?.pause();\n };\n private readonly onRate = (): void => this.sync();\n\n private readonly onAdStart = (): void => {\n this.root.setAttribute('data-ad', '');\n this.onMainPause();\n };\n\n private readonly onAdEnd = (): void => {\n this.root.removeAttribute('data-ad');\n this.sync();\n };\n\n /** Canlı yayın posterleri: önbelleği atlayarak yenile. */\n private readonly refreshPosters = (): void => {\n for (const t of this.tiles.values()) {\n if (!t.img || !t.cam.poster) continue;\n const u = new URL(t.cam.poster, location.href);\n u.searchParams.set('_hp', String(Date.now()));\n t.img.src = u.toString();\n }\n };\n\n private waitFor(target: EventTarget, type: string, ms: number): Promise<void> {\n const v = target as HTMLVideoElement;\n // Olay zaten olmuşsa beklenmez.\n if ((type === 'loadedmetadata' && v.readyState >= 1) || (type === 'canplay' && v.readyState >= 3) || (type === 'seeked' && !v.seeking)) return Promise.resolve();\n return new Promise((resolve) => {\n const done = (): void => {\n clearTimeout(timer);\n target.removeEventListener(type, done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n target.addEventListener(type, done, { once: true });\n });\n }\n\n /** Yeni yayının saat bilgisi (hls.js'te playlist yüklenince gelir) — en fazla 2 sn beklenir. */\n private async waitClock(v: HTMLVideoElement): Promise<{ pos: number; date: number } | null> {\n for (let i = 0; i < 20; i++) {\n const hls = this.ctx.mainHls();\n const c = clockOf(v, hls);\n if (c) return c;\n // Liste yüklendi ama saat etiketi yok (ya da hls.js değil) — beklemeye gerek yok, offset kullanılır.\n if (!hls || hls.levels?.some((l) => l.details)) return null;\n await new Promise((r) => setTimeout(r, 100));\n }\n return null;\n }\n}\n","import { registerLocaleStrings } from '../../i18n';\nimport { strings } from './strings';\nimport { Multiview, type HlsLike, type MultiviewPlayerContext } from './Multiview';\nimport type { MultiviewOptions } from '../../types';\n\nregisterLocaleStrings(strings);\n\nexport function installMultiview(ctx: MultiviewPlayerContext, options: MultiviewOptions): Multiview {\n return new Multiview(ctx, options);\n}\n\nexport { Multiview };\nexport type { HlsLike, MultiviewPlayerContext };\n"],"names":["strings","label","GRID","DRIFT","isHls","cam","clockOf","video","hls","details","_b","_a","_d","_c","l","frag","f","start","_e","t","clamp","pos","s","Multiview","ctx","options","__publicField","main","clock","mainDate","mainEvent","v","c","want","before","after","waiting","u","adoptStyle","css","ev","e","btn","i18n","layout","id","next","from","wasPaused","rate","startedAt","nowDate","nowEvent","target","elapsed","i","state","p","others","max","grid","keep","order","cells","x","y","w","h","tile","isActive","rect","area","k","el","badge","active","img","mse","type","ms","resolve","done","timer","r","registerLocaleStrings","installMultiview"],"mappings":"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"}
@@ -1,15 +1,16 @@
1
- var u = Object.defineProperty;
2
- var c = (o, e, t) => e in o ? u(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t;
3
- var s = (o, e, t) => c(o, typeof e != "symbol" ? e + "" : e, t);
4
- import { l as m } from "./gpt-CGXHTG_H.js";
5
- const v = [
1
+ var c = Object.defineProperty;
2
+ var u = (r, e, t) => e in r ? c(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
+ var s = (r, e, t) => u(r, typeof e != "symbol" ? e + "" : e, t);
4
+ import { a as m } from "./plugin-style-CPJELe-i.js";
5
+ import { l as f } from "./gpt-CGXHTG_H.js";
6
+ const v = ".video-area[data-pause-ad-ready]>:is(.media-layer,.hp-chrome,.hp-center-play,.hp-caption-layer,.hp-error-screen,.hp-mini-progress){right:var(--hp-pause-ad-w, 0px);transition:right .38s cubic-bezier(.2,.8,.2,1),opacity .2s ease}.video-area[data-pause-ad] .media-layer video{object-fit:cover}.hp-pause-ad{position:absolute;top:0;right:0;bottom:0;z-index:25;width:var(--hp-pause-ad-panel-w, 332px);box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;gap:10px;padding:12px 16px;background:var(--hp-color-surface, #0a0a0a);color:var(--hp-color-on-surface, #fff);transform:translate(100%);visibility:hidden;transition:transform .38s cubic-bezier(.2,.8,.2,1),visibility 0s linear .38s}.hp-pause-ad[data-open]{transform:none;visibility:visible;transition:transform .38s cubic-bezier(.2,.8,.2,1)}.hp-pause-ad-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.hp-pause-ad-label{font-size:13px;font-weight:600;color:var(--hp-color-on-surface-muted, rgba(255, 255, 255, .7))}.hp-pause-ad-close{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:9999px;background:transparent;color:var(--hp-color-on-surface, #fff);cursor:pointer;transition:background-color .15s ease}.hp-pause-ad-close:hover{background:var(--hp-chip-bg-hover)}.hp-pause-ad-body{display:flex;justify-content:center;overflow:hidden;border-radius:8px}.hp-pause-ad-resume{align-self:stretch;padding:9px 14px;border:1px solid var(--hp-chip-border);border-radius:9999px;background:var(--hp-chip-bg);color:var(--hp-color-on-surface, #fff);font:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .15s ease,border-color .15s ease}.hp-pause-ad-resume:hover{background:var(--hp-chip-bg-hover);border-color:var(--hp-chip-border-hover)}.hp-pause-ad-close:focus-visible,.hp-pause-ad-resume:focus-visible{outline:2px solid var(--hp-color-accent);outline-offset:2px}@media(prefers-reduced-motion:reduce){.video-area[data-pause-ad-ready]>:is(.media-layer,.hp-chrome,.hp-center-play,.hp-caption-layer,.hp-error-screen,.hp-mini-progress),.hp-pause-ad,.hp-pause-ad[data-open]{transition:none}}", b = [
6
7
  [300, 250],
7
8
  [336, 280],
8
9
  [250, 250],
9
10
  [200, 200]
10
- ], d = 16, y = 104, h = "hp-pause-ad", f = 420;
11
+ ], l = 16, y = 104, h = "hp-pause-ad", g = 420;
11
12
  let E = 0;
12
- class g {
13
+ class x {
13
14
  constructor(e, t) {
14
15
  s(this, "panel");
15
16
  s(this, "adHost");
@@ -44,58 +45,58 @@ class g {
44
45
  }
45
46
  if (!t || !this.ctx.videoEl.paused || this.ctx.isBlocked()) return;
46
47
  const i = Array.isArray(e.size) && typeof e.size[0] == "number" ? e.size[0] : null;
47
- this.show(i ? i + d * 2 : void 0, e.size);
48
+ this.show(i ? i + l * 2 : void 0, e.size);
48
49
  });
49
50
  this.ctx = e, this.options = t, this.divId = `hp-pause-ad-${++E}`, this.panel = document.createElement("div"), this.panel.className = "hp-pause-ad", this.panel.setAttribute("part", "pause-ad"), this.panel.setAttribute("aria-hidden", "true");
50
51
  const i = document.createElement("div");
51
52
  i.className = "hp-pause-ad-header", this.labelEl = document.createElement("span"), this.labelEl.className = "hp-pause-ad-label", this.closeBtn = document.createElement("button"), this.closeBtn.type = "button", this.closeBtn.className = "hp-pause-ad-close", this.closeBtn.innerHTML = '<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>', this.closeBtn.addEventListener("click", () => this.hide("closed")), i.append(this.labelEl, this.closeBtn);
52
- const n = document.createElement("div");
53
- n.className = "hp-pause-ad-body";
54
- const r = document.createElement("slot");
55
- r.name = h, n.appendChild(r), this.resumeBtn = document.createElement("button"), this.resumeBtn.type = "button", this.resumeBtn.className = "hp-pause-ad-resume", this.resumeBtn.addEventListener("click", () => void this.ctx.videoEl.play()), t.showResumeButton === !1 && (this.resumeBtn.style.display = "none"), this.panel.append(i, n, this.resumeBtn), this.panel.addEventListener("pointerdown", (a) => a.stopPropagation()), this.panel.addEventListener("click", (a) => a.stopPropagation()), e.videoArea.appendChild(this.panel), e.videoArea.setAttribute("data-pause-ad-ready", ""), this.adHost = document.createElement("div"), this.adHost.slot = h, this.adHost.id = this.divId, e.hostEl.appendChild(this.adHost), this.refreshLabels(), e.videoEl.addEventListener("pause", this.onPause), e.videoEl.addEventListener("play", this.onPlay);
53
+ const o = document.createElement("div");
54
+ o.className = "hp-pause-ad-body";
55
+ const n = document.createElement("slot");
56
+ n.name = h, o.appendChild(n), this.resumeBtn = document.createElement("button"), this.resumeBtn.type = "button", this.resumeBtn.className = "hp-pause-ad-resume", this.resumeBtn.addEventListener("click", () => void this.ctx.videoEl.play()), t.showResumeButton === !1 && (this.resumeBtn.style.display = "none"), this.panel.append(i, o, this.resumeBtn), this.panel.addEventListener("pointerdown", (a) => a.stopPropagation()), this.panel.addEventListener("click", (a) => a.stopPropagation()), e.videoArea.appendChild(this.panel), e.videoArea.setAttribute("data-pause-ad-ready", ""), this.adHost = document.createElement("div"), this.adHost.slot = h, this.adHost.id = this.divId, e.hostEl.appendChild(this.adHost), this.refreshLabels(), e.videoEl.addEventListener("pause", this.onPause), e.videoEl.addEventListener("play", this.onPlay);
56
57
  }
57
58
  refreshLabels() {
58
59
  this.labelEl.textContent = this.options.label ?? this.ctx.i18n.pauseAdLabel, this.closeBtn.setAttribute("aria-label", this.ctx.i18n.pauseAdClose), this.resumeBtn.textContent = this.ctx.i18n.pauseAdResume;
59
60
  }
60
61
  destroy() {
61
- var e, t, i, n;
62
- this.destroyed = !0, this.delayTimer && clearTimeout(this.delayTimer), this.ctx.videoEl.removeEventListener("pause", this.onPause), this.ctx.videoEl.removeEventListener("play", this.onPlay), (i = (e = this.googletag) == null ? void 0 : (t = e.pubads()).removeEventListener) == null || i.call(t, "slotRenderEnded", this.onRenderEnded), this.slot && ((n = this.googletag) == null || n.destroySlots([this.slot])), this.setShift(0), this.coverTimer && clearTimeout(this.coverTimer), this.ctx.videoArea.removeAttribute("data-pause-ad"), this.ctx.videoArea.removeAttribute("data-pause-ad-ready"), this.panel.remove(), this.adHost.remove();
62
+ var e, t, i, o;
63
+ this.destroyed = !0, this.delayTimer && clearTimeout(this.delayTimer), this.ctx.videoEl.removeEventListener("pause", this.onPause), this.ctx.videoEl.removeEventListener("play", this.onPlay), (i = (e = this.googletag) == null ? void 0 : (t = e.pubads()).removeEventListener) == null || i.call(t, "slotRenderEnded", this.onRenderEnded), this.slot && ((o = this.googletag) == null || o.destroySlots([this.slot])), this.setShift(0), this.coverTimer && clearTimeout(this.coverTimer), this.ctx.videoArea.removeAttribute("data-pause-ad"), this.ctx.videoArea.removeAttribute("data-pause-ad-ready"), this.panel.remove(), this.adHost.remove();
63
64
  }
64
65
  // ── istek / gösterim ──
65
66
  /** Alana sığan reklam boyutları (genişlik oranı + dikey alan) — hiçbiri sığmazsa gösterilmez. */
66
67
  fittingSizes() {
67
68
  const e = this.ctx.videoArea.getBoundingClientRect();
68
69
  if (e.width < (this.options.minPlayerWidth ?? 640)) return [];
69
- const t = e.width * (this.options.maxWidthRatio ?? 0.5) - d * 2, i = e.height - y;
70
- return (this.options.sizes ?? v).filter(([n, r]) => n <= t && r <= i);
70
+ const t = e.width * (this.options.maxWidthRatio ?? 0.5) - l * 2, i = e.height - y;
71
+ return (this.options.sizes ?? b).filter(([o, n]) => o <= t && n <= i);
71
72
  }
72
73
  async request() {
73
74
  const e = this.ctx.videoEl;
74
75
  if (this.destroyed || !e.paused || e.ended || e.seeking || this.ctx.isBlocked()) return;
75
76
  const t = this.fittingSizes();
76
77
  if (!t.length) return;
77
- const i = Math.max(...t.map(([l]) => l)) + d * 2;
78
+ const i = Math.max(...t.map(([d]) => d)) + l * 2;
78
79
  this.panel.style.setProperty("--hp-pause-ad-panel-w", `${i}px`);
79
- const n = (this.options.refreshIntervalSec ?? 30) * 1e3, r = JSON.stringify(t);
80
- if (this.slot && this.lastFilled && r === this.slotSizesKey && Date.now() - this.lastFetchAt < n) {
80
+ const o = (this.options.refreshIntervalSec ?? 30) * 1e3, n = JSON.stringify(t);
81
+ if (this.slot && this.lastFilled && n === this.slotSizesKey && Date.now() - this.lastFetchAt < o) {
81
82
  this.show(i);
82
83
  return;
83
84
  }
84
85
  try {
85
- this.googletag = this.googletag ?? await m();
86
- } catch (l) {
87
- console.warn("[HopePlayer pause-ad]", l);
86
+ this.googletag = this.googletag ?? await f();
87
+ } catch (d) {
88
+ console.warn("[HopePlayer pause-ad]", d);
88
89
  return;
89
90
  }
90
91
  if (this.destroyed || !e.paused) return;
91
92
  const a = this.googletag;
92
93
  this.waitingForRender = !0, a.cmd.push(() => {
93
94
  if (!this.destroyed) {
94
- if (!this.slot || r !== this.slotSizesKey) {
95
+ if (!this.slot || n !== this.slotSizesKey) {
95
96
  if (this.slot && a.destroySlots([this.slot]), this.slot = a.defineSlot(this.options.adUnitPath, t, this.divId), !this.slot) return;
96
97
  this.slot.addService(a.pubads());
97
- for (const [l, p] of Object.entries(this.options.targeting ?? {})) this.slot.setTargeting(l, p);
98
- this.slotSizesKey = r, a.pubads().addEventListener("slotRenderEnded", this.onRenderEnded), a.enableServices(), a.display(this.divId), a.pubads().isInitialLoadDisabled() && a.pubads().refresh([this.slot]);
98
+ for (const [d, p] of Object.entries(this.options.targeting ?? {})) this.slot.setTargeting(d, p);
99
+ this.slotSizesKey = n, a.pubads().addEventListener("slotRenderEnded", this.onRenderEnded), a.enableServices(), a.display(this.divId), a.pubads().isInitialLoadDisabled() && a.pubads().refresh([this.slot]);
99
100
  } else
100
101
  a.pubads().refresh([this.slot]);
101
102
  this.lastFetchAt = Date.now();
@@ -115,17 +116,17 @@ class g {
115
116
  const t = this.ctx.videoArea;
116
117
  this.coverTimer && clearTimeout(this.coverTimer), this.coverTimer = null, t.style.setProperty("--hp-pause-ad-w", `${e}px`), e > 0 ? t.setAttribute("data-pause-ad", "") : t.hasAttribute("data-pause-ad") && (this.coverTimer = setTimeout(() => {
117
118
  this.coverTimer = null, t.removeAttribute("data-pause-ad");
118
- }, f));
119
+ }, g));
119
120
  }
120
121
  emit(e, t, i) {
121
122
  this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:pausead", { detail: { state: e, size: t, reason: i } }));
122
123
  }
123
124
  }
124
- function T(o, e) {
125
- return new g(o, e);
125
+ function S(r, e) {
126
+ return m(r.videoEl, "pause-ad", v), new x(r, e);
126
127
  }
127
128
  export {
128
- g as PauseAd,
129
- T as installPauseAd
129
+ x as PauseAd,
130
+ S as installPauseAd
130
131
  };
131
- //# sourceMappingURL=pauseAd-BQQe21X4.js.map
132
+ //# sourceMappingURL=pauseAd-DF7KGwUs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pauseAd-BQQe21X4.js","sources":["../../src/plugins/pause-ad/PauseAd.ts","../../src/plugins/pause-ad/index.ts"],"sourcesContent":["import type { PauseAdOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { loadGpt, type GoogleTag, type GptSlot, type GptSlotRenderEndedEvent } from './loadGpt';\n\nexport interface PauseAdPlayerContext {\n videoEl: HTMLVideoElement;\n /** Light DOM sahibi (GPT reklam div'ini bulabilsin diye slot'lu div buraya eklenir) + hp:pausead olayları. */\n hostEl: HTMLElement;\n videoArea: HTMLElement;\n i18n: HopeLocaleStrings;\n /** IMA reklamı oynuyor ya da giriş ekranı (countdown/geo) açık — bu sırada gösterilmez. */\n isBlocked(): boolean;\n}\n\nconst DEFAULT_SIZES: Array<[number, number]> = [\n [300, 250],\n [336, 280],\n [250, 250],\n [200, 200],\n];\nconst PANEL_PADDING_X = 16;\n/** Başlık + \"Videoya devam et\" satırı + boşluklar (px) — dikey sığma hesabı için. */\nconst PANEL_CHROME_Y = 104;\nconst SLOT_NAME = 'hp-pause-ad';\n/** tailwind.css'teki sıkışma geçişiyle (380ms) aynı + küçük pay. */\nconst SHIFT_TRANSITION_MS = 420;\nlet instanceCount = 0;\n\n/**\n * Pause reklamı: video duraklatılınca Google display reklamı (GPT) istenir; dolarsa video sola animasyonla\n * sıkışır (cover — dış kenarlar kırpılır), sağdan reklam paneli kayar. Boş dönerse hiçbir şey açılmaz.\n * GPT reklamı document.getElementById ile bulur — Shadow DOM'u göremez; bu yüzden reklam div'i host'un light\n * DOM çocuğu olarak oluşturulup paneldeki <slot>'a yansıtılır.\n */\nexport class PauseAd {\n private readonly panel: HTMLDivElement;\n private readonly adHost: HTMLDivElement;\n private readonly labelEl: HTMLSpanElement;\n private readonly closeBtn: HTMLButtonElement;\n private readonly resumeBtn: HTMLButtonElement;\n private readonly divId: string;\n private googletag: GoogleTag | null = null;\n private slot: GptSlot | null = null;\n private slotSizesKey = '';\n private lastFetchAt = 0;\n private lastFilled = false;\n private waitingForRender = false;\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\n private coverTimer: ReturnType<typeof setTimeout> | null = null;\n private open = false;\n private destroyed = false;\n\n constructor(\n private readonly ctx: PauseAdPlayerContext,\n private readonly options: PauseAdOptions\n ) {\n this.divId = `hp-pause-ad-${++instanceCount}`;\n\n this.panel = document.createElement('div');\n this.panel.className = 'hp-pause-ad';\n this.panel.setAttribute('part', 'pause-ad');\n this.panel.setAttribute('aria-hidden', 'true');\n\n const header = document.createElement('div');\n header.className = 'hp-pause-ad-header';\n this.labelEl = document.createElement('span');\n this.labelEl.className = 'hp-pause-ad-label';\n this.closeBtn = document.createElement('button');\n this.closeBtn.type = 'button';\n this.closeBtn.className = 'hp-pause-ad-close';\n this.closeBtn.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n this.closeBtn.addEventListener('click', () => this.hide('closed'));\n header.append(this.labelEl, this.closeBtn);\n\n const body = document.createElement('div');\n body.className = 'hp-pause-ad-body';\n const slotEl = document.createElement('slot');\n slotEl.name = SLOT_NAME;\n body.appendChild(slotEl);\n\n this.resumeBtn = document.createElement('button');\n this.resumeBtn.type = 'button';\n this.resumeBtn.className = 'hp-pause-ad-resume';\n this.resumeBtn.addEventListener('click', () => void this.ctx.videoEl.play());\n if (options.showResumeButton === false) this.resumeBtn.style.display = 'none';\n\n this.panel.append(header, body, this.resumeBtn);\n // Videoya dokunma/tıklama (oynat/duraklat) panelden tetiklenmesin.\n this.panel.addEventListener('pointerdown', (e) => e.stopPropagation());\n this.panel.addEventListener('click', (e) => e.stopPropagation());\n ctx.videoArea.appendChild(this.panel);\n ctx.videoArea.setAttribute('data-pause-ad-ready', '');\n\n // Light DOM reklam kapsayıcısı — GPT bunu id ile bulur; görüntüsü paneldeki slot'ta.\n this.adHost = document.createElement('div');\n this.adHost.slot = SLOT_NAME;\n this.adHost.id = this.divId;\n ctx.hostEl.appendChild(this.adHost);\n\n this.refreshLabels();\n ctx.videoEl.addEventListener('pause', this.onPause);\n ctx.videoEl.addEventListener('play', this.onPlay);\n }\n\n refreshLabels(): void {\n this.labelEl.textContent = this.options.label ?? this.ctx.i18n.pauseAdLabel;\n this.closeBtn.setAttribute('aria-label', this.ctx.i18n.pauseAdClose);\n this.resumeBtn.textContent = this.ctx.i18n.pauseAdResume;\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.ctx.videoEl.removeEventListener('pause', this.onPause);\n this.ctx.videoEl.removeEventListener('play', this.onPlay);\n this.googletag?.pubads().removeEventListener?.('slotRenderEnded', this.onRenderEnded);\n if (this.slot) this.googletag?.destroySlots([this.slot]);\n this.setShift(0);\n if (this.coverTimer) clearTimeout(this.coverTimer);\n this.ctx.videoArea.removeAttribute('data-pause-ad');\n this.ctx.videoArea.removeAttribute('data-pause-ad-ready');\n this.panel.remove();\n this.adHost.remove();\n }\n\n // ── olaylar ──\n\n private readonly onPause = (): void => {\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.delayTimer = setTimeout(() => void this.request(), this.options.delayMs ?? 300);\n };\n\n private readonly onPlay = (): void => {\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.waitingForRender = false;\n this.hide('resumed');\n };\n\n // ── istek / gösterim ──\n\n /** Alana sığan reklam boyutları (genişlik oranı + dikey alan) — hiçbiri sığmazsa gösterilmez. */\n private fittingSizes(): Array<[number, number]> {\n const area = this.ctx.videoArea.getBoundingClientRect();\n if (area.width < (this.options.minPlayerWidth ?? 640)) return [];\n const maxW = area.width * (this.options.maxWidthRatio ?? 0.5) - PANEL_PADDING_X * 2;\n const maxH = area.height - PANEL_CHROME_Y;\n return (this.options.sizes ?? DEFAULT_SIZES).filter(([w, h]) => w <= maxW && h <= maxH);\n }\n\n private async request(): Promise<void> {\n const v = this.ctx.videoEl;\n if (this.destroyed || !v.paused || v.ended || v.seeking || this.ctx.isBlocked()) return;\n const sizes = this.fittingSizes();\n if (!sizes.length) return;\n\n // Panel genişliği: sığan en geniş reklam + iç boşluk.\n const panelW = Math.max(...sizes.map(([w]) => w)) + PANEL_PADDING_X * 2;\n this.panel.style.setProperty('--hp-pause-ad-panel-w', `${panelW}px`);\n\n const refreshMs = (this.options.refreshIntervalSec ?? 30) * 1000;\n const sizesKey = JSON.stringify(sizes);\n // Yakın zamanda doldurulmuş ve boyutlar aynı → yeni istek atmadan mevcut reklamı göster.\n if (this.slot && this.lastFilled && sizesKey === this.slotSizesKey && Date.now() - this.lastFetchAt < refreshMs) {\n this.show(panelW);\n return;\n }\n\n try {\n this.googletag = this.googletag ?? (await loadGpt());\n } catch (err) {\n console.warn('[HopePlayer pause-ad]', err);\n return;\n }\n if (this.destroyed || !v.paused) return;\n const gt = this.googletag;\n this.waitingForRender = true;\n gt.cmd.push(() => {\n if (this.destroyed) return;\n if (!this.slot || sizesKey !== this.slotSizesKey) {\n if (this.slot) gt.destroySlots([this.slot]);\n this.slot = gt.defineSlot(this.options.adUnitPath, sizes, this.divId);\n if (!this.slot) return;\n this.slot.addService(gt.pubads());\n for (const [k, val] of Object.entries(this.options.targeting ?? {})) this.slot.setTargeting(k, val);\n this.slotSizesKey = sizesKey;\n gt.pubads().addEventListener('slotRenderEnded', this.onRenderEnded);\n gt.enableServices();\n gt.display(this.divId);\n // Sayfa disableInitialLoad kullanıyorsa display istek atmaz — elle refresh.\n if (gt.pubads().isInitialLoadDisabled()) gt.pubads().refresh([this.slot]);\n } else {\n gt.pubads().refresh([this.slot]);\n }\n this.lastFetchAt = Date.now();\n });\n }\n\n private readonly onRenderEnded = (e: GptSlotRenderEndedEvent): void => {\n if (e.slot !== this.slot) return;\n this.lastFilled = !e.isEmpty;\n const wasWaiting = this.waitingForRender;\n this.waitingForRender = false;\n if (e.isEmpty) {\n this.emit('empty');\n return;\n }\n // İstek sürerken kullanıcı oynattıysa açma.\n if (!wasWaiting || !this.ctx.videoEl.paused || this.ctx.isBlocked()) return;\n const width = Array.isArray(e.size) && typeof e.size[0] === 'number' ? e.size[0] : null;\n this.show(width ? width + PANEL_PADDING_X * 2 : undefined, e.size as [number, number] | undefined);\n };\n\n private show(panelW?: number, size?: [number, number]): void {\n if (panelW) this.panel.style.setProperty('--hp-pause-ad-panel-w', `${panelW}px`);\n const w = parseFloat(this.panel.style.getPropertyValue('--hp-pause-ad-panel-w')) || 332;\n this.open = true;\n this.panel.setAttribute('data-open', '');\n this.panel.setAttribute('aria-hidden', 'false');\n this.setShift(w);\n this.emit('shown', size);\n }\n\n private hide(reason: 'closed' | 'resumed'): void {\n if (!this.open) return;\n this.open = false;\n this.panel.removeAttribute('data-open');\n this.panel.setAttribute('aria-hidden', 'true');\n this.setShift(0);\n this.emit('hidden', undefined, reason);\n }\n\n /** Video ve kontrolleri panel genişliği kadar sola sıkıştırır (tailwind.css `.video-area[data-pause-ad]`). */\n private setShift(px: number): void {\n const area = this.ctx.videoArea;\n if (this.coverTimer) clearTimeout(this.coverTimer);\n this.coverTimer = null;\n area.style.setProperty('--hp-pause-ad-w', `${px}px`);\n if (px > 0) {\n area.setAttribute('data-pause-ad', '');\n } else if (area.hasAttribute('data-pause-ad')) {\n // cover, genişleme animasyonu bitene kadar kalır — hemen contain'e dönmek kapanışta görüntüyü sıçratıyordu.\n this.coverTimer = setTimeout(() => {\n this.coverTimer = null;\n area.removeAttribute('data-pause-ad');\n }, SHIFT_TRANSITION_MS);\n }\n }\n\n private emit(state: 'shown' | 'hidden' | 'empty', size?: [number, number], reason?: 'closed' | 'resumed'): void {\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:pausead', { detail: { state, size, reason } }));\n }\n}\n","import { PauseAd, type PauseAdPlayerContext } from './PauseAd';\nimport type { PauseAdOptions } from '../../types';\n\nexport function installPauseAd(ctx: PauseAdPlayerContext, options: PauseAdOptions): PauseAd {\n return new PauseAd(ctx, options);\n}\n\nexport { PauseAd };\nexport type { PauseAdPlayerContext };\n"],"names":["DEFAULT_SIZES","PANEL_PADDING_X","PANEL_CHROME_Y","SLOT_NAME","SHIFT_TRANSITION_MS","instanceCount","PauseAd","ctx","options","__publicField","wasWaiting","width","header","body","slotEl","e","_c","_a","_b","_d","area","maxW","maxH","w","h","v","sizes","panelW","refreshMs","sizesKey","loadGpt","err","gt","k","val","size","reason","px","state","installPauseAd"],"mappings":"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"}
1
+ {"version":3,"file":"pauseAd-DF7KGwUs.js","sources":["../../src/plugins/pause-ad/PauseAd.ts","../../src/plugins/pause-ad/index.ts"],"sourcesContent":["import type { PauseAdOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { loadGpt, type GoogleTag, type GptSlot, type GptSlotRenderEndedEvent } from './loadGpt';\n\nexport interface PauseAdPlayerContext {\n videoEl: HTMLVideoElement;\n /** Light DOM sahibi (GPT reklam div'ini bulabilsin diye slot'lu div buraya eklenir) + hp:pausead olayları. */\n hostEl: HTMLElement;\n videoArea: HTMLElement;\n i18n: HopeLocaleStrings;\n /** IMA reklamı oynuyor ya da giriş ekranı (countdown/geo) açık — bu sırada gösterilmez. */\n isBlocked(): boolean;\n}\n\nconst DEFAULT_SIZES: Array<[number, number]> = [\n [300, 250],\n [336, 280],\n [250, 250],\n [200, 200],\n];\nconst PANEL_PADDING_X = 16;\n/** Başlık + \"Videoya devam et\" satırı + boşluklar (px) — dikey sığma hesabı için. */\nconst PANEL_CHROME_Y = 104;\nconst SLOT_NAME = 'hp-pause-ad';\n/** tailwind.css'teki sıkışma geçişiyle (380ms) aynı + küçük pay. */\nconst SHIFT_TRANSITION_MS = 420;\nlet instanceCount = 0;\n\n/**\n * Pause reklamı: video duraklatılınca Google display reklamı (GPT) istenir; dolarsa video sola animasyonla\n * sıkışır (cover — dış kenarlar kırpılır), sağdan reklam paneli kayar. Boş dönerse hiçbir şey açılmaz.\n * GPT reklamı document.getElementById ile bulur — Shadow DOM'u göremez; bu yüzden reklam div'i host'un light\n * DOM çocuğu olarak oluşturulup paneldeki <slot>'a yansıtılır.\n */\nexport class PauseAd {\n private readonly panel: HTMLDivElement;\n private readonly adHost: HTMLDivElement;\n private readonly labelEl: HTMLSpanElement;\n private readonly closeBtn: HTMLButtonElement;\n private readonly resumeBtn: HTMLButtonElement;\n private readonly divId: string;\n private googletag: GoogleTag | null = null;\n private slot: GptSlot | null = null;\n private slotSizesKey = '';\n private lastFetchAt = 0;\n private lastFilled = false;\n private waitingForRender = false;\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\n private coverTimer: ReturnType<typeof setTimeout> | null = null;\n private open = false;\n private destroyed = false;\n\n constructor(\n private readonly ctx: PauseAdPlayerContext,\n private readonly options: PauseAdOptions\n ) {\n this.divId = `hp-pause-ad-${++instanceCount}`;\n\n this.panel = document.createElement('div');\n this.panel.className = 'hp-pause-ad';\n this.panel.setAttribute('part', 'pause-ad');\n this.panel.setAttribute('aria-hidden', 'true');\n\n const header = document.createElement('div');\n header.className = 'hp-pause-ad-header';\n this.labelEl = document.createElement('span');\n this.labelEl.className = 'hp-pause-ad-label';\n this.closeBtn = document.createElement('button');\n this.closeBtn.type = 'button';\n this.closeBtn.className = 'hp-pause-ad-close';\n this.closeBtn.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n this.closeBtn.addEventListener('click', () => this.hide('closed'));\n header.append(this.labelEl, this.closeBtn);\n\n const body = document.createElement('div');\n body.className = 'hp-pause-ad-body';\n const slotEl = document.createElement('slot');\n slotEl.name = SLOT_NAME;\n body.appendChild(slotEl);\n\n this.resumeBtn = document.createElement('button');\n this.resumeBtn.type = 'button';\n this.resumeBtn.className = 'hp-pause-ad-resume';\n this.resumeBtn.addEventListener('click', () => void this.ctx.videoEl.play());\n if (options.showResumeButton === false) this.resumeBtn.style.display = 'none';\n\n this.panel.append(header, body, this.resumeBtn);\n // Videoya dokunma/tıklama (oynat/duraklat) panelden tetiklenmesin.\n this.panel.addEventListener('pointerdown', (e) => e.stopPropagation());\n this.panel.addEventListener('click', (e) => e.stopPropagation());\n ctx.videoArea.appendChild(this.panel);\n ctx.videoArea.setAttribute('data-pause-ad-ready', '');\n\n // Light DOM reklam kapsayıcısı — GPT bunu id ile bulur; görüntüsü paneldeki slot'ta.\n this.adHost = document.createElement('div');\n this.adHost.slot = SLOT_NAME;\n this.adHost.id = this.divId;\n ctx.hostEl.appendChild(this.adHost);\n\n this.refreshLabels();\n ctx.videoEl.addEventListener('pause', this.onPause);\n ctx.videoEl.addEventListener('play', this.onPlay);\n }\n\n refreshLabels(): void {\n this.labelEl.textContent = this.options.label ?? this.ctx.i18n.pauseAdLabel;\n this.closeBtn.setAttribute('aria-label', this.ctx.i18n.pauseAdClose);\n this.resumeBtn.textContent = this.ctx.i18n.pauseAdResume;\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.ctx.videoEl.removeEventListener('pause', this.onPause);\n this.ctx.videoEl.removeEventListener('play', this.onPlay);\n this.googletag?.pubads().removeEventListener?.('slotRenderEnded', this.onRenderEnded);\n if (this.slot) this.googletag?.destroySlots([this.slot]);\n this.setShift(0);\n if (this.coverTimer) clearTimeout(this.coverTimer);\n this.ctx.videoArea.removeAttribute('data-pause-ad');\n this.ctx.videoArea.removeAttribute('data-pause-ad-ready');\n this.panel.remove();\n this.adHost.remove();\n }\n\n // ── olaylar ──\n\n private readonly onPause = (): void => {\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.delayTimer = setTimeout(() => void this.request(), this.options.delayMs ?? 300);\n };\n\n private readonly onPlay = (): void => {\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.waitingForRender = false;\n this.hide('resumed');\n };\n\n // ── istek / gösterim ──\n\n /** Alana sığan reklam boyutları (genişlik oranı + dikey alan) — hiçbiri sığmazsa gösterilmez. */\n private fittingSizes(): Array<[number, number]> {\n const area = this.ctx.videoArea.getBoundingClientRect();\n if (area.width < (this.options.minPlayerWidth ?? 640)) return [];\n const maxW = area.width * (this.options.maxWidthRatio ?? 0.5) - PANEL_PADDING_X * 2;\n const maxH = area.height - PANEL_CHROME_Y;\n return (this.options.sizes ?? DEFAULT_SIZES).filter(([w, h]) => w <= maxW && h <= maxH);\n }\n\n private async request(): Promise<void> {\n const v = this.ctx.videoEl;\n if (this.destroyed || !v.paused || v.ended || v.seeking || this.ctx.isBlocked()) return;\n const sizes = this.fittingSizes();\n if (!sizes.length) return;\n\n // Panel genişliği: sığan en geniş reklam + iç boşluk.\n const panelW = Math.max(...sizes.map(([w]) => w)) + PANEL_PADDING_X * 2;\n this.panel.style.setProperty('--hp-pause-ad-panel-w', `${panelW}px`);\n\n const refreshMs = (this.options.refreshIntervalSec ?? 30) * 1000;\n const sizesKey = JSON.stringify(sizes);\n // Yakın zamanda doldurulmuş ve boyutlar aynı → yeni istek atmadan mevcut reklamı göster.\n if (this.slot && this.lastFilled && sizesKey === this.slotSizesKey && Date.now() - this.lastFetchAt < refreshMs) {\n this.show(panelW);\n return;\n }\n\n try {\n this.googletag = this.googletag ?? (await loadGpt());\n } catch (err) {\n console.warn('[HopePlayer pause-ad]', err);\n return;\n }\n if (this.destroyed || !v.paused) return;\n const gt = this.googletag;\n this.waitingForRender = true;\n gt.cmd.push(() => {\n if (this.destroyed) return;\n if (!this.slot || sizesKey !== this.slotSizesKey) {\n if (this.slot) gt.destroySlots([this.slot]);\n this.slot = gt.defineSlot(this.options.adUnitPath, sizes, this.divId);\n if (!this.slot) return;\n this.slot.addService(gt.pubads());\n for (const [k, val] of Object.entries(this.options.targeting ?? {})) this.slot.setTargeting(k, val);\n this.slotSizesKey = sizesKey;\n gt.pubads().addEventListener('slotRenderEnded', this.onRenderEnded);\n gt.enableServices();\n gt.display(this.divId);\n // Sayfa disableInitialLoad kullanıyorsa display istek atmaz — elle refresh.\n if (gt.pubads().isInitialLoadDisabled()) gt.pubads().refresh([this.slot]);\n } else {\n gt.pubads().refresh([this.slot]);\n }\n this.lastFetchAt = Date.now();\n });\n }\n\n private readonly onRenderEnded = (e: GptSlotRenderEndedEvent): void => {\n if (e.slot !== this.slot) return;\n this.lastFilled = !e.isEmpty;\n const wasWaiting = this.waitingForRender;\n this.waitingForRender = false;\n if (e.isEmpty) {\n this.emit('empty');\n return;\n }\n // İstek sürerken kullanıcı oynattıysa açma.\n if (!wasWaiting || !this.ctx.videoEl.paused || this.ctx.isBlocked()) return;\n const width = Array.isArray(e.size) && typeof e.size[0] === 'number' ? e.size[0] : null;\n this.show(width ? width + PANEL_PADDING_X * 2 : undefined, e.size as [number, number] | undefined);\n };\n\n private show(panelW?: number, size?: [number, number]): void {\n if (panelW) this.panel.style.setProperty('--hp-pause-ad-panel-w', `${panelW}px`);\n const w = parseFloat(this.panel.style.getPropertyValue('--hp-pause-ad-panel-w')) || 332;\n this.open = true;\n this.panel.setAttribute('data-open', '');\n this.panel.setAttribute('aria-hidden', 'false');\n this.setShift(w);\n this.emit('shown', size);\n }\n\n private hide(reason: 'closed' | 'resumed'): void {\n if (!this.open) return;\n this.open = false;\n this.panel.removeAttribute('data-open');\n this.panel.setAttribute('aria-hidden', 'true');\n this.setShift(0);\n this.emit('hidden', undefined, reason);\n }\n\n /** Video ve kontrolleri panel genişliği kadar sola sıkıştırır (tailwind.css `.video-area[data-pause-ad]`). */\n private setShift(px: number): void {\n const area = this.ctx.videoArea;\n if (this.coverTimer) clearTimeout(this.coverTimer);\n this.coverTimer = null;\n area.style.setProperty('--hp-pause-ad-w', `${px}px`);\n if (px > 0) {\n area.setAttribute('data-pause-ad', '');\n } else if (area.hasAttribute('data-pause-ad')) {\n // cover, genişleme animasyonu bitene kadar kalır — hemen contain'e dönmek kapanışta görüntüyü sıçratıyordu.\n this.coverTimer = setTimeout(() => {\n this.coverTimer = null;\n area.removeAttribute('data-pause-ad');\n }, SHIFT_TRANSITION_MS);\n }\n }\n\n private emit(state: 'shown' | 'hidden' | 'empty', size?: [number, number], reason?: 'closed' | 'resumed'): void {\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:pausead', { detail: { state, size, reason } }));\n }\n}\n","import { adoptStyle } from '../../utils/plugin-style';\nimport css from './pause-ad.css?inline';\nimport { PauseAd, type PauseAdPlayerContext } from './PauseAd';\nimport type { PauseAdOptions } from '../../types';\n\nexport function installPauseAd(ctx: PauseAdPlayerContext, options: PauseAdOptions): PauseAd {\n adoptStyle(ctx.videoEl, 'pause-ad', css);\n return new PauseAd(ctx, options);\n}\n\nexport { PauseAd };\nexport type { PauseAdPlayerContext };\n"],"names":["DEFAULT_SIZES","PANEL_PADDING_X","PANEL_CHROME_Y","SLOT_NAME","SHIFT_TRANSITION_MS","instanceCount","PauseAd","ctx","options","__publicField","wasWaiting","width","header","body","slotEl","e","_c","_a","_b","_d","area","maxW","maxH","w","h","v","sizes","panelW","refreshMs","sizesKey","loadGpt","err","gt","k","val","size","reason","px","state","installPauseAd","adoptStyle","css"],"mappings":"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"}