@hopeplayer/core 1.0.17 → 1.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/HopePlayerElement.d.ts +2 -0
  2. package/dist/HopePlayerElement.d.ts.map +1 -1
  3. package/dist/chunks/{adTriggers-4SueRFgK.js → adTriggers-DXmtF4t2.js} +112 -117
  4. package/dist/chunks/adTriggers-DXmtF4t2.js.map +1 -0
  5. package/dist/chunks/{ads-DPL7m9PV.js → ads-MCG5a6eK.js} +2 -2
  6. package/dist/chunks/{ads-DPL7m9PV.js.map → ads-MCG5a6eK.js.map} +1 -1
  7. package/dist/chunks/{cast-DCAT2agI.js → cast-bMrkGGuD.js} +70 -66
  8. package/dist/chunks/cast-bMrkGGuD.js.map +1 -0
  9. package/dist/chunks/{markers-DE4O8xbw.js → markers-BhMJLPqj.js} +2 -2
  10. package/dist/chunks/{markers-DE4O8xbw.js.map → markers-BhMJLPqj.js.map} +1 -1
  11. package/dist/chunks/{player-C886oKP-.js → player-DW5iWvPs.js} +260 -229
  12. package/dist/chunks/player-DW5iWvPs.js.map +1 -0
  13. package/dist/chunks/{playlist-CI3mRZjo.js → playlist-DYGbJ5wz.js} +24 -24
  14. package/dist/chunks/playlist-DYGbJ5wz.js.map +1 -0
  15. package/dist/chunks/{qrResume-BNy8XCp_.js → qrResume-DXwD3oSA.js} +29 -30
  16. package/dist/chunks/{qrResume-BNy8XCp_.js.map → qrResume-DXwD3oSA.js.map} +1 -1
  17. package/dist/chunks/{redirectScreen-CJ3q9OX4.js → redirectScreen-CSjrS8Kg.js} +2 -2
  18. package/dist/chunks/{redirectScreen-CJ3q9OX4.js.map → redirectScreen-CSjrS8Kg.js.map} +1 -1
  19. package/dist/chunks/{rewardedUnlock-EyGMB9PK.js → rewardedUnlock-DZ_qPcDG.js} +2 -2
  20. package/dist/chunks/{rewardedUnlock-EyGMB9PK.js.map → rewardedUnlock-DZ_qPcDG.js.map} +1 -1
  21. package/dist/chunks/seekWhenReady-Clzne3-S.js +32 -0
  22. package/dist/chunks/seekWhenReady-Clzne3-S.js.map +1 -0
  23. package/dist/chunks/{segments-C2HKU6XK.js → segments-LsZPlbYi.js} +2 -2
  24. package/dist/chunks/{segments-C2HKU6XK.js.map → segments-LsZPlbYi.js.map} +1 -1
  25. package/dist/chunks/{sponsorship-DyFwGmEb.js → sponsorship-BT21uwN5.js} +36 -41
  26. package/dist/chunks/sponsorship-BT21uwN5.js.map +1 -0
  27. package/dist/chunks/{spriteThumbnails-D0NQ5CCp.js → spriteThumbnails-BQkEBRu-.js} +2 -2
  28. package/dist/chunks/{spriteThumbnails-D0NQ5CCp.js.map → spriteThumbnails-BQkEBRu-.js.map} +1 -1
  29. package/dist/chunks/{story-D5Got6-6.js → story-H6f7gSoX.js} +27 -15
  30. package/dist/chunks/story-H6f7gSoX.js.map +1 -0
  31. package/dist/chunks/trackingPixel-D2wxdCEz.js +20 -0
  32. package/dist/chunks/trackingPixel-D2wxdCEz.js.map +1 -0
  33. package/dist/controls/SeekBar.d.ts.map +1 -1
  34. package/dist/hls/SourceManager.d.ts.map +1 -1
  35. package/dist/hope-player.js +1 -1
  36. package/dist/keyboard/KeyboardController.d.ts.map +1 -1
  37. package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
  38. package/dist/plugins/cast/CastController.d.ts.map +1 -1
  39. package/dist/plugins/playlist/PlaylistRunner.d.ts.map +1 -1
  40. package/dist/plugins/qr-resume/QrResume.d.ts.map +1 -1
  41. package/dist/plugins/shared/seekWhenReady.d.ts +22 -0
  42. package/dist/plugins/shared/seekWhenReady.d.ts.map +1 -0
  43. package/dist/plugins/shared/trackingPixel.d.ts +8 -0
  44. package/dist/plugins/shared/trackingPixel.d.ts.map +1 -0
  45. package/dist/plugins/sponsorship/SponsorshipLayer.d.ts.map +1 -1
  46. package/dist/plugins/story/HopeStory.d.ts +2 -0
  47. package/dist/plugins/story/HopeStory.d.ts.map +1 -1
  48. package/dist/screens/ErrorScreen.d.ts +7 -0
  49. package/dist/screens/ErrorScreen.d.ts.map +1 -1
  50. package/dist/types/index.d.ts +2 -0
  51. package/dist/types/index.d.ts.map +1 -1
  52. package/dist/utils/media-error.d.ts +10 -0
  53. package/dist/utils/media-error.d.ts.map +1 -0
  54. package/dist/utils/seek-by.d.ts +8 -0
  55. package/dist/utils/seek-by.d.ts.map +1 -1
  56. package/package.json +2 -1
  57. package/dist/chunks/adTriggers-4SueRFgK.js.map +0 -1
  58. package/dist/chunks/cast-DCAT2agI.js.map +0 -1
  59. package/dist/chunks/player-C886oKP-.js.map +0 -1
  60. package/dist/chunks/playlist-CI3mRZjo.js.map +0 -1
  61. package/dist/chunks/sponsorship-DyFwGmEb.js.map +0 -1
  62. package/dist/chunks/story-D5Got6-6.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  var A = Object.defineProperty;
