@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 @@
|
|
|
1
|
+
{"version":3,"file":"segments-C2HKU6XK.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":"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"}
|
|
@@ -23,7 +23,7 @@ function f(i, t, e, o) {
|
|
|
23
23
|
return typeof i == "number" && Number.isFinite(i) ? Math.min(e, Math.max(t, i)) : o;
|
|
24
24
|
}
|
|
25
25
|
function A(i) {
|
|
26
|
-
var
|
|
26
|
+
var p, l, n, c, v, E, y, b;
|
|
27
27
|
if (!i || typeof i != "object") return null;
|
|
28
28
|
const t = i;
|
|
29
29
|
if (t.active !== !0 || !t.sponsor || typeof t.sponsor.name != "string" || !t.sponsor.name.trim()) return null;
|
|
@@ -31,7 +31,7 @@ function A(i) {
|
|
|
31
31
|
if (Number.isFinite(o) && e < o || Number.isFinite(s) && e > s) return null;
|
|
32
32
|
const r = {};
|
|
33
33
|
for (const d of Object.keys(T)) {
|
|
34
|
-
const u = x((
|
|
34
|
+
const u = x((p = t.theme) == null ? void 0 : p[d]);
|
|
35
35
|
u && (r[d] = u);
|
|
36
36
|
}
|
|
37
37
|
const h = (d) => Array.isArray(d) ? d.map(m).filter((u) => !!u).slice(0, 10) : [];
|
|
@@ -47,7 +47,7 @@ function A(i) {
|
|
|
47
47
|
logo: {
|
|
48
48
|
position: S.includes((l = t.logo) == null ? void 0 : l.position) ? t.logo.position : "top-left",
|
|
49
49
|
width: f((n = t.logo) == null ? void 0 : n.width, 32, 240, 96),
|
|
50
|
-
opacity: f((
|
|
50
|
+
opacity: f((c = t.logo) == null ? void 0 : c.opacity, 0.2, 1, 0.9),
|
|
51
51
|
label: typeof ((v = t.logo) == null ? void 0 : v.label) == "string" ? t.logo.label.slice(0, 40) : void 0
|
|
52
52
|
},
|
|
53
53
|
intro: t.intro ? {
|
|
@@ -100,10 +100,10 @@ class L {
|
|
|
100
100
|
* tekrar gösterilir — maxShows'a kadar.
|
|
101
101
|
*/
|
|
102
102
|
a(this, "tick", () => {
|
|
103
|
-
var
|
|
103
|
+
var p, l;
|
|
104
104
|
const t = performance.now(), e = Math.min(2e3, Math.max(0, t - this.lastTick));
|
|
105
105
|
this.lastTick = t;
|
|
106
|
-
const o = this.config, s = (
|
|
106
|
+
const o = this.config, s = (p = o == null ? void 0 : o.intro) == null ? void 0 : p.repeatMinutes;
|
|
107
107
|
if (!o || !s || !(!this.ctx.videoEl.paused && !this.ctx.videoEl.ended && !document.hidden && !this.ctx.hostEl.hasAttribute("data-sponsor-hidden")) || !this.introCount.has(this.key(o)) || (this.watchedSinceIntro += e, this.watchedSinceIntro < s * 6e4)) return;
|
|
108
108
|
const h = (l = o.intro) == null ? void 0 : l.maxShows;
|
|
109
109
|
h && (this.introCount.get(this.key(o)) ?? 0) >= h || this.showIntro(o);
|
|
@@ -175,14 +175,14 @@ class L {
|
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
renderLogo() {
|
|
178
|
-
var o, s, r, h,
|
|
178
|
+
var o, s, r, h, p, l;
|
|
179
179
|
(o = this.logoEl) == null || o.remove(), this.logoEl = null;
|
|
180
180
|
const t = this.config;
|
|
181
181
|
if (!t || !t.sponsor.logo && !((s = t.logo) != null && s.label)) return;
|
|
182
182
|
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) ?? 96}px`), e.style.opacity = String(((
|
|
184
|
-
var
|
|
185
|
-
n.stopPropagation(), g((
|
|
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) ?? 96}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
|
+
var c;
|
|
185
|
+
n.stopPropagation(), g((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
186
|
})), e.setAttribute("aria-label", t.sponsor.name), t.sponsor.logo) {
|
|
187
187
|
const n = document.createElement("img");
|
|
188
188
|
n.src = t.sponsor.logo, n.alt = t.sponsor.name, n.decoding = "async", n.addEventListener("error", () => n.remove()), e.appendChild(n);
|
|
@@ -191,7 +191,7 @@ class L {
|
|
|
191
191
|
const n = document.createElement("span");
|
|
192
192
|
n.className = "hp-sponsor-label", n.textContent = t.logo.label, e.appendChild(n);
|
|
193
193
|
}
|
|
194
|
-
for (const n of ["pointerdown", "dblclick"]) e.addEventListener(n, (
|
|
194
|
+
for (const n of ["pointerdown", "dblclick"]) e.addEventListener(n, (c) => c.stopPropagation());
|
|
195
195
|
this.ctx.overlayEl.appendChild(e), this.logoEl = e, this.positionLogo();
|
|
196
196
|
}
|
|
197
197
|
/**
|
|
@@ -199,28 +199,28 @@ class L {
|
|
|
199
199
|
* altta seek bar'ın hemen üstüne yerleşir. Dar player'da logo en fazla 48 px.
|
|
200
200
|
*/
|
|
201
201
|
positionLogo() {
|
|
202
|
-
var h,
|
|
202
|
+
var h, p;
|
|
203
203
|
const t = this.logoEl;
|
|
204
204
|
if (!t) return;
|
|
205
205
|
const e = this.ctx.overlayEl, o = e.hasAttribute("data-compact"), s = t.getAttribute("data-position");
|
|
206
|
-
t.style.removeProperty("right"), t.style.removeProperty("bottom"), t.toggleAttribute("data-compact", o);
|
|
206
|
+
t.style.removeProperty("--hp-sponsor-avoid-right"), t.style.removeProperty("--hp-sponsor-avoid-bottom"), t.toggleAttribute("data-compact", o);
|
|
207
207
|
const r = e.getBoundingClientRect();
|
|
208
208
|
if (s === "top-right") {
|
|
209
209
|
const l = (h = e.querySelector(".hp-top-bar")) == null ? void 0 : h.getBoundingClientRect();
|
|
210
|
-
l && l.width > 0 &&
|
|
210
|
+
l && l.width > 0 && t.style.setProperty("--hp-sponsor-avoid-right", `${Math.round(r.right - l.left + 8)}px`);
|
|
211
211
|
} else if (s === "bottom-left" || s === "bottom-right") {
|
|
212
|
-
const l = (
|
|
213
|
-
l && l.height > 0 &&
|
|
212
|
+
const l = (p = e.querySelector('[part="seek-bar"]')) == null ? void 0 : p.getBoundingClientRect();
|
|
213
|
+
l && l.height > 0 && t.style.setProperty("--hp-sponsor-avoid-bottom", `${Math.round(r.bottom - l.top + 6)}px`);
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
showIntro(t) {
|
|
217
|
-
var h,
|
|
217
|
+
var h, p, l, n;
|
|
218
218
|
const e = this.key(t), o = (this.introCount.get(e) ?? 0) + 1;
|
|
219
|
-
this.introCount.set(e, o), this.watchedSinceIntro = 0, g((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), (
|
|
219
|
+
this.introCount.set(e, o), this.watchedSinceIntro = 0, g((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
220
|
const s = document.createElement("div");
|
|
221
221
|
if (s.className = "hp-sponsor-intro", s.setAttribute("part", "sponsor-intro"), s.setAttribute("role", "status"), t.sponsor.logo) {
|
|
222
|
-
const
|
|
223
|
-
|
|
222
|
+
const c = document.createElement("img");
|
|
223
|
+
c.src = t.sponsor.logo, c.alt = "", c.addEventListener("error", () => c.remove()), s.appendChild(c);
|
|
224
224
|
}
|
|
225
225
|
const r = document.createElement("span");
|
|
226
226
|
r.textContent = ((l = t.intro) == null ? void 0 : l.text) || this.ctx.i18n.sponsorPresents.replace("{name}", t.sponsor.name), s.appendChild(r), this.ctx.overlayEl.appendChild(s), this.introEl = s, this.ctx.hostEl.setAttribute("data-sponsor-intro", ""), this.introTimer = setTimeout(() => {
|
|
@@ -242,4 +242,4 @@ export {
|
|
|
242
242
|
I as installSponsorship,
|
|
243
243
|
A as normalizeSponsorship
|
|
244
244
|
};
|
|
245
|
-
//# sourceMappingURL=
|
|
245
|
+
//# sourceMappingURL=sponsorship-DyFwGmEb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sponsorship-DyFwGmEb.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';\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/** Takip pikseli: yanıtı beklenmeyen GET (img beacon). */\nfunction fire(urls: string[] | undefined): void {\n for (const u of urls ?? []) {\n const img = new Image();\n img.referrerPolicy = 'no-referrer-when-downgrade';\n img.src = u;\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":["THEME_TOKENS","POSITIONS","safeUrl","value","u","safeColor","clamp","n","min","max","fallback","normalizeSponsorship","raw","_a","_b","_c","_d","_e","_f","_g","_h","r","now","from","until","theme","key","c","urls","list","fire","img","SponsorshipLayer","ctx","options","__publicField","delta","repeat","e","topBar","changed","refreshChanged","s","k","v","seq","ctrl","timer","url","res","json","err","config","prevKey","style","prop","el","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-C886oKP-.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-D0NQ5CCp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spriteThumbnails-D0NQ5CCp.js","sources":["../../src/plugins/sprite-thumbnails/SpriteThumbnails.ts","../../src/plugins/sprite-thumbnails/index.ts"],"sourcesContent":["import type { SpriteThumbnailsOptions } from '../../types';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SpriteThumbnailsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Önizlemenin bağlandığı seek bar — zaman eşlemesi (chapter boşlukları dahil) onun `ratioAtClientX`'inden. */\n seekBar: {\n readonly el: HTMLElement;\n ratioAtClientX(clientX: number): number;\n suppressHoverTime(key: string, suppressed: boolean): void;\n };\n /** Responsive ölçekleme için referans genişlik — genelde player/video alanının genişliği. */\n playerWidth(): number;\n}\n\n/** Bir önizleme karesi: hangi görselin hangi dikdörtgeni. */\ninterface Frame {\n url: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\ninterface Sheet {\n img: HTMLImageElement;\n ready: boolean;\n failed: boolean;\n promise: Promise<void>;\n}\n\nexport interface VttCue {\n start: number;\n end: number;\n url: string;\n /** `#xywh` yoksa null → görselin tamamı. */\n rect: { x: number; y: number; w: number; h: number } | null;\n}\n\n/** Aynı anda bellekte (decode edilmiş) tutulan en fazla sheet — uzun videolarda bellek sınırsız büyümesin. */\nconst MAX_CACHED_SHEETS = 8;\n/** Sheet numarası şablonu: `%d` ya da sıfır dolgulu `%03d`. */\nconst SHEET_TEMPLATE = /%(0(\\d+))?d/;\n\n/**\n * Seek bar hover önizlemesi. Kaynak: tek görsel, çok parçalı (%d / %03d şablonu ya da sheets) veya WebVTT (#xywh).\n * sheetDuration verilmezse ilk sheet'in ızgarasından hesaplanır. Kurulumda hiçbir şey indirilmez; yalnızca imlecin\n * altındaki sheet + komşuları yüklenir, decode bitmeden gösterilmez, LRU cache.\n */\nexport class SpriteThumbnails {\n private readonly tooltip: HTMLElement;\n private readonly imageEl: HTMLElement;\n private readonly timeEl: HTMLElement;\n private readonly sheets = new Map<string, Sheet>();\n private vttCues: VttCue[] | null = null;\n private vttLoading: Promise<void> | null = null;\n /** Çok parçalı modda otomatik hesaplanan sheet süresi (ilk sheet yüklenince). */\n private derivedSheetDuration: number | null = null;\n private warmed = false;\n private hovering = false;\n private lastClientX = 0;\n private rafId: number | null = null;\n private destroyed = false;\n\n constructor(\n private readonly ctx: SpriteThumbnailsPlayerContext,\n private readonly options: SpriteThumbnailsOptions\n ) {\n this.tooltip = document.createElement('div');\n this.tooltip.setAttribute('part', 'sprite-tooltip');\n this.tooltip.className = 'hp-sprite-tooltip';\n this.imageEl = document.createElement('div');\n this.imageEl.className = 'hp-sprite-image';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-sprite-time';\n this.tooltip.append(this.imageEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltip);\n // Önizlemenin altında zaman zaten yazıyor — varsayılan hover zamanı ikinci kez göstermesin.\n ctx.seekBar.suppressHoverTime('sprite', true);\n\n ctx.seekBar.el.addEventListener('pointerenter', this.onPointerEnter);\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('play', this.warm);\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n this.ctx.seekBar.el.removeEventListener('pointerenter', this.onPointerEnter);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.videoEl.removeEventListener('play', this.warm);\n this.tooltip.remove();\n this.ctx.seekBar.suppressHoverTime('sprite', false);\n for (const sheet of this.sheets.values()) sheet.img.src = '';\n this.sheets.clear();\n }\n\n // ── olaylar ──\n\n private readonly onPointerEnter = (e: PointerEvent): void => {\n this.hovering = true;\n this.lastClientX = e.clientX;\n this.warm();\n this.scheduleRender();\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n this.hovering = true;\n this.lastClientX = e.clientX;\n this.scheduleRender();\n };\n\n private readonly onPointerLeave = (): void => {\n this.hovering = false;\n this.tooltip.removeAttribute('data-visible');\n };\n\n /** İlk ihtiyaç anında (hover / oynatma) kaynağı hazırla — kurulumda hiçbir şey indirilmiyor. */\n private readonly warm = (): void => {\n if (this.warmed || this.destroyed) return;\n this.warmed = true;\n if (this.options.vtt) {\n void this.loadVtt();\n return;\n }\n const duration = this.ctx.videoEl.duration;\n const t = Number.isFinite(duration) ? this.ctx.videoEl.currentTime : 0;\n // Şablonlu/çok parçalı modda sheet süresi henüz bilinmiyorsa ilk sheet'ten öğrenilecek.\n void this.ensureSheet(this.sheetUrl(this.isMultiSheet() && this.sheetDuration() === null ? 0 : this.sheetIndexAt(t)));\n };\n\n private scheduleRender(): void {\n if (this.rafId !== null) return;\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n this.render();\n });\n }\n\n // ── çizim ──\n\n private render(): void {\n if (!this.hovering || this.destroyed) return;\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n const seconds = this.ctx.seekBar.ratioAtClientX(this.lastClientX) * duration;\n this.timeEl.textContent = formatTime(seconds);\n\n const frame = this.isNetworkEligible() ? this.frameAt(seconds, duration) : null;\n const scale = this.scale();\n if (frame) {\n const sheet = this.sheets.get(frame.url)!;\n const { naturalWidth, naturalHeight } = sheet.img;\n this.imageEl.style.display = '';\n this.imageEl.style.width = `${frame.w * scale}px`;\n this.imageEl.style.height = `${frame.h * scale}px`;\n this.imageEl.style.backgroundImage = `url(\"${frame.url}\")`;\n this.imageEl.style.backgroundSize = `${naturalWidth * scale}px ${naturalHeight * scale}px`;\n this.imageEl.style.backgroundPosition = `${-frame.x * scale}px ${-frame.y * scale}px`;\n } else if (!this.imageEl.style.backgroundImage) {\n // Henüz hiçbir kare yüklenmedi — yalnızca zaman (yükleme bitince yeniden çizilir).\n this.imageEl.style.display = 'none';\n }\n\n // Kenarlarda taşmasın: imleci ortala ama seek bar sınırlarında kal.\n this.tooltip.setAttribute('data-visible', '');\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n const tipWidth = this.tooltip.offsetWidth;\n const x = Math.min(Math.max(this.lastClientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltip.style.transform = `translateX(${x}px)`;\n }\n\n private scale(): number {\n const responsive = this.options.responsive;\n const playerWidth = this.ctx.playerWidth();\n return responsive && playerWidth && playerWidth < responsive ? playerWidth / responsive : 1;\n }\n\n private isNetworkEligible(): boolean {\n const nav = navigator as Navigator & { connection?: { downlink?: number } };\n const downlink = nav.connection?.downlink;\n const anyReady = Array.from(this.sheets.values()).some((s) => s.ready);\n return downlink === undefined || downlink >= (this.options.downlink ?? 2) || anyReady;\n }\n\n // ── kare çözümleme ──\n\n /** Saniyedeki kareyi döner; gereken sheet hazır değilse yüklemeyi başlatıp null döner (yüklenince render tekrar çağrılır). */\n private frameAt(seconds: number, duration: number): Frame | null {\n return this.options.vtt ? this.vttFrameAt(seconds) : this.gridFrameAt(seconds, duration);\n }\n\n private isMultiSheet(): boolean {\n return !!this.options.sheets?.length || SHEET_TEMPLATE.test(this.options.url ?? '');\n }\n\n /** Tek sheet → Infinity (tüm video); çok parçalı → verilen ya da ilk sheet'ten hesaplanan süre; henüz bilinmiyorsa null. */\n private sheetDuration(): number | null {\n if (!this.isMultiSheet()) return Infinity;\n return this.options.sheetDuration ?? this.derivedSheetDuration;\n }\n\n private sheetIndexAt(seconds: number): number {\n const d = this.sheetDuration();\n if (d === null || d === Infinity) return 0;\n // floor (ceil DEĞİL): tam sınırda (ör. 60. sn) bir SONRAKİ sheet'in ilk karesi.\n let index = Math.floor(Math.max(0, seconds) / d);\n if (this.options.sheets?.length) index = Math.min(index, this.options.sheets.length - 1);\n return index;\n }\n\n /** 0 tabanlı sheet index'inden URL. */\n private sheetUrl(index: number): string {\n if (this.options.sheets?.length) return this.options.sheets[Math.min(index, this.options.sheets.length - 1)]!;\n const url = this.options.url ?? '';\n const number = index + (this.options.firstSheetIndex ?? 1);\n return url.replace(SHEET_TEMPLATE, (_m, _p, width?: string) => String(number).padStart(width ? Number(width) : 0, '0'));\n }\n\n private gridFrameAt(seconds: number, duration: number): Frame | null {\n const { width, height } = this.options;\n if (!width || !height) return null;\n const interval = this.options.interval || 1;\n\n const sheetDuration = this.sheetDuration();\n if (sheetDuration === null) {\n // Çok parçalı ama süre bilinmiyor — ilk sheet yüklenince hesaplanacak.\n void this.ensureSheet(this.sheetUrl(0));\n return null;\n }\n\n const lastIndex = sheetDuration === Infinity ? 0 : this.sheetIndexAt(Math.max(0, duration - 0.001));\n const index = Math.min(this.sheetIndexAt(seconds), lastIndex);\n const url = this.sheetUrl(index);\n this.preloadAround(index, lastIndex);\n\n const sheet = this.sheets.get(url);\n if (!sheet?.ready) {\n void this.ensureSheet(url);\n return null;\n }\n this.touch(url);\n\n // Her sheet'in KENDİ boyutu (son sheet daha kısa olabilir).\n const columns = Math.max(1, Math.floor(sheet.img.naturalWidth / width));\n const rows = Math.max(1, Math.floor(sheet.img.naturalHeight / height));\n const local = sheetDuration === Infinity ? seconds : seconds - index * sheetDuration;\n const frameIndex = Math.min(Math.max(0, Math.floor(local / interval)), columns * rows - 1);\n return { url, x: (frameIndex % columns) * width, y: Math.floor(frameIndex / columns) * height, w: width, h: height };\n }\n\n private preloadAround(index: number, lastIndex: number): void {\n const n = this.options.preloadSheets ?? 1;\n for (let d = 1; d <= n; d++) {\n if (index + d <= lastIndex) void this.ensureSheet(this.sheetUrl(index + d));\n if (index - d >= 0) void this.ensureSheet(this.sheetUrl(index - d));\n }\n }\n\n private vttFrameAt(seconds: number): Frame | null {\n if (!this.vttCues) {\n void this.loadVtt();\n return null;\n }\n const cues = this.vttCues;\n if (!cues.length) return null;\n // İkili arama — saatlerce süren videolarda binlerce cue olabilir.\n let lo = 0;\n let hi = cues.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (cues[mid]!.start <= seconds) lo = mid;\n else hi = mid - 1;\n }\n const cue = cues[lo]!;\n const neighbours = [cues[lo + 1], cues[lo - 1]].filter((c): c is VttCue => !!c && c.url !== cue.url);\n neighbours.forEach((c) => void this.ensureSheet(c.url));\n\n const sheet = this.sheets.get(cue.url);\n if (!sheet?.ready) {\n void this.ensureSheet(cue.url);\n return null;\n }\n this.touch(cue.url);\n const rect = cue.rect ?? { x: 0, y: 0, w: sheet.img.naturalWidth, h: sheet.img.naturalHeight };\n return { url: cue.url, ...rect };\n }\n\n // ── yükleme / cache ──\n\n private ensureSheet(url: string): Promise<void> {\n if (!url) return Promise.resolve();\n const existing = this.sheets.get(url);\n if (existing) return existing.promise;\n\n const img = new Image();\n img.decoding = 'async';\n const sheet: Sheet = { img, ready: false, failed: false, promise: Promise.resolve() };\n sheet.promise = new Promise<void>((resolve) => {\n img.onload = () => {\n // decode() bitmeden gösterme — yeni sheet'e geçerken boş/yanlış kare titremesi olmasın.\n const done = () => {\n if (this.destroyed) return resolve();\n sheet.ready = true;\n this.learnSheetDuration(img);\n if (this.hovering) this.scheduleRender();\n resolve();\n };\n img.decode ? img.decode().then(done, done) : done();\n };\n img.onerror = () => {\n sheet.failed = true;\n resolve();\n };\n });\n img.src = url;\n this.sheets.set(url, sheet);\n this.evict();\n return sheet.promise;\n }\n\n /** Çok parçalı modda `sheetDuration` verilmediyse ilk yüklenen sheet'in ızgara kapasitesinden hesapla. */\n private learnSheetDuration(img: HTMLImageElement): void {\n if (this.derivedSheetDuration !== null || this.options.vtt || !this.isMultiSheet() || this.options.sheetDuration) return;\n const { width, height } = this.options;\n if (!width || !height) return;\n const capacity = Math.max(1, Math.floor(img.naturalWidth / width)) * Math.max(1, Math.floor(img.naturalHeight / height));\n this.derivedSheetDuration = capacity * (this.options.interval || 1);\n }\n\n /** LRU: kullanılan sheet'i sona taşı. */\n private touch(url: string): void {\n const sheet = this.sheets.get(url);\n if (!sheet) return;\n this.sheets.delete(url);\n this.sheets.set(url, sheet);\n }\n\n private evict(): void {\n while (this.sheets.size > MAX_CACHED_SHEETS) {\n const oldest = this.sheets.keys().next().value as string;\n const sheet = this.sheets.get(oldest)!;\n sheet.img.onload = null;\n sheet.img.onerror = null;\n this.sheets.delete(oldest);\n }\n }\n\n private loadVtt(): Promise<void> {\n if (this.vttLoading) return this.vttLoading;\n const vttUrl = this.options.vtt!;\n this.vttLoading = fetch(vttUrl)\n .then((r) => {\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n return r.text();\n })\n .then((text) => {\n if (this.destroyed) return;\n this.vttCues = parseThumbnailVtt(text, new URL(vttUrl, document.baseURI).href);\n if (this.vttCues.length) void this.ensureSheet(this.vttCues[0]!.url);\n if (this.hovering) this.scheduleRender();\n })\n .catch((err) => {\n console.warn('[HopePlayer sprite-thumbnails] VTT yüklenemedi:', err);\n this.vttCues = [];\n });\n return this.vttLoading;\n }\n}\n\n/** \"01:02:03.500\" / \"02:03.500\" → saniye. */\nfunction parseVttTime(value: string): number {\n const parts = value.trim().split(':').map(Number);\n return parts.reduce((acc, n) => acc * 60 + n, 0);\n}\n\n/** WebVTT thumbnail dosyası → sıralı cue listesi. Görsel yolları VTT dosyasına göre çözümlenir. */\nexport function parseThumbnailVtt(text: string, baseUrl: string): VttCue[] {\n const cues: VttCue[] = [];\n const blocks = text.replace(/\\r/g, '').split(/\\n\\n+/);\n for (const block of blocks) {\n const lines = block.split('\\n').filter(Boolean);\n const timingIndex = lines.findIndex((l) => l.includes('-->'));\n if (timingIndex === -1) continue;\n const [startStr, endStr] = lines[timingIndex]!.split('-->');\n const target = lines[timingIndex + 1]?.trim();\n if (!startStr || !endStr || !target) continue;\n\n const [path, hash] = target.split('#');\n const match = hash?.match(/xywh=(\\d+),(\\d+),(\\d+),(\\d+)/);\n cues.push({\n start: parseVttTime(startStr),\n end: parseVttTime(endStr.trim().split(/\\s+/)[0]!),\n url: new URL(path!, baseUrl).href,\n rect: match ? { x: +match[1]!, y: +match[2]!, w: +match[3]!, h: +match[4]! } : null,\n });\n }\n return cues.sort((a, b) => a.start - b.start);\n}\n","import { SpriteThumbnails, type SpriteThumbnailsPlayerContext } from './SpriteThumbnails';\nimport type { SpriteThumbnailsOptions } from '../../types';\n\nexport function installSpriteThumbnails(ctx: SpriteThumbnailsPlayerContext, options: SpriteThumbnailsOptions): SpriteThumbnails {\n return new SpriteThumbnails(ctx, options);\n}\n\nexport { SpriteThumbnails };\nexport type { SpriteThumbnailsPlayerContext };\n"],"names":["MAX_CACHED_SHEETS","SHEET_TEMPLATE","SpriteThumbnails","ctx","options","__publicField","e","duration","t","sheet","seconds","formatTime","frame","scale","naturalWidth","naturalHeight","barRect","tipWidth","x","responsive","playerWidth","downlink","_a","anyReady","s","d","index","url","number","_m","_p","width","height","interval","sheetDuration","lastIndex","columns","rows","local","frameIndex","n","cues","lo","hi","mid","cue","c","rect","existing","img","resolve","done","capacity","oldest","vttUrl","r","text","parseThumbnailVtt","err","parseVttTime","value","acc","baseUrl","blocks","block","lines","timingIndex","l","startStr","endStr","target","path","hash","match","a","b","installSpriteThumbnails"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsPanel-DSClIwA3.js","sources":["../../src/plugins/stats/StatsPanel.ts","../../src/plugins/stats/index.ts"],"sourcesContent":["import type { HopeLocaleStrings } from '../../i18n/types';\nimport type { PlaybackEngineInfo } from '../../hls/SourceManager';\n\n/** hls.js instance'ından okunan alanlar — tam tipi içe aktarmamak için. */\ninterface HlsStatsSource {\n currentLevel: number;\n autoLevelEnabled: boolean;\n levels: { height: number; width: number; bitrate: number; videoCodec?: string; audioCodec?: string; details?: { live: boolean } }[];\n bandwidthEstimate: number;\n latency: number;\n config: { maxBufferLength: number };\n}\n\nexport interface StatsPlayerContext {\n videoEl: HTMLVideoElement;\n containerEl: HTMLElement;\n i18n: HopeLocaleStrings;\n version: string;\n getEngine(): PlaybackEngineInfo;\n getHls(): HlsStatsSource | null;\n}\n\nconst REFRESH_MS = 500;\n\n/** Sağ tık menüsündeki \"İstatistikler\" — player üstünde canlı teknik bilgi paneli (YouTube'daki \"Stats for nerds\" gibi). */\nexport class StatsPanel {\n private readonly el: HTMLDivElement;\n private readonly titleEl: HTMLSpanElement;\n private readonly closeBtn: HTMLButtonElement;\n private readonly body: HTMLDListElement;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(private readonly ctx: StatsPlayerContext) {\n this.el = document.createElement('div');\n this.el.className = 'hp-stats';\n this.el.setAttribute('part', 'stats-panel');\n this.el.setAttribute('role', 'dialog');\n\n const header = document.createElement('div');\n header.className = 'hp-stats-header';\n this.titleEl = document.createElement('span');\n this.closeBtn = document.createElement('button');\n this.closeBtn.type = 'button';\n this.closeBtn.className = 'hp-stats-close';\n this.closeBtn.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n this.closeBtn.addEventListener('click', () => this.hide());\n header.append(this.titleEl, this.closeBtn);\n\n this.body = document.createElement('dl');\n this.body.className = 'hp-stats-body';\n this.el.append(header, this.body);\n // Panel tıklamaları videoyu oynat/duraklat yapmasın.\n this.el.addEventListener('pointerdown', (e) => e.stopPropagation());\n this.el.addEventListener('click', (e) => e.stopPropagation());\n this.refreshLabels();\n }\n\n get isVisible(): boolean {\n return this.el.isConnected;\n }\n\n show(): void {\n if (!this.isVisible) this.ctx.containerEl.appendChild(this.el);\n this.render();\n if (!this.timer) this.timer = setInterval(() => this.render(), REFRESH_MS);\n }\n\n hide(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n this.el.remove();\n }\n\n toggle(force?: boolean): void {\n if (force ?? !this.isVisible) this.show();\n else this.hide();\n }\n\n refreshLabels(): void {\n this.titleEl.textContent = this.ctx.i18n.statsTitle;\n this.closeBtn.setAttribute('aria-label', this.ctx.i18n.statsClose);\n if (this.isVisible) this.render();\n }\n\n destroy(): void {\n this.hide();\n }\n\n private render(): void {\n const { videoEl: v, i18n: t } = this.ctx;\n const hls = this.ctx.getHls();\n const engine = this.ctx.getEngine();\n const level = hls && hls.currentLevel >= 0 ? hls.levels[hls.currentLevel] : undefined;\n const quality = v.getVideoPlaybackQuality?.();\n const rect = v.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n\n let ahead = 0;\n for (let i = 0; i < v.buffered.length; i++) {\n if (v.buffered.start(i) <= v.currentTime + 0.5 && v.buffered.end(i) > v.currentTime) ahead = v.buffered.end(i) - v.currentTime;\n }\n\n const rows: [string, string][] = [\n [t.statsEngine, engine.engine + (engine.reason ? ` (${engine.reason})` : '')],\n [t.statsResolution, `${v.videoWidth}×${v.videoHeight} / ${Math.round(rect.width * dpr)}×${Math.round(rect.height * dpr)}`],\n [t.statsQuality, level ? `${level.height}p · ${Math.round(level.bitrate / 1000)} kbps${hls!.autoLevelEnabled ? ' · auto' : ''}` : '—'],\n [t.statsCodecs, level ? [level.videoCodec, level.audioCodec].filter(Boolean).join(', ') || '—' : '—'],\n [t.statsBandwidth, hls ? `${(hls.bandwidthEstimate / 1e6).toFixed(2)} Mbps` : '—'],\n [t.statsBuffer, `${ahead.toFixed(1)} s`],\n [t.statsDropped, quality ? `${quality.droppedVideoFrames} / ${quality.totalVideoFrames}` : '—'],\n // hls.js `latency`'yi VOD'da da hesaplıyor (süre - konum) — yalnızca canlı yayında anlamlı.\n [t.statsLatency, level?.details?.live && Number.isFinite(hls!.latency) ? `${hls!.latency.toFixed(1)} s` : '—'],\n [t.statsSpeedVolume, `${v.playbackRate}× · ${v.muted ? 0 : Math.round(v.volume * 100)}%`],\n [t.statsSource, v.currentSrc && !v.currentSrc.startsWith('blob:') ? v.currentSrc : v.currentSrc ? 'MediaSource (hls.js)' : '—'],\n [t.statsVersion, `HopeCorePlayer ${this.ctx.version}`],\n ];\n this.body.replaceChildren(\n ...rows.flatMap(([k, val]) => {\n const dt = document.createElement('dt');\n dt.textContent = k;\n const dd = document.createElement('dd');\n dd.textContent = val;\n dd.title = val;\n return [dt, dd];\n })\n );\n }\n}\n","import { StatsPanel, type StatsPlayerContext } from './StatsPanel';\n\nexport function installStats(ctx: StatsPlayerContext): StatsPanel {\n return new StatsPanel(ctx);\n}\n\nexport { StatsPanel };\nexport type { StatsPlayerContext };\n"],"names":["StatsPanel","ctx","__publicField","header","e","force","_a","_b","v","t","hls","engine","level","quality","rect","dpr","ahead","i","rows","k","val","dt","dd","installStats"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sticky-D_eLCNFk.js","sources":["../../src/plugins/sticky/StickyManager.ts","../../src/plugins/sticky/index.ts"],"sourcesContent":["import type { StickyCorner, StickyOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\nexport interface StickyPlayerContext {\n key: string;\n videoEl: HTMLVideoElement;\n hostEl: HTMLElement;\n /** Sticky olarak köşeye taşınacak element — genelde hostEl'in kendisi (bkz. options.wrapperSelector). */\n wrapperEl: HTMLElement;\n /**\n * Kapat butonu wrapperEl'e değil shadow root içine eklenir — wrapperEl varsayılan olarak host;\n * slot olmadığı için light DOM child'ı render edilmez.\n */\n closeButtonMountEl: HTMLElement;\n isAdActive(): boolean;\n i18n: HopeLocaleStrings;\n}\n\n/** `register()`'ın döndürdüğü unregister fonksiyonu — dil sonradan değişince close butonunun statik etiketini tazelemek için `refreshLabels` da taşıyor (bkz. loop-section'daki aynı \"fonksiyona metod ekleme\" deseni). */\nexport type StickyUnregister = (() => void) & { refreshLabels?: () => void };\n\ninterface StickyItemState {\n inView: boolean;\n playing: boolean;\n sticky: boolean;\n hasEverBeenInView: boolean;\n hasEverBeenInViewWhilePlaying: boolean;\n watchMsInView: number;\n lastTickAt: number;\n minPlaySatisfied: boolean;\n userPaused: boolean;\n userPausedAt: number;\n adStartedOnce: boolean;\n contentStartedOnce: boolean;\n blockResumeUntil: number;\n programmaticPauseUntil: number;\n placeholderEl: HTMLElement | null;\n closeBtnEl: HTMLElement | null;\n}\n\ninterface StickyItem {\n ctx: StickyPlayerContext;\n options: Required<Omit<StickyOptions, 'wrapperSelector'>>;\n state: StickyItemState;\n /** wrapperEl'in doğal konumundaki görünmez işaretçi — IntersectionObserver bunu izler (sticky olunca wrapper yer değiştirir). */\n sentinelEl: HTMLElement;\n}\n\nconst GESTURE_WINDOW_MS = 1200;\nconst USER_PAUSED_MAX_MS = 30000;\nconst PROGRAMMATIC_PAUSE_MS = 800;\nconst BLOCK_RESUME_MS = 1200;\nconst STORAGE_KEY = 'hope_sticky_dismissed_until';\nconst STORAGE_KEY_FOREVER = 'hope_sticky_dismissed_forever';\n\n/** Sayfadaki tüm sticky player'ları koordine eden modül seviyesi singleton (aynı anda tek sticky). */\nclass StickyManagerImpl {\n private readonly items = new Map<string, StickyItem>();\n private activeKey: string | null = null;\n private observer: IntersectionObserver | null = null;\n\n private lastUserGestureAt = 0;\n private lastGestureType: 'play' | 'pause' | 'other' | null = null;\n private gestureListenersAttached = false;\n\n private dismissedUntil = 0;\n private dismissedForever = false;\n private dismissLoaded = false;\n\n register(ctx: StickyPlayerContext, options: StickyOptions): StickyUnregister {\n this.ensureGestureListeners();\n this.loadDismissState();\n\n const resolved: StickyItem['options'] = {\n enabled: options.enabled ?? true,\n corner: options.corner ?? 'br',\n requirePlaying: options.requirePlaying ?? true,\n minPlayMs: options.minPlayMs ?? 800,\n onlyOneSticky: options.onlyOneSticky ?? true,\n closeActiveStickyOnAnotherPlay: options.closeActiveStickyOnAnotherPlay ?? true,\n userGestureWindowMs: options.userGestureWindowMs ?? GESTURE_WINDOW_MS,\n adCanTriggerSticky: options.adCanTriggerSticky ?? 'preroll-only',\n dismissMode: options.dismissMode ?? 'cooldown',\n cooldownMinutes: options.cooldownMinutes ?? 5,\n storage: options.storage ?? 'local',\n closeButton: options.closeButton ?? true,\n };\n\n if (!resolved.enabled) return () => {};\n\n const sentinel = document.createElement('div');\n sentinel.setAttribute('aria-hidden', 'true');\n sentinel.style.cssText = 'position:relative;width:1px;height:1px;pointer-events:none;opacity:0;';\n ctx.wrapperEl.parentNode?.insertBefore(sentinel, ctx.wrapperEl);\n\n const item: StickyItem = {\n ctx,\n options: resolved,\n sentinelEl: sentinel,\n state: {\n inView: true,\n playing: false,\n sticky: false,\n hasEverBeenInView: false,\n hasEverBeenInViewWhilePlaying: false,\n watchMsInView: 0,\n lastTickAt: 0,\n minPlaySatisfied: false,\n userPaused: false,\n userPausedAt: 0,\n adStartedOnce: false,\n contentStartedOnce: false,\n blockResumeUntil: 0,\n programmaticPauseUntil: 0,\n placeholderEl: null,\n closeBtnEl: null,\n },\n };\n this.items.set(ctx.key, item);\n\n this.ensureObserver().observe(sentinel);\n\n const onPlay = () => this.handlePlay(item);\n const onPause = () => this.handlePauseOrEnded(item, 'pause');\n const onEnded = () => this.handlePauseOrEnded(item, 'ended');\n const onAdStart = () => this.handleAdStart(item);\n const onAdEnd = () => this.handleAdEnd(item);\n\n ctx.videoEl.addEventListener('play', onPlay);\n ctx.videoEl.addEventListener('pause', onPause);\n ctx.videoEl.addEventListener('ended', onEnded);\n ctx.hostEl.addEventListener('hp:adstart', onAdStart);\n ctx.hostEl.addEventListener('hp:adend', onAdEnd);\n\n // Plugin dinamik yüklendiği için autoplay video'yu bu dinleyiciden önce başlatmış olabilir —\n // kaçırılan 'play'i telafi et, yoksa requirePlaying sticky'yi hiç açmaz.\n if (!ctx.videoEl.paused && !ctx.videoEl.ended) {\n this.handlePlay(item);\n }\n\n const unregister: StickyUnregister = () => {\n if (item.state.sticky) this.unstick(ctx.key, 'destroy');\n ctx.videoEl.removeEventListener('play', onPlay);\n ctx.videoEl.removeEventListener('pause', onPause);\n ctx.videoEl.removeEventListener('ended', onEnded);\n ctx.hostEl.removeEventListener('hp:adstart', onAdStart);\n ctx.hostEl.removeEventListener('hp:adend', onAdEnd);\n this.observer?.unobserve(sentinel);\n sentinel.remove();\n this.items.delete(ctx.key);\n };\n unregister.refreshLabels = () => {\n if (item.state.closeBtnEl) {\n item.state.closeBtnEl.setAttribute('aria-label', ctx.i18n.close);\n }\n };\n return unregister;\n }\n\n // ── gesture tracking (tüm sayfa için tek dinleyici) ──\n\n private ensureGestureListeners(): void {\n if (this.gestureListenersAttached || typeof window === 'undefined') return;\n this.gestureListenersAttached = true;\n\n window.addEventListener(\n 'pointerdown',\n (e) => {\n this.lastUserGestureAt = Date.now();\n // composedPath()[0]: Shadow DOM'da e.target host'a retarget edilir; gerçek iç butonu almak için.\n const target = (e.composedPath()[0] ?? e.target) as HTMLElement | null;\n const btn = target?.closest?.('button,[role=\"button\"]') as HTMLElement | null;\n if (btn?.querySelector('.hp-icon-pause')) this.lastGestureType = 'pause';\n else if (btn?.querySelector('.hp-icon-play')) this.lastGestureType = 'play';\n else this.lastGestureType = 'other';\n },\n { capture: true, passive: true }\n );\n window.addEventListener(\n 'keydown',\n () => {\n this.lastUserGestureAt = Date.now();\n this.lastGestureType = 'other';\n },\n { capture: true }\n );\n }\n\n // ── intersection observer (tüm sticky item'lar için tek instance) ──\n\n private ensureObserver(): IntersectionObserver {\n if (this.observer) return this.observer;\n this.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const item = [...this.items.values()].find((i) => i.sentinelEl === entry.target);\n if (!item) continue;\n this.onIntersect(item, entry);\n }\n },\n { threshold: [0.35], rootMargin: '0px 0px -20% 0px' }\n );\n return this.observer;\n }\n\n private onIntersect(item: StickyItem, entry: IntersectionObserverEntry): void {\n this.accumulateWatch(item);\n const inView = entry.isIntersecting && entry.intersectionRatio >= 0.35;\n item.state.inView = inView;\n\n if (inView) {\n item.state.hasEverBeenInView = true;\n if (item.state.playing) item.state.hasEverBeenInViewWhilePlaying = true;\n if (item.state.sticky) this.unstick(item.ctx.key, 'back_in_view');\n } else {\n if (!item.state.hasEverBeenInView) return;\n const isActive = item.state.playing;\n if (item.options.requirePlaying && !isActive) return;\n this.maybeStick(item, 'out_of_view');\n }\n }\n\n // ── player event handlers ──\n\n private handlePlay(item: StickyItem): void {\n if (item.state.blockResumeUntil && Date.now() < item.state.blockResumeUntil) {\n item.ctx.videoEl.pause();\n item.state.playing = false;\n return;\n }\n if (item.ctx.isAdActive()) return;\n\n item.state.contentStartedOnce = true;\n const wasPlaying = item.state.playing;\n item.state.playing = true;\n if (!wasPlaying) {\n item.state.lastTickAt = Date.now();\n item.state.watchMsInView = 0;\n }\n if (item.state.inView) item.state.hasEverBeenInViewWhilePlaying = true;\n\n const gestureWindow = item.options.userGestureWindowMs;\n let userInitiated = Date.now() - this.lastUserGestureAt <= gestureWindow;\n if (this.lastGestureType === 'pause') userInitiated = false;\n if (item.state.userPaused && Date.now() - item.state.userPausedAt <= 1500) userInitiated = false;\n\n if (userInitiated) {\n item.state.userPaused = false;\n item.state.userPausedAt = 0;\n this.lastGestureType = 'play';\n }\n\n this.handleBecameActive(item, 'content', userInitiated);\n }\n\n private handlePauseOrEnded(item: StickyItem, kind: 'pause' | 'ended'): void {\n this.accumulateWatch(item);\n if (item.ctx.isAdActive()) {\n item.state.playing = true;\n return;\n }\n item.state.playing = false;\n\n const now = Date.now();\n if (item.state.programmaticPauseUntil && now < item.state.programmaticPauseUntil) {\n item.state.programmaticPauseUntil = 0;\n item.state.userPaused = false;\n item.state.userPausedAt = 0;\n return;\n }\n\n if (kind === 'pause') {\n const isUserPause = now - this.lastUserGestureAt <= item.options.userGestureWindowMs;\n if (isUserPause) {\n item.state.userPaused = true;\n item.state.userPausedAt = now;\n this.lastGestureType = 'pause';\n }\n } else if (item.state.sticky) {\n this.unstick(item.ctx.key, 'ended');\n }\n }\n\n private handleAdStart(item: StickyItem): void {\n const mode = item.options.adCanTriggerSticky;\n const isCurrentlySticky = this.activeKey === item.ctx.key;\n const isFirstAdEver = !item.state.adStartedOnce;\n item.state.adStartedOnce = true;\n item.state.lastTickAt = Date.now();\n item.state.playing = true;\n\n let allow = false;\n if (mode === 'always') allow = true;\n else if (mode === 'never') allow = false;\n else allow = isCurrentlySticky || (isFirstAdEver && !item.state.contentStartedOnce);\n\n if (!allow) return;\n this.handleBecameActive(item, 'ad', false);\n }\n\n private handleAdEnd(item: StickyItem): void {\n this.accumulateWatch(item);\n item.state.playing = !item.ctx.videoEl.paused && !item.ctx.videoEl.ended;\n item.state.lastTickAt = Date.now();\n }\n\n private handleBecameActive(item: StickyItem, source: 'content' | 'ad', userInitiated: boolean): void {\n item.state.playing = true;\n if (userInitiated) {\n item.state.userPaused = false;\n item.state.userPausedAt = 0;\n this.lastGestureType = 'play';\n }\n\n const now = Date.now();\n if (!item.state.lastTickAt) item.state.lastTickAt = now;\n if (item.state.inView) {\n item.state.hasEverBeenInView = true;\n item.state.hasEverBeenInViewWhilePlaying = true;\n }\n\n if (item.options.closeActiveStickyOnAnotherPlay && userInitiated && this.activeKey && this.activeKey !== item.ctx.key) {\n this.pauseAndUnstick(this.activeKey, 'another_played');\n }\n\n if (!item.state.inView) this.maybeStick(item, source === 'ad' ? 'play_ad' : 'play');\n }\n\n private accumulateWatch(item: StickyItem): void {\n const now = Date.now();\n const last = item.state.lastTickAt || now;\n item.state.lastTickAt = now;\n if (!item.state.playing || !item.state.inView) return;\n\n item.state.watchMsInView += now - last;\n if (!item.state.minPlaySatisfied && item.options.minPlayMs > 0 && item.state.watchMsInView >= item.options.minPlayMs) {\n item.state.minPlaySatisfied = true;\n }\n }\n\n // ── stick / unstick ──\n\n private maybeStick(item: StickyItem, _trigger: string): void {\n const maxMs = USER_PAUSED_MAX_MS;\n if (item.state.userPaused && Date.now() - item.state.userPausedAt > maxMs) {\n item.state.userPaused = false;\n item.state.userPausedAt = 0;\n }\n\n if (!item.state.hasEverBeenInView) return;\n if (!item.state.hasEverBeenInViewWhilePlaying) return;\n if (item.state.userPaused) return;\n\n const now = Date.now();\n if (item.options.dismissMode === 'never' && this.dismissedForever) return;\n if (item.options.dismissMode === 'cooldown' && this.dismissedUntil && now < this.dismissedUntil) return;\n\n if (item.options.requirePlaying && !item.state.playing) return;\n if (item.state.sticky) return;\n if (item.options.minPlayMs > 0 && !item.state.minPlaySatisfied) return;\n\n if (item.options.onlyOneSticky && this.activeKey && this.activeKey !== item.ctx.key) {\n this.pauseAndUnstick(this.activeKey, 'replaced');\n }\n\n this.stick(item);\n }\n\n private stick(item: StickyItem): void {\n const wrapper = item.ctx.wrapperEl;\n const corner = item.options.corner;\n\n if (!item.state.placeholderEl) {\n const ph = document.createElement('div');\n ph.setAttribute('data-hope-sticky-placeholder', '1');\n const rect = wrapper.getBoundingClientRect();\n ph.style.height = `${rect.height}px`;\n wrapper.parentNode?.insertBefore(ph, wrapper);\n item.state.placeholderEl = ph;\n }\n\n wrapper.setAttribute('data-sticky', '1');\n wrapper.setAttribute('data-sticky-corner', corner);\n\n if (item.options.closeButton && !item.state.closeBtnEl) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('part', 'sticky-close-button');\n btn.setAttribute('aria-label', item.ctx.i18n.close);\n btn.className =\n 'hp:absolute hp:top-1 hp:right-1 hp:z-30 hp:flex hp:items-center hp:justify-center hp:w-6 hp:h-6 ' +\n 'hp:rounded-full hp:bg-black/60 hp:text-white hp:border-0 hp:cursor-pointer';\n btn.innerHTML = '<i class=\"hp-icon hp-icon-close\" aria-hidden=\"true\"></i>';\n btn.addEventListener('click', () => {\n this.applyGlobalDismiss(item.options);\n this.pauseAndUnstick(item.ctx.key, 'closed');\n });\n item.ctx.closeButtonMountEl.appendChild(btn);\n item.state.closeBtnEl = btn;\n }\n\n item.state.sticky = true;\n this.activeKey = item.ctx.key;\n item.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sticky', { detail: { sticky: true, corner } }));\n }\n\n private unstick(key: string, _reason: string): void {\n const item = this.items.get(key);\n if (!item) return;\n\n const wrapper = item.ctx.wrapperEl;\n wrapper.removeAttribute('data-sticky');\n wrapper.removeAttribute('data-sticky-corner');\n\n item.state.closeBtnEl?.remove();\n item.state.closeBtnEl = null;\n item.state.placeholderEl?.remove();\n item.state.placeholderEl = null;\n\n item.state.sticky = false;\n if (this.activeKey === key) this.activeKey = null;\n item.ctx.hostEl.dispatchEvent(new CustomEvent('hp:sticky', { detail: { sticky: false } }));\n }\n\n private pauseAndUnstick(key: string, reason: string): void {\n const item = this.items.get(key);\n if (!item) return;\n\n const now = Date.now();\n item.state.blockResumeUntil = now + BLOCK_RESUME_MS;\n item.state.programmaticPauseUntil = now + PROGRAMMATIC_PAUSE_MS;\n\n item.ctx.videoEl.pause();\n item.state.playing = false;\n this.unstick(key, reason);\n }\n\n // ── global dismiss (localStorage/sessionStorage) ──\n\n private loadDismissState(): void {\n if (this.dismissLoaded) return;\n this.dismissLoaded = true;\n try {\n const st = window.localStorage;\n this.dismissedUntil = Number(st.getItem(STORAGE_KEY) || 0) || 0;\n this.dismissedForever = st.getItem(STORAGE_KEY_FOREVER) === '1';\n } catch {\n /* storage erişilemez (gizli mod vb.) — sessizce yoksay */\n }\n }\n\n private applyGlobalDismiss(options: StickyItem['options']): void {\n if (options.dismissMode === 'none') return;\n const storage = options.storage === 'memory' ? null : options.storage === 'session' ? window.sessionStorage : window.localStorage;\n\n if (options.dismissMode === 'never') {\n this.dismissedForever = true;\n try {\n storage?.setItem(STORAGE_KEY_FOREVER, '1');\n } catch {\n /* no-op */\n }\n return;\n }\n\n const until = Date.now() + options.cooldownMinutes * 60000;\n this.dismissedUntil = until;\n try {\n storage?.setItem(STORAGE_KEY, String(until));\n } catch {\n /* no-op */\n }\n }\n}\n\nexport const stickyManager = new StickyManagerImpl();\nexport type { StickyCorner };\n","import { stickyManager, type StickyPlayerContext, type StickyUnregister } from './StickyManager';\nimport type { StickyOptions } from '../../types';\n\n/** Dönen fonksiyon unregister/cleanup — HopePlayerElement.disconnectedCallback'te çağrılmalı. `refreshLabels()` da taşır (dil değişince close butonu için). */\nexport function installSticky(ctx: StickyPlayerContext, options: StickyOptions): StickyUnregister {\n return stickyManager.register(ctx, options);\n}\n\nexport type { StickyPlayerContext, StickyUnregister };\n"],"names":["STORAGE_KEY","STORAGE_KEY_FOREVER","StickyManagerImpl","__publicField","ctx","options","_a","resolved","sentinel","item","onPlay","onPause","onEnded","onAdStart","onAdEnd","unregister","target","btn","entries","entry","i","inView","isActive","wasPlaying","gestureWindow","userInitiated","kind","now","mode","isCurrentlySticky","isFirstAdEver","allow","source","last","_trigger","wrapper","corner","ph","rect","key","_reason","_b","reason","st","storage","until","stickyManager","installSticky"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var A = Object.defineProperty;
|
|
2
2
|
var P = (h, t, e) => t in h ? A(h, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : h[t] = e;
|
|
3
3
|
var r = (h, t, e) => P(h, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { c as b } from "./
|
|
4
|
+
import { c as b } from "./player-C886oKP-.js";
|
|
5
5
|
const L = {
|
|
6
6
|
startIndex: 0,
|
|
7
7
|
loop: !0,
|
|
@@ -319,4 +319,4 @@ export {
|
|
|
319
319
|
N as HopeStory,
|
|
320
320
|
M as installStory
|
|
321
321
|
};
|
|
322
|
-
//# sourceMappingURL=
|
|
322
|
+
//# sourceMappingURL=story-D5Got6-6.js.map
|