@hopeplayer/core 0.0.0-stage → 1.0.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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -2
  3. package/dist/HopePlayerElement.d.ts +120 -0
  4. package/dist/HopePlayerElement.d.ts.map +1 -0
  5. package/dist/chunks/VideoPrebid-CpckFzSq.js +180 -0
  6. package/dist/chunks/VideoPrebid-CpckFzSq.js.map +1 -0
  7. package/dist/chunks/hls-CfP6MPo0.js +24663 -0
  8. package/dist/chunks/hls-CfP6MPo0.js.map +1 -0
  9. package/dist/chunks/index-3QALpwsf.js +39 -0
  10. package/dist/chunks/index-3QALpwsf.js.map +1 -0
  11. package/dist/chunks/index-B4ujPVcl.js +236 -0
  12. package/dist/chunks/index-B4ujPVcl.js.map +1 -0
  13. package/dist/chunks/index-BBmuCtKu.js +139 -0
  14. package/dist/chunks/index-BBmuCtKu.js.map +1 -0
  15. package/dist/chunks/index-BFgqg05L.js +322 -0
  16. package/dist/chunks/index-BFgqg05L.js.map +1 -0
  17. package/dist/chunks/index-CDDke5rz.js +233 -0
  18. package/dist/chunks/index-CDDke5rz.js.map +1 -0
  19. package/dist/chunks/index-CQqGn9as.js +63 -0
  20. package/dist/chunks/index-CQqGn9as.js.map +1 -0
  21. package/dist/chunks/index-Ca8hocby.js +68 -0
  22. package/dist/chunks/index-Ca8hocby.js.map +1 -0
  23. package/dist/chunks/index-D6r-BGAV.js +77 -0
  24. package/dist/chunks/index-D6r-BGAV.js.map +1 -0
  25. package/dist/chunks/index-DT8-oMPm.js +1211 -0
  26. package/dist/chunks/index-DT8-oMPm.js.map +1 -0
  27. package/dist/chunks/index-DXWK4EFa.js +52 -0
  28. package/dist/chunks/index-DXWK4EFa.js.map +1 -0
  29. package/dist/chunks/index-DXf2Al1x.js +205 -0
  30. package/dist/chunks/index-DXf2Al1x.js.map +1 -0
  31. package/dist/chunks/index-DiCkShCE.js +1776 -0
  32. package/dist/chunks/index-DiCkShCE.js.map +1 -0
  33. package/dist/chunks/index-Q8FMOHj0.js +110 -0
  34. package/dist/chunks/index-Q8FMOHj0.js.map +1 -0
  35. package/dist/chunks/index-Z7Jmls0c.js +135 -0
  36. package/dist/chunks/index-Z7Jmls0c.js.map +1 -0
  37. package/dist/chunks/index-f0vSgRIK.js +75 -0
  38. package/dist/chunks/index-f0vSgRIK.js.map +1 -0
  39. package/dist/chunks/index-glxDu2eJ.js +531 -0
  40. package/dist/chunks/index-glxDu2eJ.js.map +1 -0
  41. package/dist/chunks/index-q5DsrT-Q.js +225 -0
  42. package/dist/chunks/index-q5DsrT-Q.js.map +1 -0
  43. package/dist/chunks/index-rENB3n9O.js +74 -0
  44. package/dist/chunks/index-rENB3n9O.js.map +1 -0
  45. package/dist/controls/ControlBar.d.ts +76 -0
  46. package/dist/controls/ControlBar.d.ts.map +1 -0
  47. package/dist/controls/MiniProgress.d.ts +22 -0
  48. package/dist/controls/MiniProgress.d.ts.map +1 -0
  49. package/dist/controls/SeekBar.d.ts +60 -0
  50. package/dist/controls/SeekBar.d.ts.map +1 -0
  51. package/dist/controls/SettingsMenu.d.ts +92 -0
  52. package/dist/controls/SettingsMenu.d.ts.map +1 -0
  53. package/dist/controls/Tooltip.d.ts +24 -0
  54. package/dist/controls/Tooltip.d.ts.map +1 -0
  55. package/dist/controls/VolumePanel.d.ts +45 -0
  56. package/dist/controls/VolumePanel.d.ts.map +1 -0
  57. package/dist/hls/SourceManager.d.ts +17 -0
  58. package/dist/hls/SourceManager.d.ts.map +1 -0
  59. package/dist/hope-player.js +5 -0
  60. package/dist/hope-player.js.map +1 -0
  61. package/dist/i18n/index.d.ts +10 -0
  62. package/dist/i18n/index.d.ts.map +1 -0
  63. package/dist/i18n/locales/en.d.ts +3 -0
  64. package/dist/i18n/locales/en.d.ts.map +1 -0
  65. package/dist/i18n/locales/tr.d.ts +4 -0
  66. package/dist/i18n/locales/tr.d.ts.map +1 -0
  67. package/dist/i18n/types.d.ts +68 -0
  68. package/dist/i18n/types.d.ts.map +1 -0
  69. package/dist/icons/Icon.d.ts +5 -0
  70. package/dist/icons/Icon.d.ts.map +1 -0
  71. package/dist/icons/injectIconFont.d.ts +3 -0
  72. package/dist/icons/injectIconFont.d.ts.map +1 -0
  73. package/dist/index.d.ts +10 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/keyboard/KeyboardController.d.ts +10 -0
  76. package/dist/keyboard/KeyboardController.d.ts.map +1 -0
  77. package/dist/plugins/ads/AdsController.d.ts +86 -0
  78. package/dist/plugins/ads/AdsController.d.ts.map +1 -0
  79. package/dist/plugins/ads/RetryController.d.ts +21 -0
  80. package/dist/plugins/ads/RetryController.d.ts.map +1 -0
  81. package/dist/plugins/ads/consent.d.ts +26 -0
  82. package/dist/plugins/ads/consent.d.ts.map +1 -0
  83. package/dist/plugins/ads/generateVastUrl.d.ts +8 -0
  84. package/dist/plugins/ads/generateVastUrl.d.ts.map +1 -0
  85. package/dist/plugins/ads/index.d.ts +7 -0
  86. package/dist/plugins/ads/index.d.ts.map +1 -0
  87. package/dist/plugins/ads/loadImaSdk.d.ts +10 -0
  88. package/dist/plugins/ads/loadImaSdk.d.ts.map +1 -0
  89. package/dist/plugins/ads/scte35.d.ts +40 -0
  90. package/dist/plugins/ads/scte35.d.ts.map +1 -0
  91. package/dist/plugins/countdown-screen/CountdownScreen.d.ts +27 -0
  92. package/dist/plugins/countdown-screen/CountdownScreen.d.ts.map +1 -0
  93. package/dist/plugins/countdown-screen/index.d.ts +7 -0
  94. package/dist/plugins/countdown-screen/index.d.ts.map +1 -0
  95. package/dist/plugins/dai/DaiController.d.ts +28 -0
  96. package/dist/plugins/dai/DaiController.d.ts.map +1 -0
  97. package/dist/plugins/dai/index.d.ts +6 -0
  98. package/dist/plugins/dai/index.d.ts.map +1 -0
  99. package/dist/plugins/dai/loadDaiSdk.d.ts +3 -0
  100. package/dist/plugins/dai/loadDaiSdk.d.ts.map +1 -0
  101. package/dist/plugins/dubbing/Dubbing.d.ts +23 -0
  102. package/dist/plugins/dubbing/Dubbing.d.ts.map +1 -0
  103. package/dist/plugins/dubbing/index.d.ts +6 -0
  104. package/dist/plugins/dubbing/index.d.ts.map +1 -0
  105. package/dist/plugins/geo-checker/GeoChecker.d.ts +22 -0
  106. package/dist/plugins/geo-checker/GeoChecker.d.ts.map +1 -0
  107. package/dist/plugins/geo-checker/index.d.ts +7 -0
  108. package/dist/plugins/geo-checker/index.d.ts.map +1 -0
  109. package/dist/plugins/gesture/GestureControls.d.ts +29 -0
  110. package/dist/plugins/gesture/GestureControls.d.ts.map +1 -0
  111. package/dist/plugins/gesture/index.d.ts +6 -0
  112. package/dist/plugins/gesture/index.d.ts.map +1 -0
  113. package/dist/plugins/in-view-autoplay/InViewAutoplay.d.ts +21 -0
  114. package/dist/plugins/in-view-autoplay/InViewAutoplay.d.ts.map +1 -0
  115. package/dist/plugins/in-view-autoplay/index.d.ts +6 -0
  116. package/dist/plugins/in-view-autoplay/index.d.ts.map +1 -0
  117. package/dist/plugins/live/LiveWallClock.d.ts +43 -0
  118. package/dist/plugins/live/LiveWallClock.d.ts.map +1 -0
  119. package/dist/plugins/live/index.d.ts +6 -0
  120. package/dist/plugins/live/index.d.ts.map +1 -0
  121. package/dist/plugins/loop-section/LoopSection.d.ts +34 -0
  122. package/dist/plugins/loop-section/LoopSection.d.ts.map +1 -0
  123. package/dist/plugins/loop-section/index.d.ts +18 -0
  124. package/dist/plugins/loop-section/index.d.ts.map +1 -0
  125. package/dist/plugins/markers/MarkProgress.d.ts +43 -0
  126. package/dist/plugins/markers/MarkProgress.d.ts.map +1 -0
  127. package/dist/plugins/markers/index.d.ts +6 -0
  128. package/dist/plugins/markers/index.d.ts.map +1 -0
  129. package/dist/plugins/playlist/PlaylistRunner.d.ts +64 -0
  130. package/dist/plugins/playlist/PlaylistRunner.d.ts.map +1 -0
  131. package/dist/plugins/playlist/index.d.ts +6 -0
  132. package/dist/plugins/playlist/index.d.ts.map +1 -0
  133. package/dist/plugins/prebid/VideoPrebid.d.ts +88 -0
  134. package/dist/plugins/prebid/VideoPrebid.d.ts.map +1 -0
  135. package/dist/plugins/qr-resume/QrResume.d.ts +38 -0
  136. package/dist/plugins/qr-resume/QrResume.d.ts.map +1 -0
  137. package/dist/plugins/qr-resume/index.d.ts +6 -0
  138. package/dist/plugins/qr-resume/index.d.ts.map +1 -0
  139. package/dist/plugins/qr-resume/qrSvg.d.ts +9 -0
  140. package/dist/plugins/qr-resume/qrSvg.d.ts.map +1 -0
  141. package/dist/plugins/redirect-screen/RedirectScreen.d.ts +25 -0
  142. package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -0
  143. package/dist/plugins/redirect-screen/index.d.ts +6 -0
  144. package/dist/plugins/redirect-screen/index.d.ts.map +1 -0
  145. package/dist/plugins/segments/Segments.d.ts +34 -0
  146. package/dist/plugins/segments/Segments.d.ts.map +1 -0
  147. package/dist/plugins/segments/index.d.ts +6 -0
  148. package/dist/plugins/segments/index.d.ts.map +1 -0
  149. package/dist/plugins/shared/GatePlayerContext.d.ts +10 -0
  150. package/dist/plugins/shared/GatePlayerContext.d.ts.map +1 -0
  151. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +78 -0
  152. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -0
  153. package/dist/plugins/sprite-thumbnails/index.d.ts +6 -0
  154. package/dist/plugins/sprite-thumbnails/index.d.ts.map +1 -0
  155. package/dist/plugins/sticky/StickyManager.d.ts +51 -0
  156. package/dist/plugins/sticky/StickyManager.d.ts.map +1 -0
  157. package/dist/plugins/sticky/index.d.ts +6 -0
  158. package/dist/plugins/sticky/index.d.ts.map +1 -0
  159. package/dist/plugins/story/HopeStory.d.ts +71 -0
  160. package/dist/plugins/story/HopeStory.d.ts.map +1 -0
  161. package/dist/plugins/story/index.d.ts +6 -0
  162. package/dist/plugins/story/index.d.ts.map +1 -0
  163. package/dist/screens/ErrorScreen.d.ts +17 -0
  164. package/dist/screens/ErrorScreen.d.ts.map +1 -0
  165. package/dist/screens/LoadingSpinner.d.ts +10 -0
  166. package/dist/screens/LoadingSpinner.d.ts.map +1 -0
  167. package/dist/subtitles/CaptionRenderer.d.ts +55 -0
  168. package/dist/subtitles/CaptionRenderer.d.ts.map +1 -0
  169. package/dist/subtitles/attachTracks.d.ts +10 -0
  170. package/dist/subtitles/attachTracks.d.ts.map +1 -0
  171. package/dist/types/index.d.ts +480 -0
  172. package/dist/types/index.d.ts.map +1 -0
  173. package/dist/utils/format-time.d.ts +3 -0
  174. package/dist/utils/format-time.d.ts.map +1 -0
  175. package/package.json +53 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Umut Yaldız
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,37 @@
1
- # Temporary Holding Version
1
+ # @hopeplayer/core
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ A dependency-free (except `hls.js`) `<hope-player>` custom element — Shadow DOM + Tailwind-based theming, real plugin code-splitting, and a framework-agnostic event API. Works in plain HTML, React, Vue, Next.js, or anywhere else a Custom Element runs.
4
+
5
+ Full docs, live demos, and the options/theming/plugin reference: **[umutyaldiz.com/hopecoreplayer](https://umutyaldiz.com/hopecoreplayer)**
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @hopeplayer/core
11
+ ```
12
+
13
+ ```ts
14
+ import '@hopeplayer/core';
15
+
16
+ document.querySelector('#player').options = {
17
+ src: '/video.mp4',
18
+ poster: '/poster.jpg',
19
+ };
20
+ ```
21
+
22
+ ```html
23
+ <hope-player src="/video.mp4" poster="/poster.jpg"></hope-player>
24
+ ```
25
+
26
+ ## Highlights
27
+
28
+ - **Zero runtime dependencies** besides `hls.js`, which is itself only downloaded (as a separate chunk) when the source is an `.m3u8` stream and the browser lacks native HLS support.
29
+ - **Shadow DOM** — the player's styles never leak into (or get overridden by) the host page.
30
+ - **Real plugin code-splitting** — ads, Prebid, playlist, story mode, markers, segments, sprite thumbnails, countdown/geo/redirect screens, dubbing, live/SCTE-35, DAI, and more each ship as their own dynamically-imported chunk. Nothing you don't configure is ever downloaded.
31
+ - **4 built-in style presets** (glass dark/light, neomorphism, flat) plus a CSS custom-property token system — set your brand color with a single `--hp-color-accent` token.
32
+ - **i18n built in** — every label, tooltip, and ad-UI string follows a single `locale`/`labels` option.
33
+ - Framework wrappers: [`@hopeplayer/react`](https://www.npmjs.com/package/@hopeplayer/react), [`@hopeplayer/vue`](https://www.npmjs.com/package/@hopeplayer/vue).
34
+
35
+ ## License
36
+
37
+ MIT © [Umut Yaldız](https://www.umutyaldiz.com)
@@ -0,0 +1,120 @@
1
+ import type { HopePlayerOptions } from './types';
2
+ /** <hope-player> — çekirdek oynatma ve kontroller; plugin'ler ilgili option verilince dinamik import edilir. */
3
+ export declare class HopePlayerElement extends HTMLElement {
4
+ static get observedAttributes(): string[];
5
+ private readonly root;
6
+ private readonly videoArea;
7
+ private readonly videoEl;
8
+ private readonly adLayerEl;
9
+ private readonly chromeEl;
10
+ private readonly centerPlayButton;
11
+ private readonly captionRenderer;
12
+ /** options.miniProgress açıkken kurulur. */
13
+ private miniProgress;
14
+ private chromeVisible;
15
+ private readonly sourceManager;
16
+ private readonly controlBar;
17
+ private readonly tooltip;
18
+ private readonly keyboard;
19
+ private readonly loadingSpinner;
20
+ private readonly errorScreen;
21
+ private adsController;
22
+ private gestureControls;
23
+ private loopSection;
24
+ private inViewAutoplay;
25
+ private unregisterSticky;
26
+ private playlistRunner;
27
+ private hopeStory;
28
+ private markProgress;
29
+ private segments;
30
+ private spriteThumbnails;
31
+ private countdownScreen;
32
+ private geoChecker;
33
+ private redirectScreen;
34
+ private qrResume;
35
+ private dubbing;
36
+ private liveWallClock;
37
+ private daiController;
38
+ private readonly instanceKey;
39
+ private subtitleTracks;
40
+ /** `applyOptions()`'ta aktif bir altyazı track'i seçiliyken `true` — dil değişince Boyut/Konum görünümünü tazelemek için. */
41
+ private captionTrackActive;
42
+ /**
43
+ * countdownScreen varken gerçek init (kaynak + içerik plugin'leri) ertelenir; en güncel options snapshot'ı.
44
+ * onComplete kaydı tek sefer yapılır (bkz. playbackInitRegistered) — init birden fazla kez tetiklenmesin.
45
+ */
46
+ private pendingPlaybackOptions;
47
+ private playbackInitRegistered;
48
+ /**
49
+ * countdownScreen gibi alanlar yalnızca .options ile gelir. connectedCallback'teki ilk (options'suz) geçiş chrome'u
50
+ * bir an açıp player'ı gösteriyordu; 'boot' bloklayıcısı gerçek options gelene kadar bekletir.
51
+ */
52
+ private bootResolved;
53
+ private bootGraceTimer;
54
+ private _options;
55
+ private hideTimer;
56
+ private autoHideDelayMs;
57
+ private tapCandidate;
58
+ private tapStartX;
59
+ private tapStartY;
60
+ /** Tüm UI'ın paylaştığı tek, mutable sözlük — dil değişince referans değil alanlar güncellenir. */
61
+ private readonly i18n;
62
+ /** IMA SDK'nın kendi ad-UI dili (skip butonu/sayaç metni) de aynı dili takip etsin diye — bkz. plugins/ads/AdsController. */
63
+ private localeCode;
64
+ constructor();
65
+ connectedCallback(): void;
66
+ disconnectedCallback(): void;
67
+ /** Reklam/consent-farkında plugin'lerin (gesture/sticky/in-view-autoplay) ortak sorgusu. */
68
+ isAdPlaying(): boolean;
69
+ attributeChangedCallback(): void;
70
+ get options(): HopePlayerOptions;
71
+ set options(value: HopePlayerOptions);
72
+ play(): Promise<void>;
73
+ pause(): void;
74
+ /** `options.qrResume` kuruluysa "telefonundan devam et" QR ekranını manuel göster (ör. entegratörün kendi "telefona gönder" butonu) — otomatik gösterim kuralları (minElapsed/minRemaining) burada uygulanmaz. */
75
+ showQrResume(): void;
76
+ get showRemainingTime(): boolean;
77
+ set showRemainingTime(value: boolean);
78
+ toggleTimeDisplay(): void;
79
+ private syncFromAttributes;
80
+ private applyOptions;
81
+ private initPlayback;
82
+ /** Ayarlar menüsünün "Altyazı" alt menüsüne eklenen Boyut/Renk/Konum satırları — her zaman GÜNCEL `this.i18n`'i okur (dil sonradan değişse bile). */
83
+ private buildCaptionAppearance;
84
+ /** Playlist panelinin monte edileceği, .video-area'nın ALTINDAKİ (shadow root içi) kapsayıcı — ilk ihtiyaçta oluşturulur. */
85
+ private panelContainer;
86
+ private getOrCreatePanelContainer;
87
+ /** Kalite değişirken oynatma konumunu ve play/pause durumunu korur. */
88
+ private switchQualitySource;
89
+ private readonly onHlsLevelsChanged;
90
+ private requestFullscreenCompat;
91
+ private exitFullscreenCompat;
92
+ private isFullscreenActive;
93
+ private readonly onFullscreenChange;
94
+ private readonly chromeBlockers;
95
+ private get isChromeBlocked();
96
+ private get isChromeFullyHidden();
97
+ private readonly onPlay;
98
+ private readonly onPause;
99
+ private readonly onPointerDownFocus;
100
+ private readonly onVideoPressStart;
101
+ private readonly onVideoPressEnd;
102
+ private readonly onVideoPressCancel;
103
+ private showChrome;
104
+ /** Chrome görünürlüğünün tek giriş noktası — altyazı da haberdar olur (kontroller gizlenince en alta iner). */
105
+ private setChromeOpacity;
106
+ /** İnce ilerleme çizgisi: yalnızca kontroller gizliyken; reklam/giriş ekranı (chrome bloklu) sırasında değil. */
107
+ private updateMiniProgress;
108
+ /**
109
+ * Plugin (ads/countdown/geo) chrome'u kendi key'iyle gizler; unblockChrome aynı key'le açar.
110
+ * 'reduced' (ads): yalnızca oynat/duraklat + ses kalır. Merkez buton her modda gizli.
111
+ */
112
+ blockChrome(key: string, mode?: 'hidden' | 'reduced'): void;
113
+ /** Bloklayan plugin işini bitirince çağırır — başka bir blocker hâlâ aktifse chrome açılmaz. */
114
+ unblockChrome(key: string): void;
115
+ /** DAI reklam arası boyunca kullanıcı reklamın İÇİNE seek edemesin diye (sunucu taraflı eklenen reklamlar seekable aralığın parçası). */
116
+ disableSeeking(): void;
117
+ enableSeeking(): void;
118
+ private readonly scheduleAutoHide;
119
+ }
120
+ //# sourceMappingURL=HopePlayerElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ var b = Object.defineProperty;
2
+ var f = (c, e, i) => e in c ? b(c, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : c[e] = i;
3
+ var s = (c, e, i) => f(c, typeof e != "symbol" ? e + "" : e, i);
4
+ class y {
5
+ constructor(e = {}) {
6
+ s(this, "timeout");
7
+ s(this, "adUnitCode");
8
+ s(this, "sizes");
9
+ s(this, "bidders");
10
+ s(this, "gamAdUnit");
11
+ s(this, "gpid");
12
+ s(this, "playbackMethod");
13
+ s(this, "skip");
14
+ s(this, "skipafter");
15
+ s(this, "maxduration");
16
+ s(this, "minduration");
17
+ s(this, "api");
18
+ s(this, "protocols");
19
+ s(this, "mimes");
20
+ s(this, "applyLossFactor");
21
+ s(this, "lossFactors");
22
+ s(this, "consentManagement");
23
+ s(this, "cacheWarned", !1);
24
+ s(this, "gamWarned", !1);
25
+ s(this, "cacheKeyWarned", !1);
26
+ this.timeout = e.timeout ?? 1500, this.adUnitCode = e.adUnitCode || "hope-video-preroll", this.sizes = e.sizes || [[640, 360]], this.bidders = e.bidders || [], this.gamAdUnit = e.gamAdUnit ?? null, this.gpid = e.gpid ?? this.gamAdUnit ?? null, this.playbackMethod = e.playbackMethod ?? 2, this.skip = e.skip ?? 0, this.skipafter = e.skipafter ?? 5, this.maxduration = e.maxduration ?? 30, this.minduration = e.minduration ?? 1, this.api = e.api || [2, 7], this.protocols = e.protocols || [2, 3, 5, 6, 7, 8], this.mimes = e.mimes || (this.api.includes(2) ? ["video/mp4", "video/webm", "application/javascript"] : ["video/mp4", "video/webm"]), this.applyLossFactor = e.applyLossFactor ?? !1, this.lossFactors = e.lossFactors || {}, this.consentManagement = e.consentManagement ?? null;
27
+ }
28
+ applyConsentConfig() {
29
+ const e = window.pbjs;
30
+ if (!(!this.consentManagement || !e || e.__hopeConsentApplied))
31
+ try {
32
+ e.setConfig({ consentManagement: this.consentManagement }), e.__hopeConsentApplied = !0;
33
+ } catch (i) {
34
+ console.warn("[VideoPrebid] consentManagement setConfig hatası:", i);
35
+ }
36
+ }
37
+ isAvailable() {
38
+ var n, a;
39
+ const e = window.pbjs;
40
+ if (!e || typeof e.requestBids != "function") return !1;
41
+ this.cacheWarned || ((a = (n = e.getConfig) == null ? void 0 : n.call(e, "cache")) != null && a.url || console.warn(`[VideoPrebid] pbjs.setConfig({cache:{url}}) tanımlı değil. ${this.gamAdUnit ? "GAM isteğinde hb_uuid boş kalacak, creative reklam döndüremeyecek." : "vastUrl boş dönecek, fallback tag kullanılacak."}`), this.cacheWarned = !0);
42
+ const i = e.installedModules || [];
43
+ if (!i.length) return !0;
44
+ const t = e.aliasRegistry || {};
45
+ return this.bidders.some((r) => {
46
+ if (i.includes(`${r.bidder}BidAdapter`)) return !0;
47
+ const o = t[r.bidder];
48
+ return o ? i.includes(`${o}BidAdapter`) : !1;
49
+ });
50
+ }
51
+ runAuction(e) {
52
+ return new Promise((i) => {
53
+ if (!this.isAvailable()) {
54
+ i(e);
55
+ return;
56
+ }
57
+ const t = window.pbjs, n = this.buildAdUnit(), a = () => {
58
+ try {
59
+ t.removeAdUnit(n.code);
60
+ } catch {
61
+ }
62
+ };
63
+ let r = !1;
64
+ const o = (l) => {
65
+ r || (r = !0, a(), i(l));
66
+ };
67
+ t.que = t.que || [], t.que.push(() => {
68
+ this.applyConsentConfig(), t.removeAdUnit(n.code), t.addAdUnits([n]);
69
+ const l = setTimeout(() => o(e), this.timeout + 500);
70
+ t.requestBids({
71
+ adUnits: [n],
72
+ timeout: this.timeout,
73
+ bidsBackHandler: () => {
74
+ clearTimeout(l), o(this.resolveVastUrl(n, e));
75
+ }
76
+ });
77
+ });
78
+ });
79
+ }
80
+ buildAdUnit() {
81
+ const e = typeof structuredClone == "function" ? structuredClone(this.bidders) : JSON.parse(JSON.stringify(this.bidders)), i = this.gpid || this.adUnitCode;
82
+ return {
83
+ code: this.adUnitCode,
84
+ ortb2Imp: {
85
+ ext: {
86
+ gpid: i,
87
+ data: { pbadslot: i }
88
+ }
89
+ },
90
+ mediaTypes: {
91
+ video: {
92
+ context: "instream",
93
+ playerSize: this.sizes,
94
+ mimes: this.mimes,
95
+ protocols: this.protocols,
96
+ api: this.api,
97
+ minduration: this.minduration,
98
+ maxduration: this.maxduration,
99
+ startdelay: 0,
100
+ playbackmethod: [this.playbackMethod],
101
+ linearity: 1,
102
+ plcmt: 1,
103
+ placement: 1,
104
+ skip: this.skip,
105
+ ...this.skip ? { skipafter: this.skipafter } : {},
106
+ pos: 1
107
+ }
108
+ },
109
+ bids: e
110
+ };
111
+ }
112
+ getGamAdServer() {
113
+ var t;
114
+ const e = (t = window.pbjs) == null ? void 0 : t.adServers, i = (e == null ? void 0 : e.gam) || (e == null ? void 0 : e.dfp);
115
+ return typeof (i == null ? void 0 : i.buildVideoUrl) == "function" ? i : null;
116
+ }
117
+ /** Fallback tag'in cust_params'ını objeye çevirir — buildVideoUrl URL'i sıfırdan kurduğu için ayrıca geçilmeli. */
118
+ extractCustParams(e) {
119
+ const i = {};
120
+ try {
121
+ const t = new URL(e).searchParams.get("cust_params");
122
+ if (!t) return i;
123
+ for (const n of t.split("&")) {
124
+ const a = n.indexOf("=");
125
+ if (a <= 0) continue;
126
+ const r = n.slice(0, a);
127
+ r.startsWith("hb_") || (i[r] = n.slice(a + 1));
128
+ }
129
+ } catch (t) {
130
+ console.warn("[VideoPrebid] fallback cust_params okunamadı:", t);
131
+ }
132
+ return i;
133
+ }
134
+ pickWinningBid(e) {
135
+ var l, u, h;
136
+ const i = window.pbjs;
137
+ if (!this.applyLossFactor)
138
+ return (((l = i.getHighestCpmBids) == null ? void 0 : l.call(i, e)) || [])[0];
139
+ const t = ((h = (u = i.getBidResponsesForAdUnitCode) == null ? void 0 : u.call(i, e)) == null ? void 0 : h.bids) || [];
140
+ if (!t.length) return;
141
+ const n = Date.now(), a = t.filter((d) => !d.responseTimestamp || !d.ttl || d.responseTimestamp + d.ttl * 1e3 > n);
142
+ if (!a.length) return;
143
+ let r, o = -1 / 0;
144
+ for (const d of a) {
145
+ const p = this.lossFactors[d.bidder] ?? 1, m = (d.cpm || 0) * p;
146
+ m > o && (o = m, r = d);
147
+ }
148
+ return r;
149
+ }
150
+ resolveVastUrl(e, i) {
151
+ const t = this.gamAdUnit ? this.getGamAdServer() : null;
152
+ this.gamAdUnit && !t && !this.gamWarned && (console.warn(`[VideoPrebid] pbjs.adServers.gam.buildVideoUrl bulunamadı — Prebid build'inde "Google Ad Manager Video" (dfpAdServerVideo) modülü yok. GAM atlanıyor, kazanan bid'in vastUrl'i kullanılacak.`), this.gamWarned = !0);
153
+ const n = this.pickWinningBid(e.code);
154
+ if (t && !n && console.warn(`[VideoPrebid] Auction'dan kazanan bid çıkmadı — GAM isteği hb_pb/hb_bidder olmadan gidiyor, cust_params'ta hb_uuid=undefined görünecek. pbjs.getBidResponsesForAdUnitCode('${e.code}') ve pbjs.getEvents() ile no-bid/timeout sebebine bakın.`), t && n && !n.videoCacheKey && !this.cacheKeyWarned && (console.warn(`[VideoPrebid] Kazanan bid'de videoCacheKey yok — GAM isteğine hb_uuid=undefined gidecek. VAST cache'e yazılmamış: pbjs.setConfig({cache:{url}}) auction'dan önce çalışıyor mu ve cache POST'u başarılı mı kontrol edin. (bidder: ${n.bidder})`), this.cacheKeyWarned = !0), t)
155
+ try {
156
+ const a = t.buildVideoUrl({
157
+ adUnit: e,
158
+ params: {
159
+ iu: this.gamAdUnit,
160
+ output: "vast",
161
+ description_url: window.location.href,
162
+ url: window.location.href,
163
+ cust_params: this.extractCustParams(i)
164
+ }
165
+ });
166
+ if (a) return a;
167
+ } catch (a) {
168
+ console.warn("[VideoPrebid] buildVideoUrl failed:", a);
169
+ }
170
+ if (n) {
171
+ if (n.vastUrl) return n.vastUrl;
172
+ n.vastXml && console.warn("[VideoPrebid] Kazanan bid vastXml içeriyor ancak Prebid cache yapılandırılmamış. pbjs.setConfig({cache:{url}}) ekleyin. Fallback'e düşülüyor.");
173
+ }
174
+ return i;
175
+ }
176
+ }
177
+ export {
178
+ y as VideoPrebid
179
+ };
180
+ //# sourceMappingURL=VideoPrebid-CpckFzSq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoPrebid-CpckFzSq.js","sources":["../../src/plugins/prebid/VideoPrebid.ts"],"sourcesContent":["import type { PrebidBidderConfig, PrebidBreakOptions, PrebidOptions } from '../../types';\n\n/** window.pbjs yüzeyi — Prebid.js sayfaya <script> ile yüklenir, npm bağımlılığı değil. */\ninterface PbjsBid {\n bidder: string;\n cpm?: number;\n vastUrl?: string;\n vastXml?: string;\n videoCacheKey?: string;\n responseTimestamp?: number;\n ttl?: number;\n}\n\ninterface Pbjs {\n que: Array<() => void>;\n requestBids(params: { adUnits: unknown[]; timeout: number; bidsBackHandler: () => void }): void;\n addAdUnits(units: unknown[]): void;\n removeAdUnit(code: string): void;\n setConfig(config: Record<string, unknown>): void;\n getConfig?(key: string): { url?: string } | undefined;\n installedModules?: string[];\n aliasRegistry?: Record<string, string>;\n getHighestCpmBids?(adUnitCode: string): PbjsBid[];\n getBidResponsesForAdUnitCode?(adUnitCode: string): { bids: PbjsBid[] };\n adServers?: {\n gam?: { buildVideoUrl(args: { adUnit: unknown; params: Record<string, string> }): string | null };\n dfp?: { buildVideoUrl(args: { adUnit: unknown; params: Record<string, string> }): string | null };\n };\n __hopeConsentApplied?: boolean;\n}\n\ndeclare global {\n interface Window {\n pbjs?: Pbjs;\n }\n}\n\n/** Prebid.js instream video header bidding (GAM ve direkt-VAST modları). */\nexport class VideoPrebid {\n private readonly timeout: number;\n private readonly adUnitCode: string;\n private readonly sizes: Array<[number, number]>;\n private readonly bidders: PrebidBidderConfig[];\n private readonly gamAdUnit: string | null;\n private readonly gpid: string | null;\n private readonly playbackMethod: number;\n private readonly skip: 0 | 1;\n private readonly skipafter: number;\n private readonly maxduration: number;\n private readonly minduration: number;\n private readonly api: number[];\n private readonly protocols: number[];\n private readonly mimes: string[];\n private readonly applyLossFactor: boolean;\n private readonly lossFactors: Record<string, number>;\n private readonly consentManagement: PrebidOptions['consentManagement'];\n\n private cacheWarned = false;\n private gamWarned = false;\n private cacheKeyWarned = false;\n\n constructor(opts: PrebidBreakOptions & { consentManagement?: PrebidOptions['consentManagement'] } = {}) {\n this.timeout = opts.timeout ?? 1500;\n this.adUnitCode = opts.adUnitCode || 'hope-video-preroll';\n this.sizes = opts.sizes || [[640, 360]];\n this.bidders = opts.bidders || [];\n this.gamAdUnit = opts.gamAdUnit ?? null;\n this.gpid = opts.gpid ?? this.gamAdUnit ?? null;\n this.playbackMethod = opts.playbackMethod ?? 2;\n this.skip = opts.skip ?? 0;\n this.skipafter = opts.skipafter ?? 5;\n this.maxduration = opts.maxduration ?? 30;\n this.minduration = opts.minduration ?? 1;\n this.api = opts.api || [2, 7];\n this.protocols = opts.protocols || [2, 3, 5, 6, 7, 8];\n this.mimes = opts.mimes || (this.api.includes(2)\n ? ['video/mp4', 'video/webm', 'application/javascript']\n : ['video/mp4', 'video/webm']);\n this.applyLossFactor = opts.applyLossFactor ?? false;\n this.lossFactors = opts.lossFactors || {};\n this.consentManagement = opts.consentManagement ?? null;\n }\n\n private applyConsentConfig(): void {\n const pbjs = window.pbjs;\n if (!this.consentManagement || !pbjs || pbjs.__hopeConsentApplied) return;\n try {\n pbjs.setConfig({ consentManagement: this.consentManagement });\n pbjs.__hopeConsentApplied = true;\n } catch (err) {\n console.warn('[VideoPrebid] consentManagement setConfig hatası:', err);\n }\n }\n\n isAvailable(): boolean {\n const pbjs = window.pbjs;\n if (!pbjs || typeof pbjs.requestBids !== 'function') return false;\n\n if (!this.cacheWarned) {\n const cacheUrl = pbjs.getConfig?.('cache')?.url;\n if (!cacheUrl) {\n console.warn(`[VideoPrebid] pbjs.setConfig({cache:{url}}) tanımlı değil. ${this.gamAdUnit ? 'GAM isteğinde hb_uuid boş kalacak, creative reklam döndüremeyecek.' : 'vastUrl boş dönecek, fallback tag kullanılacak.'}`);\n }\n this.cacheWarned = true;\n }\n\n const installed = pbjs.installedModules || [];\n if (!installed.length) return true;\n\n const aliasRegistry = pbjs.aliasRegistry || {};\n return this.bidders.some((b) => {\n if (installed.includes(`${b.bidder}BidAdapter`)) return true;\n const canonical = aliasRegistry[b.bidder];\n return canonical ? installed.includes(`${canonical}BidAdapter`) : false;\n });\n }\n\n runAuction(fallbackVastUrl: string): Promise<string> {\n return new Promise((resolve) => {\n if (!this.isAvailable()) {\n resolve(fallbackVastUrl);\n return;\n }\n const pbjs = window.pbjs!;\n\n const adUnit = this.buildAdUnit();\n const cleanup = () => {\n try {\n pbjs.removeAdUnit(adUnit.code);\n } catch {\n /* no-op */\n }\n };\n\n let settled = false;\n const done = (url: string) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(url);\n };\n\n pbjs.que = pbjs.que || [];\n pbjs.que.push(() => {\n this.applyConsentConfig();\n pbjs.removeAdUnit(adUnit.code);\n pbjs.addAdUnits([adUnit]);\n\n // Prebid'in kendi timeoutBuffer default'u 400ms, +300 bidsBackHandler'dan\n // önce ateşleyebiliyordu — +500ms tampon bu yüzden.\n const failsafe = setTimeout(() => done(fallbackVastUrl), this.timeout + 500);\n\n pbjs.requestBids({\n adUnits: [adUnit],\n timeout: this.timeout,\n bidsBackHandler: () => {\n clearTimeout(failsafe);\n done(this.resolveVastUrl(adUnit, fallbackVastUrl));\n },\n });\n });\n });\n }\n\n private buildAdUnit(): { code: string; ortb2Imp: unknown; mediaTypes: unknown; bids: PrebidBidderConfig[] } {\n const bids: PrebidBidderConfig[] = typeof structuredClone === 'function'\n ? structuredClone(this.bidders)\n : (JSON.parse(JSON.stringify(this.bidders)) as PrebidBidderConfig[]);\n\n const stableId = this.gpid || this.adUnitCode;\n\n return {\n code: this.adUnitCode,\n ortb2Imp: {\n ext: {\n gpid: stableId,\n data: { pbadslot: stableId },\n },\n },\n mediaTypes: {\n video: {\n context: 'instream',\n playerSize: this.sizes,\n mimes: this.mimes,\n protocols: this.protocols,\n api: this.api,\n minduration: this.minduration,\n maxduration: this.maxduration,\n startdelay: 0,\n playbackmethod: [this.playbackMethod],\n linearity: 1,\n plcmt: 1,\n placement: 1,\n skip: this.skip,\n ...(this.skip ? { skipafter: this.skipafter } : {}),\n pos: 1,\n },\n },\n bids,\n };\n }\n\n private getGamAdServer(): {\n buildVideoUrl(args: { adUnit: unknown; params: Record<string, string | Record<string, string>> }): string | null;\n } | null {\n const adServers = window.pbjs?.adServers;\n const gam = adServers?.gam || adServers?.dfp;\n return typeof gam?.buildVideoUrl === 'function' ? gam : null;\n }\n\n /** Fallback tag'in cust_params'ını objeye çevirir — buildVideoUrl URL'i sıfırdan kurduğu için ayrıca geçilmeli. */\n private extractCustParams(url: string): Record<string, string> {\n const result: Record<string, string> = {};\n try {\n const raw = new URL(url).searchParams.get('cust_params');\n if (!raw) return result;\n for (const pair of raw.split('&')) {\n const idx = pair.indexOf('=');\n if (idx <= 0) continue;\n const key = pair.slice(0, idx);\n if (key.startsWith('hb_')) continue;\n result[key] = pair.slice(idx + 1);\n }\n } catch (err) {\n console.warn('[VideoPrebid] fallback cust_params okunamadı:', err);\n }\n return result;\n }\n\n private pickWinningBid(adUnitCode: string): PbjsBid | undefined {\n const pbjs = window.pbjs!;\n if (!this.applyLossFactor) {\n return (pbjs.getHighestCpmBids?.(adUnitCode) || [])[0];\n }\n\n const responses = pbjs.getBidResponsesForAdUnitCode?.(adUnitCode)?.bids || [];\n if (!responses.length) return undefined;\n\n const now = Date.now();\n const valid = responses.filter((b) => !b.responseTimestamp || !b.ttl || b.responseTimestamp + b.ttl * 1000 > now);\n if (!valid.length) return undefined;\n\n let best: PbjsBid | undefined;\n let bestWeighted = -Infinity;\n for (const bid of valid) {\n const factor = this.lossFactors[bid.bidder] ?? 1;\n const weighted = (bid.cpm || 0) * factor;\n if (weighted > bestWeighted) {\n bestWeighted = weighted;\n best = bid;\n }\n }\n return best;\n }\n\n private resolveVastUrl(adUnit: { code: string }, fallback: string): string {\n const gam = this.gamAdUnit ? this.getGamAdServer() : null;\n\n if (this.gamAdUnit && !gam && !this.gamWarned) {\n console.warn('[VideoPrebid] pbjs.adServers.gam.buildVideoUrl bulunamadı — Prebid build\\'inde \"Google Ad Manager Video\" (dfpAdServerVideo) modülü yok. GAM atlanıyor, kazanan bid\\'in vastUrl\\'i kullanılacak.');\n this.gamWarned = true;\n }\n\n const winner = this.pickWinningBid(adUnit.code);\n\n if (gam && !winner) {\n console.warn(`[VideoPrebid] Auction'dan kazanan bid çıkmadı — GAM isteği hb_pb/hb_bidder olmadan gidiyor, cust_params'ta hb_uuid=undefined görünecek. pbjs.getBidResponsesForAdUnitCode('${adUnit.code}') ve pbjs.getEvents() ile no-bid/timeout sebebine bakın.`);\n }\n\n if (gam && winner && !winner.videoCacheKey && !this.cacheKeyWarned) {\n console.warn(`[VideoPrebid] Kazanan bid'de videoCacheKey yok — GAM isteğine hb_uuid=undefined gidecek. VAST cache'e yazılmamış: pbjs.setConfig({cache:{url}}) auction'dan önce çalışıyor mu ve cache POST'u başarılı mı kontrol edin. (bidder: ${winner.bidder})`);\n this.cacheKeyWarned = true;\n }\n\n if (gam) {\n try {\n const url = gam.buildVideoUrl({\n adUnit,\n params: {\n iu: this.gamAdUnit!,\n output: 'vast',\n description_url: window.location.href,\n url: window.location.href,\n cust_params: this.extractCustParams(fallback),\n },\n });\n if (url) return url;\n } catch (err) {\n console.warn('[VideoPrebid] buildVideoUrl failed:', err);\n }\n }\n\n if (winner) {\n if (winner.vastUrl) return winner.vastUrl;\n if (winner.vastXml) {\n console.warn('[VideoPrebid] Kazanan bid vastXml içeriyor ancak Prebid cache yapılandırılmamış. pbjs.setConfig({cache:{url}}) ekleyin. Fallback\\'e düşülüyor.');\n }\n }\n\n return fallback;\n }\n}\n\nexport default VideoPrebid;\n"],"names":["VideoPrebid","opts","__publicField","pbjs","err","_a","_b","installed","aliasRegistry","b","canonical","fallbackVastUrl","resolve","adUnit","cleanup","settled","done","url","failsafe","bids","stableId","adServers","gam","result","raw","pair","idx","key","adUnitCode","_c","responses","now","valid","best","bestWeighted","bid","factor","weighted","fallback","winner"],"mappings":"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"}