2
2
  var g = (h, t, e) => t in h ? A(h, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : h[t] = e;
3
3
  var n = (h, t, e) => g(h, typeof t != "symbol" ? t + "" : t, e);
4
- import { c as b } from "./player-C886oKP-.js";
5
- const P = {
4
+ import { i as b, c as P } from "./player-DW5iWvPs.js";
5
+ const I = {
6
6
  startMode: "after_current",
7
7
  startIndex: 0,
8
8
  loop: !1,
@@ -10,7 +10,7 @@ const P = {
10
10
  preferHls: !0,
11
11
  adsOnItemChange: !0
12
12
  };
13
- class I {
13
+ class w {
14
14
  constructor(t, e) {
15
15
  n(this, "options");
16
16
  n(this, "items");
@@ -37,14 +37,14 @@ class I {
37
37
  this.playlistActive && this.next();
38
38
  });
39
39
  n(this, "onError", () => {
40
- if (this.destroyed || !this.playlistActive) return;
40
+ if (this.destroyed || !this.playlistActive || b(this.ctx.videoEl.error)) return;
41
41
  const t = Date.now();
42
42
  t - this.lastErrorAt < 200 || (this.lastErrorAt = t, this.fallbackOrSkip());
43
43
  });
44
44
  n(this, "onTimeUpdate", () => {
45
45
  this.updateProgress();
46
46
  });
47
- this.ctx = t, this.rawOptions = e, this.options = { ...P, ...e }, this.items = Array.isArray(e.items) ? e.items : [], this.index = this.clampIndex(this.options.startIndex), this.ui = this.buildUi(), this.bindPlayerEvents(), this.init();
47
+ this.ctx = t, this.rawOptions = e, this.options = { ...I, ...e }, this.items = Array.isArray(e.items) ? e.items : [], this.index = this.clampIndex(this.options.startIndex), this.ui = this.buildUi(), this.bindPlayerEvents(), this.init();
48
48
  }
49
49
  // ── lifecycle ──
50
50
  init() {
@@ -110,11 +110,11 @@ class I {
110
110
  this.switching = !1;
111
111
  return;
112
112
  }
113
- const s = ++this.attemptId, a = e.forceMode ?? this.resolveMode(i);
114
- let r = /* @__PURE__ */ new Set([a]), d = e.forceMp4Index ?? 0;
115
- e.isFallback && ((o = this.attempt) == null ? void 0 : o.index) === t && ((u = this.attempt) != null && u.tried) && (r = new Set(this.attempt.tried), r.add(a), e.forceMp4Index == null && (d = this.attempt.mp4Index ?? 0)), this.attempt = { id: s, index: t, mode: a, tried: r, mp4Index: d };
113
+ const s = ++this.attemptId, r = e.forceMode ?? this.resolveMode(i);
114
+ let a = /* @__PURE__ */ new Set([r]), d = e.forceMp4Index ?? 0;
115
+ e.isFallback && ((o = this.attempt) == null ? void 0 : o.index) === t && ((u = this.attempt) != null && u.tried) && (a = new Set(this.attempt.tried), a.add(r), e.forceMp4Index == null && (d = this.attempt.mp4Index ?? 0)), this.attempt = { id: s, index: t, mode: r, tried: a, mp4Index: d };
116
116
  try {
117
- const p = this.buildPayload(i, a, d);
117
+ const p = this.buildPayload(i, r, d);
118
118
  if (!p) throw new Error("No playable source");
119
119
  if (this.setActive(t), this.ctx.videoEl.pause(), i.image && this.ctx.setPoster(i.image), await this.ctx.loadSource(p.src, p.type), this.options.adsOnItemChange && this.maybeRequestAds(t, i, !!e.isFallback), this.shouldAutoPlay(!!e.userInitiated))
120
120
  try {
@@ -131,7 +131,7 @@ class I {
131
131
  const t = this.items[this.attempt.index];
132
132
  if (!t) return;
133
133
  if (this.attempt.mode === "mp4") {
134
- const i = (t.mp4 || []).filter((a) => a == null ? void 0 : a.src), s = (this.attempt.mp4Index ?? 0) + 1;
134
+ const i = (t.mp4 || []).filter((r) => r == null ? void 0 : r.src), s = (this.attempt.mp4Index ?? 0) + 1;
135
135
  if (s < i.length) {
136
136
  await this.loadAndPlay(this.attempt.index, { forceMode: "mp4", forceMp4Index: s, isFallback: !0 });
137
137
  return;
@@ -156,10 +156,10 @@ class I {
156
156
  return Array.isArray(t[e]) && t[e].some((i) => i == null ? void 0 : i.src);
157
157
  }
158
158
  buildPayload(t, e, i = 0) {
159
- const s = (t[e] || []).filter((r) => r == null ? void 0 : r.src);
159
+ const s = (t[e] || []).filter((a) => a == null ? void 0 : a.src);
160
160
  if (!s.length) return null;
161
- let a;
162
- return e === "mp4" ? a = i > 0 ? s[i] || s[0] : s.find((r) => r.selected) || s[0] : a = s[0], { src: a.src, type: a.type || (e === "hls" ? "application/x-mpegURL" : "video/mp4") };
161
+ let r;
162
+ return e === "mp4" ? r = i > 0 ? s[i] || s[0] : s.find((a) => a.selected) || s[0] : r = s[0], { src: r.src, type: r.type || (e === "hls" ? "application/x-mpegURL" : "video/mp4") };
163
163
  }
164
164
  shouldAutoPlay(t) {
165
165
  return t ? !0 : this.options.autoplayNext && this.userHasStartedPlayback;
@@ -175,10 +175,10 @@ class I {
175
175
  i.className = "hp:flex hp:items-center hp:justify-between hp:gap-2 hp:mb-1";
176
176
  const s = document.createElement("div");
177
177
  s.className = "hp:text-sm hp:font-semibold hp:text-on-surface", s.textContent = this.playlistTitleText(), i.appendChild(s);
178
- const a = document.createElement("div");
179
- a.className = "hp:flex hp:gap-1";
180
- const r = this.navButton("chevron-left", this.ctx.i18n.playlistPrev, () => this.prev()), d = this.navButton("chevron-left", this.ctx.i18n.playlistNext, () => this.next());
181
- d.style.transform = "rotate(180deg)", a.append(r, d), i.appendChild(a), e.appendChild(i);
178
+ const r = document.createElement("div");
179
+ r.className = "hp:flex hp:gap-1";
180
+ const a = this.navButton("chevron-left", this.ctx.i18n.playlistPrev, () => this.prev()), d = this.navButton("chevron-left", this.ctx.i18n.playlistNext, () => this.next());
181
+ d.style.transform = "rotate(180deg)", r.append(a, d), i.appendChild(r), e.appendChild(i);
182
182
  const o = document.createElement("ul");
183
183
  o.className = "hp:flex hp:flex-col hp:gap-1 hp:list-none hp:m-0 hp:p-0", e.appendChild(o);
184
184
  const u = [];
@@ -200,7 +200,7 @@ class I {
200
200
  v.className = "hp:flex-1 hp:h-0.5 hp:bg-on-surface/20 hp:rounded-full hp:overflow-hidden", m = document.createElement("div"), m.className = "hp:h-full hp:bg-accent", m.style.width = "0%", v.appendChild(m), l.appendChild(v), f.appendChild(l);
201
201
  }
202
202
  c.appendChild(f), c.addEventListener("click", () => this.setIndex(E)), o.appendChild(c), u.push({ li: c, titleRow: x, progressFill: m, timeEl: y });
203
- }), this.ctx.panelEl.appendChild(e), { root: e, titleEl: s, listEl: o, prevBtn: r, nextBtn: d, itemEls: u };
203
+ }), this.ctx.panelEl.appendChild(e), { root: e, titleEl: s, listEl: o, prevBtn: a, nextBtn: d, itemEls: u };
204
204
  }
205
205
  playlistTitleText() {
206
206
  const t = this.rawOptions.ui ?? {}, e = t.title || this.ctx.i18n.playlistTitle;
@@ -208,7 +208,7 @@ class I {
208
208
  }
209
209
  navButton(t, e, i) {
210
210
  const s = document.createElement("button");
211
- return s.type = "button", s.setAttribute("aria-label", e), s.className = "hp:flex hp:items-center hp:justify-center hp:w-6 hp:h-6 hp:text-on-surface hp:bg-transparent hp:border-0 hp:cursor-pointer", s.appendChild(b(t, "hp:text-sm")), s.addEventListener("click", i), s;
211
+ return s.type = "button", s.setAttribute("aria-label", e), s.className = "hp:flex hp:items-center hp:justify-center hp:w-6 hp:h-6 hp:text-on-surface hp:bg-transparent hp:border-0 hp:cursor-pointer", s.appendChild(P(t, "hp:text-sm")), s.addEventListener("click", i), s;
212
212
  }
213
213
  setActive(t) {
214
214
  this.ui.itemEls.forEach((e, i) => {
@@ -226,11 +226,11 @@ class I {
226
226
  return `${i}:${String(s).padStart(2, "0")}`;
227
227
  }
228
228
  }
229
- function M(h, t) {
230
- return new I(h, t);
229
+ function N(h, t) {
230
+ return new w(h, t);
231
231
  }
232
232
  export {
233
- I as PlaylistRunner,
234
- M as installPlaylist
233
+ w as PlaylistRunner,
234
+ N as installPlaylist
235
235
  };
236
- //# sourceMappingURL=playlist-CI3mRZjo.js.map
236
+ //# sourceMappingURL=playlist-DYGbJ5wz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playlist-DYGbJ5wz.js","sources":["../../src/plugins/playlist/PlaylistRunner.ts","../../src/plugins/playlist/index.ts"],"sourcesContent":["import { createIcon } from '../../icons/Icon';\nimport type { PlayableItem, PlaylistOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { isAudioOutputError } from '../../utils/media-error';\n\nexport interface PlaylistPlayerContext {\n videoEl: HTMLVideoElement;\n hostEl: HTMLElement;\n /** Liste UI'ının monte edileceği, shadow root içindeki panel. */\n panelEl: HTMLElement;\n loadSource(src: string, type?: string): Promise<void>;\n setPoster(url: string): void;\n /** AdsController varsa retry/VMAP durumunu sıfırlayıp item'ın (varsa) kendi adTagPreroll'üyle yeniden reklam ister — yoksa no-op. */\n requestFreshAd(prerollTag?: string): void;\n i18n: HopeLocaleStrings;\n}\n\ntype SourceMode = 'hls' | 'mp4';\n\ninterface Attempt {\n id: number;\n index: number;\n mode: SourceMode;\n tried: Set<SourceMode>;\n mp4Index: number;\n}\n\nconst DEFAULTS: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>> = {\n startMode: 'after_current',\n startIndex: 0,\n loop: false,\n autoplayNext: true,\n preferHls: true,\n adsOnItemChange: true,\n};\n\n/** Tek player üzerinde sıralı oynatma listesi (startMode, loop, hata fallback zinciri). */\nexport class PlaylistRunner {\n private readonly options: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>>;\n private readonly items: PlayableItem[];\n\n private index: number;\n private destroyed = false;\n private switching = false;\n private playlistActive = false;\n private startPendingAfterCurrent = false;\n private attemptId = 0;\n private attempt: Attempt | null = null;\n private lastErrorAt = 0;\n private lastAdsIndex: number | null = null;\n private lastDispatchedIndex: number | null = null;\n private userHasStartedPlayback = false;\n\n private readonly ui: {\n root: HTMLElement;\n titleEl: HTMLElement;\n listEl: HTMLElement;\n prevBtn: HTMLButtonElement;\n nextBtn: HTMLButtonElement;\n itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }>;\n };\n\n constructor(\n private readonly ctx: PlaylistPlayerContext,\n private readonly rawOptions: PlaylistOptions\n ) {\n this.options = { ...DEFAULTS, ...rawOptions };\n this.items = Array.isArray(rawOptions.items) ? rawOptions.items : [];\n this.index = this.clampIndex(this.options.startIndex);\n\n this.ui = this.buildUi();\n this.bindPlayerEvents();\n this.init();\n }\n\n // ── lifecycle ──\n\n private init(): void {\n if (!this.items.length) return;\n\n if (this.options.startMode === 'after_current') {\n this.startPendingAfterCurrent = true;\n this.playlistActive = false;\n this.setActive(this.index);\n return;\n }\n\n this.playlistActive = true;\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n refreshLabels(): void {\n this.ui.titleEl.textContent = this.playlistTitleText();\n this.ui.prevBtn.setAttribute('aria-label', this.ctx.i18n.playlistPrev);\n this.ui.nextBtn.setAttribute('aria-label', this.ctx.i18n.playlistNext);\n this.ui.itemEls.forEach((entry, idx) => {\n const item = this.items[idx];\n if (item && !item.title) entry.titleRow.textContent = this.ctx.i18n.videoFallbackTitle(idx);\n });\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.ctx.videoEl.removeEventListener('ended', this.onEnded);\n this.ctx.videoEl.removeEventListener('error', this.onError);\n this.ctx.videoEl.removeEventListener('play', this.onUserPlay);\n this.ui.root.remove();\n }\n\n // ── public api ──\n\n start(opts: { index?: number } = {}): void {\n if (this.destroyed || !this.items.length) return;\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.index = this.clampIndex(opts.index ?? this.index);\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n next(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n\n if (this.index < this.items.length - 1) this.index++;\n else if (this.options.loop) this.index = 0;\n else return;\n\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n prev(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n if (this.index === 0) return;\n this.index--;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n setIndex(i: number): void {\n if (this.destroyed || !this.items.length) return;\n this.index = this.clampIndex(i);\n this.setActive(this.index);\n if (!this.playlistActive) return this.start({ index: this.index });\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n getIndex(): number {\n return this.index;\n }\n\n isActive(): boolean {\n return this.playlistActive;\n }\n\n // ── player events ──\n\n private bindPlayerEvents(): void {\n this.ctx.videoEl.addEventListener('ended', this.onEnded);\n this.ctx.videoEl.addEventListener('error', this.onError);\n this.ctx.videoEl.addEventListener('play', this.onUserPlay);\n this.ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n private readonly onUserPlay = (): void => {\n this.userHasStartedPlayback = true;\n };\n\n private readonly onEnded = (): void => {\n if (this.startPendingAfterCurrent && !this.playlistActive) {\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true, isPlaylistStart: true });\n return;\n }\n if (this.playlistActive) this.next();\n };\n\n private readonly onError = (): void => {\n if (this.destroyed || !this.playlistActive) return;\n // Ses aygıtı yok (Firefox): video sessiz oynamaya devam ediyor — sonraki öğeye atlama.\n if (isAudioOutputError(this.ctx.videoEl.error)) return;\n const now = Date.now();\n if (now - this.lastErrorAt < 200) return;\n this.lastErrorAt = now;\n void this.fallbackOrSkip();\n };\n\n private readonly onTimeUpdate = (): void => {\n this.updateProgress();\n };\n\n // ── core load ──\n\n private async loadAndPlay(\n i: number,\n opts: { userInitiated?: boolean; forceMode?: SourceMode | null; forceMp4Index?: number | null; isFallback?: boolean; isPlaylistStart?: boolean } = {}\n ): Promise<void> {\n if (this.destroyed || this.switching || !this.playlistActive) return;\n this.switching = true;\n\n const item = this.items[i];\n if (!item) {\n this.switching = false;\n return;\n }\n const attemptId = ++this.attemptId;\n const mode = opts.forceMode ?? this.resolveMode(item);\n\n let tried = new Set<SourceMode>([mode]);\n let mp4Index = opts.forceMp4Index ?? 0;\n if (opts.isFallback && this.attempt?.index === i && this.attempt?.tried) {\n tried = new Set(this.attempt.tried);\n tried.add(mode);\n if (opts.forceMp4Index == null) mp4Index = this.attempt.mp4Index ?? 0;\n }\n this.attempt = { id: attemptId, index: i, mode, tried, mp4Index };\n\n try {\n const payload = this.buildPayload(item, mode, mp4Index);\n if (!payload) throw new Error('No playable source');\n\n this.setActive(i);\n this.ctx.videoEl.pause();\n if (item.image) this.ctx.setPoster(item.image);\n await this.ctx.loadSource(payload.src, payload.type);\n\n if (this.options.adsOnItemChange) this.maybeRequestAds(i, item, !!opts.isFallback);\n\n if (this.shouldAutoPlay(!!opts.userInitiated)) {\n try {\n await this.ctx.videoEl.play();\n } catch {\n /* autoplay engellendi — sessizce geç */\n }\n }\n this.updateProgress();\n } finally {\n this.switching = false;\n }\n }\n\n private async fallbackOrSkip(): Promise<void> {\n if (this.destroyed || !this.attempt) return;\n const item = this.items[this.attempt.index];\n if (!item) return;\n\n if (this.attempt.mode === 'mp4') {\n const mp4List = (item.mp4 || []).filter((v) => v?.src);\n const nextMp4 = (this.attempt.mp4Index ?? 0) + 1;\n if (nextMp4 < mp4List.length) {\n await this.loadAndPlay(this.attempt.index, { forceMode: 'mp4', forceMp4Index: nextMp4, isFallback: true });\n return;\n }\n }\n\n const otherMode: SourceMode = this.attempt.mode === 'hls' ? 'mp4' : 'hls';\n if (this.hasMode(item, otherMode) && !this.attempt.tried.has(otherMode)) {\n await this.loadAndPlay(this.attempt.index, { forceMode: otherMode, isFallback: true });\n return;\n }\n\n this.next();\n }\n\n // ── ads ──\n\n private maybeRequestAds(index: number, item: PlayableItem, _isFallback: boolean): void {\n if (this.lastAdsIndex === index) return;\n this.lastAdsIndex = index;\n this.ctx.requestFreshAd(item.adTagPreroll || this.rawOptions.adTagPreroll);\n }\n\n // ── sources ──\n\n private resolveMode(item: PlayableItem): SourceMode {\n if (this.options.preferHls) return this.hasMode(item, 'hls') ? 'hls' : this.hasMode(item, 'mp4') ? 'mp4' : 'hls';\n return this.hasMode(item, 'mp4') ? 'mp4' : this.hasMode(item, 'hls') ? 'hls' : 'mp4';\n }\n\n private hasMode(item: PlayableItem, mode: SourceMode): boolean {\n return Array.isArray(item[mode]) && item[mode]!.some((v) => v?.src);\n }\n\n private buildPayload(item: PlayableItem, mode: SourceMode, mp4Index = 0): { src: string; type?: string } | null {\n const list = (item[mode] || []).filter((v) => v?.src);\n if (!list.length) return null;\n\n let src;\n if (mode === 'mp4') {\n src = mp4Index > 0 ? list[mp4Index] || list[0] : list.find((v) => v.selected) || list[0];\n } else {\n src = list[0];\n }\n return { src: src!.src, type: src!.type || (mode === 'hls' ? 'application/x-mpegURL' : 'video/mp4') };\n }\n\n private shouldAutoPlay(userInitiated: boolean): boolean {\n if (userInitiated) return true;\n return this.options.autoplayNext && this.userHasStartedPlayback;\n }\n\n private clampIndex(i: number): number {\n if (!Number.isFinite(i) || !this.items.length) return 0;\n return Math.max(0, Math.min(this.items.length - 1, Math.trunc(i)));\n }\n\n // ── ui ──\n\n private buildUi() {\n const ui = this.rawOptions.ui ?? {};\n const root = document.createElement('div');\n root.setAttribute('part', 'playlist-panel');\n root.className = 'hp:flex hp:flex-col hp:gap-2 hp:p-3 hp:bg-surface-elev hp:max-h-80 hp:overflow-y-auto';\n\n const header = document.createElement('div');\n header.className = 'hp:flex hp:items-center hp:justify-between hp:gap-2 hp:mb-1';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'hp:text-sm hp:font-semibold hp:text-on-surface';\n titleEl.textContent = this.playlistTitleText();\n header.appendChild(titleEl);\n\n const navWrap = document.createElement('div');\n navWrap.className = 'hp:flex hp:gap-1';\n const prevBtn = this.navButton('chevron-left', this.ctx.i18n.playlistPrev, () => this.prev());\n const nextBtn = this.navButton('chevron-left', this.ctx.i18n.playlistNext, () => this.next());\n nextBtn.style.transform = 'rotate(180deg)';\n navWrap.append(prevBtn, nextBtn);\n header.appendChild(navWrap);\n\n root.appendChild(header);\n\n const listEl = document.createElement('ul');\n listEl.className = 'hp:flex hp:flex-col hp:gap-1 hp:list-none hp:m-0 hp:p-0';\n root.appendChild(listEl);\n\n const itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }> = [];\n this.items.forEach((item, idx) => {\n const li = document.createElement('li');\n li.className =\n 'hp:flex hp:items-center hp:gap-2 hp:p-2 hp:rounded hp:cursor-pointer hp:text-on-surface-muted hp:text-sm ' +\n 'hp:hover:bg-on-surface/5 hp:data-[active=true]:bg-accent/15 hp:data-[active=true]:text-on-surface';\n\n if (item.image) {\n const img = document.createElement('img');\n img.src = item.image;\n img.loading = 'lazy';\n img.className = 'hp:w-16 hp:aspect-video hp:object-cover hp:rounded hp:shrink-0';\n li.appendChild(img);\n }\n\n const body = document.createElement('div');\n body.className = 'hp:flex-1 hp:min-w-0';\n const titleRow = document.createElement('div');\n titleRow.className = 'hp:truncate hp:font-medium';\n titleRow.textContent = item.title || this.ctx.i18n.videoFallbackTitle(idx);\n body.appendChild(titleRow);\n\n let progressFill: HTMLElement | null = null;\n let timeEl: HTMLElement | null = null;\n if (ui.showMeta !== false) {\n const metaRow = document.createElement('div');\n metaRow.className = 'hp:flex hp:items-center hp:gap-2 hp:text-xs hp:opacity-70 hp:mt-0.5';\n timeEl = document.createElement('span');\n timeEl.textContent = '';\n metaRow.appendChild(timeEl);\n\n const bar = document.createElement('div');\n bar.className = 'hp:flex-1 hp:h-0.5 hp:bg-on-surface/20 hp:rounded-full hp:overflow-hidden';\n progressFill = document.createElement('div');\n progressFill.className = 'hp:h-full hp:bg-accent';\n progressFill.style.width = '0%';\n bar.appendChild(progressFill);\n metaRow.appendChild(bar);\n body.appendChild(metaRow);\n }\n\n li.appendChild(body);\n li.addEventListener('click', () => this.setIndex(idx));\n listEl.appendChild(li);\n itemEls.push({ li, titleRow, progressFill, timeEl });\n });\n\n this.ctx.panelEl.appendChild(root);\n return { root, titleEl, listEl, prevBtn, nextBtn, itemEls };\n }\n\n private playlistTitleText(): string {\n const ui = this.rawOptions.ui ?? {};\n const title = ui.title || this.ctx.i18n.playlistTitle;\n return ui.showCount === false ? title : `${title} (${this.items.length})`;\n }\n\n private navButton(iconName: string, label: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('aria-label', label);\n btn.className = 'hp:flex hp:items-center hp:justify-center hp:w-6 hp:h-6 hp:text-on-surface hp:bg-transparent hp:border-0 hp:cursor-pointer';\n btn.appendChild(createIcon(iconName, 'hp:text-sm'));\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private setActive(index: number): void {\n this.ui.itemEls.forEach((entry, idx) => {\n if (idx === index) entry.li.setAttribute('data-active', 'true');\n else entry.li.removeAttribute('data-active');\n });\n // loadAndPlay() hem anlık UI geri bildirimi için önceden (next/prev/setIndex\n // içinden) hem de kaynak gerçekten yüklendiğinde setActive() çağırıyor —\n // aynı index için event'i yalnızca BİR kez yaymak için guard.\n if (this.lastDispatchedIndex !== index) {\n this.lastDispatchedIndex = index;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:itemchange', { detail: { index, source: 'playlist' } }));\n }\n }\n\n private updateProgress(): void {\n const active = this.ui.itemEls[this.index];\n if (!active) return;\n const duration = this.ctx.videoEl.duration;\n const current = this.ctx.videoEl.currentTime;\n if (active.timeEl) active.timeEl.textContent = this.formatTime(current);\n if (active.progressFill && Number.isFinite(duration) && duration > 0) {\n active.progressFill.style.width = `${Math.min(100, (current / duration) * 100)}%`;\n }\n }\n\n private formatTime(sec: number): string {\n const s = Math.max(0, Math.floor(sec || 0));\n const m = Math.floor(s / 60);\n const r = s % 60;\n return `${m}:${String(r).padStart(2, '0')}`;\n }\n}\n","import { PlaylistRunner, type PlaylistPlayerContext } from './PlaylistRunner';\nimport type { PlaylistOptions } from '../../types';\n\nexport function installPlaylist(ctx: PlaylistPlayerContext, options: PlaylistOptions): PlaylistRunner {\n return new PlaylistRunner(ctx, options);\n}\n\nexport { PlaylistRunner };\nexport type { PlaylistPlayerContext };\n"],"names":["DEFAULTS","PlaylistRunner","ctx","rawOptions","__publicField","isAudioOutputError","now","entry","idx","item","opts","i","attemptId","mode","tried","mp4Index","_a","_b","payload","mp4List","v","nextMp4","otherMode","index","_isFallback","list","src","userInitiated","ui","root","header","titleEl","navWrap","prevBtn","nextBtn","listEl","itemEls","li","img","body","titleRow","progressFill","timeEl","metaRow","bar","title","iconName","label","onClick","btn","createIcon","active","duration","current","sec","s","m","r","installPlaylist","options"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  var z = Object.defineProperty;
2
2
  var tt = (p, s, a) => s in p ? z(p, s, { enumerable: !0, configurable: !0, writable: !0, value: a }) : p[s] = a;
3
3
  var P = (p, s, a) => tt(p, typeof s != "symbol" ? s + "" : s, a);
4
+ import { s as et } from "./seekWhenReady-Clzne3-S.js";
4
5
  const H = function(p, s) {
5
6
  let i = p;
6
7
  const f = j[s];
@@ -129,16 +130,16 @@ const H = function(p, s) {
129
130
  let n = null;
130
131
  switch (h) {
131
132
  case "Numeric":
132
- n = et(o);
133
+ n = nt(o);
133
134
  break;
134
135
  case "Alphanumeric":
135
- n = nt(o);
136
+ n = rt(o);
136
137
  break;
137
138
  case "Byte":
138
- n = rt(o);
139
+ n = ot(o);
139
140
  break;
140
141
  case "Kanji":
141
- n = ot(o);
142
+ n = it(o);
142
143
  break;
143
144
  default:
144
145
  throw "mode:" + h;
@@ -191,7 +192,7 @@ const H = function(p, s) {
191
192
  }, m.createDataURL = function(o, h) {
192
193
  o = o || 2, h = typeof h > "u" ? o * 4 : h;
193
194
  const n = m.getModuleCount() * o + h * 2, l = h, u = n - h;
194
- return ut(n, n, function(w, x) {
195
+ return lt(n, n, function(w, x) {
195
196
  if (l <= w && w < u && l <= x && x < u) {
196
197
  const E = Math.floor((w - l) / o), k = Math.floor((x - l) / o);
197
198
  return m.isDark(k, E) ? 0 : 1;
@@ -285,7 +286,7 @@ H.stringToBytes = function(p) {
285
286
  };
286
287
  H.createStringToBytes = function(p, s) {
287
288
  const a = (function() {
288
- const i = st(p), f = function() {
289
+ const i = ct(p), f = function() {
289
290
  const c = i.read();
290
291
  if (c == -1) throw "eof";
291
292
  return c;
@@ -815,7 +816,7 @@ const M = {
815
816
  const i = Math.floor(s / 8);
816
817
  p.length <= i && p.push(0), r && (p[i] |= 128 >>> s % 8), s += 1;
817
818
  }, a;
818
- }, et = function(p) {
819
+ }, nt = function(p) {
819
820
  const s = M.MODE_NUMBER, a = p, r = {};
820
821
  r.getMode = function() {
821
822
  return s;
@@ -839,7 +840,7 @@ const M = {
839
840
  throw "illegal char :" + e;
840
841
  };
841
842
  return r;
842
- }, nt = function(p) {
843
+ }, rt = function(p) {
843
844
  const s = M.MODE_ALPHA_NUM, a = p, r = {};
844
845
  r.getMode = function() {
845
846
  return s;
@@ -884,7 +885,7 @@ const M = {
884
885
  }
885
886
  };
886
887
  return r;
887
- }, rt = function(p) {
888
+ }, ot = function(p) {
888
889
  const s = M.MODE_8BIT_BYTE, a = H.stringToBytes(p), r = {};
889
890
  return r.getMode = function() {
890
891
  return s;
@@ -894,7 +895,7 @@ const M = {
894
895
  for (let f = 0; f < a.length; f += 1)
895
896
  i.put(a[f], 8);
896
897
  }, r;
897
- }, ot = function(p) {
898
+ }, it = function(p) {
898
899
  const s = M.MODE_KANJI, a = H.stringToBytes;
899
900
  (function(f, e) {
900
901
  const t = a(f);
@@ -944,7 +945,7 @@ const M = {
944
945
  r > 0 && (a += ","), a += p[r];
945
946
  return a += "]", a;
946
947
  }, s;
947
- }, it = function() {
948
+ }, st = function() {
948
949
  let p = 0, s = 0, a = 0, r = "";
949
950
  const i = {}, f = function(t) {
950
951
  r += String.fromCharCode(e(t & 63));
@@ -975,7 +976,7 @@ const M = {
975
976
  }, i.toString = function() {
976
977
  return r;
977
978
  }, i;
978
- }, st = function(p) {
979
+ }, ct = function(p) {
979
980
  const s = p;
980
981
  let a = 0, r = 0, i = 0;
981
982
  const f = {};
@@ -1010,7 +1011,7 @@ const M = {
1010
1011
  throw "c:" + t;
1011
1012
  };
1012
1013
  return f;
1013
- }, ct = function(p, s) {
1014
+ }, ut = function(p, s) {
1014
1015
  const a = p, r = s, i = new Array(p * s), f = {};
1015
1016
  f.setPixel = function(b, m, g) {
1016
1017
  i[m * a + b] = g;
@@ -1068,21 +1069,21 @@ const M = {
1068
1069
  }, g;
1069
1070
  };
1070
1071
  return f;
1071
- }, ut = function(p, s, a) {
1072
- const r = ct(p, s);
1072
+ }, lt = function(p, s, a) {
1073
+ const r = ut(p, s);
1073
1074
  for (let t = 0; t < s; t += 1)
1074
1075
  for (let c = 0; c < p; c += 1)
1075
1076
  r.setPixel(c, t, a(c, t));
1076
1077
  const i = W();
1077
1078
  r.write(i);
1078
- const f = it(), e = i.toByteArray();
1079
+ const f = st(), e = i.toByteArray();
1079
1080
  for (let t = 0; t < e.length; t += 1)
1080
1081
  f.writeByte(e[t]);
1081
1082
  return f.flush(), "data:image/gif;base64," + f;
1082
1083
  };
1083
1084
  H.stringToBytes;
1084
- const F = "http://www.w3.org/2000/svg", lt = "http://www.w3.org/1999/xlink";
1085
- function ft(p, s) {
1085
+ const F = "http://www.w3.org/2000/svg", ft = "http://www.w3.org/1999/xlink";
1086
+ function at(p, s) {
1086
1087
  const a = H(0, s.logoUrl ? "H" : "M");
1087
1088
  a.addData(p), a.make();
1088
1089
  const r = a.getModuleCount(), i = s.size / r, f = document.createElementNS(F, "svg");
@@ -1101,12 +1102,12 @@ function ft(p, s) {
1101
1102
  const c = s.size * s.logoScale, b = c * 0.18, m = c + b * 2, g = (s.size - m) / 2, d = (s.size - c) / 2, A = document.createElementNS(F, "rect");
1102
1103
  A.setAttribute("x", String(g)), A.setAttribute("y", String(g)), A.setAttribute("width", String(m)), A.setAttribute("height", String(m)), A.setAttribute("rx", String(m * 0.22)), A.setAttribute("fill", "#fff"), f.appendChild(A);
1103
1104
  const B = document.createElementNS(F, "image");
1104
- B.setAttribute("href", s.logoUrl), B.setAttributeNS(lt, "xlink:href", s.logoUrl), B.setAttribute("x", String(d)), B.setAttribute("y", String(d)), B.setAttribute("width", String(c)), B.setAttribute("height", String(c)), B.setAttribute("preserveAspectRatio", "xMidYMid meet"), f.appendChild(B);
1105
+ B.setAttribute("href", s.logoUrl), B.setAttributeNS(ft, "xlink:href", s.logoUrl), B.setAttribute("x", String(d)), B.setAttribute("y", String(d)), B.setAttribute("width", String(c)), B.setAttribute("height", String(c)), B.setAttribute("preserveAspectRatio", "xMidYMid meet"), f.appendChild(B);
1105
1106
  }
1106
1107
  return f;
1107
1108
  }
1108
1109
  const $ = "hope-qr-resume-dismissed";
1109
- class at {
1110
+ class ht {
1110
1111
  constructor(s, a) {
1111
1112
  P(this, "wrapper", null);
1112
1113
  P(this, "seeking", !1);
@@ -1172,10 +1173,8 @@ class at {
1172
1173
  applyResumeFromUrl() {
1173
1174
  const s = new URL(window.location.href), a = s.searchParams.get(this.paramName);
1174
1175
  if (a === null || !/^\d+$/.test(a)) return;
1175
- const r = Number(a), i = () => {
1176
- this.ctx.videoEl.currentTime = r;
1177
- };
1178
- this.ctx.videoEl.readyState >= 1 ? i() : this.ctx.videoEl.addEventListener("loadedmetadata", i, { once: !0 }), s.searchParams.delete(this.paramName), window.history.replaceState(window.history.state, "", s.toString());
1176
+ const r = Number(a), i = this.ctx.videoEl;
1177
+ et(i, r, { attempts: 2 }), s.searchParams.delete(this.paramName), window.history.replaceState(window.history.state, "", s.toString());
1179
1178
  }
1180
1179
  remove() {
1181
1180
  var s;
@@ -1186,7 +1185,7 @@ class at {
1186
1185
  const s = this.options.size ?? 220, a = this.buildResumeUrl(this.ctx.videoEl.currentTime), r = document.createElement("div");
1187
1186
  r.setAttribute("part", "qr-resume-screen"), r.className = "hp:absolute hp:inset-0 hp:z-30 hp:flex hp:flex-col hp:items-center hp:justify-center hp:gap-3 hp:bg-black/85 hp:text-white hp:text-center hp:p-4";
1188
1187
  const i = document.createElement("div");
1189
- i.className = "hp:rounded-lg hp:overflow-hidden hp:shadow-lg hp:leading-none", i.appendChild(ft(a, { size: s, logoUrl: this.options.logo, logoScale: this.options.logoScale ?? 0.22 })), r.appendChild(i);
1188
+ i.className = "hp:rounded-lg hp:overflow-hidden hp:shadow-lg hp:leading-none", i.appendChild(at(a, { size: s, logoUrl: this.options.logo, logoScale: this.options.logoScale ?? 0.22 })), r.appendChild(i);
1190
1189
  const f = document.createElement("div");
1191
1190
  f.className = "hp:text-sm hp:opacity-90 hp:max-w-xs", f.textContent = this.ctx.i18n.qrResumeTitle, r.appendChild(f);
1192
1191
  const e = document.createElement("div");
@@ -1201,11 +1200,11 @@ class at {
1201
1200
  }), e.append(t, c), r.appendChild(e), this.ctx.overlayContainerEl.appendChild(r), this.wrapper = r;
1202
1201
  }
1203
1202
  }
1204
- function gt(p, s) {
1205
- return new at(p, s);
1203
+ function wt(p, s) {
1204
+ return new ht(p, s);
1206
1205
  }
1207
1206
  export {
1208
- at as QrResume,
1209
- gt as installQrResume
1207
+ ht as QrResume,
1208
+ wt as installQrResume
1210
1209
  };
1211
- //# sourceMappingURL=qrResume-BNy8XCp_.js.map
1210
+ //# sourceMappingURL=qrResume-DXwD3oSA.js.map