@hopeplayer/core 1.0.16 → 1.0.18
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 +3 -0
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/{index-CWLyz1fp.js → adTriggers-DXmtF4t2.js} +113 -118
- package/dist/chunks/adTriggers-DXmtF4t2.js.map +1 -0
- package/dist/chunks/{index-DITXYcHx.js → ads-MCG5a6eK.js} +130 -125
- package/dist/chunks/ads-MCG5a6eK.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/{index-Miba3PD_.js → cast-bMrkGGuD.js} +70 -66
- package/dist/chunks/cast-bMrkGGuD.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/{loadGpt-CmiAy366.js → gpt-CGXHTG_H.js} +1 -1
- 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-e00_M05B.js → markers-BhMJLPqj.js} +2 -2
- package/dist/chunks/markers-BhMJLPqj.js.map +1 -0
- package/dist/chunks/{index-CDPrkLq0.js → pauseAd-BQQe21X4.js} +2 -2
- package/dist/chunks/pauseAd-BQQe21X4.js.map +1 -0
- package/dist/chunks/{index-DEv3YqLg.js → player-DW5iWvPs.js} +939 -880
- package/dist/chunks/player-DW5iWvPs.js.map +1 -0
- package/dist/chunks/{index-D3Z7ZDLJ.js → playlist-DYGbJ5wz.js} +24 -24
- package/dist/chunks/playlist-DYGbJ5wz.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-DXwD3oSA.js} +29 -30
- package/dist/chunks/qrResume-DXwD3oSA.js.map +1 -0
- package/dist/chunks/redirectScreen-CSjrS8Kg.js +208 -0
- package/dist/chunks/redirectScreen-CSjrS8Kg.js.map +1 -0
- package/dist/chunks/{index-BbRYOSvk.js → rewardedUnlock-DZ_qPcDG.js} +22 -19
- package/dist/chunks/rewardedUnlock-DZ_qPcDG.js.map +1 -0
- package/dist/chunks/seekWhenReady-Clzne3-S.js +32 -0
- package/dist/chunks/seekWhenReady-Clzne3-S.js.map +1 -0
- package/dist/chunks/{index-CBX7bn-G.js → segments-LsZPlbYi.js} +2 -2
- package/dist/chunks/segments-LsZPlbYi.js.map +1 -0
- package/dist/chunks/{index-Ch3ep-eJ.js → sponsorship-BT21uwN5.js} +36 -41
- package/dist/chunks/sponsorship-BT21uwN5.js.map +1 -0
- package/dist/chunks/{index-BXSND_xN.js → spriteThumbnails-BQkEBRu-.js} +2 -2
- package/dist/chunks/spriteThumbnails-BQkEBRu-.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-C3BQGcT3.js → story-H6f7gSoX.js} +27 -15
- package/dist/chunks/story-H6f7gSoX.js.map +1 -0
- package/dist/chunks/{index-C5oGMHF_.js → tapGestures-DrC42DiI.js} +1 -1
- package/dist/chunks/tapGestures-DrC42DiI.js.map +1 -0
- package/dist/chunks/trackingPixel-D2wxdCEz.js +20 -0
- package/dist/chunks/trackingPixel-D2wxdCEz.js.map +1 -0
- package/dist/controls/SeekBar.d.ts.map +1 -1
- package/dist/hls/SourceManager.d.ts.map +1 -1
- 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 +3 -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/keyboard/KeyboardController.d.ts.map +1 -1
- package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/plugins/playlist/PlaylistRunner.d.ts.map +1 -1
- package/dist/plugins/qr-resume/QrResume.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 +0 -5
- package/dist/plugins/rewarded/RewardedUnlock.d.ts.map +1 -1
- package/dist/plugins/shared/seekWhenReady.d.ts +22 -0
- package/dist/plugins/shared/seekWhenReady.d.ts.map +1 -0
- package/dist/plugins/shared/trackingPixel.d.ts +8 -0
- package/dist/plugins/shared/trackingPixel.d.ts.map +1 -0
- package/dist/plugins/sponsorship/SponsorshipLayer.d.ts.map +1 -1
- package/dist/plugins/story/HopeStory.d.ts +2 -0
- package/dist/plugins/story/HopeStory.d.ts.map +1 -1
- package/dist/screens/ErrorScreen.d.ts +7 -0
- package/dist/screens/ErrorScreen.d.ts.map +1 -1
- package/dist/types/index.d.ts +49 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/media-error.d.ts +10 -0
- package/dist/utils/media-error.d.ts.map +1 -0
- package/dist/utils/seek-by.d.ts +8 -0
- package/dist/utils/seek-by.d.ts.map +1 -1
- package/package.json +4 -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-BXSND_xN.js.map +0 -1
- package/dist/chunks/index-BbRYOSvk.js.map +0 -1
- package/dist/chunks/index-BeJNpAyx.js.map +0 -1
- package/dist/chunks/index-C3BQGcT3.js.map +0 -1
- package/dist/chunks/index-C5oGMHF_.js.map +0 -1
- package/dist/chunks/index-CBX7bn-G.js.map +0 -1
- package/dist/chunks/index-CDDke5rz.js.map +0 -1
- package/dist/chunks/index-CDPrkLq0.js.map +0 -1
- package/dist/chunks/index-CWLyz1fp.js.map +0 -1
- package/dist/chunks/index-Ca8hocby.js.map +0 -1
- package/dist/chunks/index-Ch3ep-eJ.js.map +0 -1
- package/dist/chunks/index-D3Z7ZDLJ.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-DEv3YqLg.js.map +0 -1
- package/dist/chunks/index-DGtpFgHV.js.map +0 -1
- package/dist/chunks/index-DITXYcHx.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-Miba3PD_.js.map +0 -1
- package/dist/chunks/index-Q8FMOHj0.js.map +0 -1
- package/dist/chunks/index-e00_M05B.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/loadGpt-CmiAy366.js.map +0 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
var y = Object.defineProperty;
|
|
2
2
|
var x = (r, t, e) => t in r ? y(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
|
|
3
3
|
var u = (r, t, e) => x(r, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { L as
|
|
4
|
+
import { L as E } from "./player-DW5iWvPs.js";
|
|
5
5
|
const k = "https://securepubads.g.doubleclick.net/tag/js/gpt.js";
|
|
6
|
-
let
|
|
6
|
+
let b = null;
|
|
7
7
|
function C() {
|
|
8
8
|
var t;
|
|
9
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() : (
|
|
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
11
|
const s = document.createElement("script");
|
|
12
12
|
s.async = !0, s.src = k, s.onload = () => e(), s.onerror = () => {
|
|
13
|
-
|
|
13
|
+
b = null, s.remove(), o(new Error("gpt.js could not be loaded (ad blocker / network / certificate)"));
|
|
14
14
|
}, document.head.appendChild(s);
|
|
15
|
-
})),
|
|
15
|
+
})), b);
|
|
16
16
|
}
|
|
17
17
|
function L(r, t, e) {
|
|
18
18
|
return new Promise((o) => {
|
|
@@ -65,8 +65,9 @@ function L(r, t, e) {
|
|
|
65
65
|
}).catch(() => c("nofill"));
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
-
const T = 480, S = "hope-rewarded-unlock",
|
|
69
|
-
|
|
68
|
+
const T = 480, S = "hope-rewarded-unlock", A = 8e3, D = 2600;
|
|
69
|
+
let F = 0;
|
|
70
|
+
class K {
|
|
70
71
|
constructor(t, e) {
|
|
71
72
|
u(this, "options");
|
|
72
73
|
u(this, "button");
|
|
@@ -134,7 +135,9 @@ class F {
|
|
|
134
135
|
/** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */
|
|
135
136
|
onQualitiesChanged() {
|
|
136
137
|
const t = this.ctx.lockedQualityLabel(), e = this.options.button !== !1 && !!t && !this.unlocked;
|
|
137
|
-
this.button.hidden = !e, e
|
|
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);
|
|
138
141
|
}
|
|
139
142
|
// ── Akış ────────────────────────────────────────────────────────────
|
|
140
143
|
/** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */
|
|
@@ -171,7 +174,7 @@ class F {
|
|
|
171
174
|
}
|
|
172
175
|
async runProvider(t) {
|
|
173
176
|
const e = this.options.provider;
|
|
174
|
-
if ((e == null ? void 0 : e.type) === "gpt") return L(e.adUnitPath, e.timeoutMs ??
|
|
177
|
+
if ((e == null ? void 0 : e.type) === "gpt") return L(e.adUnitPath, e.timeoutMs ?? A, t);
|
|
175
178
|
if ((e == null ? void 0 : e.type) === "custom") {
|
|
176
179
|
const o = new Promise((n) => t.addEventListener("abort", () => n("closed"), { once: !0 })), s = await Promise.race([e.show({ signal: t }), o]);
|
|
177
180
|
return s === !0 ? "granted" : s === !1 ? "closed" : s;
|
|
@@ -200,9 +203,9 @@ class F {
|
|
|
200
203
|
const n = document.createElement("div");
|
|
201
204
|
n.className = "hp-rw-card";
|
|
202
205
|
const m = document.createElement("div");
|
|
203
|
-
m.className = "hp-rw-icon", m.innerHTML =
|
|
206
|
+
m.className = "hp-rw-icon", m.innerHTML = E;
|
|
204
207
|
const i = document.createElement("div");
|
|
205
|
-
i.className = "hp-rw-title";
|
|
208
|
+
i.className = "hp-rw-title", i.id = `hp-rw-title-${++F}`, s.setAttribute("aria-labelledby", i.id);
|
|
206
209
|
const f = document.createElement("div");
|
|
207
210
|
f.className = "hp-rw-text";
|
|
208
211
|
const v = document.createElement("div");
|
|
@@ -238,24 +241,24 @@ class F {
|
|
|
238
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(() => {
|
|
239
242
|
var s;
|
|
240
243
|
(s = this.toast) == null || s.remove(), this.toast = null;
|
|
241
|
-
},
|
|
244
|
+
}, D);
|
|
242
245
|
}
|
|
243
246
|
refreshLabels() {
|
|
244
|
-
this.
|
|
247
|
+
this.onQualitiesChanged();
|
|
245
248
|
}
|
|
246
249
|
destroy() {
|
|
247
250
|
var t, e;
|
|
248
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();
|
|
249
252
|
}
|
|
250
253
|
}
|
|
251
|
-
function
|
|
254
|
+
function N(r) {
|
|
252
255
|
return r.replace(/[&<>"']/g, (t) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[t]);
|
|
253
256
|
}
|
|
254
|
-
function
|
|
255
|
-
return new
|
|
257
|
+
function R(r, t) {
|
|
258
|
+
return new K(r, t);
|
|
256
259
|
}
|
|
257
260
|
export {
|
|
258
|
-
|
|
259
|
-
|
|
261
|
+
K as RewardedUnlock,
|
|
262
|
+
R as installRewardedUnlock
|
|
260
263
|
};
|
|
261
|
-
//# sourceMappingURL=
|
|
264
|
+
//# sourceMappingURL=rewardedUnlock-DZ_qPcDG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewardedUnlock-DZ_qPcDG.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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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function T(e, r, { done: n, attempts: l = 3, guardMs: o = 0 } = {}) {
|
|
2
|
+
let d = !1, t = !1;
|
|
3
|
+
const u = () => {
|
|
4
|
+
d || (d = !0, clearTimeout(k), o > 0 && E(), n == null || n());
|
|
5
|
+
}, k = n ? setTimeout(u, 3e3) : void 0, c = () => {
|
|
6
|
+
t = !0, e.currentTime = r;
|
|
7
|
+
}, s = () => {
|
|
8
|
+
if (t = !1, Math.abs(e.currentTime - r) <= 0.5 || l-- <= 0) return u();
|
|
9
|
+
e.addEventListener("seeked", s, { once: !0 }), c();
|
|
10
|
+
}, E = () => {
|
|
11
|
+
let L = 0;
|
|
12
|
+
const a = () => {
|
|
13
|
+
clearTimeout(p), e.removeEventListener("timeupdate", i), e.removeEventListener("playing", i), e.removeEventListener("seeking", m), e.removeEventListener("seeked", f);
|
|
14
|
+
}, i = () => {
|
|
15
|
+
if (!(t || e.seeking || e.currentTime >= r - 1)) {
|
|
16
|
+
if (L++ >= 2) return a();
|
|
17
|
+
c();
|
|
18
|
+
}
|
|
19
|
+
}, m = () => {
|
|
20
|
+
t || a();
|
|
21
|
+
}, f = () => {
|
|
22
|
+
t = !1;
|
|
23
|
+
};
|
|
24
|
+
e.addEventListener("timeupdate", i), e.addEventListener("playing", i), e.addEventListener("seeking", m), e.addEventListener("seeked", f);
|
|
25
|
+
const p = setTimeout(a, o);
|
|
26
|
+
};
|
|
27
|
+
e.readyState >= 1 ? s() : e.addEventListener("loadedmetadata", s, { once: !0 });
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
T as s
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=seekWhenReady-Clzne3-S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seekWhenReady-Clzne3-S.js","sources":["../../src/plugins/shared/seekWhenReady.ts"],"sourcesContent":["interface SeekWhenReadyOptions {\n /** Konum yerleşince (ya da denemeler bitince) bir kez çağrılır — ör. play(). */\n done?: () => void;\n /** Toplam sarma denemesi (varsayılan 3). */\n attempts?: number;\n /**\n * Yerleştikten sonra bu süre (ms) boyunca konum `seeking` olmadan hedefin gerisine düşerse sarma bir kez daha\n * uygulanır. WebKitGTK / WPE (GStreamer): uzun süre duraklatılmış videoda oynarken yapılan sarma `seeked`'te\n * doğru görünüp ardından oynatma eski konumdan sürüyor. Kullanıcı / başka bir kod sararsa (`seeking`) bekçi kapanır.\n */\n guardMs?: number;\n}\n\n/**\n * Videoyu `seconds`'a güvenilir biçimde sarar.\n *\n * WebKit (Safari / iOS, Playwright WebKit) `readyState`'i `loadedmetadata`'dan önce yükseltiyor ve aradaki ya da\n * hemen ardından play() gelen bir seek'i 0'a sıfırlayabiliyor. Bu yüzden konum `seeked`'te doğrulanır, tutmadıysa\n * toplam `attempts` kez uygulanır; `done` her durumda (yerleşince ya da denemeler bitince) bir kez çağrılır.\n */\nexport function seekWhenReady(v: HTMLVideoElement, seconds: number, { done, attempts = 3, guardMs = 0 }: SeekWhenReadyOptions = {}): void {\n let finished = false;\n let ownSeek = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n clearTimeout(timer);\n if (guardMs > 0) guard();\n done?.();\n };\n // seeked hiç gelmezse (takılan ağ, iptal edilen seek) done yine de çalışsın — oynatma askıda kalmasın.\n const timer = done ? setTimeout(finish, 3000) : undefined;\n const seekTo = () => {\n ownSeek = true;\n v.currentTime = seconds;\n };\n const attempt = () => {\n ownSeek = false;\n if (Math.abs(v.currentTime - seconds) <= 0.5 || attempts-- <= 0) return finish();\n v.addEventListener('seeked', attempt, { once: true });\n seekTo();\n };\n\n const guard = () => {\n let reapplied = 0;\n const stop = () => {\n clearTimeout(guardTimer);\n v.removeEventListener('timeupdate', check);\n v.removeEventListener('playing', check);\n v.removeEventListener('seeking', onSeeking);\n v.removeEventListener('seeked', onSeeked);\n };\n const check = () => {\n if (ownSeek || v.seeking || v.currentTime >= seconds - 1) return;\n if (reapplied++ >= 2) return stop();\n seekTo();\n };\n // Başka bir sarma (kullanıcı, eklenti) bekçiyi kapatır; kendi yeniden sarmamız kapatmaz.\n const onSeeking = () => {\n if (!ownSeek) stop();\n };\n const onSeeked = () => {\n ownSeek = false;\n };\n v.addEventListener('timeupdate', check);\n v.addEventListener('playing', check);\n v.addEventListener('seeking', onSeeking);\n v.addEventListener('seeked', onSeeked);\n const guardTimer = setTimeout(stop, guardMs);\n };\n\n if (v.readyState >= 1) attempt();\n else v.addEventListener('loadedmetadata', attempt, { once: true });\n}\n"],"names":["seekWhenReady","v","seconds","done","attempts","guardMs","finished","ownSeek","finish","timer","guard","seekTo","attempt","reapplied","stop","guardTimer","check","onSeeking","onSeeked"],"mappings":"AAoBO,SAASA,EAAcC,GAAqBC,GAAiB,EAAE,MAAAC,GAAM,UAAAC,IAAW,GAAG,SAAAC,IAAU,EAAA,IAA4B,IAAU;AACtI,MAAIC,IAAW,IACXC,IAAU;AACd,QAAMC,IAAS,MAAM;AACjB,IAAIF,MACJA,IAAW,IACX,aAAaG,CAAK,GACdJ,IAAU,KAAGK,EAAA,GACjBP,KAAA,QAAAA;AAAA,EACJ,GAEMM,IAAQN,IAAO,WAAWK,GAAQ,GAAI,IAAI,QAC1CG,IAAS,MAAM;AACjB,IAAAJ,IAAU,IACVN,EAAE,cAAcC;AAAA,EACpB,GACMU,IAAU,MAAM;AAElB,QADAL,IAAU,IACN,KAAK,IAAIN,EAAE,cAAcC,CAAO,KAAK,OAAOE,OAAc,EAAG,QAAOI,EAAA;AACxE,IAAAP,EAAE,iBAAiB,UAAUW,GAAS,EAAE,MAAM,IAAM,GACpDD,EAAA;AAAA,EACJ,GAEMD,IAAQ,MAAM;AAChB,QAAIG,IAAY;AAChB,UAAMC,IAAO,MAAM;AACf,mBAAaC,CAAU,GACvBd,EAAE,oBAAoB,cAAce,CAAK,GACzCf,EAAE,oBAAoB,WAAWe,CAAK,GACtCf,EAAE,oBAAoB,WAAWgB,CAAS,GAC1ChB,EAAE,oBAAoB,UAAUiB,CAAQ;AAAA,IAC5C,GACMF,IAAQ,MAAM;AAChB,UAAI,EAAAT,KAAWN,EAAE,WAAWA,EAAE,eAAeC,IAAU,IACvD;AAAA,YAAIW,OAAe,EAAG,QAAOC,EAAA;AAC7B,QAAAH,EAAA;AAAA;AAAA,IACJ,GAEMM,IAAY,MAAM;AACpB,MAAKV,KAASO,EAAA;AAAA,IAClB,GACMI,IAAW,MAAM;AACnB,MAAAX,IAAU;AAAA,IACd;AACA,IAAAN,EAAE,iBAAiB,cAAce,CAAK,GACtCf,EAAE,iBAAiB,WAAWe,CAAK,GACnCf,EAAE,iBAAiB,WAAWgB,CAAS,GACvChB,EAAE,iBAAiB,UAAUiB,CAAQ;AACrC,UAAMH,IAAa,WAAWD,GAAMT,CAAO;AAAA,EAC/C;AAEA,EAAIJ,EAAE,cAAc,IAAGW,EAAA,MAChB,iBAAiB,kBAAkBA,GAAS,EAAE,MAAM,IAAM;AACrE;"}
|
|
@@ -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-DW5iWvPs.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-LsZPlbYi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segments-LsZPlbYi.js","sources":["../../src/plugins/segments/Segments.ts","../../src/plugins/segments/index.ts"],"sourcesContent":["import type { SegmentItem } from '../../types';\nimport type { SeekBarChapterRange } from '../../controls/SeekBar';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SegmentsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Chapter modunu destekleyen seek bar — parçalara bölme/zaman eşlemesi onda. */\n seekBar: {\n readonly el: HTMLElement;\n setChapters(ranges: SeekBarChapterRange[]): HTMLElement[];\n suppressHoverTime(key: string, suppressed: boolean): void;\n clearChapters(): void;\n ratioAtClientX(clientX: number): number;\n };\n}\n\ninterface Chapter {\n start: number;\n end: number;\n text?: string;\n color?: string;\n}\n\n/**\n * YouTube tarzı bölümler: seek bar parçalara bölünür (SeekBar.setChapters), hover'da bölüm adı + zaman.\n * Zaman çizgisi her zaman tam kaplanır (boşluklar adsız bölüm, son bölüm sona uzar).\n */\nexport class Segments {\n private chapters: Chapter[] = [];\n private chapterEls: HTMLElement[] = [];\n private hoverIndex = -1;\n private readonly tooltipEl: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly timeEl: HTMLDivElement;\n\n constructor(\n private readonly ctx: SegmentsPlayerContext,\n private readonly segments: SegmentItem[]\n ) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'hp-chapter-tooltip';\n this.tooltipEl.setAttribute('part', 'segment-tooltip');\n this.titleEl = document.createElement('div');\n this.titleEl.className = 'hp-chapter-tooltip-title';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-chapter-tooltip-time';\n this.tooltipEl.append(this.titleEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltipEl);\n // Popup zamanı zaten gösteriyor — seek bar'ın varsayılan hover zamanı ikinci kez yazmasın.\n ctx.seekBar.suppressHoverTime('segments', true);\n\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.seekBar.clearChapters();\n this.ctx.seekBar.suppressHoverTime('segments', false);\n this.tooltipEl.remove();\n this.chapterEls = [];\n this.chapters = [];\n }\n\n private readonly onLoadedMetadata = (): void => {\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n this.chapters = buildChapters(this.segments, duration);\n this.chapterEls = this.ctx.seekBar.setChapters(\n this.chapters.map((c) => ({ start: c.start / duration, end: c.end / duration, color: c.color }))\n );\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const duration = this.ctx.videoEl.duration;\n if (!this.chapters.length || !Number.isFinite(duration) || duration <= 0) return;\n\n const time = this.ctx.seekBar.ratioAtClientX(e.clientX) * duration;\n let index = this.chapters.findIndex((c) => time < c.end);\n if (index === -1) index = this.chapters.length - 1;\n this.setHover(index);\n\n const chapter = this.chapters[index]!;\n this.titleEl.textContent = chapter.text ?? '';\n this.titleEl.style.display = chapter.text ? '' : 'none';\n this.timeEl.textContent = formatTime(time);\n\n // sprite-thumbnails önizlemesi de seek bar'ın hemen üstünde açılıyor —\n // görünürse popup onun ÜSTÜNE çıkıyor (üst üste binmesin).\n const sprite = this.ctx.seekBar.el.querySelector<HTMLElement>('[part=\"sprite-tooltip\"]');\n const spriteH = sprite && sprite.hasAttribute('data-visible') && sprite.offsetHeight > 0 ? sprite.offsetHeight + 8 : 0;\n this.tooltipEl.style.bottom = spriteH ? `calc(100% + 6px + ${spriteH}px)` : '';\n // Sprite önizlemesi zamanı zaten kendi altında gösteriyor — aynı zaman iki kez yazılmasın.\n this.timeEl.style.display = spriteH ? 'none' : '';\n\n // Popup imleci ortalar ama seek bar kenarlarından taşmaz.\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n this.tooltipEl.setAttribute('data-visible', '');\n const tipWidth = this.tooltipEl.offsetWidth;\n const x = Math.min(Math.max(e.clientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltipEl.style.transform = `translateX(${x}px)`;\n };\n\n private readonly onPointerLeave = (): void => {\n this.setHover(-1);\n this.tooltipEl.removeAttribute('data-visible');\n };\n\n private setHover(index: number): void {\n if (index === this.hoverIndex) return;\n this.chapterEls[this.hoverIndex]?.removeAttribute('data-hover');\n this.hoverIndex = index;\n this.chapterEls[index]?.setAttribute('data-hover', '');\n }\n}\n\n/** Segmentleri sıralar, boşlukları adsız bölümle doldurur, son bölümü video sonuna uzatır — sonuç 0→duration'ı kesintisiz kaplar. */\nfunction buildChapters(segments: SegmentItem[], duration: number): Chapter[] {\n const sorted = segments\n .filter((s) => Number.isFinite(s.start) && s.start < duration)\n .slice()\n .sort((a, b) => a.start - b.start);\n\n const chapters: Chapter[] = [];\n let cursor = 0;\n for (const seg of sorted) {\n const start = Math.max(seg.start, cursor);\n const end = Math.min(Number.isFinite(seg.end) ? seg.end : duration, duration);\n if (end <= start) continue;\n if (start > cursor) chapters.push({ start: cursor, end: start });\n chapters.push({ start, end, text: seg.text, color: seg.color });\n cursor = end;\n }\n if (!chapters.length) return [];\n if (cursor < duration) chapters[chapters.length - 1]!.end = duration;\n return chapters;\n}\n","import { Segments, type SegmentsPlayerContext } from './Segments';\nimport type { SegmentItem } from '../../types';\n\nexport function installSegments(ctx: SegmentsPlayerContext, items: SegmentItem[]): Segments {\n return new Segments(ctx, items);\n}\n\nexport { Segments };\nexport type { SegmentsPlayerContext };\n"],"names":["Segments","ctx","segments","__publicField","duration","buildChapters","c","e","time","index","chapter","formatTime","sprite","spriteH","barRect","tipWidth","x","_a","_b","sorted","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":";;;;AA2BO,MAAMA,EAAS;AAAA,EAQlB,YACqBC,GACAC,GACnB;AAVM,IAAAC,EAAA,kBAAsB,CAAA;AACtB,IAAAA,EAAA,oBAA4B,CAAA;AAC5B,IAAAA,EAAA,oBAAa;AACJ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAmCA,IAAAA,EAAA,0BAAmB,MAAY;AAC5C,YAAMC,IAAW,KAAK,IAAI,QAAQ;AAClC,MAAI,CAAC,OAAO,SAASA,CAAQ,KAAKA,KAAY,MAE9C,KAAK,WAAWC,EAAc,KAAK,UAAUD,CAAQ,GACrD,KAAK,aAAa,KAAK,IAAI,QAAQ;AAAA,QAC/B,KAAK,SAAS,IAAI,CAACE,OAAO,EAAE,OAAOA,EAAE,QAAQF,GAAU,KAAKE,EAAE,MAAMF,GAAU,OAAOE,EAAE,QAAQ;AAAA,MAAA;AAAA,IAEvG;AAEiB,IAAAH,EAAA,uBAAgB,CAACI,MAA0B;AACxD,YAAMH,IAAW,KAAK,IAAI,QAAQ;AAClC,UAAI,CAAC,KAAK,SAAS,UAAU,CAAC,OAAO,SAASA,CAAQ,KAAKA,KAAY,EAAG;AAE1E,YAAMI,IAAO,KAAK,IAAI,QAAQ,eAAeD,EAAE,OAAO,IAAIH;AAC1D,UAAIK,IAAQ,KAAK,SAAS,UAAU,CAAC,MAAMD,IAAO,EAAE,GAAG;AACvD,MAAIC,MAAU,OAAIA,IAAQ,KAAK,SAAS,SAAS,IACjD,KAAK,SAASA,CAAK;AAEnB,YAAMC,IAAU,KAAK,SAASD,CAAK;AACnC,WAAK,QAAQ,cAAcC,EAAQ,QAAQ,IAC3C,KAAK,QAAQ,MAAM,UAAUA,EAAQ,OAAO,KAAK,QACjD,KAAK,OAAO,cAAcC,EAAWH,CAAI;AAIzC,YAAMI,IAAS,KAAK,IAAI,QAAQ,GAAG,cAA2B,yBAAyB,GACjFC,IAAUD,KAAUA,EAAO,aAAa,cAAc,KAAKA,EAAO,eAAe,IAAIA,EAAO,eAAe,IAAI;AACrH,WAAK,UAAU,MAAM,SAASC,IAAU,qBAAqBA,CAAO,QAAQ,IAE5E,KAAK,OAAO,MAAM,UAAUA,IAAU,SAAS;AAG/C,YAAMC,IAAU,KAAK,IAAI,QAAQ,GAAG,sBAAA;AACpC,WAAK,UAAU,aAAa,gBAAgB,EAAE;AAC9C,YAAMC,IAAW,KAAK,UAAU,aAC1BC,IAAI,KAAK,IAAI,KAAK,IAAIT,EAAE,UAAUO,EAAQ,OAAOC,IAAW,GAAG,CAAC,GAAG,KAAK,IAAID,EAAQ,QAAQC,GAAU,CAAC,CAAC;AAC9G,WAAK,UAAU,MAAM,YAAY,cAAcC,CAAC;AAAA,IACpD;AAEiB,IAAAb,EAAA,wBAAiB,MAAY;AAC1C,WAAK,SAAS,EAAE,GAChB,KAAK,UAAU,gBAAgB,cAAc;AAAA,IACjD;AA3EqB,SAAA,MAAAF,GACA,KAAA,WAAAC,GAEjB,KAAK,YAAY,SAAS,cAAc,KAAK,GAC7C,KAAK,UAAU,YAAY,sBAC3B,KAAK,UAAU,aAAa,QAAQ,iBAAiB,GACrD,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,QAAQ,YAAY,4BACzB,KAAK,SAAS,SAAS,cAAc,KAAK,GAC1C,KAAK,OAAO,YAAY,2BACxB,KAAK,UAAU,OAAO,KAAK,SAAS,KAAK,MAAM,GAC/CD,EAAI,QAAQ,GAAG,YAAY,KAAK,SAAS,GAEzCA,EAAI,QAAQ,kBAAkB,YAAY,EAAI,GAE9CA,EAAI,QAAQ,GAAG,iBAAiB,eAAe,KAAK,aAAa,GACjEA,EAAI,QAAQ,GAAG,iBAAiB,gBAAgB,KAAK,cAAc,GACnEA,EAAI,QAAQ,iBAAiB,kBAAkB,KAAK,gBAAgB,GAChEA,EAAI,QAAQ,cAAc,UAAQ,iBAAA;AAAA,EAC1C;AAAA,EAEA,UAAgB;AACZ,SAAK,IAAI,QAAQ,oBAAoB,kBAAkB,KAAK,gBAAgB,GAC5E,KAAK,IAAI,QAAQ,GAAG,oBAAoB,eAAe,KAAK,aAAa,GACzE,KAAK,IAAI,QAAQ,GAAG,oBAAoB,gBAAgB,KAAK,cAAc,GAC3E,KAAK,IAAI,QAAQ,cAAA,GACjB,KAAK,IAAI,QAAQ,kBAAkB,YAAY,EAAK,GACpD,KAAK,UAAU,OAAA,GACf,KAAK,aAAa,CAAA,GAClB,KAAK,WAAW,CAAA;AAAA,EACpB;AAAA,EA+CQ,SAASQ,GAAqB;;AAClC,IAAIA,MAAU,KAAK,gBACnBQ,IAAA,KAAK,WAAW,KAAK,UAAU,MAA/B,QAAAA,EAAkC,gBAAgB,eAClD,KAAK,aAAaR,IAClBS,IAAA,KAAK,WAAWT,CAAK,MAArB,QAAAS,EAAwB,aAAa,cAAc;AAAA,EACvD;AACJ;AAGA,SAASb,EAAcH,GAAyBE,GAA6B;AACzE,QAAMe,IAASjB,EACV,OAAO,CAAC,MAAM,OAAO,SAAS,EAAE,KAAK,KAAK,EAAE,QAAQE,CAAQ,EAC5D,QACA,KAAK,CAACgB,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK,GAE/BC,IAAsB,CAAA;AAC5B,MAAIC,IAAS;AACb,aAAWC,KAAOL,GAAQ;AACtB,UAAMM,IAAQ,KAAK,IAAID,EAAI,OAAOD,CAAM,GAClCG,IAAM,KAAK,IAAI,OAAO,SAASF,EAAI,GAAG,IAAIA,EAAI,MAAMpB,GAAUA,CAAQ;AAC5E,IAAIsB,KAAOD,MACPA,IAAQF,KAAQD,EAAS,KAAK,EAAE,OAAOC,GAAQ,KAAKE,GAAO,GAC/DH,EAAS,KAAK,EAAE,OAAAG,GAAO,KAAAC,GAAK,MAAMF,EAAI,MAAM,OAAOA,EAAI,MAAA,CAAO,GAC9DD,IAASG;AAAA,EACb;AACA,SAAKJ,EAAS,UACVC,IAASnB,MAAUkB,EAASA,EAAS,SAAS,CAAC,EAAG,MAAMlB,IACrDkB,KAFsB,CAAA;AAGjC;AC1IO,SAASK,EAAgB1B,GAA4B2B,GAAgC;AACxF,SAAO,IAAI5B,EAASC,GAAK2B,CAAK;AAClC;"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var a = (i, t, e) =>
|
|
4
|
-
|
|
1
|
+
var w = Object.defineProperty;
|
|
2
|
+
var S = (i, t, e) => t in i ? w(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e;
|
|
3
|
+
var a = (i, t, e) => S(i, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
import { f as m } from "./trackingPixel-D2wxdCEz.js";
|
|
5
|
+
const A = 5e3, T = 96, k = 3500, x = {
|
|
5
6
|
accent: "--hp-color-accent",
|
|
6
7
|
onAccent: "--hp-color-on-accent",
|
|
7
8
|
surface: "--hp-color-surface",
|
|
8
9
|
onSurface: "--hp-color-on-surface"
|
|
9
|
-
},
|
|
10
|
-
function
|
|
10
|
+
}, C = ["top-left", "top-right", "bottom-left", "bottom-right"];
|
|
11
|
+
function f(i) {
|
|
11
12
|
if (typeof i != "string" || !i.trim()) return null;
|
|
12
13
|
try {
|
|
13
14
|
const t = new URL(i, document.baseURI);
|
|
@@ -16,56 +17,50 @@ function m(i) {
|
|
|
16
17
|
return null;
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
|
-
function
|
|
20
|
+
function M(i) {
|
|
20
21
|
return typeof i == "string" && i.length < 64 && CSS.supports("color", i) ? i : null;
|
|
21
22
|
}
|
|
22
|
-
function
|
|
23
|
+
function g(i, t, e, o) {
|
|
23
24
|
return typeof i == "number" && Number.isFinite(i) ? Math.min(e, Math.max(t, i)) : o;
|
|
24
25
|
}
|
|
25
|
-
function
|
|
26
|
-
var p, l, n, c, v,
|
|
26
|
+
function L(i) {
|
|
27
|
+
var p, l, n, c, v, y, E, b;
|
|
27
28
|
if (!i || typeof i != "object") return null;
|
|
28
29
|
const t = i;
|
|
29
30
|
if (t.active !== !0 || !t.sponsor || typeof t.sponsor.name != "string" || !t.sponsor.name.trim()) return null;
|
|
30
31
|
const e = Date.now(), o = t.validFrom ? Date.parse(t.validFrom) : NaN, s = t.validUntil ? Date.parse(t.validUntil) : NaN;
|
|
31
32
|
if (Number.isFinite(o) && e < o || Number.isFinite(s) && e > s) return null;
|
|
32
33
|
const r = {};
|
|
33
|
-
for (const d of Object.keys(
|
|
34
|
-
const u =
|
|
34
|
+
for (const d of Object.keys(x)) {
|
|
35
|
+
const u = M((p = t.theme) == null ? void 0 : p[d]);
|
|
35
36
|
u && (r[d] = u);
|
|
36
37
|
}
|
|
37
|
-
const h = (d) => Array.isArray(d) ? d.map(
|
|
38
|
+
const h = (d) => Array.isArray(d) ? d.map(f).filter((u) => !!u).slice(0, 10) : [];
|
|
38
39
|
return {
|
|
39
40
|
active: !0,
|
|
40
41
|
id: typeof t.id == "string" ? t.id.slice(0, 120) : void 0,
|
|
41
42
|
sponsor: {
|
|
42
43
|
name: t.sponsor.name.slice(0, 80),
|
|
43
|
-
logo:
|
|
44
|
-
url:
|
|
44
|
+
logo: f(t.sponsor.logo) ?? void 0,
|
|
45
|
+
url: f(t.sponsor.url) ?? void 0
|
|
45
46
|
},
|
|
46
47
|
theme: r,
|
|
47
48
|
logo: {
|
|
48
|
-
position:
|
|
49
|
-
width:
|
|
50
|
-
opacity:
|
|
49
|
+
position: C.includes((l = t.logo) == null ? void 0 : l.position) ? t.logo.position : "top-left",
|
|
50
|
+
width: g((n = t.logo) == null ? void 0 : n.width, 32, 240, T),
|
|
51
|
+
opacity: g((c = t.logo) == null ? void 0 : c.opacity, 0.2, 1, 0.9),
|
|
51
52
|
label: typeof ((v = t.logo) == null ? void 0 : v.label) == "string" ? t.logo.label.slice(0, 40) : void 0
|
|
52
53
|
},
|
|
53
54
|
intro: t.intro ? {
|
|
54
55
|
text: typeof t.intro.text == "string" ? t.intro.text.slice(0, 120) : void 0,
|
|
55
|
-
durationMs:
|
|
56
|
+
durationMs: g(t.intro.durationMs, 1e3, 15e3, k),
|
|
56
57
|
repeatMinutes: typeof t.intro.repeatMinutes == "number" && t.intro.repeatMinutes > 0 ? Math.min(240, Math.max(1, t.intro.repeatMinutes)) : void 0,
|
|
57
58
|
maxShows: typeof t.intro.maxShows == "number" && t.intro.maxShows >= 1 ? Math.min(100, Math.floor(t.intro.maxShows)) : void 0
|
|
58
59
|
} : void 0,
|
|
59
|
-
tracking: { impression: h((
|
|
60
|
+
tracking: { impression: h((y = t.tracking) == null ? void 0 : y.impression), click: h((E = t.tracking) == null ? void 0 : E.click), intro: h((b = t.tracking) == null ? void 0 : b.intro) }
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
|
-
|
|
63
|
-
for (const t of i ?? []) {
|
|
64
|
-
const e = new Image();
|
|
65
|
-
e.referrerPolicy = "no-referrer-when-downgrade", e.src = t;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
class L {
|
|
63
|
+
class I {
|
|
69
64
|
constructor(t, e) {
|
|
70
65
|
a(this, "options");
|
|
71
66
|
a(this, "config", null);
|
|
@@ -93,7 +88,7 @@ class L {
|
|
|
93
88
|
const t = this.config;
|
|
94
89
|
if (!t) return;
|
|
95
90
|
const e = this.key(t);
|
|
96
|
-
this.impressed.has(e) || (this.impressed.add(e),
|
|
91
|
+
this.impressed.has(e) || (this.impressed.add(e), m((o = t.tracking) == null ? void 0 : o.impression), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorimpression", { detail: { id: t.id, sponsor: t.sponsor.name } }))), t.intro && !this.introCount.has(e) && this.showIntro(t);
|
|
97
92
|
});
|
|
98
93
|
/**
|
|
99
94
|
* intro.repeatMinutes: yalnızca gerçekten izlenirken sayar (oynuyor, sekme önde, reklam yok); süre dolunca giriş
|
|
@@ -141,7 +136,7 @@ class L {
|
|
|
141
136
|
return t.href;
|
|
142
137
|
}
|
|
143
138
|
async load() {
|
|
144
|
-
const t = ++this.requestSeq, e = typeof AbortController < "u" ? new AbortController() : null, o = setTimeout(() => e == null ? void 0 : e.abort(), this.options.timeoutMs ??
|
|
139
|
+
const t = ++this.requestSeq, e = typeof AbortController < "u" ? new AbortController() : null, o = setTimeout(() => e == null ? void 0 : e.abort(), this.options.timeoutMs ?? A);
|
|
145
140
|
let s = "";
|
|
146
141
|
try {
|
|
147
142
|
s = this.buildUrl();
|
|
@@ -149,7 +144,7 @@ class L {
|
|
|
149
144
|
if (!r.ok) throw new Error(`HTTP ${r.status}`);
|
|
150
145
|
const h = await r.json();
|
|
151
146
|
if (this.destroyed || t !== this.requestSeq) return;
|
|
152
|
-
this.apply(
|
|
147
|
+
this.apply(L(h));
|
|
153
148
|
} catch (r) {
|
|
154
149
|
if (this.destroyed || t !== this.requestSeq) return;
|
|
155
150
|
this.ctx.log({ message: `Sponsorship API failed: ${String(r)}`, details: { url: s } });
|
|
@@ -169,7 +164,7 @@ class L {
|
|
|
169
164
|
for (const [o, s] of this.previousTokens)
|
|
170
165
|
s ? e.setProperty(o, s) : e.removeProperty(o);
|
|
171
166
|
if (this.previousTokens.clear(), !!t)
|
|
172
|
-
for (const [o, s] of Object.entries(
|
|
167
|
+
for (const [o, s] of Object.entries(x)) {
|
|
173
168
|
const r = t[o];
|
|
174
169
|
r && (this.previousTokens.set(s, e.getPropertyValue(s)), e.setProperty(s, r));
|
|
175
170
|
}
|
|
@@ -180,9 +175,9 @@ class L {
|
|
|
180
175
|
const t = this.config;
|
|
181
176
|
if (!t || !t.sponsor.logo && !((s = t.logo) != null && s.label)) return;
|
|
182
177
|
const e = t.sponsor.url ? document.createElement("a") : document.createElement("div");
|
|
183
|
-
if (e.className = "hp-sponsor-logo", e.setAttribute("part", "sponsor-logo"), e.setAttribute("data-position", ((r = t.logo) == null ? void 0 : r.position) ?? "top-left"), e.style.setProperty("--hp-sponsor-logo-w", `${((h = t.logo) == null ? void 0 : h.width) ??
|
|
178
|
+
if (e.className = "hp-sponsor-logo", e.setAttribute("part", "sponsor-logo"), e.setAttribute("data-position", ((r = t.logo) == null ? void 0 : r.position) ?? "top-left"), e.style.setProperty("--hp-sponsor-logo-w", `${((h = t.logo) == null ? void 0 : h.width) ?? T}px`), e.style.opacity = String(((p = t.logo) == null ? void 0 : p.opacity) ?? 0.9), e instanceof HTMLAnchorElement && (e.href = t.sponsor.url, e.target = "_blank", e.rel = "noopener sponsored", e.addEventListener("click", (n) => {
|
|
184
179
|
var c;
|
|
185
|
-
n.stopPropagation(),
|
|
180
|
+
n.stopPropagation(), m((c = t.tracking) == null ? void 0 : c.click), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorclick", { detail: { id: t.id, sponsor: t.sponsor.name } }));
|
|
186
181
|
})), e.setAttribute("aria-label", t.sponsor.name), t.sponsor.logo) {
|
|
187
182
|
const n = document.createElement("img");
|
|
188
183
|
n.src = t.sponsor.logo, n.alt = t.sponsor.name, n.decoding = "async", n.addEventListener("error", () => n.remove()), e.appendChild(n);
|
|
@@ -216,7 +211,7 @@ class L {
|
|
|
216
211
|
showIntro(t) {
|
|
217
212
|
var h, p, l, n;
|
|
218
213
|
const e = this.key(t), o = (this.introCount.get(e) ?? 0) + 1;
|
|
219
|
-
this.introCount.set(e, o), this.watchedSinceIntro = 0,
|
|
214
|
+
this.introCount.set(e, o), this.watchedSinceIntro = 0, m((h = t.tracking) == null ? void 0 : h.intro), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorintro", { detail: { id: t.id, sponsor: t.sponsor.name, count: o } })), this.introTimer && clearTimeout(this.introTimer), (p = this.introEl) == null || p.remove();
|
|
220
215
|
const s = document.createElement("div");
|
|
221
216
|
if (s.className = "hp-sponsor-intro", s.setAttribute("part", "sponsor-intro"), s.setAttribute("role", "status"), t.sponsor.logo) {
|
|
222
217
|
const c = document.createElement("img");
|
|
@@ -227,19 +222,19 @@ class L {
|
|
|
227
222
|
s.setAttribute("data-leaving", ""), this.ctx.hostEl.removeAttribute("data-sponsor-intro"), this.introTimer = setTimeout(() => {
|
|
228
223
|
s.remove(), this.introEl === s && (this.introEl = null);
|
|
229
224
|
}, 400);
|
|
230
|
-
}, ((n = t.intro) == null ? void 0 : n.durationMs) ??
|
|
225
|
+
}, ((n = t.intro) == null ? void 0 : n.durationMs) ?? k);
|
|
231
226
|
}
|
|
232
227
|
destroy() {
|
|
233
228
|
var t, e, o;
|
|
234
229
|
this.destroyed = !0, clearInterval(this.tickTimer), (t = this.resizeObserver) == null || t.disconnect(), this.refreshTimer && clearInterval(this.refreshTimer), this.introTimer && clearTimeout(this.introTimer), this.ctx.videoEl.removeEventListener("play", this.onPlay), this.ctx.hostEl.removeEventListener("hp:adstart", this.onAdStart), this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.applyTheme(null), (e = this.logoEl) == null || e.remove(), (o = this.introEl) == null || o.remove(), this.ctx.hostEl.removeAttribute("data-sponsored"), this.ctx.hostEl.removeAttribute("data-sponsor-hidden"), this.ctx.hostEl.removeAttribute("data-sponsor-intro");
|
|
235
230
|
}
|
|
236
231
|
}
|
|
237
|
-
function
|
|
238
|
-
return new
|
|
232
|
+
function N(i, t) {
|
|
233
|
+
return new I(i, t);
|
|
239
234
|
}
|
|
240
235
|
export {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
236
|
+
I as SponsorshipLayer,
|
|
237
|
+
N as installSponsorship,
|
|
238
|
+
L as normalizeSponsorship
|
|
244
239
|
};
|
|
245
|
-
//# sourceMappingURL=
|
|
240
|
+
//# sourceMappingURL=sponsorship-BT21uwN5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sponsorship-BT21uwN5.js","sources":["../../src/plugins/sponsorship/SponsorshipLayer.ts","../../src/plugins/sponsorship/index.ts"],"sourcesContent":["import type { SponsorshipConfig, SponsorshipOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { firePixels as fire } from '../shared/trackingPixel';\n\nexport interface SponsorshipContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Logo ve giriş kartının ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; fatal?: boolean; details?: Record<string, string | number | boolean | undefined> }): void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst DEFAULT_LOGO_WIDTH = 96;\nconst DEFAULT_INTRO_MS = 3500;\n/** API'den gelen tema değerleri → player'ın CSS değişkenleri. */\nconst THEME_TOKENS: Record<keyof NonNullable<SponsorshipConfig['theme']>, string> = {\n accent: '--hp-color-accent',\n onAccent: '--hp-color-on-accent',\n surface: '--hp-color-surface',\n onSurface: '--hp-color-on-surface',\n};\nconst POSITIONS = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n\n/** Yalnızca http(s) ya da göreli adresler — `javascript:` / `data:` gibi şemalar reddedilir. */\nfunction safeUrl(value: unknown): string | null {\n if (typeof value !== 'string' || !value.trim()) return null;\n try {\n const u = new URL(value, document.baseURI);\n return u.protocol === 'https:' || u.protocol === 'http:' ? u.href : null;\n } catch {\n return null;\n }\n}\n\nfunction safeColor(value: unknown): string | null {\n return typeof value === 'string' && value.length < 64 && CSS.supports('color', value) ? value : null;\n}\n\nfunction clamp(n: unknown, min: number, max: number, fallback: number): number {\n return typeof n === 'number' && Number.isFinite(n) ? Math.min(max, Math.max(min, n)) : fallback;\n}\n\n/** API yanıtını doğrular, geçersiz alanları atar; katman kapalıysa null. */\nexport function normalizeSponsorship(raw: unknown): SponsorshipConfig | null {\n if (!raw || typeof raw !== 'object') return null;\n const r = raw as Partial<SponsorshipConfig>;\n if (r.active !== true || !r.sponsor || typeof r.sponsor.name !== 'string' || !r.sponsor.name.trim()) return null;\n const now = Date.now();\n const from = r.validFrom ? Date.parse(r.validFrom) : NaN;\n const until = r.validUntil ? Date.parse(r.validUntil) : NaN;\n if ((Number.isFinite(from) && now < from) || (Number.isFinite(until) && now > until)) return null;\n const theme: NonNullable<SponsorshipConfig['theme']> = {};\n for (const key of Object.keys(THEME_TOKENS) as Array<keyof typeof THEME_TOKENS>) {\n const c = safeColor(r.theme?.[key]);\n if (c) theme[key] = c;\n }\n const urls = (list: unknown): string[] => (Array.isArray(list) ? list.map(safeUrl).filter((u): u is string => !!u).slice(0, 10) : []);\n return {\n active: true,\n id: typeof r.id === 'string' ? r.id.slice(0, 120) : undefined,\n sponsor: {\n name: r.sponsor.name.slice(0, 80),\n logo: safeUrl(r.sponsor.logo) ?? undefined,\n url: safeUrl(r.sponsor.url) ?? undefined,\n },\n theme,\n logo: {\n position: POSITIONS.includes(r.logo?.position as (typeof POSITIONS)[number]) ? r.logo!.position : 'top-left',\n width: clamp(r.logo?.width, 32, 240, DEFAULT_LOGO_WIDTH),\n opacity: clamp(r.logo?.opacity, 0.2, 1, 0.9),\n label: typeof r.logo?.label === 'string' ? r.logo.label.slice(0, 40) : undefined,\n },\n intro: r.intro\n ? {\n text: typeof r.intro.text === 'string' ? r.intro.text.slice(0, 120) : undefined,\n durationMs: clamp(r.intro.durationMs, 1000, 15000, DEFAULT_INTRO_MS),\n repeatMinutes: typeof r.intro.repeatMinutes === 'number' && r.intro.repeatMinutes > 0 ? Math.min(240, Math.max(1, r.intro.repeatMinutes)) : undefined,\n maxShows: typeof r.intro.maxShows === 'number' && r.intro.maxShows >= 1 ? Math.min(100, Math.floor(r.intro.maxShows)) : undefined,\n }\n : undefined,\n tracking: { impression: urls(r.tracking?.impression), click: urls(r.tracking?.click), intro: urls(r.tracking?.intro) },\n };\n}\n\n\n/**\n * Sponsorluk katmanı: `endpoint`'ten JSON çeker (SponsorshipConfig), player renklerini değiştirir, köşeye logo koyar,\n * oynatma başlarken \"X sunar\" kartını gösterir. Canlıda `refreshSeconds` ile kampanya değişimi izlenir. API hatasında\n * son geçerli ayar korunur; hiç alınamadıysa katman kapalı kalır — player normal çalışır.\n */\nexport class SponsorshipLayer {\n private options: SponsorshipOptions;\n private config: SponsorshipConfig | null = null;\n private logoEl: HTMLAnchorElement | HTMLDivElement | null = null;\n private introEl: HTMLDivElement | null = null;\n private introTimer: ReturnType<typeof setTimeout> | null = null;\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n /** Player boyutu / kontrol düzeni değişince logo kontrollerin üstüne binmesin diye yeniden konumlanır. */\n private readonly resizeObserver: ResizeObserver | null;\n /** Uygulanan tema değişkenlerinin önceki satır içi değerleri — katman kalkınca geri yüklenir. */\n private previousTokens = new Map<string, string>();\n /** Gösterim pikseli kampanya başına bir kez. */\n private impressed = new Set<string>();\n /** Kampanya başına giriş gösterim sayısı. */\n private introCount = new Map<string, number>();\n /** Son girişten bu yana gerçek izleme süresi (ms) — intro.repeatMinutes için. */\n private watchedSinceIntro = 0;\n private lastTick = 0;\n private readonly tickTimer: ReturnType<typeof setInterval>;\n private destroyed = false;\n private requestSeq = 0;\n\n constructor(\n private readonly ctx: SponsorshipContext,\n options: SponsorshipOptions\n ) {\n this.options = options;\n ctx.videoEl.addEventListener('play', this.onPlay);\n ctx.hostEl.addEventListener('hp:adstart', this.onAdStart);\n ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n this.lastTick = performance.now();\n this.tickTimer = setInterval(this.tick, 1000);\n this.resizeObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(() => this.positionLogo()) : null;\n this.resizeObserver?.observe(ctx.overlayEl);\n const topBar = ctx.overlayEl.querySelector('.hp-top-bar');\n if (topBar) this.resizeObserver?.observe(topBar);\n void this.load();\n this.scheduleRefresh();\n }\n\n update(options: SponsorshipOptions): void {\n const changed = options.endpoint !== this.options.endpoint || JSON.stringify(options.params) !== JSON.stringify(this.options.params);\n const refreshChanged = options.refreshSeconds !== this.options.refreshSeconds;\n this.options = options;\n if (changed) void this.load();\n if (refreshChanged) this.scheduleRefresh();\n }\n\n /** Şu an uygulanan kampanya (yoksa null). */\n get current(): SponsorshipConfig | null {\n return this.config;\n }\n\n private scheduleRefresh(): void {\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n const s = this.options.refreshSeconds;\n if (typeof s === 'number' && s >= 10) this.refreshTimer = setInterval(() => void this.load(), s * 1000);\n }\n\n private buildUrl(): string {\n const u = new URL(this.options.endpoint, document.baseURI);\n for (const [k, v] of Object.entries(this.options.params ?? {})) u.searchParams.set(k, v);\n return u.href;\n }\n\n private async load(): Promise<void> {\n const seq = ++this.requestSeq;\n const ctrl = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = setTimeout(() => ctrl?.abort(), this.options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n let url = '';\n try {\n url = this.buildUrl();\n const res = await fetch(url, { ...this.options.fetchInit, signal: ctrl?.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json: unknown = await res.json();\n if (this.destroyed || seq !== this.requestSeq) return; // daha yeni bir istek var\n this.apply(normalizeSponsorship(json));\n } catch (err) {\n if (this.destroyed || seq !== this.requestSeq) return;\n // Son geçerli kampanya korunur — geçici API hatası katmanı söndürmesin.\n this.ctx.log({ message: `Sponsorship API failed: ${String(err)}`, details: { url } });\n } finally {\n clearTimeout(timer);\n }\n }\n\n private apply(config: SponsorshipConfig | null): void {\n const prevKey = this.key(this.config);\n this.config = config;\n this.applyTheme(config?.theme ?? null);\n this.renderLogo();\n this.ctx.hostEl.toggleAttribute('data-sponsored', !!config);\n if (this.key(config) !== prevKey) {\n this.watchedSinceIntro = 0;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorship', { detail: { config } }));\n // Yeni kampanya oynarken geldiyse (canlı yenileme) girişi hemen göster.\n if (config && !this.ctx.videoEl.paused) this.onPlay();\n }\n }\n\n private key(c: SponsorshipConfig | null): string {\n return c ? c.id || c.sponsor.name : '';\n }\n\n private applyTheme(theme: SponsorshipConfig['theme'] | null): void {\n const style = this.ctx.hostEl.style;\n // Önce önceki kampanyanın değerlerini geri al.\n for (const [prop, value] of this.previousTokens) {\n if (value) style.setProperty(prop, value);\n else style.removeProperty(prop);\n }\n this.previousTokens.clear();\n if (!theme) return;\n for (const [key, prop] of Object.entries(THEME_TOKENS) as Array<[keyof typeof THEME_TOKENS, string]>) {\n const value = theme[key];\n if (!value) continue;\n this.previousTokens.set(prop, style.getPropertyValue(prop));\n style.setProperty(prop, value);\n }\n }\n\n private renderLogo(): void {\n this.logoEl?.remove();\n this.logoEl = null;\n const c = this.config;\n if (!c || (!c.sponsor.logo && !c.logo?.label)) return;\n const el = c.sponsor.url ? document.createElement('a') : document.createElement('div');\n el.className = 'hp-sponsor-logo';\n el.setAttribute('part', 'sponsor-logo');\n el.setAttribute('data-position', c.logo?.position ?? 'top-left');\n el.style.setProperty('--hp-sponsor-logo-w', `${c.logo?.width ?? DEFAULT_LOGO_WIDTH}px`);\n el.style.opacity = String(c.logo?.opacity ?? 0.9);\n if (el instanceof HTMLAnchorElement) {\n el.href = c.sponsor.url!;\n el.target = '_blank';\n el.rel = 'noopener sponsored';\n el.addEventListener('click', (e) => {\n e.stopPropagation();\n fire(c.tracking?.click);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorclick', { detail: { id: c.id, sponsor: c.sponsor.name } }));\n });\n }\n el.setAttribute('aria-label', c.sponsor.name);\n if (c.sponsor.logo) {\n const img = document.createElement('img');\n img.src = c.sponsor.logo;\n img.alt = c.sponsor.name;\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n // Etiket logonun altında, ortalı.\n if (c.logo?.label) {\n const label = document.createElement('span');\n label.className = 'hp-sponsor-label';\n label.textContent = c.logo.label;\n el.appendChild(label);\n }\n for (const t of ['pointerdown', 'dblclick'] as const) el.addEventListener(t, (e) => e.stopPropagation());\n this.ctx.overlayEl.appendChild(el);\n this.logoEl = el;\n this.positionLogo();\n }\n\n /**\n * Logo kontrollerin üstüne binmesin: sağ üstte (dar player'da ayarlar / PiP oraya taşınır) üst çubuğun soluna,\n * altta seek bar'ın hemen üstüne yerleşir. Dar player'da logo en fazla 48 px.\n */\n private positionLogo(): void {\n const el = this.logoEl;\n if (!el) return;\n const area = this.ctx.overlayEl;\n const compact = area.hasAttribute('data-compact');\n const position = el.getAttribute('data-position');\n // Kontroller görünürken kaçınılacak mesafe CSS değişkenine yazılır; kontroller gizliyken CSS logoyu köşeye\n // alır (bkz. :host([data-chrome-hidden])) ve geçiş animasyonlu olur.\n el.style.removeProperty('--hp-sponsor-avoid-right');\n el.style.removeProperty('--hp-sponsor-avoid-bottom');\n el.toggleAttribute('data-compact', compact);\n const a = area.getBoundingClientRect();\n if (position === 'top-right') {\n const bar = area.querySelector('.hp-top-bar')?.getBoundingClientRect();\n if (bar && bar.width > 0) el.style.setProperty('--hp-sponsor-avoid-right', `${Math.round(a.right - bar.left + 8)}px`);\n } else if (position === 'bottom-left' || position === 'bottom-right') {\n const seek = area.querySelector('[part=\"seek-bar\"]')?.getBoundingClientRect();\n if (seek && seek.height > 0) el.style.setProperty('--hp-sponsor-avoid-bottom', `${Math.round(a.bottom - seek.top + 6)}px`);\n }\n }\n\n /** Oynatma başladı: kampanya başına bir kez gösterim pikseli + \"X sunar\" kartı. */\n private readonly onPlay = (): void => {\n const c = this.config;\n if (!c) return;\n const key = this.key(c);\n if (!this.impressed.has(key)) {\n this.impressed.add(key);\n fire(c.tracking?.impression);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorimpression', { detail: { id: c.id, sponsor: c.sponsor.name } }));\n }\n if (c.intro && !this.introCount.has(key)) this.showIntro(c);\n };\n\n /**\n * intro.repeatMinutes: yalnızca gerçekten izlenirken sayar (oynuyor, sekme önde, reklam yok); süre dolunca giriş\n * tekrar gösterilir — maxShows'a kadar.\n */\n private readonly tick = (): void => {\n const now = performance.now();\n // Sekme uyuyunca setInterval seyrekleşir — tek seferde en fazla 2 sn sayılır.\n const delta = Math.min(2000, Math.max(0, now - this.lastTick));\n this.lastTick = now;\n const c = this.config;\n const repeat = c?.intro?.repeatMinutes;\n if (!c || !repeat) return;\n const watching =\n !this.ctx.videoEl.paused && !this.ctx.videoEl.ended && !document.hidden && !this.ctx.hostEl.hasAttribute('data-sponsor-hidden');\n if (!watching || !this.introCount.has(this.key(c))) return;\n this.watchedSinceIntro += delta;\n if (this.watchedSinceIntro < repeat * 60_000) return;\n const max = c.intro?.maxShows;\n if (max && (this.introCount.get(this.key(c)) ?? 0) >= max) return;\n this.showIntro(c);\n };\n\n private showIntro(c: SponsorshipConfig): void {\n const key = this.key(c);\n const count = (this.introCount.get(key) ?? 0) + 1;\n this.introCount.set(key, count);\n this.watchedSinceIntro = 0;\n fire(c.tracking?.intro);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sponsorintro', { detail: { id: c.id, sponsor: c.sponsor.name, count } }));\n if (this.introTimer) clearTimeout(this.introTimer);\n this.introEl?.remove();\n const el = document.createElement('div');\n el.className = 'hp-sponsor-intro';\n el.setAttribute('part', 'sponsor-intro');\n el.setAttribute('role', 'status');\n if (c.sponsor.logo) {\n const img = document.createElement('img');\n img.src = c.sponsor.logo;\n img.alt = '';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n const text = document.createElement('span');\n text.textContent = c.intro?.text || this.ctx.i18n.sponsorPresents.replace('{name}', c.sponsor.name);\n el.appendChild(text);\n this.ctx.overlayEl.appendChild(el);\n this.introEl = el;\n // Giriş kartı sponsoru zaten gösteriyor — kart görünürken köşe logosu gizli (küçük player'da üst üste binmesin).\n this.ctx.hostEl.setAttribute('data-sponsor-intro', '');\n this.introTimer = setTimeout(() => {\n el.setAttribute('data-leaving', '');\n this.ctx.hostEl.removeAttribute('data-sponsor-intro');\n this.introTimer = setTimeout(() => {\n el.remove();\n if (this.introEl === el) this.introEl = null;\n }, 400);\n }, c.intro?.durationMs ?? DEFAULT_INTRO_MS);\n }\n\n /** Lineer reklam sırasında logo / giriş gizlenir (reklamın üstüne binmesin). */\n private readonly onAdStart = (e: Event): void => {\n if ((e as CustomEvent<{ linear?: boolean }>).detail?.linear === false) return;\n this.ctx.hostEl.setAttribute('data-sponsor-hidden', '');\n };\n\n private readonly onAdEnd = (e: Event): void => {\n if ((e as CustomEvent<{ linear?: boolean }>).detail?.linear === false) return;\n this.ctx.hostEl.removeAttribute('data-sponsor-hidden');\n };\n\n destroy(): void {\n this.destroyed = true;\n clearInterval(this.tickTimer);\n this.resizeObserver?.disconnect();\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n if (this.introTimer) clearTimeout(this.introTimer);\n this.ctx.videoEl.removeEventListener('play', this.onPlay);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.onAdStart);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.applyTheme(null);\n this.logoEl?.remove();\n this.introEl?.remove();\n this.ctx.hostEl.removeAttribute('data-sponsored');\n this.ctx.hostEl.removeAttribute('data-sponsor-hidden');\n this.ctx.hostEl.removeAttribute('data-sponsor-intro');\n }\n}\n","import { SponsorshipLayer, normalizeSponsorship, type SponsorshipContext } from './SponsorshipLayer';\nimport type { SponsorshipOptions } from '../../types';\n\n/** Sponsorluk katmanını kurar (ayarları `endpoint`'ten alır). */\nexport function installSponsorship(ctx: SponsorshipContext, options: SponsorshipOptions): SponsorshipLayer {\n return new SponsorshipLayer(ctx, options);\n}\n\nexport { SponsorshipLayer, normalizeSponsorship };\nexport type { SponsorshipContext };\n"],"names":["DEFAULT_TIMEOUT_MS","DEFAULT_LOGO_WIDTH","DEFAULT_INTRO_MS","THEME_TOKENS","POSITIONS","safeUrl","value","u","safeColor","clamp","n","min","max","fallback","normalizeSponsorship","raw","r","now","from","until","theme","key","c","_a","urls","list","_b","_c","_d","_e","_f","_g","_h","SponsorshipLayer","ctx","options","__publicField","fire","delta","repeat","e","topBar","changed","refreshChanged","s","k","v","seq","ctrl","timer","url","res","json","err","config","prevKey","style","prop","el","img","label","t","area","compact","position","a","bar","seek","count","text","installSponsorship"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var E = Object.defineProperty;
|
|
2
2
|
var y = (a, t, e) => t in a ? E(a, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[t] = e;
|
|
3
3
|
var l = (a, t, e) => y(a, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { f as x } from "./
|
|
4
|
+
import { f as x } from "./player-DW5iWvPs.js";
|
|
5
5
|
const w = 8, f = /%(0(\d+))?d/;
|
|
6
6
|
class M {
|
|
7
7
|
constructor(t, e) {
|
|
@@ -222,4 +222,4 @@ export {
|
|
|
222
222
|
M as SpriteThumbnails,
|
|
223
223
|
I as installSpriteThumbnails
|
|
224
224
|
};
|
|
225
|
-
//# sourceMappingURL=
|
|
225
|
+
//# sourceMappingURL=spriteThumbnails-BQkEBRu-.js.map
|