@hopeplayer/core 1.0.15 → 1.0.17
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.
- package/README.md +24 -14
- package/dist/HopePlayerElement.d.ts +37 -0
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/adTriggers-4SueRFgK.js +415 -0
- package/dist/chunks/adTriggers-4SueRFgK.js.map +1 -0
- package/dist/chunks/{index-BCMVXNL0.js → ads-DPL7m9PV.js} +135 -158
- package/dist/chunks/ads-DPL7m9PV.js.map +1 -0
- package/dist/chunks/{index-BeJNpAyx.js → audio-LkYgd5Wq.js} +7 -7
- package/dist/chunks/audio-LkYgd5Wq.js.map +1 -0
- package/dist/chunks/{ScratchSound-0XKHUcJK.js → audioScratchSound-7XkwCCDm.js} +1 -1
- package/dist/chunks/audioScratchSound-7XkwCCDm.js.map +1 -0
- package/dist/chunks/cast-DCAT2agI.js +387 -0
- package/dist/chunks/cast-DCAT2agI.js.map +1 -0
- package/dist/chunks/{index-rENB3n9O.js → countdownScreen-CI-u6jjA.js} +1 -1
- package/dist/chunks/countdownScreen-CI-u6jjA.js.map +1 -0
- package/dist/chunks/{index-Q8FMOHj0.js → dai-B9Tth1Iv.js} +1 -1
- package/dist/chunks/dai-B9Tth1Iv.js.map +1 -0
- package/dist/chunks/{index-DCXX1ZJG.js → debugPanel-Bnc_7GOn.js} +1 -1
- package/dist/chunks/debugPanel-Bnc_7GOn.js.map +1 -0
- package/dist/chunks/{index-DXWK4EFa.js → dubbing-kNMPpyHl.js} +1 -1
- package/dist/chunks/dubbing-kNMPpyHl.js.map +1 -0
- package/dist/chunks/{index-BBmuCtKu.js → geoChecker-BRtvHwI-.js} +1 -1
- package/dist/chunks/geoChecker-BRtvHwI-.js.map +1 -0
- package/dist/chunks/{index-Ca8hocby.js → gesture-BzPCgi87.js} +1 -1
- package/dist/chunks/gesture-BzPCgi87.js.map +1 -0
- package/dist/chunks/gpt-CGXHTG_H.js +18 -0
- package/dist/chunks/gpt-CGXHTG_H.js.map +1 -0
- package/dist/chunks/{index-3QALpwsf.js → inViewAutoplay-CRJe7GA4.js} +1 -1
- package/dist/chunks/inViewAutoplay-CRJe7GA4.js.map +1 -0
- package/dist/chunks/{index-7IBf8Y-R.js → liveWallClock-ChUTtzLD.js} +1 -1
- package/dist/chunks/liveWallClock-ChUTtzLD.js.map +1 -0
- package/dist/chunks/{index-f0vSgRIK.js → loopSection-CvF4l5uf.js} +1 -1
- package/dist/chunks/loopSection-CvF4l5uf.js.map +1 -0
- package/dist/chunks/{index-DRlQC-ev.js → markers-DE4O8xbw.js} +2 -2
- package/dist/chunks/markers-DE4O8xbw.js.map +1 -0
- package/dist/chunks/{index-CaMVTgh0.js → pauseAd-BQQe21X4.js} +55 -68
- package/dist/chunks/pauseAd-BQQe21X4.js.map +1 -0
- package/dist/chunks/{index-w7pACyTw.js → player-C886oKP-.js} +726 -391
- package/dist/chunks/player-C886oKP-.js.map +1 -0
- package/dist/chunks/{index-DpUZXNJS.js → playlist-CI3mRZjo.js} +2 -2
- package/dist/chunks/playlist-CI3mRZjo.js.map +1 -0
- package/dist/chunks/{VideoPrebid-CpckFzSq.js → prebid-CRY3i2OT.js} +1 -1
- package/dist/chunks/prebid-CRY3i2OT.js.map +1 -0
- package/dist/chunks/{index-DT8-oMPm.js → qrResume-BNy8XCp_.js} +1 -1
- package/dist/chunks/qrResume-BNy8XCp_.js.map +1 -0
- package/dist/chunks/redirectScreen-CJ3q9OX4.js +208 -0
- package/dist/chunks/redirectScreen-CJ3q9OX4.js.map +1 -0
- package/dist/chunks/rewardedUnlock-EyGMB9PK.js +264 -0
- package/dist/chunks/rewardedUnlock-EyGMB9PK.js.map +1 -0
- package/dist/chunks/{index-BOoNcKeR.js → segments-C2HKU6XK.js} +2 -2
- package/dist/chunks/segments-C2HKU6XK.js.map +1 -0
- package/dist/chunks/{index-D5P-LWbg.js → sponsorship-DyFwGmEb.js} +20 -20
- package/dist/chunks/sponsorship-DyFwGmEb.js.map +1 -0
- package/dist/chunks/{index-BvoB2O1p.js → spriteThumbnails-D0NQ5CCp.js} +2 -2
- package/dist/chunks/spriteThumbnails-D0NQ5CCp.js.map +1 -0
- package/dist/chunks/{index-DGtpFgHV.js → statsPanel-DSClIwA3.js} +1 -1
- package/dist/chunks/statsPanel-DSClIwA3.js.map +1 -0
- package/dist/chunks/{index-CDDke5rz.js → sticky-D_eLCNFk.js} +1 -1
- package/dist/chunks/sticky-D_eLCNFk.js.map +1 -0
- package/dist/chunks/{index-ClQg_X1N.js → story-D5Got6-6.js} +2 -2
- package/dist/chunks/{index-ClQg_X1N.js.map → story-D5Got6-6.js.map} +1 -1
- package/dist/chunks/{index-C5oGMHF_.js → tapGestures-DrC42DiI.js} +1 -1
- package/dist/chunks/tapGestures-DrC42DiI.js.map +1 -0
- package/dist/hls/SourceManager.d.ts +8 -0
- package/dist/hls/SourceManager.d.ts.map +1 -1
- package/dist/hls/sourceGroups.d.ts +19 -0
- package/dist/hls/sourceGroups.d.ts.map +1 -0
- package/dist/hope-player.js +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/types.d.ts +12 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/plugins/ad-triggers/AdTriggers.d.ts +99 -0
- package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -0
- package/dist/plugins/ad-triggers/index.d.ts +7 -0
- package/dist/plugins/ad-triggers/index.d.ts.map +1 -0
- package/dist/plugins/ads/AdsController.d.ts +8 -0
- package/dist/plugins/ads/AdsController.d.ts.map +1 -1
- package/dist/plugins/ads/generateVastUrl.d.ts +10 -0
- package/dist/plugins/ads/generateVastUrl.d.ts.map +1 -1
- package/dist/plugins/cast/CastController.d.ts +107 -0
- package/dist/plugins/cast/CastController.d.ts.map +1 -0
- package/dist/plugins/cast/RemoteMediaProxy.d.ts +41 -0
- package/dist/plugins/cast/RemoteMediaProxy.d.ts.map +1 -0
- package/dist/plugins/cast/castSdk.d.ts +160 -0
- package/dist/plugins/cast/castSdk.d.ts.map +1 -0
- package/dist/plugins/cast/index.d.ts +7 -0
- package/dist/plugins/cast/index.d.ts.map +1 -0
- package/dist/plugins/pause-ad/loadGpt.d.ts +2 -0
- package/dist/plugins/pause-ad/loadGpt.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts +26 -3
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
- package/dist/plugins/rewarded/RewardedUnlock.d.ts +2 -5
- package/dist/plugins/rewarded/RewardedUnlock.d.ts.map +1 -1
- package/dist/plugins/rewarded/gpt.d.ts +6 -2
- package/dist/plugins/rewarded/gpt.d.ts.map +1 -1
- package/dist/plugins/sponsorship/SponsorshipLayer.d.ts.map +1 -1
- package/dist/types/index.d.ts +308 -3
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -1
- package/dist/chunks/ScratchSound-0XKHUcJK.js.map +0 -1
- package/dist/chunks/VideoPrebid-CpckFzSq.js.map +0 -1
- package/dist/chunks/index-3QALpwsf.js.map +0 -1
- package/dist/chunks/index-7IBf8Y-R.js.map +0 -1
- package/dist/chunks/index-BBmuCtKu.js.map +0 -1
- package/dist/chunks/index-BCMVXNL0.js.map +0 -1
- package/dist/chunks/index-BOoNcKeR.js.map +0 -1
- package/dist/chunks/index-BeJNpAyx.js.map +0 -1
- package/dist/chunks/index-BvoB2O1p.js.map +0 -1
- package/dist/chunks/index-C5oGMHF_.js.map +0 -1
- package/dist/chunks/index-CDDke5rz.js.map +0 -1
- package/dist/chunks/index-Ca8hocby.js.map +0 -1
- package/dist/chunks/index-CaMVTgh0.js.map +0 -1
- package/dist/chunks/index-D5P-LWbg.js.map +0 -1
- package/dist/chunks/index-D6r-BGAV.js +0 -77
- package/dist/chunks/index-D6r-BGAV.js.map +0 -1
- package/dist/chunks/index-DCXX1ZJG.js.map +0 -1
- package/dist/chunks/index-DGtpFgHV.js.map +0 -1
- package/dist/chunks/index-DRlQC-ev.js.map +0 -1
- package/dist/chunks/index-DT8-oMPm.js.map +0 -1
- package/dist/chunks/index-DXWK4EFa.js.map +0 -1
- package/dist/chunks/index-DpUZXNJS.js.map +0 -1
- package/dist/chunks/index-Q8FMOHj0.js.map +0 -1
- package/dist/chunks/index-TkG8IO6q.js +0 -239
- package/dist/chunks/index-TkG8IO6q.js.map +0 -1
- package/dist/chunks/index-f0vSgRIK.js.map +0 -1
- package/dist/chunks/index-rENB3n9O.js.map +0 -1
- package/dist/chunks/index-w7pACyTw.js.map +0 -1
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
var w = Object.defineProperty;
|
|
2
|
+
var N = (o, e, t) => e in o ? w(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t;
|
|
3
|
+
var l = (o, e, t) => N(o, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { c as f } from "./player-C886oKP-.js";
|
|
5
|
+
const b = "http://www.w3.org/2000/svg", C = 18, g = 2 * Math.PI * C, A = 10;
|
|
6
|
+
function y(o) {
|
|
7
|
+
const e = document.createElementNS(b, "svg");
|
|
8
|
+
e.setAttribute("viewBox", "0 0 40 40"), e.setAttribute("aria-hidden", "true"), e.setAttribute("class", o);
|
|
9
|
+
const t = document.createElementNS(b, "circle"), i = document.createElementNS(b, "circle");
|
|
10
|
+
for (const n of [t, i])
|
|
11
|
+
n.setAttribute("cx", "20"), n.setAttribute("cy", "20"), n.setAttribute("r", String(C));
|
|
12
|
+
return t.setAttribute("class", "hp-redirect-ring-track"), i.setAttribute("class", "hp-redirect-ring-bar"), i.setAttribute("stroke-dasharray", String(g)), e.append(t, i), {
|
|
13
|
+
el: e,
|
|
14
|
+
set: (n) => i.setAttribute("stroke-dashoffset", String(g * (1 - Math.min(1, Math.max(0, n)))))
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function E(o, e, t) {
|
|
18
|
+
const i = document.createElement("span");
|
|
19
|
+
if (i.className = t, o) {
|
|
20
|
+
const s = document.createElement("img");
|
|
21
|
+
s.src = o, s.alt = "", s.decoding = "async", s.addEventListener("error", () => s.remove()), i.appendChild(s);
|
|
22
|
+
}
|
|
23
|
+
const n = y("hp-redirect-ring"), r = document.createElement("span");
|
|
24
|
+
if (r.className = "hp-redirect-play", r.appendChild(f("play")), i.append(n.el, r), e) {
|
|
25
|
+
const s = document.createElement("span");
|
|
26
|
+
s.className = "hp-redirect-duration", s.textContent = e, i.appendChild(s);
|
|
27
|
+
}
|
|
28
|
+
return { el: i, ring: n };
|
|
29
|
+
}
|
|
30
|
+
class L {
|
|
31
|
+
constructor(e, t) {
|
|
32
|
+
l(this, "counterTimer", null);
|
|
33
|
+
l(this, "wrapper", null);
|
|
34
|
+
l(this, "card", null);
|
|
35
|
+
l(this, "cardRing", null);
|
|
36
|
+
l(this, "cardLabel", null);
|
|
37
|
+
l(this, "cancelled", !1);
|
|
38
|
+
l(this, "waitingForAd", !1);
|
|
39
|
+
l(this, "mode");
|
|
40
|
+
l(this, "onPlay", () => {
|
|
41
|
+
this.remove();
|
|
42
|
+
});
|
|
43
|
+
l(this, "onEnded", () => {
|
|
44
|
+
if (this.ctx.isAdActive()) {
|
|
45
|
+
this.waitForAd();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.finish();
|
|
49
|
+
});
|
|
50
|
+
l(this, "onAdEnd", () => {
|
|
51
|
+
this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.waitingForAd = !1, this.ctx.videoEl.ended && this.finish();
|
|
52
|
+
});
|
|
53
|
+
// ── 'card' modu ─────────────────────────────────────────────────────────
|
|
54
|
+
l(this, "onTimeUpdate", () => {
|
|
55
|
+
var s;
|
|
56
|
+
const e = this.ctx.videoEl, t = Math.max(1, this.options.showBefore ?? A), i = e.duration;
|
|
57
|
+
if (!Number.isFinite(i) || i <= 0) return;
|
|
58
|
+
const n = i - e.currentTime;
|
|
59
|
+
if (n > t) {
|
|
60
|
+
n > t + 1 && (this.cancelled = !1), this.hideCard();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (this.cancelled || this.ctx.isAdActive() || e.ended || n <= 0) {
|
|
64
|
+
this.ctx.isAdActive() && this.hideCard();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.card || this.showCard();
|
|
68
|
+
const r = Math.ceil(n);
|
|
69
|
+
(s = this.cardRing) == null || s.set(n / t), this.cardLabel && (this.cardLabel.textContent = `${this.options.label ?? this.ctx.i18n.redirectUpNext} · ${r}`);
|
|
70
|
+
});
|
|
71
|
+
this.ctx = e, this.options = t, this.mode = t.mode === "card" ? "card" : "screen", t.enabled !== !1 && (e.videoEl.addEventListener("ended", this.onEnded), e.videoEl.addEventListener("play", this.onPlay), this.mode === "card" && e.videoEl.addEventListener("timeupdate", this.onTimeUpdate));
|
|
72
|
+
}
|
|
73
|
+
/** Ekranlar her gösterimde güncel `ctx.i18n` ile kurulur; açık kartın etiketi burada tazelenir. */
|
|
74
|
+
refreshLabels() {
|
|
75
|
+
var e, t;
|
|
76
|
+
(t = (e = this.card) == null ? void 0 : e.querySelector(".hp-redirect-close")) == null || t.setAttribute("aria-label", this.ctx.i18n.redirectCancelCard);
|
|
77
|
+
}
|
|
78
|
+
destroy() {
|
|
79
|
+
const e = this.ctx.videoEl;
|
|
80
|
+
e.removeEventListener("ended", this.onEnded), e.removeEventListener("play", this.onPlay), e.removeEventListener("timeupdate", this.onTimeUpdate), this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.remove(), this.hideCard();
|
|
81
|
+
}
|
|
82
|
+
emit(e, t) {
|
|
83
|
+
return this.ctx.hostEl.dispatchEvent(
|
|
84
|
+
new CustomEvent("hp:redirect", { detail: { state: e, url: this.options.url, mode: this.mode, reason: t }, cancelable: e === "redirect" })
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
go(e) {
|
|
88
|
+
this.remove(), this.hideCard(), this.emit("redirect", e) && (this.options.newTab ? window.open(this.options.url, "_blank", "noopener") : window.location.href = this.options.url);
|
|
89
|
+
}
|
|
90
|
+
waitForAd() {
|
|
91
|
+
this.waitingForAd || (this.waitingForAd = !0, this.ctx.hostEl.addEventListener("hp:adend", this.onAdEnd));
|
|
92
|
+
}
|
|
93
|
+
finish() {
|
|
94
|
+
var e;
|
|
95
|
+
if (this.mode === "card") {
|
|
96
|
+
this.hideCard(), this.cancelled ? (e = this.options.suggestions) != null && e.length && this.showSuggestions(this.options.suggestions) : this.go("auto");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.createScreen();
|
|
100
|
+
}
|
|
101
|
+
showCard() {
|
|
102
|
+
const e = this.options, t = document.createElement("div");
|
|
103
|
+
t.className = "hp-redirect-card", t.setAttribute("part", "redirect-card"), t.setAttribute("data-position", e.position ?? "bottom-right");
|
|
104
|
+
const i = document.createElement("button");
|
|
105
|
+
i.type = "button", i.className = "hp-redirect-card-main", i.addEventListener("click", () => this.go("click"));
|
|
106
|
+
const n = E(e.image, e.duration, "hp-redirect-thumb"), r = document.createElement("span");
|
|
107
|
+
r.className = "hp-redirect-text";
|
|
108
|
+
const s = document.createElement("span");
|
|
109
|
+
if (s.className = "hp-redirect-label", r.appendChild(s), e.title) {
|
|
110
|
+
const a = document.createElement("span");
|
|
111
|
+
a.className = "hp-redirect-title", a.textContent = e.title, r.appendChild(a);
|
|
112
|
+
}
|
|
113
|
+
if (e.subtitle) {
|
|
114
|
+
const a = document.createElement("span");
|
|
115
|
+
a.className = "hp-redirect-sub", a.textContent = e.subtitle, r.appendChild(a);
|
|
116
|
+
}
|
|
117
|
+
n.el.setAttribute("aria-hidden", "true");
|
|
118
|
+
const d = document.createElement("span");
|
|
119
|
+
d.className = "hp-sr-only", d.textContent = ` — ${this.ctx.i18n.redirectPlayNow}`, r.appendChild(d), i.append(n.el, r);
|
|
120
|
+
const h = document.createElement("button");
|
|
121
|
+
h.type = "button", h.className = "hp-redirect-close", h.setAttribute("aria-label", this.ctx.i18n.redirectCancelCard), h.appendChild(f("close")), h.addEventListener("click", () => {
|
|
122
|
+
this.cancelled = !0, this.hideCard(), this.emit("cancel");
|
|
123
|
+
}), t.append(i, h);
|
|
124
|
+
for (const a of ["pointerdown", "click", "dblclick"]) t.addEventListener(a, (p) => p.stopPropagation());
|
|
125
|
+
this.ctx.overlayContainerEl.appendChild(t), this.card = t, this.cardRing = n.ring, this.cardLabel = s, this.emit("shown");
|
|
126
|
+
}
|
|
127
|
+
hideCard() {
|
|
128
|
+
var e;
|
|
129
|
+
(e = this.card) == null || e.remove(), this.card = null, this.cardRing = null, this.cardLabel = null;
|
|
130
|
+
}
|
|
131
|
+
// ── 'screen' modu ───────────────────────────────────────────────────────
|
|
132
|
+
remove() {
|
|
133
|
+
var e;
|
|
134
|
+
this.counterTimer && (clearInterval(this.counterTimer), this.counterTimer = null), (e = this.wrapper) == null || e.remove(), this.wrapper = null;
|
|
135
|
+
}
|
|
136
|
+
createScreen() {
|
|
137
|
+
this.remove();
|
|
138
|
+
const e = this.options, t = document.createElement("div");
|
|
139
|
+
if (t.setAttribute("part", "redirect-screen"), t.className = "hp-redirect-screen", e.image) {
|
|
140
|
+
const c = document.createElement("img");
|
|
141
|
+
c.className = "hp-redirect-bg", c.src = e.image, c.alt = "", c.addEventListener("error", () => c.remove()), t.appendChild(c);
|
|
142
|
+
}
|
|
143
|
+
const i = document.createElement("div");
|
|
144
|
+
i.className = "hp-redirect-panel";
|
|
145
|
+
const n = document.createElement("span");
|
|
146
|
+
n.className = "hp-redirect-label", n.textContent = e.label ?? this.ctx.i18n.redirectUpNext, i.appendChild(n);
|
|
147
|
+
const r = document.createElement("button");
|
|
148
|
+
r.type = "button", r.className = "hp-redirect-poster", r.setAttribute("aria-label", this.ctx.i18n.redirectPlayNow);
|
|
149
|
+
const s = E(e.image, e.duration, "hp-redirect-thumb");
|
|
150
|
+
if (r.appendChild(s.el), r.addEventListener("click", () => this.go("click")), i.appendChild(r), e.title) {
|
|
151
|
+
const c = document.createElement("div");
|
|
152
|
+
c.className = "hp-redirect-title", c.textContent = e.title, i.appendChild(c);
|
|
153
|
+
}
|
|
154
|
+
if (e.subtitle) {
|
|
155
|
+
const c = document.createElement("div");
|
|
156
|
+
c.className = "hp-redirect-sub", c.textContent = e.subtitle, i.appendChild(c);
|
|
157
|
+
}
|
|
158
|
+
const d = document.createElement("div");
|
|
159
|
+
d.className = "hp-redirect-counter", d.setAttribute("aria-live", "polite"), i.appendChild(d);
|
|
160
|
+
const h = document.createElement("div");
|
|
161
|
+
h.className = "hp-redirect-actions";
|
|
162
|
+
const a = document.createElement("button");
|
|
163
|
+
a.type = "button", a.className = "hp-redirect-btn", a.textContent = this.ctx.i18n.redirectCancel;
|
|
164
|
+
const p = document.createElement("button");
|
|
165
|
+
p.type = "button", p.className = "hp-redirect-btn hp-redirect-btn-primary", p.textContent = this.ctx.i18n.redirectPlayNow, p.addEventListener("click", () => this.go("click")), a.addEventListener("click", () => {
|
|
166
|
+
var c;
|
|
167
|
+
this.remove(), this.emit("cancel"), (c = e.suggestions) != null && c.length && this.showSuggestions(e.suggestions);
|
|
168
|
+
}), h.append(a, p), i.appendChild(h), t.appendChild(i);
|
|
169
|
+
for (const c of ["pointerdown", "click", "dblclick"]) t.addEventListener(c, (x) => x.stopPropagation());
|
|
170
|
+
this.ctx.overlayContainerEl.appendChild(t), this.wrapper = t, this.emit("shown");
|
|
171
|
+
const u = Math.max(0, e.time);
|
|
172
|
+
let m = u;
|
|
173
|
+
const v = () => {
|
|
174
|
+
d.textContent = this.ctx.i18n.redirectCountdown(m), s.ring.set(u > 0 ? m / u : 0);
|
|
175
|
+
};
|
|
176
|
+
v(), this.counterTimer = setInterval(() => {
|
|
177
|
+
if (m--, m > 0) {
|
|
178
|
+
v();
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
this.counterTimer && clearInterval(this.counterTimer), this.counterTimer = null, d.textContent = this.ctx.i18n.redirectNowPlaying, s.ring.set(0), this.go("auto");
|
|
182
|
+
}, 1e3);
|
|
183
|
+
}
|
|
184
|
+
showSuggestions(e) {
|
|
185
|
+
var i;
|
|
186
|
+
this.remove();
|
|
187
|
+
const t = document.createElement("div");
|
|
188
|
+
t.setAttribute("part", "redirect-suggestions"), t.className = "hp-redirect-suggestions";
|
|
189
|
+
for (const n of e) {
|
|
190
|
+
const r = document.createElement("a");
|
|
191
|
+
r.href = n.url, this.options.newTab && (r.target = "_blank", r.rel = "noopener"), r.className = "hp-redirect-suggestion";
|
|
192
|
+
const s = E(n.image, n.duration, "hp-redirect-thumb");
|
|
193
|
+
(i = s.el.querySelector(".hp-redirect-ring")) == null || i.remove();
|
|
194
|
+
const d = document.createElement("span");
|
|
195
|
+
d.className = "hp-redirect-title", d.textContent = n.title, r.append(s.el, d), t.appendChild(r);
|
|
196
|
+
}
|
|
197
|
+
for (const n of ["pointerdown", "click", "dblclick"]) t.addEventListener(n, (r) => r.stopPropagation());
|
|
198
|
+
this.ctx.overlayContainerEl.appendChild(t), this.wrapper = t;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function T(o, e) {
|
|
202
|
+
return new L(o, e);
|
|
203
|
+
}
|
|
204
|
+
export {
|
|
205
|
+
L as RedirectScreen,
|
|
206
|
+
T as installRedirectScreen
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=redirectScreen-CJ3q9OX4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redirectScreen-CJ3q9OX4.js","sources":["../../src/plugins/redirect-screen/RedirectScreen.ts","../../src/plugins/redirect-screen/index.ts"],"sourcesContent":["import type { RedirectScreenOptions, RedirectScreenSuggestion } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\n\nexport interface RedirectScreenPlayerContext {\n /** hp:redirect olayları ve postroll'un bitişini (hp:adend) dinlemek için. */\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayContainerEl: HTMLElement;\n isAdActive(): boolean;\n i18n: HopeLocaleStrings;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst RING_R = 18;\nconst RING_C = 2 * Math.PI * RING_R;\nconst DEFAULT_SHOW_BEFORE = 10;\n\n/** Dairesel geri sayım halkası (SVG) — `set(oran)` ile 1 → 0 boşalır. */\nfunction ring(className: string): { el: SVGSVGElement; set(fraction: number): void } {\n const svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('viewBox', '0 0 40 40');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('class', className);\n const track = document.createElementNS(SVG_NS, 'circle');\n const bar = document.createElementNS(SVG_NS, 'circle');\n for (const c of [track, bar]) {\n c.setAttribute('cx', '20');\n c.setAttribute('cy', '20');\n c.setAttribute('r', String(RING_R));\n }\n track.setAttribute('class', 'hp-redirect-ring-track');\n bar.setAttribute('class', 'hp-redirect-ring-bar');\n bar.setAttribute('stroke-dasharray', String(RING_C));\n svg.append(track, bar);\n return {\n el: svg,\n set: (fraction) => bar.setAttribute('stroke-dashoffset', String(RING_C * (1 - Math.min(1, Math.max(0, fraction))))),\n };\n}\n\n/** Görsel + süre rozeti + oynat ikonu + halka — kart ve tam ekran aynı parçayı kullanır. */\nfunction thumb(image: string | undefined, duration: string | undefined, className: string): { el: HTMLSpanElement; ring: ReturnType<typeof ring> } {\n const el = document.createElement('span');\n el.className = className;\n if (image) {\n const img = document.createElement('img');\n img.src = image;\n img.alt = '';\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n const r = ring('hp-redirect-ring');\n const play = document.createElement('span');\n play.className = 'hp-redirect-play';\n play.appendChild(createIcon('play'));\n el.append(r.el, play);\n if (duration) {\n const d = document.createElement('span');\n d.className = 'hp-redirect-duration';\n d.textContent = duration;\n el.appendChild(d);\n }\n return { el, ring: r };\n}\n\n/**\n * Sıradaki videoya yönlendirme. İki mod:\n * - 'screen' (varsayılan): video bitince tam alan ekran + `time` sn geri sayım; iptal → öneriler.\n * - 'card': bitime `showBefore` sn kala köşede küçük \"Sıradaki\" kartı; geri sayım videoyla birlikte işler (duraklatınca\n * durur), video bitince yönlendirilir. Karta tıklamak hemen yönlendirir, X iptal eder.\n * Bitişte postroll oynuyorsa yönlendirme reklam bitene kadar bekler. `hp:redirect` (state: redirect) iptal edilirse\n * (`preventDefault`) sayfa değişmez.\n */\nexport class RedirectScreen {\n private counterTimer: ReturnType<typeof setInterval> | null = null;\n private wrapper: HTMLElement | null = null;\n private card: HTMLDivElement | null = null;\n private cardRing: ReturnType<typeof ring> | null = null;\n private cardLabel: HTMLSpanElement | null = null;\n private cancelled = false;\n private waitingForAd = false;\n private readonly mode: 'screen' | 'card';\n\n constructor(\n private readonly ctx: RedirectScreenPlayerContext,\n private readonly options: RedirectScreenOptions\n ) {\n this.mode = options.mode === 'card' ? 'card' : 'screen';\n if (options.enabled === false) return;\n ctx.videoEl.addEventListener('ended', this.onEnded);\n ctx.videoEl.addEventListener('play', this.onPlay);\n if (this.mode === 'card') ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n /** Ekranlar her gösterimde güncel `ctx.i18n` ile kurulur; açık kartın etiketi burada tazelenir. */\n refreshLabels(): void {\n this.card?.querySelector('.hp-redirect-close')?.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('ended', this.onEnded);\n v.removeEventListener('play', this.onPlay);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.remove();\n this.hideCard();\n }\n\n private emit(state: 'shown' | 'cancel' | 'redirect', reason?: 'auto' | 'click'): boolean {\n return this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:redirect', { detail: { state, url: this.options.url, mode: this.mode, reason }, cancelable: state === 'redirect' })\n );\n }\n\n private go(reason: 'auto' | 'click'): void {\n this.remove();\n this.hideCard();\n if (!this.emit('redirect', reason)) return; // entegratör kendisi yönlendirecek\n if (this.options.newTab) window.open(this.options.url, '_blank', 'noopener');\n else window.location.href = this.options.url;\n }\n\n private readonly onPlay = (): void => {\n this.remove();\n };\n\n private readonly onEnded = (): void => {\n // Postroll oynuyorsa (ya da birazdan başlayacaksa) reklam bitince devam.\n if (this.ctx.isAdActive()) {\n this.waitForAd();\n return;\n }\n this.finish();\n };\n\n private waitForAd(): void {\n if (this.waitingForAd) return;\n this.waitingForAd = true;\n this.ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n }\n\n private readonly onAdEnd = (): void => {\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.waitingForAd = false;\n if (this.ctx.videoEl.ended) this.finish();\n };\n\n private finish(): void {\n if (this.mode === 'card') {\n this.hideCard();\n if (!this.cancelled) this.go('auto');\n else if (this.options.suggestions?.length) this.showSuggestions(this.options.suggestions);\n return;\n }\n this.createScreen();\n }\n\n // ── 'card' modu ─────────────────────────────────────────────────────────\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.videoEl;\n const showBefore = Math.max(1, this.options.showBefore ?? DEFAULT_SHOW_BEFORE);\n const d = v.duration;\n if (!Number.isFinite(d) || d <= 0) return; // canlı yayında kart yok\n const remaining = d - v.currentTime;\n if (remaining > showBefore) {\n // Geri sarıldı (eşiğin belirgin üstüne): iptal unutulur — tekrar yaklaşınca kart yine gelir.\n if (remaining > showBefore + 1) this.cancelled = false;\n this.hideCard();\n return;\n }\n if (this.cancelled || this.ctx.isAdActive() || v.ended || remaining <= 0) {\n if (this.ctx.isAdActive()) this.hideCard();\n return;\n }\n if (!this.card) this.showCard();\n const secs = Math.ceil(remaining);\n this.cardRing?.set(remaining / showBefore);\n if (this.cardLabel) this.cardLabel.textContent = `${this.options.label ?? this.ctx.i18n.redirectUpNext} · ${secs}`;\n };\n\n private showCard(): void {\n const o = this.options;\n const card = document.createElement('div');\n card.className = 'hp-redirect-card';\n card.setAttribute('part', 'redirect-card');\n card.setAttribute('data-position', o.position ?? 'bottom-right');\n\n const main = document.createElement('button');\n main.type = 'button';\n main.className = 'hp-redirect-card-main';\n main.addEventListener('click', () => this.go('click'));\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n const text = document.createElement('span');\n text.className = 'hp-redirect-text';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n text.appendChild(label);\n if (o.title) {\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n text.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('span');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n text.appendChild(sub);\n }\n // Erişilebilir ad görünen metinden oluşur (\"Sıradaki · 4 Başlık Alt başlık\"); sonuna yalnızca ekran okuyucunun\n // duyduğu \"Şimdi oynat\" eklenir — görsel / süre rozeti okunmaz.\n t.el.setAttribute('aria-hidden', 'true');\n const action = document.createElement('span');\n action.className = 'hp-sr-only';\n action.textContent = ` — ${this.ctx.i18n.redirectPlayNow}`;\n text.appendChild(action);\n main.append(t.el, text);\n\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-redirect-close';\n close.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => {\n this.cancelled = true;\n this.hideCard();\n this.emit('cancel');\n });\n\n card.append(main, close);\n // Karta dokunmak videoyu oynat / duraklat yapmasın.\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) card.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(card);\n this.card = card;\n this.cardRing = t.ring;\n this.cardLabel = label;\n this.emit('shown');\n }\n\n private hideCard(): void {\n this.card?.remove();\n this.card = null;\n this.cardRing = null;\n this.cardLabel = null;\n }\n\n // ── 'screen' modu ───────────────────────────────────────────────────────\n\n private remove(): void {\n if (this.counterTimer) {\n clearInterval(this.counterTimer);\n this.counterTimer = null;\n }\n this.wrapper?.remove();\n this.wrapper = null;\n }\n\n private createScreen(): void {\n this.remove();\n const o = this.options;\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-screen');\n wrapper.className = 'hp-redirect-screen';\n\n if (o.image) {\n const bg = document.createElement('img');\n bg.className = 'hp-redirect-bg';\n bg.src = o.image;\n bg.alt = '';\n bg.addEventListener('error', () => bg.remove());\n wrapper.appendChild(bg);\n }\n\n const panel = document.createElement('div');\n panel.className = 'hp-redirect-panel';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n label.textContent = o.label ?? this.ctx.i18n.redirectUpNext;\n panel.appendChild(label);\n\n const poster = document.createElement('button');\n poster.type = 'button';\n poster.className = 'hp-redirect-poster';\n poster.setAttribute('aria-label', this.ctx.i18n.redirectPlayNow);\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n poster.appendChild(t.el);\n poster.addEventListener('click', () => this.go('click'));\n panel.appendChild(poster);\n\n if (o.title) {\n const title = document.createElement('div');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n panel.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('div');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n panel.appendChild(sub);\n }\n\n const counter = document.createElement('div');\n counter.className = 'hp-redirect-counter';\n counter.setAttribute('aria-live', 'polite');\n panel.appendChild(counter);\n\n const actions = document.createElement('div');\n actions.className = 'hp-redirect-actions';\n const cancelBtn = document.createElement('button');\n cancelBtn.type = 'button';\n cancelBtn.className = 'hp-redirect-btn';\n cancelBtn.textContent = this.ctx.i18n.redirectCancel;\n const acceptBtn = document.createElement('button');\n acceptBtn.type = 'button';\n acceptBtn.className = 'hp-redirect-btn hp-redirect-btn-primary';\n acceptBtn.textContent = this.ctx.i18n.redirectPlayNow;\n acceptBtn.addEventListener('click', () => this.go('click'));\n cancelBtn.addEventListener('click', () => {\n this.remove();\n this.emit('cancel');\n if (o.suggestions?.length) this.showSuggestions(o.suggestions);\n });\n actions.append(cancelBtn, acceptBtn);\n panel.appendChild(actions);\n wrapper.appendChild(panel);\n\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n this.emit('shown');\n\n const total = Math.max(0, o.time);\n let remaining = total;\n const render = (): void => {\n counter.textContent = this.ctx.i18n.redirectCountdown(remaining);\n t.ring.set(total > 0 ? remaining / total : 0);\n };\n render();\n this.counterTimer = setInterval(() => {\n remaining--;\n if (remaining > 0) {\n render();\n return;\n }\n if (this.counterTimer) clearInterval(this.counterTimer);\n this.counterTimer = null;\n counter.textContent = this.ctx.i18n.redirectNowPlaying;\n t.ring.set(0);\n this.go('auto');\n }, 1000);\n }\n\n private showSuggestions(items: RedirectScreenSuggestion[]): void {\n this.remove();\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-suggestions');\n wrapper.className = 'hp-redirect-suggestions';\n for (const item of items) {\n const box = document.createElement('a');\n box.href = item.url;\n if (this.options.newTab) {\n box.target = '_blank';\n box.rel = 'noopener';\n }\n box.className = 'hp-redirect-suggestion';\n const t = thumb(item.image, item.duration, 'hp-redirect-thumb');\n t.el.querySelector('.hp-redirect-ring')?.remove();\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = item.title;\n box.append(t.el, title);\n wrapper.appendChild(box);\n }\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n }\n}\n","import { RedirectScreen, type RedirectScreenPlayerContext } from './RedirectScreen';\nimport type { RedirectScreenOptions } from '../../types';\n\nexport function installRedirectScreen(ctx: RedirectScreenPlayerContext, options: RedirectScreenOptions): RedirectScreen {\n return new RedirectScreen(ctx, options);\n}\n\nexport { RedirectScreen };\nexport type { RedirectScreenPlayerContext };\n"],"names":["SVG_NS","RING_R","RING_C","DEFAULT_SHOW_BEFORE","ring","className","svg","track","bar","c","fraction","thumb","image","duration","el","img","r","play","createIcon","d","RedirectScreen","ctx","options","__publicField","v","showBefore","remaining","secs","_a","_b","state","reason","o","card","main","t","text","label","title","sub","action","close","ev","e","wrapper","bg","panel","poster","counter","actions","cancelBtn","acceptBtn","total","render","items","item","box","installRedirectScreen"],"mappings":"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"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
var y = Object.defineProperty;
|
|
2
|
+
var x = (r, t, e) => t in r ? y(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
|
|
3
|
+
var u = (r, t, e) => x(r, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
import { L as E } from "./player-C886oKP-.js";
|
|
5
|
+
const k = "https://securepubads.g.doubleclick.net/tag/js/gpt.js";
|
|
6
|
+
let b = null;
|
|
7
|
+
function C() {
|
|
8
|
+
var t;
|
|
9
|
+
const r = window;
|
|
10
|
+
return r.googletag ?? (r.googletag = { cmd: [] }), (t = r.googletag).cmd ?? (t.cmd = []), r.googletag.apiReady || document.querySelector('script[src*="/tag/js/gpt.js"]') ? Promise.resolve() : (b ?? (b = new Promise((e, o) => {
|
|
11
|
+
const s = document.createElement("script");
|
|
12
|
+
s.async = !0, s.src = k, s.onload = () => e(), s.onerror = () => {
|
|
13
|
+
b = null, s.remove(), o(new Error("gpt.js could not be loaded (ad blocker / network / certificate)"));
|
|
14
|
+
}, document.head.appendChild(s);
|
|
15
|
+
})), b);
|
|
16
|
+
}
|
|
17
|
+
function L(r, t, e) {
|
|
18
|
+
return new Promise((o) => {
|
|
19
|
+
let s = !1, n = !1, m = !1, i = null, f = null;
|
|
20
|
+
const v = [], c = (d) => {
|
|
21
|
+
var p;
|
|
22
|
+
if (!s) {
|
|
23
|
+
if (s = !0, clearTimeout(h), e == null || e.removeEventListener("abort", l), f) {
|
|
24
|
+
const g = f.pubads();
|
|
25
|
+
for (const [a, w] of v) (p = g.removeEventListener) == null || p.call(g, a, w);
|
|
26
|
+
if (i)
|
|
27
|
+
try {
|
|
28
|
+
f.destroySlots([i]);
|
|
29
|
+
} catch {
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
o(d);
|
|
33
|
+
}
|
|
34
|
+
}, l = () => c("closed"), h = setTimeout(() => c("nofill"), t);
|
|
35
|
+
if (e != null && e.aborted) {
|
|
36
|
+
c("closed");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
e == null || e.addEventListener("abort", l), C().then(() => {
|
|
40
|
+
if (s) return;
|
|
41
|
+
const d = window.googletag;
|
|
42
|
+
d.cmd.push(() => {
|
|
43
|
+
if (s) return;
|
|
44
|
+
if (f = d, i = d.defineOutOfPageSlot(r, d.enums.OutOfPageFormat.REWARDED), !i) {
|
|
45
|
+
c("nofill");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
i.addService(d.pubads());
|
|
49
|
+
const p = d.pubads(), g = (a, w) => {
|
|
50
|
+
v.push([a, w]), p.addEventListener(a, w);
|
|
51
|
+
};
|
|
52
|
+
g("rewardedSlotReady", (a) => {
|
|
53
|
+
var w;
|
|
54
|
+
a.slot !== i || s || (clearTimeout(h), e == null || e.removeEventListener("abort", l), (w = a.makeRewardedVisible) == null || w.call(a));
|
|
55
|
+
}), g("rewardedSlotGranted", (a) => {
|
|
56
|
+
a.slot === i && (n = !0, m && c("granted"));
|
|
57
|
+
}), g("rewardedSlotVideoCompleted", (a) => {
|
|
58
|
+
a.slot === i && (m = !0, n && c("granted"));
|
|
59
|
+
}), g("rewardedSlotClosed", (a) => {
|
|
60
|
+
a.slot === i && c(n ? "granted" : "closed");
|
|
61
|
+
}), g("slotRenderEnded", (a) => {
|
|
62
|
+
a.slot === i && a.isEmpty && c("nofill");
|
|
63
|
+
}), d.enableServices(), d.display(i);
|
|
64
|
+
});
|
|
65
|
+
}).catch(() => c("nofill"));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const T = 480, S = "hope-rewarded-unlock", A = 8e3, D = 2600;
|
|
69
|
+
let F = 0;
|
|
70
|
+
class K {
|
|
71
|
+
constructor(t, e) {
|
|
72
|
+
u(this, "options");
|
|
73
|
+
u(this, "button");
|
|
74
|
+
u(this, "dialog", null);
|
|
75
|
+
u(this, "toast", null);
|
|
76
|
+
u(this, "toastTimer", null);
|
|
77
|
+
u(this, "phase", "idle");
|
|
78
|
+
/** 'video' modunda kilidin açık olduğu içerik (kaynak listesi — kalite dosyası değil). */
|
|
79
|
+
u(this, "videoUnlockedKey", null);
|
|
80
|
+
u(this, "lastKey", "");
|
|
81
|
+
/** Kaynak değişti: 'video' modunda kilit yeniden kapanır; süreli kilit dolduysa menüler güncellenir. */
|
|
82
|
+
u(this, "onSourceChange", () => {
|
|
83
|
+
const t = this.ctx.contentKey();
|
|
84
|
+
t !== this.lastKey && (this.lastKey = t, this.onQualitiesChanged());
|
|
85
|
+
});
|
|
86
|
+
u(this, "resumeAfterDialog", !1);
|
|
87
|
+
/** Reklam hazırlanırken "Vazgeç" — sağlayıcıya iletilir (GPT slotu temizlenir). */
|
|
88
|
+
u(this, "abort", null);
|
|
89
|
+
this.ctx = t, this.options = e;
|
|
90
|
+
const o = document.createElement("button");
|
|
91
|
+
o.type = "button", o.className = "hp-rw-button", o.setAttribute("part", "rewarded-button"), o.addEventListener("click", (s) => {
|
|
92
|
+
s.stopPropagation(), this.requestUnlock();
|
|
93
|
+
}), o.addEventListener("pointerdown", (s) => s.stopPropagation()), t.chromeEl.appendChild(o), this.button = o, t.videoEl.addEventListener("loadstart", this.onSourceChange), this.refreshLabels(), this.onQualitiesChanged();
|
|
94
|
+
}
|
|
95
|
+
update(t) {
|
|
96
|
+
const e = this.unlocked;
|
|
97
|
+
this.options = t, e !== this.unlocked && this.ctx.onLockChange(!1), this.onQualitiesChanged();
|
|
98
|
+
}
|
|
99
|
+
// ── Kilit durumu ────────────────────────────────────────────────────
|
|
100
|
+
get maxFreeHeight() {
|
|
101
|
+
const t = this.options.maxFreeHeight;
|
|
102
|
+
return typeof t == "number" && t > 0 ? t : T;
|
|
103
|
+
}
|
|
104
|
+
get storageKey() {
|
|
105
|
+
return this.options.storageKey || S;
|
|
106
|
+
}
|
|
107
|
+
get unlockFor() {
|
|
108
|
+
const t = this.options.unlockFor;
|
|
109
|
+
return typeof t == "number" && t > 0 ? t : t === "video" ? "video" : "session";
|
|
110
|
+
}
|
|
111
|
+
get unlocked() {
|
|
112
|
+
const t = this.unlockFor;
|
|
113
|
+
if (t === "video") return !!this.videoUnlockedKey && this.videoUnlockedKey === this.ctx.contentKey();
|
|
114
|
+
try {
|
|
115
|
+
if (t === "session") return sessionStorage.getItem(this.storageKey) === "1";
|
|
116
|
+
const e = Number(localStorage.getItem(this.storageKey));
|
|
117
|
+
return Number.isFinite(e) && e > Date.now();
|
|
118
|
+
} catch {
|
|
119
|
+
return !1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
grant() {
|
|
123
|
+
const t = this.unlockFor;
|
|
124
|
+
t === "video" && (this.videoUnlockedKey = this.ctx.contentKey());
|
|
125
|
+
try {
|
|
126
|
+
t === "session" ? sessionStorage.setItem(this.storageKey, "1") : typeof t == "number" && localStorage.setItem(this.storageKey, String(Date.now() + t * 6e4));
|
|
127
|
+
} catch {
|
|
128
|
+
this.videoUnlockedKey = this.ctx.contentKey();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** Player için: bu yükseklikteki kalite kilitli mi? */
|
|
132
|
+
isLocked(t) {
|
|
133
|
+
return this.unlocked ? !1 : t !== null && t > this.maxFreeHeight;
|
|
134
|
+
}
|
|
135
|
+
/** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */
|
|
136
|
+
onQualitiesChanged() {
|
|
137
|
+
const t = this.ctx.lockedQualityLabel(), e = this.options.button !== !1 && !!t && !this.unlocked;
|
|
138
|
+
if (this.button.hidden = !e, !e) return;
|
|
139
|
+
const o = this.fill(this.ctx.i18n.rewardedButton, t);
|
|
140
|
+
this.button.innerHTML = `${E}<span>${N(o)}</span>`, this.button.setAttribute("aria-label", o);
|
|
141
|
+
}
|
|
142
|
+
// ── Akış ────────────────────────────────────────────────────────────
|
|
143
|
+
/** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */
|
|
144
|
+
requestUnlock() {
|
|
145
|
+
if (this.unlocked || this.phase !== "idle") return;
|
|
146
|
+
const t = this.ctx.lockedQualityLabel() ?? "HD";
|
|
147
|
+
this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedprompt", { detail: { quality: t } })), this.showDialog("prompt", t);
|
|
148
|
+
}
|
|
149
|
+
async watch(t) {
|
|
150
|
+
const e = this.ctx.videoEl, o = !e.paused;
|
|
151
|
+
e.pause(), this.ctx.exitFullscreen(), this.abort = new AbortController();
|
|
152
|
+
const s = this.abort.signal;
|
|
153
|
+
this.showDialog("loading", t);
|
|
154
|
+
let n;
|
|
155
|
+
try {
|
|
156
|
+
n = await this.runProvider(s);
|
|
157
|
+
} catch (i) {
|
|
158
|
+
this.ctx.log({ message: `Rewarded ad failed: ${String(i)}` }), n = "nofill";
|
|
159
|
+
}
|
|
160
|
+
if (this.abort = null, s.aborted) {
|
|
161
|
+
this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1, cancelled: !0 } })), o && this.ctx.play();
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
let m = !1;
|
|
165
|
+
if (n === "nofill" && this.options.grantOnNoFill !== !1 && (this.ctx.log({ message: "Rewarded ad: no ad available (no fill / error / timeout) — unlocked anyway (grantOnNoFill)" }), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardednofill", { detail: { granted: !0 } })), n = "granted", m = !0), n === "granted") {
|
|
166
|
+
this.grant(), this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedgranted", { detail: { quality: t, noAd: m } })), this.ctx.onLockChange(!0), this.onQualitiesChanged(), this.showToast(this.fill(m ? this.ctx.i18n.rewardedUnlockedNoAd : this.ctx.i18n.rewardedUnlocked, t)), o && this.ctx.play();
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (n === "nofill") {
|
|
170
|
+
this.ctx.log({ message: "Rewarded ad: no ad available (no fill / unsupported page / timeout)" }), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardednofill", { detail: { granted: !1 } })), this.showDialog("nofill", t), this.resumeAfterDialog = o;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1 } })), o && this.ctx.play();
|
|
174
|
+
}
|
|
175
|
+
async runProvider(t) {
|
|
176
|
+
const e = this.options.provider;
|
|
177
|
+
if ((e == null ? void 0 : e.type) === "gpt") return L(e.adUnitPath, e.timeoutMs ?? A, t);
|
|
178
|
+
if ((e == null ? void 0 : e.type) === "custom") {
|
|
179
|
+
const o = new Promise((n) => t.addEventListener("abort", () => n("closed"), { once: !0 })), s = await Promise.race([e.show({ signal: t }), o]);
|
|
180
|
+
return s === !0 ? "granted" : s === !1 ? "closed" : s;
|
|
181
|
+
}
|
|
182
|
+
throw new Error("rewardedUnlock.provider is missing");
|
|
183
|
+
}
|
|
184
|
+
// ── Arayüz ─────────────────────────────────────────────────────────
|
|
185
|
+
fill(t, e) {
|
|
186
|
+
const o = this.unlockFor, s = this.ctx.i18n, n = o === "video" ? s.rewardedForVideo : o === "session" ? s.rewardedForSession : s.rewardedForMinutes.replace("{n}", String(o));
|
|
187
|
+
return t.replace("{quality}", e).replace("{duration}", n);
|
|
188
|
+
}
|
|
189
|
+
showDialog(t, e) {
|
|
190
|
+
this.phase = t;
|
|
191
|
+
const o = this.ctx.i18n;
|
|
192
|
+
if (!this.dialog) {
|
|
193
|
+
const l = document.createElement("div");
|
|
194
|
+
l.className = "hp-rw-dialog", l.setAttribute("part", "rewarded-dialog"), l.setAttribute("role", "dialog"), l.setAttribute("aria-modal", "true");
|
|
195
|
+
for (const h of ["click", "pointerdown", "dblclick"]) l.addEventListener(h, (d) => d.stopPropagation());
|
|
196
|
+
l.addEventListener("keydown", (h) => {
|
|
197
|
+
var d;
|
|
198
|
+
h.stopPropagation(), h.key === "Escape" && (this.phase === "loading" ? (d = this.abort) == null || d.abort() : this.dismiss());
|
|
199
|
+
}), this.ctx.overlayEl.appendChild(l), this.dialog = l;
|
|
200
|
+
}
|
|
201
|
+
const s = this.dialog;
|
|
202
|
+
s.setAttribute("data-phase", t), s.innerHTML = "";
|
|
203
|
+
const n = document.createElement("div");
|
|
204
|
+
n.className = "hp-rw-card";
|
|
205
|
+
const m = document.createElement("div");
|
|
206
|
+
m.className = "hp-rw-icon", m.innerHTML = E;
|
|
207
|
+
const i = document.createElement("div");
|
|
208
|
+
i.className = "hp-rw-title", i.id = `hp-rw-title-${++F}`, s.setAttribute("aria-labelledby", i.id);
|
|
209
|
+
const f = document.createElement("div");
|
|
210
|
+
f.className = "hp-rw-text";
|
|
211
|
+
const v = document.createElement("div");
|
|
212
|
+
v.className = "hp-rw-actions", n.append(m, i, f, v), s.appendChild(n);
|
|
213
|
+
const c = (l, h, d) => {
|
|
214
|
+
const p = document.createElement("button");
|
|
215
|
+
return p.type = "button", p.className = h ? "hp-rw-btn hp-rw-btn-primary" : "hp-rw-btn", p.textContent = l, p.addEventListener("click", d), v.appendChild(p), p;
|
|
216
|
+
};
|
|
217
|
+
if (t === "prompt")
|
|
218
|
+
i.textContent = this.fill(o.rewardedTitle, e), f.textContent = this.fill(o.rewardedBody, e), c(o.rewardedDecline, !1, () => this.dismiss()), c(o.rewardedWatch, !0, () => void this.watch(e)).focus();
|
|
219
|
+
else if (t === "loading") {
|
|
220
|
+
i.textContent = o.rewardedLoading;
|
|
221
|
+
const l = document.createElement("div");
|
|
222
|
+
l.className = "hp-rw-spinner", f.appendChild(l), c(o.rewardedDecline, !1, () => {
|
|
223
|
+
var h;
|
|
224
|
+
return (h = this.abort) == null ? void 0 : h.abort();
|
|
225
|
+
});
|
|
226
|
+
} else
|
|
227
|
+
i.textContent = this.fill(o.rewardedTitle, e), f.textContent = o.rewardedNoFill, c(o.rewardedOk, !0, () => this.dismiss()).focus();
|
|
228
|
+
}
|
|
229
|
+
dismiss() {
|
|
230
|
+
const t = this.phase === "nofill";
|
|
231
|
+
this.closeDialog(), t || this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1, declined: !0 } })), this.resumeAfterDialog && this.ctx.play(), this.resumeAfterDialog = !1;
|
|
232
|
+
}
|
|
233
|
+
closeDialog() {
|
|
234
|
+
var t;
|
|
235
|
+
this.phase = "idle", (t = this.dialog) == null || t.remove(), this.dialog = null;
|
|
236
|
+
}
|
|
237
|
+
showToast(t) {
|
|
238
|
+
var o;
|
|
239
|
+
this.toastTimer && clearTimeout(this.toastTimer), (o = this.toast) == null || o.remove();
|
|
240
|
+
const e = document.createElement("div");
|
|
241
|
+
e.className = "hp-rw-toast", e.setAttribute("part", "rewarded-toast"), e.setAttribute("role", "status"), e.textContent = t, this.ctx.overlayEl.appendChild(e), this.toast = e, this.toastTimer = setTimeout(() => {
|
|
242
|
+
var s;
|
|
243
|
+
(s = this.toast) == null || s.remove(), this.toast = null;
|
|
244
|
+
}, D);
|
|
245
|
+
}
|
|
246
|
+
refreshLabels() {
|
|
247
|
+
this.onQualitiesChanged();
|
|
248
|
+
}
|
|
249
|
+
destroy() {
|
|
250
|
+
var t, e;
|
|
251
|
+
(t = this.abort) == null || t.abort(), this.ctx.videoEl.removeEventListener("loadstart", this.onSourceChange), this.toastTimer && clearTimeout(this.toastTimer), (e = this.toast) == null || e.remove(), this.closeDialog(), this.button.remove();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function N(r) {
|
|
255
|
+
return r.replace(/[&<>"']/g, (t) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[t]);
|
|
256
|
+
}
|
|
257
|
+
function R(r, t) {
|
|
258
|
+
return new K(r, t);
|
|
259
|
+
}
|
|
260
|
+
export {
|
|
261
|
+
K as RewardedUnlock,
|
|
262
|
+
R as installRewardedUnlock
|
|
263
|
+
};
|
|
264
|
+
//# sourceMappingURL=rewardedUnlock-EyGMB9PK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewardedUnlock-EyGMB9PK.js","sources":["../../src/plugins/rewarded/gpt.ts","../../src/plugins/rewarded/RewardedUnlock.ts","../../src/plugins/rewarded/index.ts"],"sourcesContent":["import type { RewardedResult } from '../../types';\n\n/** Google Publisher Tag'in kullanılan yüzeyi (minimal tipler). */\ninterface GptSlot {\n addService(service: unknown): GptSlot;\n}\ninterface GptEvent {\n slot: GptSlot;\n isEmpty?: boolean;\n makeRewardedVisible?: () => boolean | void;\n}\ninterface GptPubAds {\n addEventListener(type: string, listener: (e: GptEvent) => void): void;\n removeEventListener?(type: string, listener: (e: GptEvent) => void): void;\n}\ninterface GoogleTag {\n cmd: Array<() => void> | { push(fn: () => void): void };\n apiReady?: boolean;\n enums: { OutOfPageFormat: { REWARDED: unknown } };\n pubads(): GptPubAds;\n defineOutOfPageSlot(path: string, format: unknown): GptSlot | null;\n enableServices(): void;\n display(slot: GptSlot): void;\n destroySlots(slots: GptSlot[]): void;\n}\n\n/** Google'ın güncel örneklerindeki adres (eski securepagead2 adresi bazı ağlarda sertifika hatası veriyordu). */\nconst GPT_SRC = 'https://securepubads.g.doubleclick.net/tag/js/gpt.js';\nlet gptLoading: Promise<void> | null = null;\n\n/** GPT sayfada yoksa yükler; sayfa GPT'yi (hangi adresten olursa olsun) zaten yüklüyorsa onu paylaşır. */\nfunction loadGpt(): Promise<void> {\n const w = window as unknown as { googletag?: Partial<GoogleTag> };\n w.googletag ??= { cmd: [] } as Partial<GoogleTag>;\n w.googletag.cmd ??= [];\n if (w.googletag.apiReady || document.querySelector('script[src*=\"/tag/js/gpt.js\"]')) return Promise.resolve();\n gptLoading ??= new Promise<void>((resolve, reject) => {\n const s = document.createElement('script');\n s.async = true;\n s.src = GPT_SRC;\n s.onload = () => resolve();\n s.onerror = () => {\n gptLoading = null;\n s.remove();\n reject(new Error('gpt.js could not be loaded (ad blocker / network / certificate)'));\n };\n document.head.appendChild(s);\n });\n return gptLoading;\n}\n\n/**\n * GPT web rewarded akışı (Google'ın örneğiyle aynı): slot tanımla → display → `rewardedSlotReady` gelince göster →\n * `rewardedSlotGranted` ödül → `rewardedSlotClosed` kapandı → slotu yok et. Kullanıcı onayı bu fonksiyon çağrılmadan\n * ÖNCE alınmış olmalı (player'ın onay penceresi).\n *\n * `timeoutMs` betiğin yüklenmesi DAHİL en baştan sayar: GPT hiç yüklenemez ya da çalışmazsa (engelleyici, ağ,\n * sertifika) da 'nofill' döner — bekleme ekranı asla takılı kalmaz. `signal` iptal edilirse (kullanıcı \"Vazgeç\") slot\n * temizlenip 'closed' döner. Reklam görünür olduktan sonra zaman aşımı işlemez; kapanışı GPT bildirir.\n */\nexport function showGptRewarded(adUnitPath: string, timeoutMs: number, signal?: AbortSignal): Promise<RewardedResult> {\n return new Promise<RewardedResult>((resolve) => {\n let done = false;\n let granted = false;\n let videoCompleted = false;\n let slot: GptSlot | null = null;\n let googletag: GoogleTag | null = null;\n const listeners: Array<[string, (e: GptEvent) => void]> = [];\n\n const finish = (result: RewardedResult): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n if (googletag) {\n const pubads = googletag.pubads();\n for (const [type, fn] of listeners) pubads.removeEventListener?.(type, fn);\n if (slot) {\n try {\n googletag.destroySlots([slot]);\n } catch {\n /* zaten yok edildi */\n }\n }\n }\n resolve(result);\n };\n const onAbort = (): void => finish('closed');\n const timer = setTimeout(() => finish('nofill'), timeoutMs);\n if (signal?.aborted) {\n finish('closed');\n return;\n }\n signal?.addEventListener('abort', onAbort);\n\n loadGpt()\n .then(() => {\n if (done) return;\n const gt = (window as unknown as { googletag: GoogleTag }).googletag;\n gt.cmd.push(() => {\n if (done) return;\n googletag = gt;\n slot = gt.defineOutOfPageSlot(adUnitPath, gt.enums.OutOfPageFormat.REWARDED);\n // null: sayfa formatı desteklemiyor (ör. mobil uyumlu viewport yok) — reklam yok sayılır.\n if (!slot) {\n finish('nofill');\n return;\n }\n slot.addService(gt.pubads());\n const pubads = gt.pubads();\n const on = (type: string, fn: (e: GptEvent) => void): void => {\n listeners.push([type, fn]);\n pubads.addEventListener(type, fn);\n };\n on('rewardedSlotReady', (e) => {\n if (e.slot !== slot || done) return;\n // Reklam hazır: artık bekleme yok — kapanışı GPT bildirecek.\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n e.makeRewardedVisible?.();\n });\n // Google: \"You need to close out ads rather than relying on GPT to do so.\" — ödül verilip video reklam\n // sonuna kadar oynayınca reklam player tarafından kapatılır (slot yok edilir); kullanıcı X'e basmak\n // zorunda kalmaz. Ödülü video bitmeden veren reklamlarda kapanış video bitince olur.\n on('rewardedSlotGranted', (e) => {\n if (e.slot !== slot) return;\n granted = true;\n if (videoCompleted) finish('granted');\n });\n on('rewardedSlotVideoCompleted', (e) => {\n if (e.slot !== slot) return;\n videoCompleted = true;\n if (granted) finish('granted');\n });\n on('rewardedSlotClosed', (e) => {\n if (e.slot === slot) finish(granted ? 'granted' : 'closed');\n });\n on('slotRenderEnded', (e) => {\n if (e.slot === slot && e.isEmpty) finish('nofill');\n });\n gt.enableServices();\n gt.display(slot);\n });\n })\n .catch(() => finish('nofill'));\n });\n}\n","import type { RewardedResult, RewardedUnlockOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { LOCK_SVG } from '../../controls/SettingsMenu';\nimport { showGptRewarded } from './gpt';\n\nexport interface RewardedUnlockContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Onay penceresinin ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n /** Buton kontrollerle birlikte görünüp gizlensin diye kontrol katmanına eklenir. */\n chromeEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; details?: Record<string, string | number | boolean | undefined> }): void;\n play(): void;\n exitFullscreen(): void;\n /** Kilitli kalitelerin en yükseği (ör. \"1080p\") — yoksa null (buton gizlenir). */\n lockedQualityLabel(): string | null;\n /** İçeriğin kimliği (kaynak listesi) — kalite değişince değişmez, başka video yüklenince değişir. */\n contentKey(): string;\n /** Kilit açıldı / geri geldi: player menüleri yeniden kurar; `upgrade` → en iyi kaliteye geç. */\n onLockChange(upgrade: boolean): void;\n}\n\nconst DEFAULT_MAX_FREE_HEIGHT = 480;\nconst DEFAULT_STORAGE_KEY = 'hope-rewarded-unlock';\nconst DEFAULT_GPT_TIMEOUT_MS = 8000;\nconst TOAST_MS = 2600;\n\ntype Phase = 'idle' | 'prompt' | 'loading' | 'nofill';\n\n/**\n * Ödüllü reklamla kalite kilidi. Akış (Google'ın ödüllü reklam politikasına göre): kullanıcı kilitli bir kaliteye ya da\n * \"Yüksek kaliteyi aç\" butonuna dokunur → ödülü açıkça yazan onay penceresi → yalnızca \"Reklamı izle\" ile reklam istenir\n * → ödül verildiyse kilit açılır. Vazgeçmek videoyu izlemeyi engellemez (düşük kalitede devam eder).\n */\n/** Diyalog başlık id'leri — aynı sayfada birden çok player olabilir. */\nlet dialogSeq = 0;\n\nexport class RewardedUnlock {\n private options: RewardedUnlockOptions;\n private readonly button: HTMLButtonElement;\n private dialog: HTMLDivElement | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n private phase: Phase = 'idle';\n /** 'video' modunda kilidin açık olduğu içerik (kaynak listesi — kalite dosyası değil). */\n private videoUnlockedKey: string | null = null;\n private lastKey = '';\n\n constructor(\n private readonly ctx: RewardedUnlockContext,\n options: RewardedUnlockOptions\n ) {\n this.options = options;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'hp-rw-button';\n btn.setAttribute('part', 'rewarded-button');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.requestUnlock();\n });\n btn.addEventListener('pointerdown', (e) => e.stopPropagation());\n ctx.chromeEl.appendChild(btn);\n this.button = btn;\n ctx.videoEl.addEventListener('loadstart', this.onSourceChange);\n this.refreshLabels();\n this.onQualitiesChanged();\n }\n\n update(options: RewardedUnlockOptions): void {\n const before = this.unlocked;\n this.options = options;\n if (before !== this.unlocked) this.ctx.onLockChange(false);\n this.onQualitiesChanged();\n }\n\n // ── Kilit durumu ────────────────────────────────────────────────────\n\n private get maxFreeHeight(): number {\n const h = this.options.maxFreeHeight;\n return typeof h === 'number' && h > 0 ? h : DEFAULT_MAX_FREE_HEIGHT;\n }\n\n private get storageKey(): string {\n return this.options.storageKey || DEFAULT_STORAGE_KEY;\n }\n\n private get unlockFor(): 'video' | 'session' | number {\n const u = this.options.unlockFor;\n return typeof u === 'number' && u > 0 ? u : u === 'video' ? 'video' : 'session';\n }\n\n get unlocked(): boolean {\n const mode = this.unlockFor;\n if (mode === 'video') return !!this.videoUnlockedKey && this.videoUnlockedKey === this.ctx.contentKey();\n try {\n if (mode === 'session') return sessionStorage.getItem(this.storageKey) === '1';\n const until = Number(localStorage.getItem(this.storageKey));\n return Number.isFinite(until) && until > Date.now();\n } catch {\n return false; // depolama kapalı (gizli mod vb.)\n }\n }\n\n private grant(): void {\n const mode = this.unlockFor;\n if (mode === 'video') this.videoUnlockedKey = this.ctx.contentKey();\n try {\n if (mode === 'session') sessionStorage.setItem(this.storageKey, '1');\n else if (typeof mode === 'number') localStorage.setItem(this.storageKey, String(Date.now() + mode * 60_000));\n } catch {\n // Depolama yoksa yalnızca bu video için açık kalır.\n this.videoUnlockedKey = this.ctx.contentKey();\n }\n }\n\n /** Player için: bu yükseklikteki kalite kilitli mi? */\n isLocked(height: number | null): boolean {\n if (this.unlocked) return false;\n return height !== null && height > this.maxFreeHeight;\n }\n\n /** Kaynak değişti: 'video' modunda kilit yeniden kapanır; süreli kilit dolduysa menüler güncellenir. */\n private readonly onSourceChange = (): void => {\n const key = this.ctx.contentKey();\n if (key === this.lastKey) return;\n this.lastKey = key;\n this.onQualitiesChanged();\n };\n\n /** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */\n onQualitiesChanged(): void {\n const label = this.ctx.lockedQualityLabel();\n const show = this.options.button !== false && !!label && !this.unlocked;\n this.button.hidden = !show;\n if (!show) return;\n const text = this.fill(this.ctx.i18n.rewardedButton, label!);\n this.button.innerHTML = `${LOCK_SVG}<span>${escapeHtml(text)}</span>`;\n // Erişilebilir ad görünen metinle aynı (sesli komutla \"720p kilidini aç\" dendiğinde bulunabilsin).\n this.button.setAttribute('aria-label', text);\n }\n\n // ── Akış ────────────────────────────────────────────────────────────\n\n /** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */\n requestUnlock(): void {\n if (this.unlocked || this.phase !== 'idle') return;\n const label = this.ctx.lockedQualityLabel() ?? 'HD';\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedprompt', { detail: { quality: label } }));\n this.showDialog('prompt', label);\n }\n\n private async watch(label: string): Promise<void> {\n const v = this.ctx.videoEl;\n const wasPlaying = !v.paused;\n v.pause();\n // GPT reklamı sayfanın kendi katmanında açılır — player tam ekrandaysa görünmez.\n this.ctx.exitFullscreen();\n this.abort = new AbortController();\n const signal = this.abort.signal;\n this.showDialog('loading', label);\n let result: RewardedResult;\n try {\n result = await this.runProvider(signal);\n } catch (err) {\n this.ctx.log({ message: `Rewarded ad failed: ${String(err)}` });\n result = 'nofill';\n }\n this.abort = null;\n // Kullanıcı hazırlanırken \"Vazgeç\" dedi — sonuç ne olursa olsun ödül yok, video devam eder.\n if (signal.aborted) {\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, cancelled: true } }));\n if (wasPlaying) this.ctx.play();\n return;\n }\n // Reklam yok / boş / hata: kusur kullanıcıda değil — varsayılan olarak kilit yine de açılır (grantOnNoFill: false kapatır).\n let noAd = false;\n if (result === 'nofill' && this.options.grantOnNoFill !== false) {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / error / timeout) — unlocked anyway (grantOnNoFill)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: true } }));\n result = 'granted';\n noAd = true;\n }\n if (result === 'granted') {\n this.grant();\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedgranted', { detail: { quality: label, noAd } }));\n this.ctx.onLockChange(true);\n this.onQualitiesChanged();\n this.showToast(this.fill(noAd ? this.ctx.i18n.rewardedUnlockedNoAd : this.ctx.i18n.rewardedUnlocked, label));\n if (wasPlaying) this.ctx.play();\n return;\n }\n if (result === 'nofill') {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / unsupported page / timeout)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: false } }));\n this.showDialog('nofill', label);\n this.resumeAfterDialog = wasPlaying;\n return;\n }\n // Kullanıcı reklamı ödül kazanmadan kapattı — video kaldığı kalitede devam eder.\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false } }));\n if (wasPlaying) this.ctx.play();\n }\n\n private resumeAfterDialog = false;\n /** Reklam hazırlanırken \"Vazgeç\" — sağlayıcıya iletilir (GPT slotu temizlenir). */\n private abort: AbortController | null = null;\n\n private async runProvider(signal: AbortSignal): Promise<RewardedResult> {\n const p = this.options.provider;\n if (p?.type === 'gpt') return showGptRewarded(p.adUnitPath, p.timeoutMs ?? DEFAULT_GPT_TIMEOUT_MS, signal);\n if (p?.type === 'custom') {\n // İptal edilirse kendi reklam sisteminizin sonucu beklenmez (sinyali kendi tarafınızda da dinleyebilirsiniz).\n const aborted = new Promise<RewardedResult>((resolve) => signal.addEventListener('abort', () => resolve('closed'), { once: true }));\n const r = await Promise.race([p.show({ signal }), aborted]);\n return r === true ? 'granted' : r === false ? 'closed' : r;\n }\n throw new Error('rewardedUnlock.provider is missing');\n }\n\n // ── Arayüz ─────────────────────────────────────────────────────────\n\n private fill(template: string, quality: string): string {\n const mode = this.unlockFor;\n const i = this.ctx.i18n;\n const duration =\n mode === 'video' ? i.rewardedForVideo : mode === 'session' ? i.rewardedForSession : i.rewardedForMinutes.replace('{n}', String(mode));\n return template.replace('{quality}', quality).replace('{duration}', duration);\n }\n\n private showDialog(phase: Exclude<Phase, 'idle'>, label: string): void {\n this.phase = phase;\n const i = this.ctx.i18n;\n if (!this.dialog) {\n const d = document.createElement('div');\n d.className = 'hp-rw-dialog';\n d.setAttribute('part', 'rewarded-dialog');\n d.setAttribute('role', 'dialog');\n d.setAttribute('aria-modal', 'true');\n for (const t of ['click', 'pointerdown', 'dblclick'] as const) d.addEventListener(t, (e) => e.stopPropagation());\n d.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key !== 'Escape') return;\n if (this.phase === 'loading') this.abort?.abort();\n else this.dismiss();\n });\n this.ctx.overlayEl.appendChild(d);\n this.dialog = d;\n }\n const d = this.dialog;\n d.setAttribute('data-phase', phase);\n d.innerHTML = '';\n const card = document.createElement('div');\n card.className = 'hp-rw-card';\n const icon = document.createElement('div');\n icon.className = 'hp-rw-icon';\n icon.innerHTML = LOCK_SVG;\n const title = document.createElement('div');\n title.className = 'hp-rw-title';\n // Diyaloğun erişilebilir adı başlığı (ekran okuyucu \"720p kilidini aç\" diye okur).\n title.id = `hp-rw-title-${++dialogSeq}`;\n d.setAttribute('aria-labelledby', title.id);\n const text = document.createElement('div');\n text.className = 'hp-rw-text';\n const actions = document.createElement('div');\n actions.className = 'hp-rw-actions';\n card.append(icon, title, text, actions);\n d.appendChild(card);\n\n const button = (labelText: string, primary: boolean, onClick: () => void): HTMLButtonElement => {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = primary ? 'hp-rw-btn hp-rw-btn-primary' : 'hp-rw-btn';\n b.textContent = labelText;\n b.addEventListener('click', onClick);\n actions.appendChild(b);\n return b;\n };\n\n if (phase === 'prompt') {\n title.textContent = this.fill(i.rewardedTitle, label);\n // Ödül, reklamdan ÖNCE açıkça yazılır (politika şartı).\n text.textContent = this.fill(i.rewardedBody, label);\n button(i.rewardedDecline, false, () => this.dismiss());\n button(i.rewardedWatch, true, () => void this.watch(label)).focus();\n } else if (phase === 'loading') {\n title.textContent = i.rewardedLoading;\n const spin = document.createElement('div');\n spin.className = 'hp-rw-spinner';\n text.appendChild(spin);\n // Hazırlanma ne kadar sürerse sürsün kullanıcı takılı kalmaz.\n button(i.rewardedDecline, false, () => this.abort?.abort());\n } else {\n title.textContent = this.fill(i.rewardedTitle, label);\n text.textContent = i.rewardedNoFill;\n button(i.rewardedOk, true, () => this.dismiss()).focus();\n }\n }\n\n private dismiss(): void {\n const wasNoFill = this.phase === 'nofill';\n this.closeDialog();\n if (!wasNoFill) this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, declined: true } }));\n if (this.resumeAfterDialog) this.ctx.play();\n this.resumeAfterDialog = false;\n }\n\n private closeDialog(): void {\n this.phase = 'idle';\n this.dialog?.remove();\n this.dialog = null;\n }\n\n private showToast(message: string): void {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n const t = document.createElement('div');\n t.className = 'hp-rw-toast';\n t.setAttribute('part', 'rewarded-toast');\n t.setAttribute('role', 'status');\n t.textContent = message;\n this.ctx.overlayEl.appendChild(t);\n this.toast = t;\n this.toastTimer = setTimeout(() => {\n this.toast?.remove();\n this.toast = null;\n }, TOAST_MS);\n }\n\n refreshLabels(): void {\n this.onQualitiesChanged();\n }\n\n destroy(): void {\n this.abort?.abort();\n this.ctx.videoEl.removeEventListener('loadstart', this.onSourceChange);\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n this.closeDialog();\n this.button.remove();\n }\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[c]!);\n}\n","import { RewardedUnlock, type RewardedUnlockContext } from './RewardedUnlock';\nimport type { RewardedUnlockOptions } from '../../types';\n\n/** Ödüllü reklamla kalite kilidini kurar. */\nexport function installRewardedUnlock(ctx: RewardedUnlockContext, options: RewardedUnlockOptions): RewardedUnlock {\n return new RewardedUnlock(ctx, options);\n}\n\nexport { RewardedUnlock };\nexport type { RewardedUnlockContext };\n"],"names":["GPT_SRC","gptLoading","loadGpt","w","_a","resolve","reject","showGptRewarded","adUnitPath","timeoutMs","signal","done","granted","videoCompleted","slot","googletag","listeners","finish","result","timer","onAbort","pubads","type","fn","gt","on","e","DEFAULT_MAX_FREE_HEIGHT","DEFAULT_STORAGE_KEY","DEFAULT_GPT_TIMEOUT_MS","TOAST_MS","dialogSeq","RewardedUnlock","ctx","options","__publicField","key","btn","before","h","u","mode","until","height","label","show","text","LOCK_SVG","escapeHtml","v","wasPlaying","err","noAd","p","aborted","r","template","quality","i","duration","phase","d","t","card","icon","title","actions","button","labelText","primary","onClick","b","spin","wasNoFill","message","_b","s","c","installRewardedUnlock"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var m = Object.defineProperty;
|
|
2
2
|
var v = (r, t, e) => t in r ? m(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
|
|
3
3
|
var n = (r, t, e) => v(r, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { f as E } from "./
|
|
4
|
+
import { f as E } from "./player-C886oKP-.js";
|
|
5
5
|
class u {
|
|
6
6
|
constructor(t, e) {
|
|
7
7
|
n(this, "chapters", []);
|
|
@@ -60,4 +60,4 @@ export {
|
|
|
60
60
|
u as Segments,
|
|
61
61
|
g as installSegments
|
|
62
62
|
};
|
|
63
|
-
//# sourceMappingURL=
|
|
63
|
+
//# sourceMappingURL=segments-C2HKU6XK.js.map
|