@hopeplayer/core 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/HopePlayerElement.d.ts +42 -2
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/NativeEme-CXosVcw8.js +80 -0
- package/dist/chunks/NativeEme-CXosVcw8.js.map +1 -0
- package/dist/chunks/{accessibility-DeUIoAda.js → accessibility-DFx4CE0H.js} +9 -8
- package/dist/chunks/{accessibility-DeUIoAda.js.map → accessibility-DFx4CE0H.js.map} +1 -1
- package/dist/chunks/adTriggers-BIAWe8o4.js +419 -0
- package/dist/chunks/adTriggers-BIAWe8o4.js.map +1 -0
- package/dist/chunks/{ads-CdWbE9aD.js → ads-DlpHPpR9.js} +3 -3
- package/dist/chunks/ads-DlpHPpR9.js.map +1 -0
- package/dist/chunks/analytics-DEjTAJO9.js +281 -0
- package/dist/chunks/analytics-DEjTAJO9.js.map +1 -0
- package/dist/chunks/{cast-BQ-suTcF.js → cast-vHyi7oV_.js} +2 -2
- package/dist/chunks/{cast-BQ-suTcF.js.map → cast-vHyi7oV_.js.map} +1 -1
- package/dist/chunks/dash-CWjy-y7B.js +22 -0
- package/dist/chunks/dash-CWjy-y7B.js.map +1 -0
- package/dist/chunks/docPip-wybMVP1H.js +82 -0
- package/dist/chunks/docPip-wybMVP1H.js.map +1 -0
- package/dist/chunks/heatmap-Bb7neaYU.js +92 -0
- package/dist/chunks/heatmap-Bb7neaYU.js.map +1 -0
- package/dist/chunks/{history-DAbqEhNB.js → history-CwqLXiZi.js} +2 -2
- package/dist/chunks/{history-DAbqEhNB.js.map → history-CwqLXiZi.js.map} +1 -1
- package/dist/chunks/interactive-CgltIneu.js +189 -0
- package/dist/chunks/interactive-CgltIneu.js.map +1 -0
- package/dist/chunks/keySystems-CNzjRq6e.js +70 -0
- package/dist/chunks/keySystems-CNzjRq6e.js.map +1 -0
- package/dist/chunks/{loopSection-CvF4l5uf.js → loopSection-Bwk4W8vz.js} +16 -16
- package/dist/chunks/loopSection-Bwk4W8vz.js.map +1 -0
- package/dist/chunks/{markers-B04NMI79.js → markers-L69W3kj6.js} +53 -51
- package/dist/chunks/markers-L69W3kj6.js.map +1 -0
- package/dist/chunks/player-D2_HRzot.js +4351 -0
- package/dist/chunks/player-D2_HRzot.js.map +1 -0
- package/dist/chunks/{playlist-C6Mh9BE8.js → playlist-CHfStNbQ.js} +29 -21
- package/dist/chunks/playlist-CHfStNbQ.js.map +1 -0
- package/dist/chunks/plugin-style-CPJELe-i.js +17 -0
- package/dist/chunks/plugin-style-CPJELe-i.js.map +1 -0
- package/dist/chunks/pluginHost-cN2uGFeG.js +566 -0
- package/dist/chunks/pluginHost-cN2uGFeG.js.map +1 -0
- package/dist/chunks/redirectScreen-TIqLdvBY.js +239 -0
- package/dist/chunks/redirectScreen-TIqLdvBY.js.map +1 -0
- package/dist/chunks/{rewardedUnlock-CGhQyWOk.js → rewardedUnlock-DUqYwXTr.js} +2 -2
- package/dist/chunks/{rewardedUnlock-CGhQyWOk.js.map → rewardedUnlock-DUqYwXTr.js.map} +1 -1
- package/dist/chunks/segments-Ds-c1b5e.js +66 -0
- package/dist/chunks/segments-Ds-c1b5e.js.map +1 -0
- package/dist/chunks/{skipSegments-BbWzPpXz.js → skipSegments-ByNoF1qZ.js} +2 -2
- package/dist/chunks/{skipSegments-BbWzPpXz.js.map → skipSegments-ByNoF1qZ.js.map} +1 -1
- package/dist/chunks/{spriteThumbnails-B7oDZFTo.js → spriteThumbnails-Cr9UmkM9.js} +74 -51
- package/dist/chunks/spriteThumbnails-Cr9UmkM9.js.map +1 -0
- package/dist/chunks/{statsPanel-DSClIwA3.js → statsPanel-D0DtoFgS.js} +2 -2
- package/dist/chunks/statsPanel-D0DtoFgS.js.map +1 -0
- package/dist/chunks/{sticky-D_eLCNFk.js → sticky-BDStzjBM.js} +27 -26
- package/dist/chunks/sticky-BDStzjBM.js.map +1 -0
- package/dist/chunks/{story-BLBij82f.js → story-CodA2dfn.js} +2 -2
- package/dist/chunks/{story-BLBij82f.js.map → story-CodA2dfn.js.map} +1 -1
- package/dist/chunks/transcript-LG7E9UYE.js +186 -0
- package/dist/chunks/transcript-LG7E9UYE.js.map +1 -0
- package/dist/controls/ContextMenu.d.ts +1 -0
- package/dist/controls/ContextMenu.d.ts.map +1 -1
- package/dist/controls/ControlBar.d.ts +6 -0
- package/dist/controls/ControlBar.d.ts.map +1 -1
- package/dist/controls/SeekBar.d.ts +5 -2
- package/dist/controls/SeekBar.d.ts.map +1 -1
- package/dist/controls/SettingsMenu.d.ts +2 -1
- package/dist/controls/SettingsMenu.d.ts.map +1 -1
- package/dist/drm/NativeEme.d.ts +23 -0
- package/dist/drm/NativeEme.d.ts.map +1 -0
- package/dist/drm/keySystems.d.ts +18 -0
- package/dist/drm/keySystems.d.ts.map +1 -0
- package/dist/hls/SourceManager.d.ts +31 -5
- package/dist/hls/SourceManager.d.ts.map +1 -1
- package/dist/hls/dashEngine.d.ts +85 -0
- package/dist/hls/dashEngine.d.ts.map +1 -0
- package/dist/hls/sourceGroups.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 +28 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/keyboard/KeyboardController.d.ts +14 -0
- package/dist/keyboard/KeyboardController.d.ts.map +1 -1
- package/dist/plugin-api/PluginAds.d.ts +61 -0
- package/dist/plugin-api/PluginAds.d.ts.map +1 -0
- package/dist/plugin-api/PluginHost.d.ts +6 -0
- package/dist/plugin-api/PluginHost.d.ts.map +1 -1
- package/dist/plugin-api/types.d.ts +39 -0
- package/dist/plugin-api/types.d.ts.map +1 -1
- package/dist/plugins/accessibility/Accessibility.d.ts.map +1 -1
- package/dist/plugins/ad-triggers/AdTriggers.d.ts +5 -0
- package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
- package/dist/plugins/ads/AdsController.d.ts +2 -0
- package/dist/plugins/ads/AdsController.d.ts.map +1 -1
- package/dist/plugins/analytics/QoeTracker.d.ts +71 -0
- package/dist/plugins/analytics/QoeTracker.d.ts.map +1 -0
- package/dist/plugins/analytics/index.d.ts +6 -0
- package/dist/plugins/analytics/index.d.ts.map +1 -0
- package/dist/plugins/doc-pip/DocumentPip.d.ts +44 -0
- package/dist/plugins/doc-pip/DocumentPip.d.ts.map +1 -0
- package/dist/plugins/doc-pip/index.d.ts +5 -0
- package/dist/plugins/doc-pip/index.d.ts.map +1 -0
- package/dist/plugins/heatmap/Heatmap.d.ts +36 -0
- package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -0
- package/dist/plugins/heatmap/index.d.ts +6 -0
- package/dist/plugins/heatmap/index.d.ts.map +1 -0
- package/dist/plugins/interactive/Interactive.d.ts +45 -0
- package/dist/plugins/interactive/Interactive.d.ts.map +1 -0
- package/dist/plugins/interactive/index.d.ts +6 -0
- package/dist/plugins/interactive/index.d.ts.map +1 -0
- package/dist/plugins/markers/MarkProgress.d.ts +3 -1
- package/dist/plugins/markers/MarkProgress.d.ts.map +1 -1
- package/dist/plugins/playlist/PlaylistRunner.d.ts +2 -0
- package/dist/plugins/playlist/PlaylistRunner.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts +3 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
- package/dist/plugins/segments/Segments.d.ts +1 -0
- package/dist/plugins/segments/Segments.d.ts.map +1 -1
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +9 -0
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
- package/dist/plugins/sticky/StickyManager.d.ts +2 -0
- package/dist/plugins/sticky/StickyManager.d.ts.map +1 -1
- package/dist/plugins/transcript/Transcript.d.ts +65 -0
- package/dist/plugins/transcript/Transcript.d.ts.map +1 -0
- package/dist/plugins/transcript/index.d.ts +6 -0
- package/dist/plugins/transcript/index.d.ts.map +1 -0
- package/dist/screens/ErrorScreen.d.ts +1 -1
- package/dist/screens/ErrorScreen.d.ts.map +1 -1
- package/dist/subtitles/attachTracks.d.ts +6 -0
- package/dist/subtitles/attachTracks.d.ts.map +1 -1
- package/dist/types/index.d.ts +320 -16
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/plugin-style.d.ts +5 -0
- package/dist/utils/plugin-style.d.ts.map +1 -0
- package/package.json +2 -1
- package/dist/chunks/adTriggers-DXmtF4t2.js +0 -410
- package/dist/chunks/adTriggers-DXmtF4t2.js.map +0 -1
- package/dist/chunks/ads-CdWbE9aD.js.map +0 -1
- package/dist/chunks/loopSection-CvF4l5uf.js.map +0 -1
- package/dist/chunks/markers-B04NMI79.js.map +0 -1
- package/dist/chunks/player-D7WQxMzr.js +0 -3894
- package/dist/chunks/player-D7WQxMzr.js.map +0 -1
- package/dist/chunks/playlist-C6Mh9BE8.js.map +0 -1
- package/dist/chunks/pluginHost-DjvLmMYZ.js +0 -376
- package/dist/chunks/pluginHost-DjvLmMYZ.js.map +0 -1
- package/dist/chunks/redirectScreen-5HAVRtxe.js +0 -208
- package/dist/chunks/redirectScreen-5HAVRtxe.js.map +0 -1
- package/dist/chunks/segments-gCPrWRig.js +0 -63
- package/dist/chunks/segments-gCPrWRig.js.map +0 -1
- package/dist/chunks/spriteThumbnails-B7oDZFTo.js.map +0 -1
- package/dist/chunks/statsPanel-DSClIwA3.js.map +0 -1
- package/dist/chunks/sticky-D_eLCNFk.js.map +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const u = {
|
|
2
|
+
widevine: "com.widevine.alpha",
|
|
3
|
+
playready: "com.microsoft.playready",
|
|
4
|
+
fairplay: "com.apple.fps",
|
|
5
|
+
clearkey: "org.w3.clearkey"
|
|
6
|
+
};
|
|
7
|
+
function y(e) {
|
|
8
|
+
return e ? ["fairplay", "widevine", "playready", "clearkey"].filter((s) => {
|
|
9
|
+
var r;
|
|
10
|
+
return (r = e[s]) == null ? void 0 : r.licenseUrl;
|
|
11
|
+
}).map((s) => [s, e[s]]) : [];
|
|
12
|
+
}
|
|
13
|
+
function g(e) {
|
|
14
|
+
return y(e).length > 0;
|
|
15
|
+
}
|
|
16
|
+
const R = (e) => Object.keys(u).find((n) => u[n] === e);
|
|
17
|
+
function A(e, n) {
|
|
18
|
+
var w, v;
|
|
19
|
+
const s = {};
|
|
20
|
+
for (const [t, c] of y(e)) {
|
|
21
|
+
const a = t === "fairplay" ? e.fairplay.certificateUrl : void 0;
|
|
22
|
+
s[u[t]] = { licenseUrl: c.licenseUrl, ...a ? { serverCertificateUrl: a } : {} };
|
|
23
|
+
}
|
|
24
|
+
const r = n.licenseXhrSetup, i = n.licenseResponseCallback, p = {
|
|
25
|
+
emeEnabled: !0,
|
|
26
|
+
drmSystems: s,
|
|
27
|
+
licenseXhrSetup(t, c, a, l) {
|
|
28
|
+
var h;
|
|
29
|
+
const f = R(a.keySystem), o = f ? e[f] : void 0;
|
|
30
|
+
for (const [d, U] of Object.entries((o == null ? void 0 : o.headers) ?? {})) t.setRequestHeader(d, U);
|
|
31
|
+
return o != null && o.withCredentials && (t.withCredentials = !0), f === "fairplay" && ((h = e.fairplay) != null && h.prepareLicenseRequest) ? Promise.resolve(e.fairplay.prepareLicenseRequest(l, new Uint8Array(0))).then(b) : r == null ? void 0 : r.call(this, t, c, a, l);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
return ((w = e.fairplay) != null && w.parseLicenseResponse || i) && (p.licenseResponseCallback = function(t, c, a) {
|
|
35
|
+
var l;
|
|
36
|
+
if (R(a.keySystem) === "fairplay" && ((l = e.fairplay) != null && l.parseLicenseResponse)) {
|
|
37
|
+
const f = e.fairplay.parseLicenseResponse(t.response);
|
|
38
|
+
if (!(f instanceof Promise)) return S(f);
|
|
39
|
+
}
|
|
40
|
+
return i ? i.call(this, t, c, a) : t.response;
|
|
41
|
+
}), (v = e.widevine) != null && v.robustness && (p.drmSystemOptions = { videoRobustness: e.widevine.robustness, audioRobustness: e.widevine.robustness }), p;
|
|
42
|
+
}
|
|
43
|
+
function b(e) {
|
|
44
|
+
return typeof e == "string" || e instanceof Uint8Array ? e : e instanceof ArrayBuffer ? new Uint8Array(e) : ArrayBuffer.isView(e) ? new Uint8Array(e.buffer, e.byteOffset, e.byteLength) : String(e);
|
|
45
|
+
}
|
|
46
|
+
function S(e) {
|
|
47
|
+
if (e instanceof ArrayBuffer) return e;
|
|
48
|
+
const n = e;
|
|
49
|
+
return n.buffer.slice(n.byteOffset, n.byteOffset + n.byteLength);
|
|
50
|
+
}
|
|
51
|
+
function L(e) {
|
|
52
|
+
var s;
|
|
53
|
+
const n = {};
|
|
54
|
+
for (const [r, i] of y(e))
|
|
55
|
+
r !== "fairplay" && (n[u[r]] = {
|
|
56
|
+
serverURL: i.licenseUrl,
|
|
57
|
+
...i.headers ? { httpRequestHeaders: i.headers } : {},
|
|
58
|
+
...i.withCredentials ? { withCredentials: !0 } : {},
|
|
59
|
+
...r === "widevine" && ((s = e.widevine) != null && s.robustness) ? { videoRobustness: e.widevine.robustness, audioRobustness: e.widevine.robustness } : {}
|
|
60
|
+
});
|
|
61
|
+
return n;
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
u as KEY_SYSTEMS,
|
|
65
|
+
L as dashProtectionData,
|
|
66
|
+
y as drmEntries,
|
|
67
|
+
g as hasDrm,
|
|
68
|
+
A as hlsDrmConfig
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=keySystems-CNzjRq6e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keySystems-CNzjRq6e.js","sources":["../../src/drm/keySystems.ts"],"sourcesContent":["// `options.drm` → hls.js / dash.js ayarları.\nimport type { HlsConfig } from 'hls.js';\nimport type { ProtectionDataSet } from 'dashjs';\nimport type { HopeDrmLicense, HopeDrmOptions } from '../types';\n\nexport const KEY_SYSTEMS = {\n widevine: 'com.widevine.alpha',\n playready: 'com.microsoft.playready',\n fairplay: 'com.apple.fps',\n clearkey: 'org.w3.clearkey',\n} as const;\n\nexport type DrmName = keyof typeof KEY_SYSTEMS;\n\n/** Verilen sistemler, öncelik sırasıyla. */\nexport function drmEntries(drm: HopeDrmOptions | undefined): Array<[DrmName, HopeDrmLicense]> {\n if (!drm) return [];\n const order: DrmName[] = ['fairplay', 'widevine', 'playready', 'clearkey'];\n return order.filter((n) => drm[n]?.licenseUrl).map((n) => [n, drm[n]!]);\n}\n\nexport function hasDrm(drm: HopeDrmOptions | undefined): boolean {\n return drmEntries(drm).length > 0;\n}\n\nconst nameOf = (keySystem: string): DrmName | undefined => (Object.keys(KEY_SYSTEMS) as DrmName[]).find((n) => KEY_SYSTEMS[n] === keySystem);\n\n/** hls.js EME ayarları. */\nexport function hlsDrmConfig(drm: HopeDrmOptions, user: Partial<HlsConfig>): Partial<HlsConfig> {\n const drmSystems: NonNullable<HlsConfig['drmSystems']> = {};\n for (const [name, lic] of drmEntries(drm)) {\n const cert = name === 'fairplay' ? drm.fairplay!.certificateUrl : undefined;\n drmSystems[KEY_SYSTEMS[name] as keyof typeof drmSystems] = { licenseUrl: lic.licenseUrl, ...(cert ? { serverCertificateUrl: cert } : {}) };\n }\n const userSetup = user.licenseXhrSetup;\n const userResponse = user.licenseResponseCallback;\n const config: Partial<HlsConfig> = {\n emeEnabled: true,\n drmSystems,\n licenseXhrSetup(xhr, url, keyContext, challenge) {\n const name = nameOf(keyContext.keySystem);\n const lic = name ? drm[name] : undefined;\n for (const [k, v] of Object.entries(lic?.headers ?? {})) xhr.setRequestHeader(k, v);\n if (lic?.withCredentials) xhr.withCredentials = true;\n if (name === 'fairplay' && drm.fairplay?.prepareLicenseRequest) {\n return Promise.resolve(drm.fairplay.prepareLicenseRequest(challenge, new Uint8Array(0))).then(toChallenge);\n }\n return userSetup?.call(this, xhr, url, keyContext, challenge);\n },\n };\n if (drm.fairplay?.parseLicenseResponse || userResponse) {\n config.licenseResponseCallback = function (xhr, url, keyContext) {\n if (nameOf(keyContext.keySystem) === 'fairplay' && drm.fairplay?.parseLicenseResponse) {\n // hls.js eşzamanlı yanıt bekler; Promise dönen ayrıştırıcı burada kullanılamaz.\n const out = drm.fairplay.parseLicenseResponse(xhr.response as ArrayBuffer);\n if (!(out instanceof Promise)) return toArrayBuffer(out);\n }\n return userResponse ? userResponse.call(this, xhr, url, keyContext) : (xhr.response as ArrayBuffer);\n };\n }\n if (drm.widevine?.robustness) {\n config.drmSystemOptions = { videoRobustness: drm.widevine.robustness, audioRobustness: drm.widevine.robustness };\n }\n return config;\n}\n\nfunction toChallenge(body: BodyInit): Uint8Array | string {\n if (typeof body === 'string') return body;\n if (body instanceof Uint8Array) return body;\n if (body instanceof ArrayBuffer) return new Uint8Array(body);\n if (ArrayBuffer.isView(body)) return new Uint8Array(body.buffer, body.byteOffset, body.byteLength);\n return String(body);\n}\n\nfunction toArrayBuffer(b: BufferSource): ArrayBuffer {\n if (b instanceof ArrayBuffer) return b;\n const view = b as ArrayBufferView;\n return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength) as ArrayBuffer;\n}\n\n/** dash.js koruma verisi (FairPlay DASH'te kullanılmaz). */\nexport function dashProtectionData(drm: HopeDrmOptions): ProtectionDataSet {\n const out: ProtectionDataSet = {};\n for (const [name, lic] of drmEntries(drm)) {\n if (name === 'fairplay') continue;\n out[KEY_SYSTEMS[name]] = {\n serverURL: lic.licenseUrl,\n ...(lic.headers ? { httpRequestHeaders: lic.headers } : {}),\n ...(lic.withCredentials ? { withCredentials: true } : {}),\n ...(name === 'widevine' && drm.widevine?.robustness ? { videoRobustness: drm.widevine.robustness, audioRobustness: drm.widevine.robustness } : {}),\n };\n }\n return out;\n}\n"],"names":["KEY_SYSTEMS","drmEntries","drm","n","_a","hasDrm","nameOf","keySystem","hlsDrmConfig","user","_b","drmSystems","name","lic","cert","userSetup","userResponse","config","xhr","url","keyContext","challenge","k","v","toChallenge","out","toArrayBuffer","body","b","view","dashProtectionData"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var v = Object.defineProperty;
|
|
2
2
|
var m = (i, t, e) => t in i ? v(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e;
|
|
3
3
|
var o = (i, t, e) => m(i, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
class
|
|
4
|
+
class k {
|
|
5
5
|
constructor(t, e, s = {}) {
|
|
6
6
|
o(this, "seconds");
|
|
7
7
|
o(this, "loopStart", null);
|
|
@@ -14,8 +14,8 @@ class E {
|
|
|
14
14
|
}
|
|
15
15
|
/** currentTime'dan geriye doğru tam N saniyelik bir aralığı döngüye alır (video başına yakınsa ileri doğru taşar). */
|
|
16
16
|
enableLastN(t) {
|
|
17
|
-
const e = this.video.currentTime, s = this.video.duration,
|
|
18
|
-
this.loopStart = Math.max(0, e -
|
|
17
|
+
const e = this.video.currentTime, s = this.video.duration, r = t || this.seconds;
|
|
18
|
+
this.loopStart = Math.max(0, e - r), this.loopEnd = Math.min(Number.isFinite(s) ? s : 1 / 0, this.loopStart + r), this.activate(), this.updateMarkers();
|
|
19
19
|
}
|
|
20
20
|
setStart(t) {
|
|
21
21
|
this.loopStart = t ?? this.video.currentTime, this.updateMarkers();
|
|
@@ -44,32 +44,32 @@ class E {
|
|
|
44
44
|
updateMarkers() {
|
|
45
45
|
this.markers.clearMarkers();
|
|
46
46
|
const t = this.video.duration;
|
|
47
|
-
!t || !Number.isFinite(t) || (this.loopStart !== null && this.markers.addMarker(this.loopStart / t, "hp
|
|
47
|
+
!t || !Number.isFinite(t) || (this.loopStart !== null && this.markers.addMarker(this.loopStart / t, "hp-seek-marker-loop"), this.loopEnd !== null && this.markers.addMarker(this.loopEnd / t, "hp-seek-marker-loop"));
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
function S(i, t) {
|
|
51
|
-
const e = new
|
|
52
|
-
e.toggle(),
|
|
53
|
-
}),
|
|
51
|
+
const e = new k(i.videoEl, i.markers, t), { btn: s } = i.addControlButton(i.i18n.loop, "loop", () => {
|
|
52
|
+
e.toggle(), r();
|
|
53
|
+
}), r = () => {
|
|
54
54
|
s.classList.toggle("hp:text-accent", e.active);
|
|
55
55
|
};
|
|
56
56
|
e.refreshLabels = () => {
|
|
57
57
|
s.setAttribute("aria-label", i.i18n.loop);
|
|
58
58
|
};
|
|
59
|
-
const a = (
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
const l = i.seekBarEl.getBoundingClientRect(),
|
|
63
|
-
|
|
59
|
+
const a = (n) => {
|
|
60
|
+
if (n.button !== 1) return;
|
|
61
|
+
n.preventDefault();
|
|
62
|
+
const l = i.seekBarEl.getBoundingClientRect(), c = Math.min(1, Math.max(0, (n.clientX - l.left) / l.width)), d = i.videoEl.duration, h = Number.isFinite(d) ? c * d : void 0, p = e.getState();
|
|
63
|
+
p.active ? e.disable() : p.loopStart === null ? e.setStart(h) : e.setEnd(h), r();
|
|
64
64
|
};
|
|
65
65
|
i.seekBarEl.addEventListener("mousedown", a);
|
|
66
|
-
const
|
|
66
|
+
const u = e.destroy.bind(e);
|
|
67
67
|
return e.destroy = () => {
|
|
68
|
-
i.seekBarEl.removeEventListener("mousedown", a),
|
|
68
|
+
i.seekBarEl.removeEventListener("mousedown", a), u();
|
|
69
69
|
}, e;
|
|
70
70
|
}
|
|
71
71
|
export {
|
|
72
|
-
|
|
72
|
+
k as LoopSection,
|
|
73
73
|
S as installLoopSection
|
|
74
74
|
};
|
|
75
|
-
//# sourceMappingURL=loopSection-
|
|
75
|
+
//# sourceMappingURL=loopSection-Bwk4W8vz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopSection-Bwk4W8vz.js","sources":["../../src/plugins/loop-section/LoopSection.ts","../../src/plugins/loop-section/index.ts"],"sourcesContent":["import type { LoopSectionOptions } from '../../types';\n\nexport interface LoopSeekBarMarkers {\n addMarker(ratio: number, extraClass?: string): HTMLDivElement;\n clearMarkers(): void;\n}\n\nexport interface LoopSectionState {\n active: boolean;\n loopStart: number | null;\n loopEnd: number | null;\n}\n\n/** A/B döngü motoru. */\nexport class LoopSection {\n private readonly seconds: number;\n loopStart: number | null = null;\n loopEnd: number | null = null;\n active = false;\n\n constructor(\n private readonly video: HTMLVideoElement,\n private readonly markers: LoopSeekBarMarkers,\n options: LoopSectionOptions = {}\n ) {\n this.seconds = options.seconds || 10;\n }\n\n /** currentTime'dan geriye doğru tam N saniyelik bir aralığı döngüye alır (video başına yakınsa ileri doğru taşar). */\n enableLastN(secs?: number): void {\n const now = this.video.currentTime;\n const duration = this.video.duration;\n const s = secs || this.seconds;\n this.loopStart = Math.max(0, now - s);\n this.loopEnd = Math.min(Number.isFinite(duration) ? duration : Infinity, this.loopStart + s);\n this.activate();\n this.updateMarkers();\n }\n\n setStart(time?: number): void {\n this.loopStart = time ?? this.video.currentTime;\n this.updateMarkers();\n }\n\n setEnd(time?: number): void {\n this.loopEnd = time ?? this.video.currentTime;\n if (this.loopStart !== null && this.loopEnd > this.loopStart) {\n this.activate();\n this.updateMarkers();\n }\n }\n\n toggle(): void {\n if (this.active) this.disable();\n else this.enableLastN();\n }\n\n disable(): void {\n this.active = false;\n this.loopStart = null;\n this.loopEnd = null;\n this.video.removeEventListener('timeupdate', this.onTimeUpdate);\n this.markers.clearMarkers();\n }\n\n getState(): LoopSectionState {\n return { active: this.active, loopStart: this.loopStart, loopEnd: this.loopEnd };\n }\n\n /** `installLoopSection` bunu gerçek buton etiketini tazeleyen bir implementasyonla override eder (bkz. index.ts) — `destroy`'un üzerine yazılma deseniyle aynı. */\n refreshLabels(): void {\n /* no-op varsayılan */\n }\n\n destroy(): void {\n this.disable();\n }\n\n private activate(): void {\n this.active = true;\n this.video.removeEventListener('timeupdate', this.onTimeUpdate);\n this.video.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n private readonly onTimeUpdate = (): void => {\n if (this.loopEnd !== null && this.video.currentTime >= this.loopEnd) {\n this.video.currentTime = this.loopStart ?? 0;\n }\n };\n\n private updateMarkers(): void {\n this.markers.clearMarkers();\n const duration = this.video.duration;\n if (!duration || !Number.isFinite(duration)) return;\n\n if (this.loopStart !== null) {\n this.markers.addMarker(this.loopStart / duration, 'hp-seek-marker-loop');\n }\n if (this.loopEnd !== null) {\n this.markers.addMarker(this.loopEnd / duration, 'hp-seek-marker-loop');\n }\n }\n}\n","import { LoopSection, type LoopSeekBarMarkers } from './LoopSection';\nimport type { LoopSectionOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\nexport interface LoopSectionPlayerContext {\n videoEl: HTMLVideoElement;\n seekBarEl: HTMLElement;\n markers: LoopSeekBarMarkers;\n addControlButton(label: string, iconName: string, onClick: () => void): { btn: HTMLButtonElement; icon: HTMLElement };\n i18n: HopeLocaleStrings;\n}\n\n/** Döngü motorunu kurar: kontrol çubuğuna toggle butonu, seek bar'da orta-tık ile A → B → kapat. */\nexport function installLoopSection(ctx: LoopSectionPlayerContext, options: LoopSectionOptions): LoopSection {\n const engine = new LoopSection(ctx.videoEl, ctx.markers, options);\n\n const { btn } = ctx.addControlButton(ctx.i18n.loop, 'loop', () => {\n engine.toggle();\n refresh();\n });\n\n const refresh = (): void => {\n btn.classList.toggle('hp:text-accent', engine.active);\n };\n\n engine.refreshLabels = () => {\n btn.setAttribute('aria-label', ctx.i18n.loop);\n };\n\n const onSeekBarMiddleClick = (e: MouseEvent): void => {\n if (e.button !== 1) return;\n e.preventDefault();\n\n const rect = ctx.seekBarEl.getBoundingClientRect();\n const ratio = Math.min(1, Math.max(0, (e.clientX - rect.left) / rect.width));\n const duration = ctx.videoEl.duration;\n const clickTime = Number.isFinite(duration) ? ratio * duration : undefined;\n\n const state = engine.getState();\n if (state.active) engine.disable();\n else if (state.loopStart === null) engine.setStart(clickTime);\n else engine.setEnd(clickTime);\n\n refresh();\n };\n ctx.seekBarEl.addEventListener('mousedown', onSeekBarMiddleClick);\n\n const originalDestroy = engine.destroy.bind(engine);\n engine.destroy = () => {\n ctx.seekBarEl.removeEventListener('mousedown', onSeekBarMiddleClick);\n originalDestroy();\n };\n\n return engine;\n}\n\nexport { LoopSection };\nexport type { LoopSeekBarMarkers };\n"],"names":["LoopSection","video","markers","options","__publicField","secs","now","duration","s","time","installLoopSection","ctx","engine","btn","refresh","onSeekBarMiddleClick","e","rect","ratio","clickTime","state","originalDestroy"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var u = Object.defineProperty;
|
|
2
|
-
var m = (
|
|
3
|
-
var
|
|
4
|
-
import { c as
|
|
5
|
-
const
|
|
2
|
+
var m = (h, e, t) => e in h ? u(h, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : h[e] = t;
|
|
3
|
+
var s = (h, e, t) => m(h, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { c as f } from "./player-D2_HRzot.js";
|
|
5
|
+
const b = {
|
|
6
6
|
enabled: !1,
|
|
7
7
|
mode: "rich",
|
|
8
8
|
text: "",
|
|
@@ -21,33 +21,35 @@ const f = {
|
|
|
21
21
|
}, k = { enabled: !1, url: "", method: "GET", includeMarker: !1 };
|
|
22
22
|
class v {
|
|
23
23
|
constructor(e, t) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
s(this, "markers");
|
|
25
|
+
s(this, "popupGlobal");
|
|
26
|
+
s(this, "pingGlobal");
|
|
27
|
+
s(this, "triggerOnSeek");
|
|
28
|
+
s(this, "seekJumpThresholdSec");
|
|
29
|
+
s(this, "seekIgnoreWindowMs");
|
|
30
|
+
/** `options.color` — öğede renk yoksa. */
|
|
31
|
+
s(this, "defaultColor");
|
|
32
|
+
s(this, "hitSet", /* @__PURE__ */ new Set());
|
|
33
|
+
s(this, "lastHitAt", /* @__PURE__ */ new Map());
|
|
34
|
+
s(this, "lastTime", 0);
|
|
35
|
+
s(this, "isSeeking", !1);
|
|
36
|
+
s(this, "ignoreUntilTs", 0);
|
|
37
|
+
s(this, "popupEl", null);
|
|
38
|
+
s(this, "onLoadedMetadata", () => {
|
|
37
39
|
const e = this.ctx.videoEl.duration;
|
|
38
40
|
!Number.isFinite(e) || e <= 0 || (this.markers.forEach((t) => {
|
|
39
41
|
if (t.el) return;
|
|
40
|
-
const i = this.ctx.addSeekBarMarker(t.time / e);
|
|
41
|
-
t.color && (i.style.backgroundColor = t.color), t.
|
|
42
|
+
const i = this.ctx.addSeekBarMarker(t.time / e, "", t.label);
|
|
43
|
+
t.color && (i.style.backgroundColor = t.color), t.el = i;
|
|
42
44
|
}), this.lastTime = this.ctx.videoEl.currentTime || 0);
|
|
43
45
|
});
|
|
44
|
-
|
|
46
|
+
s(this, "onSeeking", () => {
|
|
45
47
|
this.isSeeking = !0, this.ignoreUntilTs = Date.now() + this.seekIgnoreWindowMs, this.lastTime = this.ctx.videoEl.currentTime || 0;
|
|
46
48
|
});
|
|
47
|
-
|
|
49
|
+
s(this, "onSeeked", () => {
|
|
48
50
|
this.lastTime = this.ctx.videoEl.currentTime || 0, this.isSeeking = !1, this.ignoreUntilTs = Date.now() + this.seekIgnoreWindowMs;
|
|
49
51
|
});
|
|
50
|
-
|
|
52
|
+
s(this, "onTimeUpdate", () => {
|
|
51
53
|
const e = Date.now();
|
|
52
54
|
if (e < this.ignoreUntilTs || this.isSeeking) return;
|
|
53
55
|
const t = this.ctx.videoEl.currentTime;
|
|
@@ -56,22 +58,22 @@ class v {
|
|
|
56
58
|
this.lastTime = t;
|
|
57
59
|
return;
|
|
58
60
|
}
|
|
59
|
-
for (const
|
|
60
|
-
const a = `${
|
|
61
|
-
if (
|
|
62
|
-
if (!
|
|
61
|
+
for (const o of this.markers) {
|
|
62
|
+
const a = `${o.time}-${o.idx}`;
|
|
63
|
+
if (o.once && this.hitSet.has(a)) continue;
|
|
64
|
+
if (!o.once) {
|
|
63
65
|
const r = this.lastHitAt.get(a) || 0;
|
|
64
|
-
if (e - r <
|
|
66
|
+
if (e - r < o.cooldownMs) continue;
|
|
65
67
|
}
|
|
66
|
-
if (!(this.lastTime <
|
|
67
|
-
|
|
68
|
-
const
|
|
69
|
-
|
|
68
|
+
if (!(this.lastTime < o.time && t >= o.time - o.tolerance)) continue;
|
|
69
|
+
o.once ? this.hitSet.add(a) : this.lastHitAt.set(a, e), o.pauseOnHit && this.ctx.videoEl.pause(), this.firePing(o), this.fireAction(o);
|
|
70
|
+
const n = o.popup ? { ...this.popupGlobal, ...o.popup } : this.popupGlobal;
|
|
71
|
+
n.enabled && (this.ctx.videoEl.pause(), this.showPopup(n));
|
|
70
72
|
break;
|
|
71
73
|
}
|
|
72
74
|
this.lastTime = t;
|
|
73
75
|
});
|
|
74
|
-
this.ctx = e, this.triggerOnSeek = t.triggerOnSeek === !0, this.seekJumpThresholdSec = t.seekJumpThresholdSec ?? 1, this.seekIgnoreWindowMs = t.seekIgnoreWindowMs ?? 250, this.popupGlobal = { ...
|
|
76
|
+
this.ctx = e, this.triggerOnSeek = t.triggerOnSeek === !0, this.seekJumpThresholdSec = t.seekJumpThresholdSec ?? 1, this.seekIgnoreWindowMs = t.seekIgnoreWindowMs ?? 250, this.popupGlobal = { ...b, ...t.popup }, this.pingGlobal = { ...k, ...t.ping }, this.defaultColor = t.color, this.markers = (t.items || []).map((i, o) => this.normalize(i, o)).filter((i) => Number.isFinite(i.time) && i.time >= 0).sort((i, o) => i.time - o.time), e.videoEl.addEventListener("loadedmetadata", this.onLoadedMetadata), e.videoEl.addEventListener("timeupdate", this.onTimeUpdate), e.videoEl.addEventListener("seeking", this.onSeeking), e.videoEl.addEventListener("seeked", this.onSeeked), e.videoEl.readyState >= 1 && this.onLoadedMetadata();
|
|
75
77
|
}
|
|
76
78
|
/** Popup lazy oluşturulup yeniden kullanılıyor (`ensurePopup`) — zaten açıksa close butonunun statik etiketini tazeler. */
|
|
77
79
|
refreshLabels() {
|
|
@@ -90,7 +92,7 @@ class v {
|
|
|
90
92
|
return {
|
|
91
93
|
idx: t,
|
|
92
94
|
time: Number(e.time),
|
|
93
|
-
color: e.color,
|
|
95
|
+
color: e.color ?? this.defaultColor,
|
|
94
96
|
label: e.label ?? "",
|
|
95
97
|
pauseOnHit: e.pauseOnHit ?? !0,
|
|
96
98
|
once: e.once ?? !0,
|
|
@@ -145,8 +147,8 @@ class v {
|
|
|
145
147
|
if (typeof i == "function")
|
|
146
148
|
try {
|
|
147
149
|
i({ marker: e, payload: t.payload });
|
|
148
|
-
} catch (
|
|
149
|
-
console.warn("[HopePlayer markers] custom action fonksiyonu hata verdi:",
|
|
150
|
+
} catch (o) {
|
|
151
|
+
console.warn("[HopePlayer markers] custom action fonksiyonu hata verdi:", o);
|
|
150
152
|
}
|
|
151
153
|
else
|
|
152
154
|
console.warn("[HopePlayer markers] custom action fonksiyonu bulunamadı: window." + t.name);
|
|
@@ -160,17 +162,17 @@ class v {
|
|
|
160
162
|
const t = document.createElement("div");
|
|
161
163
|
t.className = "hp:relative hp:max-w-[85%] hp:bg-surface-elev hp:text-on-surface hp:rounded-lg hp:p-4 hp:text-center hp:shadow-xl", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "true");
|
|
162
164
|
const i = document.createElement("button");
|
|
163
|
-
i.type = "button", i.setAttribute("aria-label", this.ctx.i18n.close), i.className = "hp:absolute hp:top-1 hp:right-1 hp:w-6 hp:h-6 hp:flex hp:items-center hp:justify-center hp:bg-transparent hp:border-0 hp:cursor-pointer hp:text-on-surface", i.appendChild(
|
|
164
|
-
const
|
|
165
|
-
|
|
165
|
+
i.type = "button", i.setAttribute("aria-label", this.ctx.i18n.close), i.className = "hp:absolute hp:top-1 hp:right-1 hp:w-6 hp:h-6 hp:flex hp:items-center hp:justify-center hp:bg-transparent hp:border-0 hp:cursor-pointer hp:text-on-surface", i.appendChild(f("close", "hp:text-sm"));
|
|
166
|
+
const o = document.createElement("div");
|
|
167
|
+
o.className = "hp:hidden hp:mb-2";
|
|
166
168
|
const a = document.createElement("img");
|
|
167
|
-
a.className = "hp:max-w-full hp:rounded",
|
|
169
|
+
a.className = "hp:max-w-full hp:rounded", o.appendChild(a);
|
|
168
170
|
const l = document.createElement("div");
|
|
169
171
|
l.className = "hp:text-sm hp:mb-2";
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
+
const n = document.createElement("a");
|
|
173
|
+
n.target = "_blank", n.rel = "noopener noreferrer", n.className = "hp:hidden hp:text-accent hp:underline hp:text-sm hp:block hp:mb-2";
|
|
172
174
|
const r = document.createElement("button");
|
|
173
|
-
return r.type = "button", r.className = "hp:hidden hp:px-4 hp:py-1.5 hp:rounded hp:bg-accent hp:text-on-accent hp:border-0 hp:cursor-pointer hp:text-sm", t.append(i,
|
|
175
|
+
return r.type = "button", r.className = "hp:hidden hp:px-4 hp:py-1.5 hp:rounded hp:bg-accent hp:text-on-accent hp:border-0 hp:cursor-pointer hp:text-sm", t.append(i, o, l, n, r), e.appendChild(t), this.ctx.overlayContainerEl.appendChild(e), this.popupEl = e, e;
|
|
174
176
|
}
|
|
175
177
|
hidePopup() {
|
|
176
178
|
var e, t;
|
|
@@ -181,25 +183,25 @@ class v {
|
|
|
181
183
|
});
|
|
182
184
|
}
|
|
183
185
|
showPopup(e) {
|
|
184
|
-
const t = this.ensurePopup(), i = t.querySelector("div.hp\\:text-sm.hp\\:mb-2:not(.hp\\:hidden)"),
|
|
186
|
+
const t = this.ensurePopup(), i = t.querySelector("div.hp\\:text-sm.hp\\:mb-2:not(.hp\\:hidden)"), o = t.querySelector("div.hp\\:mb-2"), a = t.querySelector("img"), l = t.querySelector("a"), n = t.querySelectorAll("button")[1], r = t.querySelector("button");
|
|
185
187
|
r && (r.style.display = e.showClose === !1 ? "none" : ""), i && (i.textContent = e.text || "");
|
|
186
188
|
const c = e.mode === "rich";
|
|
187
|
-
|
|
188
|
-
const
|
|
189
|
-
r &&
|
|
190
|
-
const d =
|
|
191
|
-
|
|
189
|
+
o && a && (c && e.imageUrl ? (o.classList.remove("hp:hidden"), a.src = e.imageUrl, a.alt = e.imageAlt || "") : (o.classList.add("hp:hidden"), a.removeAttribute("src"))), l && (c && e.linkUrl ? (l.classList.remove("hp:hidden"), l.href = e.linkUrl, l.textContent = e.linkText || this.ctx.i18n.markerLearnMore) : (l.classList.add("hp:hidden"), l.removeAttribute("href"))), n && (e.showContinue ? (n.classList.remove("hp:hidden"), n.textContent = e.continueText || this.ctx.i18n.markerContinue) : n.classList.add("hp:hidden"));
|
|
190
|
+
const p = r == null ? void 0 : r.cloneNode(!0);
|
|
191
|
+
r && p && r.replaceWith(p);
|
|
192
|
+
const d = n == null ? void 0 : n.cloneNode(!0);
|
|
193
|
+
n && d && n.replaceWith(d), p == null || p.addEventListener("click", () => {
|
|
192
194
|
this.hidePopup(), e.autoplayOnClose && this.safePlay();
|
|
193
195
|
}), d == null || d.addEventListener("click", () => {
|
|
194
196
|
this.hidePopup(), e.autoplayOnContinue && this.safePlay();
|
|
195
197
|
}), t.classList.remove("hp:hidden"), t.classList.add("hp:flex");
|
|
196
198
|
}
|
|
197
199
|
}
|
|
198
|
-
function y(
|
|
199
|
-
return new v(
|
|
200
|
+
function y(h, e) {
|
|
201
|
+
return new v(h, e);
|
|
200
202
|
}
|
|
201
203
|
export {
|
|
202
204
|
v as MarkProgress,
|
|
203
205
|
y as installMarkers
|
|
204
206
|
};
|
|
205
|
-
//# sourceMappingURL=markers-
|
|
207
|
+
//# sourceMappingURL=markers-L69W3kj6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markers-L69W3kj6.js","sources":["../../src/plugins/markers/MarkProgress.ts","../../src/plugins/markers/index.ts"],"sourcesContent":["import { createIcon } from '../../icons/Icon';\nimport type { MarkerItem, MarkerPingOptions, MarkerPopupOptions, MarkersOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\nexport interface MarkersPlayerContext {\n videoEl: HTMLVideoElement;\n /** Popup overlay'in ekleneceği katman (shadow root içinde, video üzerinde). */\n overlayContainerEl: HTMLElement;\n /** Seek bar üzerinde işaretçi çizmek için — SeekBar.addMarker ile aynı imza. */\n addSeekBarMarker(ratio: number, extraClass?: string, label?: string): HTMLDivElement;\n i18n: HopeLocaleStrings;\n}\n\ninterface NormalizedMarker extends Required<Pick<MarkerItem, 'time'>> {\n idx: number;\n color?: string;\n label: string;\n pauseOnHit: boolean;\n once: boolean;\n tolerance: number;\n cooldownMs: number;\n action?: MarkerItem['action'];\n popup: MarkerPopupOptions | null;\n pingUrl: string;\n el?: HTMLElement;\n}\n\nconst POPUP_DEFAULTS: Required<MarkerPopupOptions> = {\n enabled: false,\n mode: 'rich',\n text: '',\n imageUrl: '',\n imageAlt: '',\n linkUrl: '',\n // Boş bırakılıyor (sentinel) — gerçek varsayılan metin showPopup()'ta\n // `ctx.i18n.markerLearnMore`/`markerContinue`'dan okunuyor, dil\n // değişimini takip edebilsin diye burada SABİT bir dilde gömülü değil.\n linkText: '',\n continueText: '',\n showContinue: true,\n showClose: true,\n autoplayOnClose: true,\n autoplayOnContinue: true,\n};\n\nconst PING_DEFAULTS: Required<MarkerPingOptions> = { enabled: false, url: '', method: 'GET', includeMarker: false };\n\n/** Zaman tabanlı seek bar işaretçileri — seek/jump koruması, once/cooldown, popup/ping/aksiyon. */\nexport class MarkProgress {\n private readonly markers: NormalizedMarker[];\n private readonly popupGlobal: Required<MarkerPopupOptions>;\n private readonly pingGlobal: Required<MarkerPingOptions>;\n private readonly triggerOnSeek: boolean;\n private readonly seekJumpThresholdSec: number;\n private readonly seekIgnoreWindowMs: number;\n /** `options.color` — öğede renk yoksa. */\n private readonly defaultColor: string | undefined;\n\n private hitSet = new Set<string>();\n private lastHitAt = new Map<string, number>();\n private lastTime = 0;\n private isSeeking = false;\n private ignoreUntilTs = 0;\n private popupEl: HTMLElement | null = null;\n\n constructor(\n private readonly ctx: MarkersPlayerContext,\n options: MarkersOptions\n ) {\n this.triggerOnSeek = options.triggerOnSeek === true;\n this.seekJumpThresholdSec = options.seekJumpThresholdSec ?? 1;\n this.seekIgnoreWindowMs = options.seekIgnoreWindowMs ?? 250;\n this.popupGlobal = { ...POPUP_DEFAULTS, ...options.popup };\n this.pingGlobal = { ...PING_DEFAULTS, ...options.ping };\n this.defaultColor = options.color;\n\n this.markers = (options.items || [])\n .map((m, idx) => this.normalize(m, idx))\n .filter((m) => Number.isFinite(m.time) && m.time >= 0)\n .sort((a, b) => a.time - b.time);\n\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n ctx.videoEl.addEventListener('seeking', this.onSeeking);\n ctx.videoEl.addEventListener('seeked', this.onSeeked);\n\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n /** Popup lazy oluşturulup yeniden kullanılıyor (`ensurePopup`) — zaten açıksa close butonunun statik etiketini tazeler. */\n refreshLabels(): void {\n const closeBtn = this.popupEl?.querySelector('button') as HTMLButtonElement | null;\n if (closeBtn) {\n closeBtn.setAttribute('aria-label', this.ctx.i18n.close);\n }\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.videoEl.removeEventListener('timeupdate', this.onTimeUpdate);\n this.ctx.videoEl.removeEventListener('seeking', this.onSeeking);\n this.ctx.videoEl.removeEventListener('seeked', this.onSeeked);\n this.markers.forEach((m) => m.el?.remove());\n this.popupEl?.remove();\n this.popupEl = null;\n this.hitSet.clear();\n this.lastHitAt.clear();\n }\n\n private normalize(m: MarkerItem, idx: number): NormalizedMarker {\n return {\n idx,\n time: Number(m.time),\n color: m.color ?? this.defaultColor,\n label: m.label ?? '',\n pauseOnHit: m.pauseOnHit ?? true,\n once: m.once ?? true,\n tolerance: m.tolerance ?? 0.25,\n cooldownMs: m.cooldownMs ?? 600,\n action: m.action,\n popup: m.popup ?? null,\n pingUrl: m.pingUrl ?? '',\n };\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.markers.forEach((m) => {\n if (m.el) return;\n const el = this.ctx.addSeekBarMarker(m.time / duration, '', m.label);\n if (m.color) el.style.backgroundColor = m.color;\n m.el = el;\n });\n\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n };\n\n private readonly onSeeking = (): void => {\n this.isSeeking = true;\n this.ignoreUntilTs = Date.now() + this.seekIgnoreWindowMs;\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n };\n\n private readonly onSeeked = (): void => {\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n this.isSeeking = false;\n this.ignoreUntilTs = Date.now() + this.seekIgnoreWindowMs;\n };\n\n private readonly onTimeUpdate = (): void => {\n const now = Date.now();\n if (now < this.ignoreUntilTs) return;\n if (this.isSeeking) return;\n\n const t = this.ctx.videoEl.currentTime;\n if (!Number.isFinite(t)) return;\n\n const jumped = Math.abs(t - this.lastTime) >= this.seekJumpThresholdSec;\n if (jumped && !this.triggerOnSeek) {\n this.lastTime = t;\n return;\n }\n\n for (const m of this.markers) {\n const key = `${m.time}-${m.idx}`;\n if (m.once && this.hitSet.has(key)) continue;\n if (!m.once) {\n const last = this.lastHitAt.get(key) || 0;\n if (now - last < m.cooldownMs) continue;\n }\n\n const crossed = this.lastTime < m.time && t >= m.time - m.tolerance;\n if (!crossed) continue;\n\n if (m.once) this.hitSet.add(key);\n else this.lastHitAt.set(key, now);\n\n if (m.pauseOnHit) this.ctx.videoEl.pause();\n\n this.firePing(m);\n this.fireAction(m);\n\n const popupCfg = m.popup ? { ...this.popupGlobal, ...m.popup } : this.popupGlobal;\n if (popupCfg.enabled) {\n this.ctx.videoEl.pause();\n this.showPopup(popupCfg);\n }\n break;\n }\n\n this.lastTime = t;\n };\n\n private resolveUrlTemplate(url: string, m: NormalizedMarker): string {\n if (!url) return '';\n return url.replaceAll('{time}', encodeURIComponent(String(m.time))).replaceAll('{label}', encodeURIComponent(m.label));\n }\n\n private firePing(m: NormalizedMarker): void {\n const baseUrl = m.pingUrl || this.pingGlobal.url;\n const url = this.resolveUrlTemplate(baseUrl, m);\n if (!this.pingGlobal.enabled || !url) return;\n\n try {\n if (this.pingGlobal.method === 'POST') {\n fetch(url, {\n method: 'POST',\n keepalive: true,\n headers: this.pingGlobal.includeMarker ? { 'Content-Type': 'application/json' } : undefined,\n body: this.pingGlobal.includeMarker ? JSON.stringify({ time: m.time, label: m.label, ts: Date.now() }) : undefined,\n }).catch(() => {});\n } else {\n fetch(url, { method: 'GET', keepalive: true }).catch(() => {});\n }\n } catch {\n /* no-op */\n }\n }\n\n private fireAction(m: NormalizedMarker): void {\n const a = m.action;\n if (!a) return;\n\n if (a.type === 'log') {\n console.log('[HopePlayer markers]', a.name || 'marker_hit', { time: m.time, label: m.label }, a.payload);\n return;\n }\n\n if (a.type === 'datalayer') {\n try {\n const w = window as unknown as { dataLayer?: unknown[] };\n w.dataLayer = w.dataLayer || [];\n w.dataLayer.push({\n event: 'HopePlayerVideoEvents',\n trigger: a.name || 'marker_hit',\n marker: { time: m.time, label: m.label, color: m.color },\n payload: a.payload ?? {},\n ts: Date.now(),\n });\n } catch {\n /* no-op */\n }\n return;\n }\n\n if (a.type === 'custom') {\n const fn = a.name ? (window as unknown as Record<string, unknown>)[a.name] : null;\n if (typeof fn === 'function') {\n try {\n (fn as (ctx: unknown) => void)({ marker: m, payload: a.payload });\n } catch (err) {\n console.warn('[HopePlayer markers] custom action fonksiyonu hata verdi:', err);\n }\n } else {\n console.warn('[HopePlayer markers] custom action fonksiyonu bulunamadı: window.' + a.name);\n }\n }\n }\n\n private ensurePopup(): HTMLElement {\n if (this.popupEl) return this.popupEl;\n\n const overlay = document.createElement('div');\n overlay.setAttribute('part', 'marker-popup');\n overlay.className = 'hp:hidden hp:absolute hp:inset-0 hp:z-30 hp:items-center hp:justify-center hp:bg-black/70';\n\n const panel = document.createElement('div');\n panel.className = 'hp:relative hp:max-w-[85%] hp:bg-surface-elev hp:text-on-surface hp:rounded-lg hp:p-4 hp:text-center hp:shadow-xl';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.setAttribute('aria-label', this.ctx.i18n.close);\n closeBtn.className = 'hp:absolute hp:top-1 hp:right-1 hp:w-6 hp:h-6 hp:flex hp:items-center hp:justify-center hp:bg-transparent hp:border-0 hp:cursor-pointer hp:text-on-surface';\n closeBtn.appendChild(createIcon('close', 'hp:text-sm'));\n\n const mediaWrap = document.createElement('div');\n mediaWrap.className = 'hp:hidden hp:mb-2';\n const img = document.createElement('img');\n img.className = 'hp:max-w-full hp:rounded';\n mediaWrap.appendChild(img);\n\n const textEl = document.createElement('div');\n textEl.className = 'hp:text-sm hp:mb-2';\n\n const linkEl = document.createElement('a');\n linkEl.target = '_blank';\n linkEl.rel = 'noopener noreferrer';\n linkEl.className = 'hp:hidden hp:text-accent hp:underline hp:text-sm hp:block hp:mb-2';\n\n const continueBtn = document.createElement('button');\n continueBtn.type = 'button';\n continueBtn.className = 'hp:hidden hp:px-4 hp:py-1.5 hp:rounded hp:bg-accent hp:text-on-accent hp:border-0 hp:cursor-pointer hp:text-sm';\n\n panel.append(closeBtn, mediaWrap, textEl, linkEl, continueBtn);\n overlay.appendChild(panel);\n this.ctx.overlayContainerEl.appendChild(overlay);\n this.popupEl = overlay;\n return overlay;\n }\n\n private hidePopup(): void {\n this.popupEl?.classList.add('hp:hidden');\n this.popupEl?.classList.remove('hp:flex');\n }\n\n private safePlay(): void {\n void this.ctx.videoEl.play().catch(() => {});\n }\n\n private showPopup(cfg: Required<MarkerPopupOptions>): void {\n const el = this.ensurePopup();\n const textEl = el.querySelector('div.hp\\\\:text-sm.hp\\\\:mb-2:not(.hp\\\\:hidden)') as HTMLElement | null;\n const mediaWrap = el.querySelector('div.hp\\\\:mb-2') as HTMLElement | null;\n const img = el.querySelector('img') as HTMLImageElement | null;\n const linkEl = el.querySelector('a') as HTMLAnchorElement | null;\n const continueBtn = el.querySelectorAll('button')[1] as HTMLButtonElement | null;\n const closeBtn = el.querySelector('button') as HTMLButtonElement | null;\n\n if (closeBtn) closeBtn.style.display = cfg.showClose === false ? 'none' : '';\n if (textEl) textEl.textContent = cfg.text || '';\n\n const isRich = cfg.mode === 'rich';\n if (mediaWrap && img) {\n if (isRich && cfg.imageUrl) {\n mediaWrap.classList.remove('hp:hidden');\n img.src = cfg.imageUrl;\n img.alt = cfg.imageAlt || '';\n } else {\n mediaWrap.classList.add('hp:hidden');\n img.removeAttribute('src');\n }\n }\n\n if (linkEl) {\n if (isRich && cfg.linkUrl) {\n linkEl.classList.remove('hp:hidden');\n linkEl.href = cfg.linkUrl;\n linkEl.textContent = cfg.linkText || this.ctx.i18n.markerLearnMore;\n } else {\n linkEl.classList.add('hp:hidden');\n linkEl.removeAttribute('href');\n }\n }\n\n if (continueBtn) {\n if (cfg.showContinue) {\n continueBtn.classList.remove('hp:hidden');\n continueBtn.textContent = cfg.continueText || this.ctx.i18n.markerContinue;\n } else {\n continueBtn.classList.add('hp:hidden');\n }\n }\n\n const newClose = closeBtn?.cloneNode(true) as HTMLButtonElement | undefined;\n if (closeBtn && newClose) closeBtn.replaceWith(newClose);\n const newCont = continueBtn?.cloneNode(true) as HTMLButtonElement | undefined;\n if (continueBtn && newCont) continueBtn.replaceWith(newCont);\n\n newClose?.addEventListener('click', () => {\n this.hidePopup();\n if (cfg.autoplayOnClose) this.safePlay();\n });\n newCont?.addEventListener('click', () => {\n this.hidePopup();\n if (cfg.autoplayOnContinue) this.safePlay();\n });\n\n el.classList.remove('hp:hidden');\n el.classList.add('hp:flex');\n }\n}\n","import { MarkProgress, type MarkersPlayerContext } from './MarkProgress';\nimport type { MarkersOptions } from '../../types';\n\nexport function installMarkers(ctx: MarkersPlayerContext, options: MarkersOptions): MarkProgress {\n return new MarkProgress(ctx, options);\n}\n\nexport { MarkProgress };\nexport type { MarkersPlayerContext };\n"],"names":["POPUP_DEFAULTS","PING_DEFAULTS","MarkProgress","ctx","options","__publicField","duration","m","el","now","key","last","popupCfg","idx","a","b","closeBtn","_a","url","baseUrl","w","fn","err","overlay","panel","createIcon","mediaWrap","img","textEl","linkEl","continueBtn","_b","cfg","isRich","newClose","newCont","installMarkers"],"mappings":"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"}
|