@hopeplayer/core 1.4.0 → 1.5.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 +18 -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/{ads-CdWbE9aD.js → ads-C4tDPsUs.js} +3 -3
- package/dist/chunks/ads-C4tDPsUs.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-Baxvu76A.js} +2 -2
- package/dist/chunks/{cast-BQ-suTcF.js.map → cast-Baxvu76A.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/{history-DAbqEhNB.js → history-CvydU0aN.js} +2 -2
- package/dist/chunks/{history-DAbqEhNB.js.map → history-CvydU0aN.js.map} +1 -1
- package/dist/chunks/keySystems-CNzjRq6e.js +70 -0
- package/dist/chunks/keySystems-CNzjRq6e.js.map +1 -0
- package/dist/chunks/{markers-B04NMI79.js → markers-Dr4-CCxE.js} +2 -2
- package/dist/chunks/{markers-B04NMI79.js.map → markers-Dr4-CCxE.js.map} +1 -1
- package/dist/chunks/{player-D7WQxMzr.js → player-DV4Hf5Cw.js} +1230 -997
- package/dist/chunks/player-DV4Hf5Cw.js.map +1 -0
- package/dist/chunks/{playlist-C6Mh9BE8.js → playlist-DJsdK6xm.js} +29 -21
- package/dist/chunks/playlist-DJsdK6xm.js.map +1 -0
- package/dist/chunks/pluginHost-GxNfyP5E.js +566 -0
- package/dist/chunks/pluginHost-GxNfyP5E.js.map +1 -0
- package/dist/chunks/{redirectScreen-5HAVRtxe.js → redirectScreen-BT_26-5g.js} +2 -2
- package/dist/chunks/{redirectScreen-5HAVRtxe.js.map → redirectScreen-BT_26-5g.js.map} +1 -1
- package/dist/chunks/{rewardedUnlock-CGhQyWOk.js → rewardedUnlock-jFOdzfSq.js} +2 -2
- package/dist/chunks/{rewardedUnlock-CGhQyWOk.js.map → rewardedUnlock-jFOdzfSq.js.map} +1 -1
- package/dist/chunks/{segments-gCPrWRig.js → segments--hl_QVrI.js} +2 -2
- package/dist/chunks/{segments-gCPrWRig.js.map → segments--hl_QVrI.js.map} +1 -1
- package/dist/chunks/{skipSegments-BbWzPpXz.js → skipSegments-vJMhdiJn.js} +2 -2
- package/dist/chunks/{skipSegments-BbWzPpXz.js.map → skipSegments-vJMhdiJn.js.map} +1 -1
- package/dist/chunks/{spriteThumbnails-B7oDZFTo.js → spriteThumbnails-BoxVY--_.js} +76 -53
- package/dist/chunks/spriteThumbnails-BoxVY--_.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/{story-BLBij82f.js → story-BRkhSDhR.js} +2 -2
- package/dist/chunks/{story-BLBij82f.js.map → story-BRkhSDhR.js.map} +1 -1
- package/dist/controls/SeekBar.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 +3 -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/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/playlist/PlaylistRunner.d.ts +2 -0
- package/dist/plugins/playlist/PlaylistRunner.d.ts.map +1 -1
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +8 -0
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
- package/dist/screens/ErrorScreen.d.ts +1 -1
- package/dist/screens/ErrorScreen.d.ts.map +1 -1
- package/dist/types/index.d.ts +156 -4
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/dist/chunks/ads-CdWbE9aD.js.map +0 -1
- 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/spriteThumbnails-B7oDZFTo.js.map +0 -1
- package/dist/chunks/statsPanel-DSClIwA3.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HopePlayerOptions } from './types';
|
|
1
|
+
import type { HopePlayerOptions, HopeQoeMetrics } from './types';
|
|
2
2
|
import type Hls from 'hls.js';
|
|
3
3
|
import { type PlaybackEngineInfo } from './hls/SourceManager';
|
|
4
4
|
import { ErrorLog } from './debug/ErrorLog';
|
|
@@ -90,12 +90,17 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
90
90
|
private redirectKey;
|
|
91
91
|
/** Eklentileri çalıştıran taraf — yalnızca bir eklenti kullanılınca indirilir (plugin-api/PluginHost). */
|
|
92
92
|
private pluginHost;
|
|
93
|
+
/** Seçenekler uygulanırken eklenti senkronu bitince çözülür (reklam tag dönüşümü bekler). */
|
|
94
|
+
private settlePlugins;
|
|
95
|
+
private pluginsSettled;
|
|
93
96
|
/** `player.use()` ile çalışırken eklenenler. */
|
|
94
97
|
private readonly runtimePlugins;
|
|
95
98
|
private offGlobalPlugins;
|
|
96
99
|
private accessibility;
|
|
97
100
|
private accessibilityKey;
|
|
98
101
|
private playbackHistory;
|
|
102
|
+
private qoeTracker;
|
|
103
|
+
private analyticsKey;
|
|
99
104
|
private historyKey;
|
|
100
105
|
private qrResume;
|
|
101
106
|
private pauseAd;
|
|
@@ -174,7 +179,11 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
174
179
|
set options(value: HopePlayerOptions);
|
|
175
180
|
play(): Promise<void>;
|
|
176
181
|
pause(): void;
|
|
177
|
-
/**
|
|
182
|
+
/** Kaynak yüklenmeden önce kurulur — ilk oynatma ölçülsün. */
|
|
183
|
+
private applyAnalytics;
|
|
184
|
+
/** Oturumun deneyim (QoE) ölçümleri — `options.analytics` kapalıysa null. */
|
|
185
|
+
get qoe(): HopeQoeMetrics | null;
|
|
186
|
+
/** Şu anki oynatma yolu: `native` (MP4/WebM), `native-hls` (tarayıcının HLS'i), `hls.js` ya da `dash.js` — teşhis için. */
|
|
178
187
|
get playbackEngine(): PlaybackEngineInfo;
|
|
179
188
|
/** Paket sürümü (ör. "1.0.4"). */
|
|
180
189
|
static readonly version: string;
|
|
@@ -201,6 +210,9 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
201
210
|
/** Eklentiyi sayfadaki tüm player'lara ekler. */
|
|
202
211
|
static use<O>(plugin: HopePlugin<O> | PluginLoader, options?: O): () => void;
|
|
203
212
|
private syncPlugins;
|
|
213
|
+
private markPluginsPending;
|
|
214
|
+
private adTagTransform;
|
|
215
|
+
private doSyncPlugins;
|
|
204
216
|
/** `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. */
|
|
205
217
|
showQrResume(): void;
|
|
206
218
|
get showRemainingTime(): boolean;
|
|
@@ -236,6 +248,10 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
236
248
|
private sourceHeight;
|
|
237
249
|
private isSourceLocked;
|
|
238
250
|
/** Başlangıç kaynağı: `selected` (ya da ilk); kilitliyse serbest kaynakların en yükseği. */
|
|
251
|
+
/** `qualityLimit.max` üstü yükseklikler; hepsi üstündeyse en düşüğü kalır. */
|
|
252
|
+
private limitSources;
|
|
253
|
+
/** Veri tasarrufu açık ve tarayıcı tasarruf / yavaş bağlantı bildiriyorsa üst sınır (px). */
|
|
254
|
+
private dataSaverHeight;
|
|
239
255
|
private pickInitialSource;
|
|
240
256
|
private renderSourceQualities;
|
|
241
257
|
/** Kilitli kalite var mı (ödüllü reklam butonu yalnızca o zaman görünür) ve en yükseğinin etiketi. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgC,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC/
|
|
1
|
+
{"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgC,iBAAiB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,KAAK,GAAG,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAuC,KAAK,kBAAkB,EAA+C,MAAM,qBAAqB,CAAC;AAyBhJ,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmB5C,OAAO,KAAK,EAAE,UAAU,EAAe,oBAAoB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiCtG,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAiCpD,gHAAgH;AAChH,qBAAa,iBAAkB,SAAQ,WAAW;IAC9C,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoB;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,4CAA4C;IAC5C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,0GAA0G;IAC1G,OAAO,CAAC,UAAU,CAA8B;IAChD,2GAA2G;IAC3G,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,oFAAoF;IACpF,OAAO,CAAC,iBAAiB,CAA+C;IACxE,6CAA6C;IAC7C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,UAAU,CAA2B;IAC7C,yEAAyE;IACzE,OAAO,CAAC,YAAY,CAAS;IAC7B,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,2GAA2G;IAC3G,OAAO,CAAC,eAAe,CAAW;IAClC,4DAA4D;IAC5D,OAAO,CAAC,WAAW,CAA4B;IAC/C,oGAAoG;IACpG,OAAO,CAAC,cAAc,CAAK;IAC3B,kFAAkF;IAClF,OAAO,CAAC,kBAAkB,CAA+B;IACzD,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,UAAU,CAA2B;IAC7C,mHAAmH;IACnH,OAAO,CAAC,WAAW,CAAoF;IACvG,OAAO,CAAC,cAAc,CAA4D;IAClF,OAAO,CAAC,WAAW,CAAiE;IACpF,+FAA+F;IAC/F,oFAAoF;IACpF,OAAO,CAAC,cAAc,CAA0B;IAChD,mGAAmG;IACnG,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,WAAW,CAAK;IACxB,0FAA0F;IAC1F,OAAO,CAAC,eAAe,CAAS;IAChC,2GAA2G;IAC3G,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAM;IAC3B,mFAAmF;IACnF,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAM;IACzB,0GAA0G;IAC1G,OAAO,CAAC,UAAU,CAA2B;IAC7C,6FAA6F;IAC7F,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,cAAc,CAAsD;IAC5E,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAA+B;IACrD,kGAAkG;IAClG,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,cAAc,CAAuB;IAC7C,2FAA2F;IAC3F,OAAO,CAAC,aAAa,CAAiD;IACtE,6HAA6H;IAC7H,OAAO,CAAC,kBAAkB,CAAS;IACnC,kCAAkC;IAClC,OAAO,CAAC,YAAY,CAAuB;IAC3C,kHAAkH;IAClH,OAAO,CAAC,YAAY,CAA0C;IAC9D,qFAAqF;IACrF,OAAO,CAAC,aAAa,CAAqC;IAC1D,oEAAoE;IACpE,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,WAAW,CAA8E;IACjG;;;OAGG;IACH,OAAO,CAAC,sBAAsB,CAAkC;IAChE,OAAO,CAAC,sBAAsB,CAAS;IACvC;;;OAGG;IACH,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE;;;OAGG;IACH,OAAO,CAAC,UAAU,CAA8D;IAChF;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,WAAW,CAA8C;IACjE,qEAAqE;IACrE,OAAO,CAAC,iBAAiB,CAA+C;IACxE,gIAAgI;IAChI,OAAO,CAAC,mBAAmB,CAAS;IACpC,uFAAuF;IACvF,OAAO,CAAC,iBAAiB,CAAS;IAClC,mEAAmE;IACnE,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgD;IACrE,6HAA6H;IAC7H,OAAO,CAAC,UAAU,CAAQ;;IAqJ1B,iBAAiB,IAAI,IAAI;IAmEzB,oBAAoB,IAAI,IAAI;IA0F5B,4FAA4F;IAC5F,WAAW,IAAI,OAAO;IAItB,wBAAwB,IAAI,IAAI;IAIhC,IAAI,OAAO,IAAI,iBAAiB,CAE/B;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,iBAAiB,EAWnC;IAED,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,KAAK,IAAI,IAAI;IAIb,8DAA8D;YAChD,cAAc;IAyB5B,6EAA6E;IAC7E,IAAI,GAAG,IAAI,cAAc,GAAG,IAAI,CAE/B;IAED,2HAA2H;IAC3H,IAAI,cAAc,IAAI,kBAAkB,CAEvC;IAED,kCAAkC;IAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,SAAuB;IAE9C,oGAAoG;IACpG,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,mFAAmF;IAC7E,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAY3B;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAG9B;IAEF;;;OAGG;IACH,cAAc,IAAI,IAAI;IAItB,6HAA6H;IACvH,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAEjC;IAEF,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAY5B;IAEF,8GAA8G;IAC9G,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAEpB;IAED,yEAAyE;IACzE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,oBAAoB;IAe/E,iDAAiD;IACjD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI;YAI9D,WAAW;IAQzB,OAAO,CAAC,kBAAkB;YAMZ,cAAc;YAMd,aAAa;IA+B3B,kNAAkN;IAClN,YAAY,IAAI,IAAI;IAIpB,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAEnC;IAED,iBAAiB,IAAI,IAAI;IAIzB,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,gBAAgB;YAoBV,YAAY;IAwF1B,6FAA6F;YAC/E,uBAAuB;YAoDvB,YAAY;IAiV1B,oGAAoG;IACpG,OAAO,CAAC,eAAe;IAkCvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAYxB,2FAA2F;IAC3F,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAkBjC;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAW3B;IAEF,sGAAsG;IACtG,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAiBxC;IAEF,+GAA+G;IAC/G,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAelC;IAEF,qJAAqJ;IACrJ,OAAO,CAAC,sBAAsB;IAgD9B,6HAA6H;IAC7H,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,yBAAyB;IAUjC,yFAAyF;IACzF,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,cAAc;IAItB,4FAA4F;IAC5F,8EAA8E;IAC9E,OAAO,CAAC,YAAY;IAQpB,6FAA6F;IAC7F,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,qBAAqB;IAgB7B,sGAAsG;IACtG,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAenC,gHAAgH;IAChH,OAAO,CAAC,kBAAkB;YAmBZ,mBAAmB;IAsCjC;;;OAGG;IACH,OAAO,CAAC,UAAU;YAMJ,SAAS;IAkCvB,uHAAuH;IACvH,OAAO,CAAC,SAAS;YAsDH,eAAe;YA4Bf,gBAAgB;IAwB9B,uEAAuE;YACzD,mBAAmB;IAWjC,wIAAwI;IACxI,OAAO,CAAC,kBAAkB;IAe1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;YAwBZ,mBAAmB;IAuBjC,iGAAiG;YACnF,WAAW;IAQzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CA4CjC;IAIF,mHAAmH;IACnH,OAAO,KAAK,QAAQ,GAMnB;IAED,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAIjC;IAEF;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2C;IAC1E,OAAO,KAAK,eAAe,GAE1B;IACD,OAAO,KAAK,mBAAmB,GAG9B;IAED,OAAO,CAAC,QAAQ,CAAC,MAAM,CASrB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAUtB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAEtB;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAE3B;IAEF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAMjC;IAEF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAMhC;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CA4B9B;IAEF;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAgCxB,qGAAqG;IACrG,OAAO,CAAC,cAAc;IAMtB,uGAAuG;IACvG,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAEjC;IAEF,OAAO,CAAC,UAAU;IAIlB,+GAA+G;IAC/G,OAAO,CAAC,gBAAgB;IAYxB,iHAAiH;IACjH,OAAO,CAAC,kBAAkB;IAI1B;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,QAAQ,GAAG,SAAoB,GAAG,IAAI;IAgBrE,gGAAgG;IAChG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IA0BhC,yIAAyI;IACzI,cAAc,IAAI,IAAI;IAMtB,aAAa,IAAI,IAAI;IAMrB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAY5B;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAK7B;IAEF,uIAAuI;IACvI,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,UAAU;IAMlB,wGAAwG;YAC1F,cAAc;IAoC5B,yFAAyF;IACzF,OAAO,CAAC,cAAc;IAsDtB,8GAA8G;IAC9G,OAAO,CAAC,mBAAmB;IAU3B,wFAAwF;IACxF,OAAO,CAAC,iBAAiB;IAMzB,+GAA+G;IAC/G,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAW/B;CACL"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
var m = Object.defineProperty;
|
|
2
|
+
var w = (n, e, s) => e in n ? m(n, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : n[e] = s;
|
|
3
|
+
var h = (n, e, s) => w(n, typeof e != "symbol" ? e + "" : e, s);
|
|
4
|
+
import { drmEntries as v, KEY_SYSTEMS as y } from "./keySystems-CNzjRq6e.js";
|
|
5
|
+
const E = ['video/mp4; codecs="avc1.42E01E"', 'video/mp4; codecs="avc1.640028"', 'video/webm; codecs="vp9"'], g = ['audio/mp4; codecs="mp4a.40.2"'];
|
|
6
|
+
class L {
|
|
7
|
+
constructor(e, s, i) {
|
|
8
|
+
h(this, "setup", null);
|
|
9
|
+
h(this, "sessions", []);
|
|
10
|
+
/** Aynı initData için ikinci oturum açılmaz. */
|
|
11
|
+
h(this, "seen", /* @__PURE__ */ new Set());
|
|
12
|
+
h(this, "disposed", !1);
|
|
13
|
+
h(this, "onEncrypted", (e) => {
|
|
14
|
+
if (!e.initData) return;
|
|
15
|
+
const s = new Uint8Array(e.initData), i = `${e.initDataType}:${Array.from(s.subarray(0, 64)).join(",")}:${s.length}`;
|
|
16
|
+
this.seen.has(i) || (this.seen.add(i), this.handle(e.initDataType, s).catch((a) => this.fail(a)));
|
|
17
|
+
});
|
|
18
|
+
this.video = e, this.drm = s, this.cb = i, e.addEventListener("encrypted", this.onEncrypted);
|
|
19
|
+
}
|
|
20
|
+
destroy() {
|
|
21
|
+
this.disposed = !0, this.video.removeEventListener("encrypted", this.onEncrypted);
|
|
22
|
+
for (const e of this.sessions.splice(0)) e.close().catch(() => {
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async handle(e, s) {
|
|
26
|
+
this.setup ?? (this.setup = this.createKeys(e));
|
|
27
|
+
const i = await this.setup;
|
|
28
|
+
if (!i || this.disposed) return;
|
|
29
|
+
const a = this.video.mediaKeys;
|
|
30
|
+
if (!a) return;
|
|
31
|
+
const r = a.createSession();
|
|
32
|
+
this.sessions.push(r), r.addEventListener("message", (t) => {
|
|
33
|
+
this.license(i.name, i.lic, r, new Uint8Array(t.message), s).catch((c) => this.fail(c, i.name));
|
|
34
|
+
}), await r.generateRequest(e, s);
|
|
35
|
+
}
|
|
36
|
+
async createKeys(e) {
|
|
37
|
+
var i;
|
|
38
|
+
if (!navigator.requestMediaKeySystemAccess) throw new Error("EME is not supported");
|
|
39
|
+
const s = /\.m3u8|mpegurl/i.test(this.video.currentSrc || this.video.src);
|
|
40
|
+
for (const [a, r] of v(this.drm)) {
|
|
41
|
+
const t = a === "widevine" ? ((i = this.drm.widevine) == null ? void 0 : i.robustness) ?? "" : "", c = a === "fairplay" && s ? [{ contentType: "application/vnd.apple.mpegurl", robustness: "" }] : E.map((o) => ({ contentType: o, robustness: t })), u = {
|
|
42
|
+
initDataTypes: [e],
|
|
43
|
+
videoCapabilities: c,
|
|
44
|
+
...a === "fairplay" && s ? {} : { audioCapabilities: g.map((o) => ({ contentType: o, robustness: t })) }
|
|
45
|
+
};
|
|
46
|
+
let d;
|
|
47
|
+
try {
|
|
48
|
+
d = await navigator.requestMediaKeySystemAccess(y[a], [u]);
|
|
49
|
+
} catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const p = await d.createMediaKeys();
|
|
53
|
+
if (a === "fairplay") {
|
|
54
|
+
const o = await b(this.drm.fairplay.certificateUrl, { headers: r.headers, credentials: r.withCredentials ? "include" : "same-origin" });
|
|
55
|
+
await p.setServerCertificate(o);
|
|
56
|
+
}
|
|
57
|
+
return this.disposed ? null : (await this.video.setMediaKeys(p), { name: a, lic: r });
|
|
58
|
+
}
|
|
59
|
+
throw new Error("None of the configured DRM systems is supported by this browser");
|
|
60
|
+
}
|
|
61
|
+
async license(e, s, i, a, r) {
|
|
62
|
+
var l, f;
|
|
63
|
+
const t = e === "fairplay" ? this.drm.fairplay : void 0, c = t != null && t.prepareLicenseRequest ? await t.prepareLicenseRequest(a, r) : a, u = { ...typeof c == "string" || t != null && t.prepareLicenseRequest ? {} : { "Content-Type": "application/octet-stream" }, ...s.headers }, d = await fetch(s.licenseUrl, { method: "POST", body: c, headers: u, credentials: s.withCredentials ? "include" : "same-origin" });
|
|
64
|
+
if (!d.ok) throw new Error(`License request failed (HTTP ${d.status})`);
|
|
65
|
+
const p = await d.arrayBuffer(), o = t != null && t.parseLicenseResponse ? await t.parseLicenseResponse(p) : p;
|
|
66
|
+
this.disposed || (await i.update(o), (f = (l = this.cb).onLicense) == null || f.call(l, y[e]));
|
|
67
|
+
}
|
|
68
|
+
fail(e, s) {
|
|
69
|
+
this.disposed || this.cb.onError((e == null ? void 0 : e.message) ?? String(e), s ? y[s] : void 0);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function b(n, e) {
|
|
73
|
+
const s = await fetch(n, e);
|
|
74
|
+
if (!s.ok) throw new Error(`Certificate request failed (HTTP ${s.status})`);
|
|
75
|
+
return s.arrayBuffer();
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
L as NativeEme
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=NativeEme-CXosVcw8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeEme-CXosVcw8.js","sources":["../../src/drm/NativeEme.ts"],"sourcesContent":["// Native oynatmada (Safari HLS / FairPlay, şifreli MP4) EME: `encrypted` olayında anahtar sistemi, oturum, lisans.\nimport type { HopeDrmLicense, HopeDrmOptions } from '../types';\nimport { KEY_SYSTEMS, drmEntries, type DrmName } from './keySystems';\n\nexport interface NativeEmeCallbacks {\n onError(message: string, keySystem?: string): void;\n onLicense?(keySystem: string): void;\n}\n\nconst VIDEO_TYPES = ['video/mp4; codecs=\"avc1.42E01E\"', 'video/mp4; codecs=\"avc1.640028\"', 'video/webm; codecs=\"vp9\"'];\nconst AUDIO_TYPES = ['audio/mp4; codecs=\"mp4a.40.2\"'];\n\nexport class NativeEme {\n private setup: Promise<{ name: DrmName; lic: HopeDrmLicense } | null> | null = null;\n private readonly sessions: MediaKeySession[] = [];\n /** Aynı initData için ikinci oturum açılmaz. */\n private readonly seen = new Set<string>();\n private disposed = false;\n\n constructor(\n private readonly video: HTMLVideoElement,\n private readonly drm: HopeDrmOptions,\n private readonly cb: NativeEmeCallbacks\n ) {\n video.addEventListener('encrypted', this.onEncrypted);\n }\n\n destroy(): void {\n this.disposed = true;\n this.video.removeEventListener('encrypted', this.onEncrypted);\n for (const s of this.sessions.splice(0)) void s.close().catch(() => {});\n }\n\n private readonly onEncrypted = (e: MediaEncryptedEvent): void => {\n if (!e.initData) return;\n const initData = new Uint8Array(e.initData) as Uint8Array<ArrayBuffer>;\n const key = `${e.initDataType}:${Array.from(initData.subarray(0, 64)).join(',')}:${initData.length}`;\n if (this.seen.has(key)) return;\n this.seen.add(key);\n void this.handle(e.initDataType, initData).catch((err) => this.fail(err));\n };\n\n private async handle(initDataType: string, initData: Uint8Array): Promise<void> {\n this.setup ??= this.createKeys(initDataType);\n const chosen = await this.setup;\n if (!chosen || this.disposed) return;\n const keys = this.video.mediaKeys;\n if (!keys) return;\n const session = keys.createSession();\n this.sessions.push(session);\n session.addEventListener('message', (ev) => {\n void this.license(chosen.name, chosen.lic, session, new Uint8Array((ev as MediaKeyMessageEvent).message), initData).catch((err) => this.fail(err, chosen.name));\n });\n await session.generateRequest(initDataType, initData as Uint8Array<ArrayBuffer>);\n }\n\n private async createKeys(initDataType: string): Promise<{ name: DrmName; lic: HopeDrmLicense } | null> {\n if (!navigator.requestMediaKeySystemAccess) throw new Error('EME is not supported');\n const hlsNative = /\\.m3u8|mpegurl/i.test(this.video.currentSrc || this.video.src);\n for (const [name, lic] of drmEntries(this.drm)) {\n const robustness = name === 'widevine' ? (this.drm.widevine?.robustness ?? '') : '';\n const videoCapabilities =\n name === 'fairplay' && hlsNative ? [{ contentType: 'application/vnd.apple.mpegurl', robustness: '' }] : VIDEO_TYPES.map((contentType) => ({ contentType, robustness }));\n const config: MediaKeySystemConfiguration = {\n initDataTypes: [initDataType],\n videoCapabilities,\n ...(name === 'fairplay' && hlsNative ? {} : { audioCapabilities: AUDIO_TYPES.map((contentType) => ({ contentType, robustness })) }),\n };\n let access: MediaKeySystemAccess;\n try {\n access = await navigator.requestMediaKeySystemAccess(KEY_SYSTEMS[name], [config]);\n } catch {\n continue;\n }\n const keys = await access.createMediaKeys();\n if (name === 'fairplay') {\n const cert = await fetchBinary(this.drm.fairplay!.certificateUrl, { headers: lic.headers, credentials: lic.withCredentials ? 'include' : 'same-origin' });\n await keys.setServerCertificate(cert);\n }\n if (this.disposed) return null;\n await this.video.setMediaKeys(keys);\n return { name, lic };\n }\n throw new Error('None of the configured DRM systems is supported by this browser');\n }\n\n private async license(name: DrmName, lic: HopeDrmLicense, session: MediaKeySession, message: Uint8Array, initData: Uint8Array): Promise<void> {\n const fp = name === 'fairplay' ? this.drm.fairplay : undefined;\n const body = fp?.prepareLicenseRequest ? await fp.prepareLicenseRequest(message, initData) : message;\n const headers: Record<string, string> = { ...(typeof body === 'string' || fp?.prepareLicenseRequest ? {} : { 'Content-Type': 'application/octet-stream' }), ...lic.headers };\n const res = await fetch(lic.licenseUrl, { method: 'POST', body: body as BodyInit, headers, credentials: lic.withCredentials ? 'include' : 'same-origin' });\n if (!res.ok) throw new Error(`License request failed (HTTP ${res.status})`);\n const raw = await res.arrayBuffer();\n const out = fp?.parseLicenseResponse ? await fp.parseLicenseResponse(raw) : raw;\n if (this.disposed) return;\n await session.update(out);\n this.cb.onLicense?.(KEY_SYSTEMS[name]);\n }\n\n private fail(err: unknown, name?: DrmName): void {\n if (this.disposed) return;\n this.cb.onError((err as Error)?.message ?? String(err), name ? KEY_SYSTEMS[name] : undefined);\n }\n}\n\nasync function fetchBinary(url: string, init: RequestInit): Promise<ArrayBuffer> {\n const res = await fetch(url, init);\n if (!res.ok) throw new Error(`Certificate request failed (HTTP ${res.status})`);\n return res.arrayBuffer();\n}\n"],"names":["VIDEO_TYPES","AUDIO_TYPES","NativeEme","video","drm","cb","__publicField","initData","key","err","s","initDataType","chosen","keys","session","ev","hlsNative","name","lic","drmEntries","robustness","_a","videoCapabilities","contentType","config","access","KEY_SYSTEMS","cert","fetchBinary","message","fp","body","headers","res","raw","out","_b","url","init"],"mappings":"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"}
|
|
@@ -5,18 +5,18 @@ const D = {
|
|
|
5
5
|
protanopia: [0.567, 0.433, 0, 0.558, 0.442, 0, 0, 0.242, 0.758],
|
|
6
6
|
deuteranopia: [0.625, 0.375, 0, 0.7, 0.3, 0, 0, 0.3, 0.7],
|
|
7
7
|
tritanopia: [0.95, 0.05, 0, 0, 0.433, 0.567, 0, 0.475, 0.525]
|
|
8
|
-
},
|
|
8
|
+
}, F = {
|
|
9
9
|
protanopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],
|
|
10
10
|
deuteranopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],
|
|
11
11
|
tritanopia: [1, 0, 0.7, 0, 1, 0.7, 0, 0, 0]
|
|
12
12
|
}, L = [1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
13
|
-
function
|
|
13
|
+
function O(n, t) {
|
|
14
14
|
const e = new Array(9);
|
|
15
15
|
for (let s = 0; s < 3; s++) for (let o = 0; o < 3; o++) e[s * 3 + o] = n[s * 3] * t[o] + n[s * 3 + 1] * t[3 + o] + n[s * 3 + 2] * t[6 + o];
|
|
16
16
|
return e;
|
|
17
17
|
}
|
|
18
18
|
function I(n) {
|
|
19
|
-
const t = D[n], e = L.map((o, i) => o - t[i]), s = F
|
|
19
|
+
const t = D[n], e = L.map((o, i) => o - t[i]), s = O(F[n], e);
|
|
20
20
|
return L.map((o, i) => o + s[i]);
|
|
21
21
|
}
|
|
22
22
|
const z = /* @__PURE__ */ new Map();
|
|
@@ -28,7 +28,7 @@ function P(n) {
|
|
|
28
28
|
}
|
|
29
29
|
return t;
|
|
30
30
|
}
|
|
31
|
-
const Y = [1, 1.25, 1.5, 2, 3],
|
|
31
|
+
const Y = [1, 1.25, 1.5, 2, 3], K = [1, 1.5, 2, 3], X = ["none", "grayscale", "daylight", "night", "contrast", "protanopia", "deuteranopia", "tritanopia"], w = "hp-accessibility", d = 0.15, S = "accessibility", B = 6, T = 'button:not(.hp-center-play), a, input, [role="slider"], [part="control-bar"], .hp-chip, .hp-chip-panel, .hp-shortcuts, .hp-top-bar', A = {
|
|
32
32
|
none: "",
|
|
33
33
|
grayscale: "grayscale(1)",
|
|
34
34
|
// Aydınlık ortamda (gün ışığında ekran) seçilebilirlik: daha parlak, daha kontrastlı.
|
|
@@ -103,7 +103,7 @@ class N {
|
|
|
103
103
|
});
|
|
104
104
|
a(this, "onPointerUp", (t) => {
|
|
105
105
|
var e;
|
|
106
|
-
this.touches.delete(t.pointerId), this.pinch && this.touches.size < 2 && (this.pinch = null, this.syncQuickButtons(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:accessibility", { detail: { ...this.state, changed: "zoom" } }))), ((e = this.drag) == null ? void 0 : e.id) === t.pointerId && (Math.hypot(t.clientX - this.drag.x, t.clientY - this.drag.y) >
|
|
106
|
+
this.touches.delete(t.pointerId), this.pinch && this.touches.size < 2 && (this.pinch = null, this.syncQuickButtons(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:accessibility", { detail: { ...this.state, changed: "zoom" } }))), ((e = this.drag) == null ? void 0 : e.id) === t.pointerId && (Math.hypot(t.clientX - this.drag.x, t.clientY - this.drag.y) > B && this.swallowNextClick(), this.drag = null);
|
|
107
107
|
});
|
|
108
108
|
// ── Klavye ──
|
|
109
109
|
a(this, "onKeyDown", (t) => {
|
|
@@ -119,7 +119,7 @@ class N {
|
|
|
119
119
|
this.zoomLevels.length < 2 || (t.key === "+" || t.key === "=" ? (t.preventDefault(), this.setZoom(this.zoomLevels.find((e) => e > this.state.zoom + 1e-3) ?? this.state.zoom)) : t.key === "-" || t.key === "_" ? (t.preventDefault(), this.setZoom([...this.zoomLevels].reverse().find((e) => e < this.state.zoom - 1e-3) ?? 1)) : t.key === "0" && this.state.zoom > 1 ? (t.preventDefault(), this.setZoom(1)) : t.shiftKey && this.state.zoom > 1 && t.key.startsWith("Arrow") && (t.preventDefault(), t.key === "ArrowLeft" && (this.panX = c(this.panX - d)), t.key === "ArrowRight" && (this.panX = c(this.panX + d)), t.key === "ArrowUp" && (this.panY = c(this.panY - d)), t.key === "ArrowDown" && (this.panY = c(this.panY + d)), this.applyZoom()));
|
|
120
120
|
}
|
|
121
121
|
});
|
|
122
|
-
if (this.ctx = t, this.options = e, this.zoomLevels = e.zoom === !1 ? [] : k(Array.isArray(e.zoom) ? e.zoom : Y), this.boostLevels = e.audio === !1 ? [] : k(e.boostLevels ??
|
|
122
|
+
if (this.ctx = t, this.options = e, this.zoomLevels = e.zoom === !1 ? [] : k(Array.isArray(e.zoom) ? e.zoom : Y), this.boostLevels = e.audio === !1 ? [] : k(e.boostLevels ?? K), this.filters = e.filters === !1 ? [] : Array.isArray(e.filters) ? ["none", ...e.filters.filter((s) => s !== "none" && s in A)] : X, this.restore(), t.registerSubmenu(this.menu()), t.hostEl.addEventListener("keydown", this.onKeyDown, !0), this.zoomLevels.length > 1) {
|
|
123
123
|
const s = t.videoAreaEl;
|
|
124
124
|
s.addEventListener("pointerdown", this.onPointerDown), s.addEventListener("pointermove", this.onPointerMove), s.addEventListener("pointerup", this.onPointerUp), s.addEventListener("pointercancel", this.onPointerUp), window.addEventListener("resize", this.applyZoom);
|
|
125
125
|
}
|
|
@@ -334,7 +334,8 @@ class N {
|
|
|
334
334
|
[["←", "→", "J", "L"], t.a11yKeySeek(this.ctx.seekStep())],
|
|
335
335
|
[["↑", "↓"], t.a11yKeyVolume],
|
|
336
336
|
[["M"], t.a11yKeyMute],
|
|
337
|
-
[["F"], t.a11yKeyFullscreen]
|
|
337
|
+
[["F"], t.a11yKeyFullscreen],
|
|
338
|
+
[[",", "."], t.a11yKeyFrame]
|
|
338
339
|
];
|
|
339
340
|
this.zoomLevels.length > 1 && (h.push([["+", "−", "0"], t.a11yKeyZoom]), h.push([["Shift", "+", "←↑↓→"], t.a11yKeyPan]));
|
|
340
341
|
for (const l of ((g = (v = this.ctx).extraShortcuts) == null ? void 0 : g.call(v)) ?? []) h.push([l.keys, l.description]);
|
|
@@ -380,4 +381,4 @@ export {
|
|
|
380
381
|
N as Accessibility,
|
|
381
382
|
Z as installAccessibility
|
|
382
383
|
};
|
|
383
|
-
//# sourceMappingURL=accessibility-
|
|
384
|
+
//# sourceMappingURL=accessibility-DFx4CE0H.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility-DeUIoAda.js","sources":["../../src/plugins/accessibility/colorBlind.ts","../../src/plugins/accessibility/Accessibility.ts","../../src/plugins/accessibility/index.ts"],"sourcesContent":["// Renk körlüğü filtreleri: daltonizasyon (renk körünün ayırt edemediği renk farkını gördüğü kanallara kaydırma).\n// Simülasyon matrisi S ile: M = I + E·(I − S). E hatayı görülebilen kanallara dağıtır. Sonuç tek bir 3×3 renk\n// matrisi — CSS `filter: url(...)` ile bir SVG feColorMatrix olarak uygulanır (shadow DOM'da #id başvurusu tarayıcıdan\n// tarayıcıya değiştiği için filtre veri adresinin içinde gelir).\n\ntype M3 = [number, number, number, number, number, number, number, number, number];\ntype Kind = 'protanopia' | 'deuteranopia' | 'tritanopia';\n\n/** RGB uzayında yaygın kullanılan renk körlüğü simülasyon matrisleri. */\nconst SIMULATE: Record<Kind, M3> = {\n protanopia: [0.567, 0.433, 0, 0.558, 0.442, 0, 0, 0.242, 0.758],\n deuteranopia: [0.625, 0.375, 0, 0.7, 0.3, 0, 0, 0.3, 0.7],\n tritanopia: [0.95, 0.05, 0, 0, 0.433, 0.567, 0, 0.475, 0.525],\n};\n\n/** Kırmızı / yeşil körlüğünde hata yeşil ve maviye; mavi körlüğünde kırmızı ve yeşile kaydırılır. */\nconst SHIFT: Record<Kind, M3> = {\n protanopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],\n deuteranopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],\n tritanopia: [1, 0, 0.7, 0, 1, 0.7, 0, 0, 0],\n};\n\nconst I: M3 = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\nfunction mul(a: M3, b: M3): M3 {\n const r = new Array<number>(9) as M3;\n for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) r[i * 3 + j] = a[i * 3]! * b[j]! + a[i * 3 + 1]! * b[3 + j]! + a[i * 3 + 2]! * b[6 + j]!;\n return r;\n}\n\nexport function daltonizeMatrix(kind: Kind): M3 {\n const s = SIMULATE[kind];\n const err = I.map((v, i) => v - s[i]!) as M3;\n const shifted = mul(SHIFT[kind], err);\n return I.map((v, i) => v + shifted[i]!) as M3;\n}\n\nconst cache = new Map<Kind, string>();\n\nexport function colorBlindFilterUrl(kind: Kind): string {\n let url = cache.get(kind);\n if (!url) {\n const m = daltonizeMatrix(kind).map((n) => Math.round(n * 1000) / 1000);\n const values = [m[0], m[1], m[2], 0, 0, m[3], m[4], m[5], 0, 0, m[6], m[7], m[8], 0, 0, 0, 0, 0, 1, 0].join(' ');\n const svg = `<svg xmlns='http://www.w3.org/2000/svg'><filter id='f' color-interpolation-filters='sRGB'><feColorMatrix type='matrix' values='${values}'/></filter></svg>`;\n url = `url(\"data:image/svg+xml,${encodeURIComponent(svg)}#f\")`;\n cache.set(kind, url);\n }\n return url;\n}\n","import type { AccessibilityFilter, AccessibilityOptions, AccessibilityState } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../../controls/SettingsMenu';\nimport { colorBlindFilterUrl } from './colorBlind';\n\nexport interface AccessibilityPlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n videoAreaEl: HTMLElement;\n i18n: HopeLocaleStrings;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n /** Ayarlar butonunun sağına hızlı erişim butonu (SettingsMenu.addQuickButton). */\n addQuickButton(btn: HTMLButtonElement, getDef: () => SettingsSubmenuDef, getParents: () => SettingsSubmenuDef[]): void;\n /** Klavyeyle sarma adımı (sn) — kısayol listesinde gösterilir. */\n seekStep(): number;\n /** Eklentilerin kısayolları (listeye eklenir). */\n extraShortcuts?(): Array<{ keys: string[]; description: string }>;\n}\n\nconst DEFAULT_ZOOM = [1, 1.25, 1.5, 2, 3];\nconst DEFAULT_BOOST = [1, 1.5, 2, 3];\nconst ALL_FILTERS: AccessibilityFilter[] = ['none', 'grayscale', 'daylight', 'night', 'contrast', 'protanopia', 'deuteranopia', 'tritanopia'];\nconst STORAGE_KEY = 'hp-accessibility';\n/** Shift + ok ile bir adımda kaydırma (yakınlaştırılmış alanın oranı). */\nconst PAN_STEP = 0.15;\nconst SUBMENU_KEY = 'accessibility';\n/** Bundan fazla kayan basış sürükleme sayılır — ardından gelen tık yutulur. */\nconst DRAG_THRESHOLD_PX = 6;\n/**\n * Bunların üstünde başlayan sürükleme / iki parmak görüntüyü kaydırmaz (butonlar, ilerleme çubuğu, menüler). Ortadaki\n * oynat butonu hariç: duraklatılmışken bütün alanı kaplıyor — onun üstünde de kaydırılabilmeli.\n */\nconst CONTROL_SELECTOR = 'button:not(.hp-center-play), a, input, [role=\"slider\"], [part=\"control-bar\"], .hp-chip, .hp-chip-panel, .hp-shortcuts, .hp-top-bar';\n\n/** CSS filtreleri. Renk körlüğü filtreleri SVG renk matrisi (daltonizasyon) — bkz. colorBlind.ts. */\nconst CSS_FILTERS: Record<AccessibilityFilter, string> = {\n none: '',\n grayscale: 'grayscale(1)',\n // Aydınlık ortamda (gün ışığında ekran) seçilebilirlik: daha parlak, daha kontrastlı.\n daylight: 'brightness(1.18) contrast(1.18) saturate(1.1)',\n // Gece: sıcak ton, mavi ışık azaltılmış, biraz karartılmış.\n night: 'sepia(0.4) saturate(1.15) hue-rotate(-12deg) brightness(0.9)',\n contrast: 'contrast(1.55) saturate(1.25)',\n protanopia: '',\n deuteranopia: '',\n tritanopia: '',\n};\n\ntype QuickId = 'zoom' | 'filter' | 'mono' | 'boost' | 'largeControls';\n\n/** Hızlı erişim butonlarının ikonları (satır içi SVG — ikon fontunda karşılıkları yok). */\nconst svg = (body: string): string =>\n `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"width:var(--hp-ctrl-icon-size);height:var(--hp-ctrl-icon-size)\">${body}</svg>`;\nconst QUICK_ICONS: Record<QuickId, string> = {\n // Büyüteç + artı\n zoom: svg('<circle cx=\"11\" cy=\"11\" r=\"6.5\"/><path d=\"M20.5 20.5l-4.9-4.9M11 8.2v5.6M8.2 11h5.6\"/>'),\n // Yarısı dolu daire (renk / kontrast)\n filter: svg('<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 3.5a8.5 8.5 0 0 1 0 17z\" fill=\"currentColor\" stroke=\"none\"/>'),\n // Tek dalgalı hoparlör + \"1\"\n mono: svg('<path d=\"M4 9.5h3.5L12 5.5v13l-4.5-4H4z\"/><path d=\"M15.5 9.5a3.5 3.5 0 0 1 0 5\"/><path d=\"M19 8.5v7\"/>'),\n // Hoparlör + artı\n boost: svg('<path d=\"M3 9.5h3.5L11 5.5v13l-4.5-4H3z\"/><path d=\"M14.5 12h6M17.5 9v6\"/>'),\n // Büyüyen kare (dışa oklar)\n largeControls: svg('<path d=\"M9 4H4v5M15 4h5v5M9 20H4v-5M15 20h5v-5\"/><rect x=\"8.5\" y=\"8.5\" width=\"7\" height=\"7\" rx=\"1.2\"/>'),\n};\ninterface AudioGraph {\n ctx: AudioContext;\n gain: GainNode;\n}\n\n/**\n * Erişilebilirlik alt menüsü: yakınlaştırma (sürükle / Shift+ok / iki parmak), görüntü filtreleri, mono ses, ses\n * güçlendirme (Web Audio), büyük kontroller ve klavye kısayolları paneli (`?`). Seçimler tarayıcıda hatırlanır.\n */\nexport class Accessibility {\n private readonly state: AccessibilityState = { zoom: 1, filter: 'none', mono: false, boost: 1, largeControls: false };\n private readonly zoomLevels: number[];\n private readonly boostLevels: number[];\n private readonly filters: AccessibilityFilter[];\n /** Kaydırma — her eksende -1…1 (yakınlaştırılmış görüntünün kenarına kadar). */\n private panX = 0;\n private panY = 0;\n private graph: AudioGraph | null = null;\n private shortcutsEl: HTMLDivElement | null = null;\n private drag: { id: number; x: number; y: number; panX: number; panY: number } | null = null;\n private readonly touches = new Map<number, { x: number; y: number }>();\n private pinch: { dist: number; zoom: number } | null = null;\n private readonly quickButtons = new Map<QuickId, HTMLButtonElement>();\n\n constructor(\n private readonly ctx: AccessibilityPlayerContext,\n private readonly options: AccessibilityOptions\n ) {\n this.zoomLevels = options.zoom === false ? [] : normalizeLevels(Array.isArray(options.zoom) ? options.zoom : DEFAULT_ZOOM);\n this.boostLevels = options.audio === false ? [] : normalizeLevels(options.boostLevels ?? DEFAULT_BOOST);\n this.filters = options.filters === false ? [] : Array.isArray(options.filters) ? ['none', ...options.filters.filter((f) => f !== 'none' && f in CSS_FILTERS)] : ALL_FILTERS;\n\n this.restore();\n ctx.registerSubmenu(this.menu());\n ctx.hostEl.addEventListener('keydown', this.onKeyDown, true);\n if (this.zoomLevels.length > 1) {\n // Video alanının tamamı (oynat butonu / altyazı katmanı videonun üstünde) — kontrollerden başlayan sürükleme hariç.\n const area = ctx.videoAreaEl;\n area.addEventListener('pointerdown', this.onPointerDown);\n area.addEventListener('pointermove', this.onPointerMove);\n area.addEventListener('pointerup', this.onPointerUp);\n area.addEventListener('pointercancel', this.onPointerUp);\n window.addEventListener('resize', this.applyZoom);\n }\n ctx.videoEl.addEventListener('play', this.resumeAudio);\n this.applyAll();\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n this.ctx.unregisterSubmenu(SUBMENU_KEY);\n this.ctx.hostEl.removeEventListener('keydown', this.onKeyDown, true);\n const area = this.ctx.videoAreaEl;\n area.removeEventListener('pointerdown', this.onPointerDown);\n area.removeEventListener('pointermove', this.onPointerMove);\n area.removeEventListener('pointerup', this.onPointerUp);\n area.removeEventListener('pointercancel', this.onPointerUp);\n v.removeEventListener('play', this.resumeAudio);\n window.removeEventListener('resize', this.applyZoom);\n this.closeShortcuts();\n for (const btn of this.quickButtons.values()) btn.remove();\n this.quickButtons.clear();\n Object.assign(v.style, { transform: '', transformOrigin: '', filter: '', touchAction: '' });\n this.ctx.hostEl.removeAttribute('data-large-controls');\n this.ctx.hostEl.removeAttribute('data-zoomed');\n // Web Audio grafiği geri alınamaz (createMediaElementSource kalıcı) — nötr değerlere çekilir.\n if (this.graph) {\n this.state.mono = false;\n this.state.boost = 1;\n this.applyAudio();\n }\n }\n\n /** Dil değişince alt menü yeni etiketlerle yeniden kaydedilir. */\n refreshLabels(): void {\n this.ctx.registerSubmenu(this.menu());\n this.syncQuickButtons();\n if (this.shortcutsEl) {\n this.closeShortcuts();\n this.openShortcuts();\n }\n }\n\n // ── Menü ──\n\n private menu(): SettingsSubmenuDef {\n const t = this.ctx.i18n;\n return {\n key: SUBMENU_KEY,\n title: t.a11yMenu,\n getValueLabel: () => '',\n getItems: () => {\n const items: SettingsSubmenuItem[] = [];\n const sub = (label: string, value: string, children: () => SettingsSubmenuDef): SettingsSubmenuItem => ({ label, value, active: false, onSelect: () => {}, children });\n if (this.zoomLevels.length > 1) items.push(sub(t.a11yZoom, pct(this.state.zoom), () => this.zoomDef()));\n if (this.filters.length > 1) items.push(sub(t.a11yFilter, this.filterLabel(this.state.filter), () => this.filterDef()));\n if (this.boostLevels.length) {\n const ok = this.audioAllowed();\n items.push({\n label: t.a11yMono,\n value: ok ? (this.state.mono ? t.a11yOn : t.a11yOff) : t.a11yUnavailable,\n active: this.state.mono,\n keepOpen: true,\n onSelect: () => {\n if (ok) this.set('mono', !this.state.mono);\n },\n });\n if (this.boostLevels.length > 1) items.push(sub(t.a11yBoost, ok ? pct(this.state.boost) : t.a11yUnavailable, () => this.boostDef()));\n }\n if (this.options.largeControls !== false)\n items.push({\n label: t.a11yLargeControls,\n value: this.state.largeControls ? t.a11yOn : t.a11yOff,\n active: this.state.largeControls,\n keepOpen: true,\n onSelect: () => this.set('largeControls', !this.state.largeControls),\n });\n if (this.options.shortcuts !== false)\n items.push({ label: t.a11yShortcuts, value: '?', active: false, onSelect: () => queueMicrotask(() => this.openShortcuts()) });\n return items;\n },\n };\n }\n\n // Özelliklerin kendi alt menüleri — hem Erişilebilirlik menüsünden hem hızlı erişim butonlarından açılır.\n\n private zoomDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-zoom',\n title: this.ctx.i18n.a11yZoom,\n getValueLabel: () => '',\n getItems: () => this.zoomLevels.map((z) => ({ label: pct(z), active: Math.abs(this.state.zoom - z) < 0.001, onSelect: () => this.setZoom(z) })),\n };\n }\n\n private filterDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-filter',\n title: this.ctx.i18n.a11yFilter,\n getValueLabel: () => '',\n getItems: () => this.filters.map((f) => ({ label: this.filterLabel(f), active: this.state.filter === f, onSelect: () => this.set('filter', f) })),\n };\n }\n\n private boostDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-boost',\n title: this.ctx.i18n.a11yBoost,\n getValueLabel: () => '',\n getItems: () => (this.audioAllowed() ? this.boostLevels.map((b) => ({ label: pct(b), active: this.state.boost === b, onSelect: () => this.set('boost', b) })) : []),\n };\n }\n\n /** Aç / kapa özellikleri (mono, büyük kontroller) için hızlı butonun açtığı iki satırlık menü. */\n private toggleDef(key: 'mono' | 'largeControls', title: string): SettingsSubmenuDef {\n const t = this.ctx.i18n;\n return {\n key: `a11y-${key}`,\n title,\n getValueLabel: () => '',\n getItems: () => [\n { label: t.a11yOn, active: this.state[key], onSelect: () => this.set(key, true) },\n { label: t.a11yOff, active: !this.state[key], onSelect: () => this.set(key, false) },\n ],\n };\n }\n\n // ── Hızlı erişim butonları ──\n\n /**\n * Açık olan her özelliğin ayarlar butonunun sağında kendi butonu olur; basınca doğrudan o özelliğin ayarları açılır\n * (yakınlaştırma seviyeleri, filtre listesi…). Özellik kapanınca buton kalkar. \"Geri\" Erişilebilirlik menüsüne döner.\n */\n private syncQuickButtons(): void {\n const t = this.ctx.i18n;\n const s = this.state;\n const specs: { id: QuickId; on: boolean; label: string; def: () => SettingsSubmenuDef }[] = [\n { id: 'zoom', on: s.zoom > 1.001, label: `${t.a11yZoom}: ${pct(s.zoom)}`, def: () => this.zoomDef() },\n { id: 'filter', on: s.filter !== 'none', label: `${t.a11yFilter}: ${this.filterLabel(s.filter)}`, def: () => this.filterDef() },\n { id: 'mono', on: s.mono, label: `${t.a11yMono}: ${t.a11yOn}`, def: () => this.toggleDef('mono', t.a11yMono) },\n { id: 'boost', on: s.boost !== 1, label: `${t.a11yBoost}: ${pct(s.boost)}`, def: () => this.boostDef() },\n { id: 'largeControls', on: s.largeControls, label: `${t.a11yLargeControls}: ${t.a11yOn}`, def: () => this.toggleDef('largeControls', t.a11yLargeControls) },\n ];\n for (const spec of specs) {\n let btn = this.quickButtons.get(spec.id);\n if (!spec.on) {\n btn?.remove();\n this.quickButtons.delete(spec.id);\n continue;\n }\n if (!btn) {\n btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-a11y-quick hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer';\n btn.setAttribute('part', `a11y-quick a11y-quick-${spec.id}`);\n btn.setAttribute('data-a11y', spec.id);\n btn.innerHTML = QUICK_ICONS[spec.id];\n this.ctx.addQuickButton(btn, spec.def, () => [this.menu()]);\n this.quickButtons.set(spec.id, btn);\n }\n // Tooltip ve ekran okuyucu: özelliğin adı + değeri (\"Yakınlaştırma: 200%\").\n btn.setAttribute('aria-label', spec.label);\n }\n }\n private filterLabel(f: AccessibilityFilter): string {\n const t = this.ctx.i18n;\n const labels: Record<AccessibilityFilter, string> = {\n none: t.a11yFilterNone,\n grayscale: t.a11yFilterGrayscale,\n daylight: t.a11yFilterDaylight,\n night: t.a11yFilterNight,\n contrast: t.a11yFilterContrast,\n protanopia: t.a11yFilterProtanopia,\n deuteranopia: t.a11yFilterDeuteranopia,\n tritanopia: t.a11yFilterTritanopia,\n };\n return labels[f];\n }\n\n // ── Durum ──\n\n private set<K extends keyof AccessibilityState>(key: K, value: AccessibilityState[K]): void {\n if (this.state[key] === value) return;\n this.state[key] = value;\n this.applyAll();\n this.save();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:accessibility', { detail: { ...this.state, changed: key } }));\n }\n\n private setZoom(z: number): void {\n if (z <= 1) {\n this.panX = 0;\n this.panY = 0;\n }\n this.set('zoom', z);\n }\n\n private applyAll(): void {\n this.applyZoom();\n this.applyFilter();\n this.applyAudio();\n this.ctx.hostEl.toggleAttribute('data-large-controls', this.state.largeControls);\n this.syncQuickButtons();\n }\n\n private readonly applyZoom = (): void => {\n const v = this.ctx.videoEl;\n const z = this.state.zoom;\n this.ctx.hostEl.toggleAttribute('data-zoomed', z > 1);\n if (this.zoomLevels.length > 1) {\n // Yakınlaştırılmamışken sayfa kaydırması serbest, tarayıcının kendi iki parmak büyütmesi kapalı (bizimki çalışsın);\n // yakınlaştırılmışken sürükleme görüntüyü kaydırır.\n v.style.touchAction = z > 1 ? 'none' : 'pan-x pan-y';\n }\n if (z <= 1) {\n v.style.transform = '';\n return;\n }\n // Kenar dışına kaydırılamaz: en fazla (z-1)/2 genişlik kadar.\n const maxX = ((z - 1) * v.clientWidth) / 2;\n const maxY = ((z - 1) * v.clientHeight) / 2;\n v.style.transformOrigin = 'center center';\n v.style.transform = `translate(${(-this.panX * maxX).toFixed(1)}px, ${(-this.panY * maxY).toFixed(1)}px) scale(${z})`;\n };\n\n private applyFilter(): void {\n const f = this.state.filter;\n this.ctx.videoEl.style.filter = f === 'protanopia' || f === 'deuteranopia' || f === 'tritanopia' ? colorBlindFilterUrl(f) : CSS_FILTERS[f];\n }\n\n // ── Ses (Web Audio) ──\n\n /**\n * Web Audio kaynağı başka alan adındaysa ve CORS'la yüklenmediyse tarayıcı sesi sıfırlar — o zaman kapalı kalır.\n * blob: (hls.js / MSE; hls.js zaten CORS'la indirir) ve aynı origin güvenli.\n */\n private audioAllowed(): boolean {\n if (typeof AudioContext === 'undefined') return false;\n const src = this.ctx.videoEl.currentSrc;\n if (!src || src.startsWith('blob:') || src.startsWith('data:')) return true;\n try {\n if (new URL(src, location.href).origin === location.origin) return true;\n } catch {\n return false;\n }\n return this.ctx.videoEl.crossOrigin !== null;\n }\n\n private applyAudio(): void {\n const needed = this.state.mono || this.state.boost !== 1;\n if (!needed && !this.graph) return;\n if (!this.graph) {\n if (!this.audioAllowed()) return;\n try {\n const ctx = new AudioContext();\n const source = ctx.createMediaElementSource(this.ctx.videoEl);\n const gain = ctx.createGain();\n source.connect(gain).connect(ctx.destination);\n this.graph = { ctx, gain };\n } catch {\n return;\n }\n }\n const { gain, ctx } = this.graph;\n gain.gain.value = this.state.boost;\n // Mono: kanalları 'speakers' kuralıyla tek kanala indir ((L+R)/2); çıkış iki hoparlöre aynı gider.\n gain.channelCountMode = this.state.mono ? 'explicit' : 'max';\n gain.channelCount = this.state.mono ? 1 : 2;\n gain.channelInterpretation = 'speakers';\n if (ctx.state === 'suspended') void ctx.resume().catch(() => {});\n }\n\n private readonly resumeAudio = (): void => {\n if (this.graph?.ctx.state === 'suspended') void this.graph.ctx.resume().catch(() => {});\n };\n\n // ── Kalıcılık ──\n\n private restore(): void {\n if (this.options.remember === false) return;\n try {\n const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) ?? 'null') as Partial<AccessibilityState> | null;\n if (!saved) return;\n if (saved.filter && this.filters.includes(saved.filter)) this.state.filter = saved.filter;\n if (typeof saved.mono === 'boolean' && this.boostLevels.length) this.state.mono = saved.mono;\n if (typeof saved.boost === 'number' && this.boostLevels.includes(saved.boost)) this.state.boost = saved.boost;\n if (typeof saved.largeControls === 'boolean' && this.options.largeControls !== false) this.state.largeControls = saved.largeControls;\n // Yakınlaştırma bilerek hatırlanmaz — bir sonraki videoda kadrajı kaçırmasın.\n } catch {\n /* gizli sekme / bozuk kayıt — varsayılanlar */\n }\n }\n\n private save(): void {\n if (this.options.remember === false) return;\n try {\n const { filter, mono, boost, largeControls } = this.state;\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ filter, mono, boost, largeControls }));\n } catch {\n /* depolama yok — yalnızca bu oturum */\n }\n }\n\n // ── Yakınlaştırma: sürükle, iki parmak ──\n\n private readonly onPointerDown = (e: PointerEvent): void => {\n const target = e.composedPath()[0];\n if (target instanceof Element && target.closest(CONTROL_SELECTOR)) return;\n if (e.pointerType === 'touch') {\n this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (this.touches.size === 2) {\n this.pinch = { dist: this.touchDistance(), zoom: this.state.zoom };\n this.drag = null;\n return;\n }\n }\n if (this.state.zoom <= 1 || (e.pointerType === 'mouse' && e.button !== 0)) return;\n this.drag = { id: e.pointerId, x: e.clientX, y: e.clientY, panX: this.panX, panY: this.panY };\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n if (e.pointerType === 'touch' && this.touches.has(e.pointerId)) this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (this.pinch && this.touches.size === 2) {\n const max = this.zoomLevels[this.zoomLevels.length - 1]!;\n const z = Math.min(max, Math.max(1, (this.pinch.zoom * this.touchDistance()) / this.pinch.dist));\n this.state.zoom = Math.round(z * 100) / 100;\n if (this.state.zoom <= 1) this.panX = this.panY = 0;\n this.applyZoom();\n return;\n }\n if (!this.drag || this.drag.id !== e.pointerId) return;\n const v = this.ctx.videoEl;\n const z = this.state.zoom;\n const maxX = ((z - 1) * v.clientWidth) / 2 || 1;\n const maxY = ((z - 1) * v.clientHeight) / 2 || 1;\n // Görüntü parmağı / imleci takip eder (sağa sürükle → görüntü sağa → sol taraf görünür).\n this.panX = clamp(this.drag.panX - (e.clientX - this.drag.x) / maxX);\n this.panY = clamp(this.drag.panY - (e.clientY - this.drag.y) / maxY);\n this.applyZoom();\n };\n\n private readonly onPointerUp = (e: PointerEvent): void => {\n this.touches.delete(e.pointerId);\n if (this.pinch && this.touches.size < 2) {\n this.pinch = null;\n this.syncQuickButtons();\n // İki parmakla serbest büyütme bitince olay / kayıt bir kez.\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:accessibility', { detail: { ...this.state, changed: 'zoom' } }));\n }\n if (this.drag?.id === e.pointerId) {\n // Gerçekten sürüklendiyse ardından gelen tık oynat / duraklat sayılmasın (oynat butonu bütün alanı kaplayabiliyor).\n if (Math.hypot(e.clientX - this.drag.x, e.clientY - this.drag.y) > DRAG_THRESHOLD_PX) this.swallowNextClick();\n this.drag = null;\n }\n };\n\n private swallowNextClick(): void {\n const area = this.ctx.videoAreaEl;\n const swallow = (ev: Event): void => {\n ev.stopPropagation();\n ev.preventDefault();\n };\n area.addEventListener('click', swallow, { capture: true, once: true });\n // Tık hiç gelmezse (ör. dokunmatik) sonraki gerçek tık yutulmasın.\n setTimeout(() => area.removeEventListener('click', swallow, { capture: true }), 400);\n }\n\n private touchDistance(): number {\n const [a, b] = [...this.touches.values()];\n return a && b ? Math.hypot(a.x - b.x, a.y - b.y) || 1 : 1;\n }\n\n // ── Klavye ──\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if (e.defaultPrevented || e.ctrlKey || e.metaKey || e.altKey) return;\n if (this.shortcutsEl && e.key === 'Escape') {\n e.preventDefault();\n this.closeShortcuts();\n return;\n }\n if (e.key === '?' && this.options.shortcuts !== false) {\n e.preventDefault();\n if (this.shortcutsEl) this.closeShortcuts();\n else this.openShortcuts();\n return;\n }\n if (this.zoomLevels.length < 2) return;\n if (e.key === '+' || e.key === '=') {\n e.preventDefault();\n this.setZoom(this.zoomLevels.find((z) => z > this.state.zoom + 0.001) ?? this.state.zoom);\n } else if (e.key === '-' || e.key === '_') {\n e.preventDefault();\n this.setZoom([...this.zoomLevels].reverse().find((z) => z < this.state.zoom - 0.001) ?? 1);\n } else if (e.key === '0' && this.state.zoom > 1) {\n e.preventDefault();\n this.setZoom(1);\n } else if (e.shiftKey && this.state.zoom > 1 && e.key.startsWith('Arrow')) {\n // Shift + ok: yakınlaştırılmış görüntüde gezin (oklar tek başına sarma / ses olarak kalır).\n e.preventDefault();\n if (e.key === 'ArrowLeft') this.panX = clamp(this.panX - PAN_STEP);\n if (e.key === 'ArrowRight') this.panX = clamp(this.panX + PAN_STEP);\n if (e.key === 'ArrowUp') this.panY = clamp(this.panY - PAN_STEP);\n if (e.key === 'ArrowDown') this.panY = clamp(this.panY + PAN_STEP);\n this.applyZoom();\n }\n };\n\n // ── Kısayol paneli ──\n\n private openShortcuts(): void {\n if (this.shortcutsEl) return;\n const t = this.ctx.i18n;\n const el = document.createElement('div');\n el.className = 'hp-shortcuts';\n el.setAttribute('part', 'shortcuts');\n el.setAttribute('role', 'dialog');\n el.setAttribute('aria-modal', 'true');\n el.setAttribute('aria-labelledby', 'hp-shortcuts-title');\n\n const box = document.createElement('div');\n box.className = 'hp-shortcuts-box';\n const head = document.createElement('div');\n head.className = 'hp-shortcuts-head';\n const title = document.createElement('h2');\n title.id = 'hp-shortcuts-title';\n title.textContent = t.a11yShortcuts;\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-shortcuts-close';\n close.setAttribute('aria-label', t.a11yClose);\n close.textContent = '✕';\n close.addEventListener('click', () => this.closeShortcuts());\n head.append(title, close);\n\n const rows: [string[], string][] = [\n [['Space', 'K'], t.a11yKeyPlay],\n [['←', '→', 'J', 'L'], t.a11yKeySeek(this.ctx.seekStep())],\n [['↑', '↓'], t.a11yKeyVolume],\n [['M'], t.a11yKeyMute],\n [['F'], t.a11yKeyFullscreen],\n ];\n if (this.zoomLevels.length > 1) {\n rows.push([['+', '−', '0'], t.a11yKeyZoom]);\n rows.push([['Shift', '+', '←↑↓→'], t.a11yKeyPan]);\n }\n for (const s of this.ctx.extraShortcuts?.() ?? []) rows.push([s.keys, s.description]);\n rows.push([['?'], t.a11yKeyShortcuts]);\n\n const list = document.createElement('dl');\n list.className = 'hp-shortcuts-list';\n for (const [keys, desc] of rows) {\n const dt = document.createElement('dt');\n for (const k of keys) {\n if (k === '+' && keys[0] === 'Shift') {\n dt.append(' + ');\n continue;\n }\n const kbd = document.createElement('kbd');\n kbd.textContent = k;\n dt.appendChild(kbd);\n }\n const dd = document.createElement('dd');\n dd.textContent = desc;\n list.append(dt, dd);\n }\n box.append(head, list);\n el.appendChild(box);\n // Arka plana tıklama kapatır; panelin içindeki tıklama oynat/duraklat'a geçmez.\n el.addEventListener('click', (e) => {\n e.stopPropagation();\n if (e.target === el) this.closeShortcuts();\n });\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n // Odak paneli terk etmesin (Tab tek butonda kalır).\n el.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n close.focus();\n }\n });\n this.ctx.videoAreaEl.appendChild(el);\n this.shortcutsEl = el;\n close.focus({ preventScroll: true });\n }\n\n private closeShortcuts(): void {\n if (!this.shortcutsEl) return;\n const hadFocus = this.shortcutsEl.contains((this.ctx.hostEl.shadowRoot ?? document).activeElement);\n this.shortcutsEl.remove();\n this.shortcutsEl = null;\n if (hadFocus) this.ctx.hostEl.focus({ preventScroll: true });\n }\n}\n\nfunction normalizeLevels(levels: number[]): number[] {\n const valid = levels.filter((n) => Number.isFinite(n) && n >= 1 && n <= 8);\n return [...new Set([1, ...valid])].sort((a, b) => a - b);\n}\n\nconst clamp = (n: number): number => Math.min(1, Math.max(-1, n));\nconst pct = (n: number): string => `${Math.round(n * 100)}%`;\n","import { Accessibility, type AccessibilityPlayerContext } from './Accessibility';\nimport type { AccessibilityOptions } from '../../types';\n\nexport function installAccessibility(ctx: AccessibilityPlayerContext, options: AccessibilityOptions): Accessibility {\n return new Accessibility(ctx, options);\n}\n\nexport { Accessibility };\nexport type { AccessibilityPlayerContext };\n"],"names":["SIMULATE","SHIFT","I","mul","a","b","r","i","j","daltonizeMatrix","kind","s","err","v","shifted","cache","colorBlindFilterUrl","url","m","n","svg","DEFAULT_ZOOM","DEFAULT_BOOST","ALL_FILTERS","STORAGE_KEY","PAN_STEP","SUBMENU_KEY","DRAG_THRESHOLD_PX","CONTROL_SELECTOR","CSS_FILTERS","body","QUICK_ICONS","Accessibility","ctx","options","__publicField","z","maxX","maxY","_a","e","target","max","clamp","normalizeLevels","f","area","btn","items","sub","label","value","children","pct","ok","key","title","t","specs","spec","src","source","gain","saved","filter","mono","boost","largeControls","swallow","ev","_b","el","box","head","close","rows","list","keys","desc","dt","k","kbd","dd","hadFocus","levels","valid","installAccessibility"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"accessibility-DFx4CE0H.js","sources":["../../src/plugins/accessibility/colorBlind.ts","../../src/plugins/accessibility/Accessibility.ts","../../src/plugins/accessibility/index.ts"],"sourcesContent":["// Renk körlüğü filtreleri: daltonizasyon (renk körünün ayırt edemediği renk farkını gördüğü kanallara kaydırma).\n// Simülasyon matrisi S ile: M = I + E·(I − S). E hatayı görülebilen kanallara dağıtır. Sonuç tek bir 3×3 renk\n// matrisi — CSS `filter: url(...)` ile bir SVG feColorMatrix olarak uygulanır (shadow DOM'da #id başvurusu tarayıcıdan\n// tarayıcıya değiştiği için filtre veri adresinin içinde gelir).\n\ntype M3 = [number, number, number, number, number, number, number, number, number];\ntype Kind = 'protanopia' | 'deuteranopia' | 'tritanopia';\n\n/** RGB uzayında yaygın kullanılan renk körlüğü simülasyon matrisleri. */\nconst SIMULATE: Record<Kind, M3> = {\n protanopia: [0.567, 0.433, 0, 0.558, 0.442, 0, 0, 0.242, 0.758],\n deuteranopia: [0.625, 0.375, 0, 0.7, 0.3, 0, 0, 0.3, 0.7],\n tritanopia: [0.95, 0.05, 0, 0, 0.433, 0.567, 0, 0.475, 0.525],\n};\n\n/** Kırmızı / yeşil körlüğünde hata yeşil ve maviye; mavi körlüğünde kırmızı ve yeşile kaydırılır. */\nconst SHIFT: Record<Kind, M3> = {\n protanopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],\n deuteranopia: [0, 0, 0, 0.7, 1, 0, 0.7, 0, 1],\n tritanopia: [1, 0, 0.7, 0, 1, 0.7, 0, 0, 0],\n};\n\nconst I: M3 = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\nfunction mul(a: M3, b: M3): M3 {\n const r = new Array<number>(9) as M3;\n for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) r[i * 3 + j] = a[i * 3]! * b[j]! + a[i * 3 + 1]! * b[3 + j]! + a[i * 3 + 2]! * b[6 + j]!;\n return r;\n}\n\nexport function daltonizeMatrix(kind: Kind): M3 {\n const s = SIMULATE[kind];\n const err = I.map((v, i) => v - s[i]!) as M3;\n const shifted = mul(SHIFT[kind], err);\n return I.map((v, i) => v + shifted[i]!) as M3;\n}\n\nconst cache = new Map<Kind, string>();\n\nexport function colorBlindFilterUrl(kind: Kind): string {\n let url = cache.get(kind);\n if (!url) {\n const m = daltonizeMatrix(kind).map((n) => Math.round(n * 1000) / 1000);\n const values = [m[0], m[1], m[2], 0, 0, m[3], m[4], m[5], 0, 0, m[6], m[7], m[8], 0, 0, 0, 0, 0, 1, 0].join(' ');\n const svg = `<svg xmlns='http://www.w3.org/2000/svg'><filter id='f' color-interpolation-filters='sRGB'><feColorMatrix type='matrix' values='${values}'/></filter></svg>`;\n url = `url(\"data:image/svg+xml,${encodeURIComponent(svg)}#f\")`;\n cache.set(kind, url);\n }\n return url;\n}\n","import type { AccessibilityFilter, AccessibilityOptions, AccessibilityState } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../../controls/SettingsMenu';\nimport { colorBlindFilterUrl } from './colorBlind';\n\nexport interface AccessibilityPlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n videoAreaEl: HTMLElement;\n i18n: HopeLocaleStrings;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n /** Ayarlar butonunun sağına hızlı erişim butonu (SettingsMenu.addQuickButton). */\n addQuickButton(btn: HTMLButtonElement, getDef: () => SettingsSubmenuDef, getParents: () => SettingsSubmenuDef[]): void;\n /** Klavyeyle sarma adımı (sn) — kısayol listesinde gösterilir. */\n seekStep(): number;\n /** Eklentilerin kısayolları (listeye eklenir). */\n extraShortcuts?(): Array<{ keys: string[]; description: string }>;\n}\n\nconst DEFAULT_ZOOM = [1, 1.25, 1.5, 2, 3];\nconst DEFAULT_BOOST = [1, 1.5, 2, 3];\nconst ALL_FILTERS: AccessibilityFilter[] = ['none', 'grayscale', 'daylight', 'night', 'contrast', 'protanopia', 'deuteranopia', 'tritanopia'];\nconst STORAGE_KEY = 'hp-accessibility';\n/** Shift + ok ile bir adımda kaydırma (yakınlaştırılmış alanın oranı). */\nconst PAN_STEP = 0.15;\nconst SUBMENU_KEY = 'accessibility';\n/** Bundan fazla kayan basış sürükleme sayılır — ardından gelen tık yutulur. */\nconst DRAG_THRESHOLD_PX = 6;\n/**\n * Bunların üstünde başlayan sürükleme / iki parmak görüntüyü kaydırmaz (butonlar, ilerleme çubuğu, menüler). Ortadaki\n * oynat butonu hariç: duraklatılmışken bütün alanı kaplıyor — onun üstünde de kaydırılabilmeli.\n */\nconst CONTROL_SELECTOR = 'button:not(.hp-center-play), a, input, [role=\"slider\"], [part=\"control-bar\"], .hp-chip, .hp-chip-panel, .hp-shortcuts, .hp-top-bar';\n\n/** CSS filtreleri. Renk körlüğü filtreleri SVG renk matrisi (daltonizasyon) — bkz. colorBlind.ts. */\nconst CSS_FILTERS: Record<AccessibilityFilter, string> = {\n none: '',\n grayscale: 'grayscale(1)',\n // Aydınlık ortamda (gün ışığında ekran) seçilebilirlik: daha parlak, daha kontrastlı.\n daylight: 'brightness(1.18) contrast(1.18) saturate(1.1)',\n // Gece: sıcak ton, mavi ışık azaltılmış, biraz karartılmış.\n night: 'sepia(0.4) saturate(1.15) hue-rotate(-12deg) brightness(0.9)',\n contrast: 'contrast(1.55) saturate(1.25)',\n protanopia: '',\n deuteranopia: '',\n tritanopia: '',\n};\n\ntype QuickId = 'zoom' | 'filter' | 'mono' | 'boost' | 'largeControls';\n\n/** Hızlı erişim butonlarının ikonları (satır içi SVG — ikon fontunda karşılıkları yok). */\nconst svg = (body: string): string =>\n `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"width:var(--hp-ctrl-icon-size);height:var(--hp-ctrl-icon-size)\">${body}</svg>`;\nconst QUICK_ICONS: Record<QuickId, string> = {\n // Büyüteç + artı\n zoom: svg('<circle cx=\"11\" cy=\"11\" r=\"6.5\"/><path d=\"M20.5 20.5l-4.9-4.9M11 8.2v5.6M8.2 11h5.6\"/>'),\n // Yarısı dolu daire (renk / kontrast)\n filter: svg('<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 3.5a8.5 8.5 0 0 1 0 17z\" fill=\"currentColor\" stroke=\"none\"/>'),\n // Tek dalgalı hoparlör + \"1\"\n mono: svg('<path d=\"M4 9.5h3.5L12 5.5v13l-4.5-4H4z\"/><path d=\"M15.5 9.5a3.5 3.5 0 0 1 0 5\"/><path d=\"M19 8.5v7\"/>'),\n // Hoparlör + artı\n boost: svg('<path d=\"M3 9.5h3.5L11 5.5v13l-4.5-4H3z\"/><path d=\"M14.5 12h6M17.5 9v6\"/>'),\n // Büyüyen kare (dışa oklar)\n largeControls: svg('<path d=\"M9 4H4v5M15 4h5v5M9 20H4v-5M15 20h5v-5\"/><rect x=\"8.5\" y=\"8.5\" width=\"7\" height=\"7\" rx=\"1.2\"/>'),\n};\ninterface AudioGraph {\n ctx: AudioContext;\n gain: GainNode;\n}\n\n/**\n * Erişilebilirlik alt menüsü: yakınlaştırma (sürükle / Shift+ok / iki parmak), görüntü filtreleri, mono ses, ses\n * güçlendirme (Web Audio), büyük kontroller ve klavye kısayolları paneli (`?`). Seçimler tarayıcıda hatırlanır.\n */\nexport class Accessibility {\n private readonly state: AccessibilityState = { zoom: 1, filter: 'none', mono: false, boost: 1, largeControls: false };\n private readonly zoomLevels: number[];\n private readonly boostLevels: number[];\n private readonly filters: AccessibilityFilter[];\n /** Kaydırma — her eksende -1…1 (yakınlaştırılmış görüntünün kenarına kadar). */\n private panX = 0;\n private panY = 0;\n private graph: AudioGraph | null = null;\n private shortcutsEl: HTMLDivElement | null = null;\n private drag: { id: number; x: number; y: number; panX: number; panY: number } | null = null;\n private readonly touches = new Map<number, { x: number; y: number }>();\n private pinch: { dist: number; zoom: number } | null = null;\n private readonly quickButtons = new Map<QuickId, HTMLButtonElement>();\n\n constructor(\n private readonly ctx: AccessibilityPlayerContext,\n private readonly options: AccessibilityOptions\n ) {\n this.zoomLevels = options.zoom === false ? [] : normalizeLevels(Array.isArray(options.zoom) ? options.zoom : DEFAULT_ZOOM);\n this.boostLevels = options.audio === false ? [] : normalizeLevels(options.boostLevels ?? DEFAULT_BOOST);\n this.filters = options.filters === false ? [] : Array.isArray(options.filters) ? ['none', ...options.filters.filter((f) => f !== 'none' && f in CSS_FILTERS)] : ALL_FILTERS;\n\n this.restore();\n ctx.registerSubmenu(this.menu());\n ctx.hostEl.addEventListener('keydown', this.onKeyDown, true);\n if (this.zoomLevels.length > 1) {\n // Video alanının tamamı (oynat butonu / altyazı katmanı videonun üstünde) — kontrollerden başlayan sürükleme hariç.\n const area = ctx.videoAreaEl;\n area.addEventListener('pointerdown', this.onPointerDown);\n area.addEventListener('pointermove', this.onPointerMove);\n area.addEventListener('pointerup', this.onPointerUp);\n area.addEventListener('pointercancel', this.onPointerUp);\n window.addEventListener('resize', this.applyZoom);\n }\n ctx.videoEl.addEventListener('play', this.resumeAudio);\n this.applyAll();\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n this.ctx.unregisterSubmenu(SUBMENU_KEY);\n this.ctx.hostEl.removeEventListener('keydown', this.onKeyDown, true);\n const area = this.ctx.videoAreaEl;\n area.removeEventListener('pointerdown', this.onPointerDown);\n area.removeEventListener('pointermove', this.onPointerMove);\n area.removeEventListener('pointerup', this.onPointerUp);\n area.removeEventListener('pointercancel', this.onPointerUp);\n v.removeEventListener('play', this.resumeAudio);\n window.removeEventListener('resize', this.applyZoom);\n this.closeShortcuts();\n for (const btn of this.quickButtons.values()) btn.remove();\n this.quickButtons.clear();\n Object.assign(v.style, { transform: '', transformOrigin: '', filter: '', touchAction: '' });\n this.ctx.hostEl.removeAttribute('data-large-controls');\n this.ctx.hostEl.removeAttribute('data-zoomed');\n // Web Audio grafiği geri alınamaz (createMediaElementSource kalıcı) — nötr değerlere çekilir.\n if (this.graph) {\n this.state.mono = false;\n this.state.boost = 1;\n this.applyAudio();\n }\n }\n\n /** Dil değişince alt menü yeni etiketlerle yeniden kaydedilir. */\n refreshLabels(): void {\n this.ctx.registerSubmenu(this.menu());\n this.syncQuickButtons();\n if (this.shortcutsEl) {\n this.closeShortcuts();\n this.openShortcuts();\n }\n }\n\n // ── Menü ──\n\n private menu(): SettingsSubmenuDef {\n const t = this.ctx.i18n;\n return {\n key: SUBMENU_KEY,\n title: t.a11yMenu,\n getValueLabel: () => '',\n getItems: () => {\n const items: SettingsSubmenuItem[] = [];\n const sub = (label: string, value: string, children: () => SettingsSubmenuDef): SettingsSubmenuItem => ({ label, value, active: false, onSelect: () => {}, children });\n if (this.zoomLevels.length > 1) items.push(sub(t.a11yZoom, pct(this.state.zoom), () => this.zoomDef()));\n if (this.filters.length > 1) items.push(sub(t.a11yFilter, this.filterLabel(this.state.filter), () => this.filterDef()));\n if (this.boostLevels.length) {\n const ok = this.audioAllowed();\n items.push({\n label: t.a11yMono,\n value: ok ? (this.state.mono ? t.a11yOn : t.a11yOff) : t.a11yUnavailable,\n active: this.state.mono,\n keepOpen: true,\n onSelect: () => {\n if (ok) this.set('mono', !this.state.mono);\n },\n });\n if (this.boostLevels.length > 1) items.push(sub(t.a11yBoost, ok ? pct(this.state.boost) : t.a11yUnavailable, () => this.boostDef()));\n }\n if (this.options.largeControls !== false)\n items.push({\n label: t.a11yLargeControls,\n value: this.state.largeControls ? t.a11yOn : t.a11yOff,\n active: this.state.largeControls,\n keepOpen: true,\n onSelect: () => this.set('largeControls', !this.state.largeControls),\n });\n if (this.options.shortcuts !== false)\n items.push({ label: t.a11yShortcuts, value: '?', active: false, onSelect: () => queueMicrotask(() => this.openShortcuts()) });\n return items;\n },\n };\n }\n\n // Özelliklerin kendi alt menüleri — hem Erişilebilirlik menüsünden hem hızlı erişim butonlarından açılır.\n\n private zoomDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-zoom',\n title: this.ctx.i18n.a11yZoom,\n getValueLabel: () => '',\n getItems: () => this.zoomLevels.map((z) => ({ label: pct(z), active: Math.abs(this.state.zoom - z) < 0.001, onSelect: () => this.setZoom(z) })),\n };\n }\n\n private filterDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-filter',\n title: this.ctx.i18n.a11yFilter,\n getValueLabel: () => '',\n getItems: () => this.filters.map((f) => ({ label: this.filterLabel(f), active: this.state.filter === f, onSelect: () => this.set('filter', f) })),\n };\n }\n\n private boostDef(): SettingsSubmenuDef {\n return {\n key: 'a11y-boost',\n title: this.ctx.i18n.a11yBoost,\n getValueLabel: () => '',\n getItems: () => (this.audioAllowed() ? this.boostLevels.map((b) => ({ label: pct(b), active: this.state.boost === b, onSelect: () => this.set('boost', b) })) : []),\n };\n }\n\n /** Aç / kapa özellikleri (mono, büyük kontroller) için hızlı butonun açtığı iki satırlık menü. */\n private toggleDef(key: 'mono' | 'largeControls', title: string): SettingsSubmenuDef {\n const t = this.ctx.i18n;\n return {\n key: `a11y-${key}`,\n title,\n getValueLabel: () => '',\n getItems: () => [\n { label: t.a11yOn, active: this.state[key], onSelect: () => this.set(key, true) },\n { label: t.a11yOff, active: !this.state[key], onSelect: () => this.set(key, false) },\n ],\n };\n }\n\n // ── Hızlı erişim butonları ──\n\n /**\n * Açık olan her özelliğin ayarlar butonunun sağında kendi butonu olur; basınca doğrudan o özelliğin ayarları açılır\n * (yakınlaştırma seviyeleri, filtre listesi…). Özellik kapanınca buton kalkar. \"Geri\" Erişilebilirlik menüsüne döner.\n */\n private syncQuickButtons(): void {\n const t = this.ctx.i18n;\n const s = this.state;\n const specs: { id: QuickId; on: boolean; label: string; def: () => SettingsSubmenuDef }[] = [\n { id: 'zoom', on: s.zoom > 1.001, label: `${t.a11yZoom}: ${pct(s.zoom)}`, def: () => this.zoomDef() },\n { id: 'filter', on: s.filter !== 'none', label: `${t.a11yFilter}: ${this.filterLabel(s.filter)}`, def: () => this.filterDef() },\n { id: 'mono', on: s.mono, label: `${t.a11yMono}: ${t.a11yOn}`, def: () => this.toggleDef('mono', t.a11yMono) },\n { id: 'boost', on: s.boost !== 1, label: `${t.a11yBoost}: ${pct(s.boost)}`, def: () => this.boostDef() },\n { id: 'largeControls', on: s.largeControls, label: `${t.a11yLargeControls}: ${t.a11yOn}`, def: () => this.toggleDef('largeControls', t.a11yLargeControls) },\n ];\n for (const spec of specs) {\n let btn = this.quickButtons.get(spec.id);\n if (!spec.on) {\n btn?.remove();\n this.quickButtons.delete(spec.id);\n continue;\n }\n if (!btn) {\n btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-a11y-quick hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer';\n btn.setAttribute('part', `a11y-quick a11y-quick-${spec.id}`);\n btn.setAttribute('data-a11y', spec.id);\n btn.innerHTML = QUICK_ICONS[spec.id];\n this.ctx.addQuickButton(btn, spec.def, () => [this.menu()]);\n this.quickButtons.set(spec.id, btn);\n }\n // Tooltip ve ekran okuyucu: özelliğin adı + değeri (\"Yakınlaştırma: 200%\").\n btn.setAttribute('aria-label', spec.label);\n }\n }\n private filterLabel(f: AccessibilityFilter): string {\n const t = this.ctx.i18n;\n const labels: Record<AccessibilityFilter, string> = {\n none: t.a11yFilterNone,\n grayscale: t.a11yFilterGrayscale,\n daylight: t.a11yFilterDaylight,\n night: t.a11yFilterNight,\n contrast: t.a11yFilterContrast,\n protanopia: t.a11yFilterProtanopia,\n deuteranopia: t.a11yFilterDeuteranopia,\n tritanopia: t.a11yFilterTritanopia,\n };\n return labels[f];\n }\n\n // ── Durum ──\n\n private set<K extends keyof AccessibilityState>(key: K, value: AccessibilityState[K]): void {\n if (this.state[key] === value) return;\n this.state[key] = value;\n this.applyAll();\n this.save();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:accessibility', { detail: { ...this.state, changed: key } }));\n }\n\n private setZoom(z: number): void {\n if (z <= 1) {\n this.panX = 0;\n this.panY = 0;\n }\n this.set('zoom', z);\n }\n\n private applyAll(): void {\n this.applyZoom();\n this.applyFilter();\n this.applyAudio();\n this.ctx.hostEl.toggleAttribute('data-large-controls', this.state.largeControls);\n this.syncQuickButtons();\n }\n\n private readonly applyZoom = (): void => {\n const v = this.ctx.videoEl;\n const z = this.state.zoom;\n this.ctx.hostEl.toggleAttribute('data-zoomed', z > 1);\n if (this.zoomLevels.length > 1) {\n // Yakınlaştırılmamışken sayfa kaydırması serbest, tarayıcının kendi iki parmak büyütmesi kapalı (bizimki çalışsın);\n // yakınlaştırılmışken sürükleme görüntüyü kaydırır.\n v.style.touchAction = z > 1 ? 'none' : 'pan-x pan-y';\n }\n if (z <= 1) {\n v.style.transform = '';\n return;\n }\n // Kenar dışına kaydırılamaz: en fazla (z-1)/2 genişlik kadar.\n const maxX = ((z - 1) * v.clientWidth) / 2;\n const maxY = ((z - 1) * v.clientHeight) / 2;\n v.style.transformOrigin = 'center center';\n v.style.transform = `translate(${(-this.panX * maxX).toFixed(1)}px, ${(-this.panY * maxY).toFixed(1)}px) scale(${z})`;\n };\n\n private applyFilter(): void {\n const f = this.state.filter;\n this.ctx.videoEl.style.filter = f === 'protanopia' || f === 'deuteranopia' || f === 'tritanopia' ? colorBlindFilterUrl(f) : CSS_FILTERS[f];\n }\n\n // ── Ses (Web Audio) ──\n\n /**\n * Web Audio kaynağı başka alan adındaysa ve CORS'la yüklenmediyse tarayıcı sesi sıfırlar — o zaman kapalı kalır.\n * blob: (hls.js / MSE; hls.js zaten CORS'la indirir) ve aynı origin güvenli.\n */\n private audioAllowed(): boolean {\n if (typeof AudioContext === 'undefined') return false;\n const src = this.ctx.videoEl.currentSrc;\n if (!src || src.startsWith('blob:') || src.startsWith('data:')) return true;\n try {\n if (new URL(src, location.href).origin === location.origin) return true;\n } catch {\n return false;\n }\n return this.ctx.videoEl.crossOrigin !== null;\n }\n\n private applyAudio(): void {\n const needed = this.state.mono || this.state.boost !== 1;\n if (!needed && !this.graph) return;\n if (!this.graph) {\n if (!this.audioAllowed()) return;\n try {\n const ctx = new AudioContext();\n const source = ctx.createMediaElementSource(this.ctx.videoEl);\n const gain = ctx.createGain();\n source.connect(gain).connect(ctx.destination);\n this.graph = { ctx, gain };\n } catch {\n return;\n }\n }\n const { gain, ctx } = this.graph;\n gain.gain.value = this.state.boost;\n // Mono: kanalları 'speakers' kuralıyla tek kanala indir ((L+R)/2); çıkış iki hoparlöre aynı gider.\n gain.channelCountMode = this.state.mono ? 'explicit' : 'max';\n gain.channelCount = this.state.mono ? 1 : 2;\n gain.channelInterpretation = 'speakers';\n if (ctx.state === 'suspended') void ctx.resume().catch(() => {});\n }\n\n private readonly resumeAudio = (): void => {\n if (this.graph?.ctx.state === 'suspended') void this.graph.ctx.resume().catch(() => {});\n };\n\n // ── Kalıcılık ──\n\n private restore(): void {\n if (this.options.remember === false) return;\n try {\n const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) ?? 'null') as Partial<AccessibilityState> | null;\n if (!saved) return;\n if (saved.filter && this.filters.includes(saved.filter)) this.state.filter = saved.filter;\n if (typeof saved.mono === 'boolean' && this.boostLevels.length) this.state.mono = saved.mono;\n if (typeof saved.boost === 'number' && this.boostLevels.includes(saved.boost)) this.state.boost = saved.boost;\n if (typeof saved.largeControls === 'boolean' && this.options.largeControls !== false) this.state.largeControls = saved.largeControls;\n // Yakınlaştırma bilerek hatırlanmaz — bir sonraki videoda kadrajı kaçırmasın.\n } catch {\n /* gizli sekme / bozuk kayıt — varsayılanlar */\n }\n }\n\n private save(): void {\n if (this.options.remember === false) return;\n try {\n const { filter, mono, boost, largeControls } = this.state;\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ filter, mono, boost, largeControls }));\n } catch {\n /* depolama yok — yalnızca bu oturum */\n }\n }\n\n // ── Yakınlaştırma: sürükle, iki parmak ──\n\n private readonly onPointerDown = (e: PointerEvent): void => {\n const target = e.composedPath()[0];\n if (target instanceof Element && target.closest(CONTROL_SELECTOR)) return;\n if (e.pointerType === 'touch') {\n this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (this.touches.size === 2) {\n this.pinch = { dist: this.touchDistance(), zoom: this.state.zoom };\n this.drag = null;\n return;\n }\n }\n if (this.state.zoom <= 1 || (e.pointerType === 'mouse' && e.button !== 0)) return;\n this.drag = { id: e.pointerId, x: e.clientX, y: e.clientY, panX: this.panX, panY: this.panY };\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n if (e.pointerType === 'touch' && this.touches.has(e.pointerId)) this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (this.pinch && this.touches.size === 2) {\n const max = this.zoomLevels[this.zoomLevels.length - 1]!;\n const z = Math.min(max, Math.max(1, (this.pinch.zoom * this.touchDistance()) / this.pinch.dist));\n this.state.zoom = Math.round(z * 100) / 100;\n if (this.state.zoom <= 1) this.panX = this.panY = 0;\n this.applyZoom();\n return;\n }\n if (!this.drag || this.drag.id !== e.pointerId) return;\n const v = this.ctx.videoEl;\n const z = this.state.zoom;\n const maxX = ((z - 1) * v.clientWidth) / 2 || 1;\n const maxY = ((z - 1) * v.clientHeight) / 2 || 1;\n // Görüntü parmağı / imleci takip eder (sağa sürükle → görüntü sağa → sol taraf görünür).\n this.panX = clamp(this.drag.panX - (e.clientX - this.drag.x) / maxX);\n this.panY = clamp(this.drag.panY - (e.clientY - this.drag.y) / maxY);\n this.applyZoom();\n };\n\n private readonly onPointerUp = (e: PointerEvent): void => {\n this.touches.delete(e.pointerId);\n if (this.pinch && this.touches.size < 2) {\n this.pinch = null;\n this.syncQuickButtons();\n // İki parmakla serbest büyütme bitince olay / kayıt bir kez.\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:accessibility', { detail: { ...this.state, changed: 'zoom' } }));\n }\n if (this.drag?.id === e.pointerId) {\n // Gerçekten sürüklendiyse ardından gelen tık oynat / duraklat sayılmasın (oynat butonu bütün alanı kaplayabiliyor).\n if (Math.hypot(e.clientX - this.drag.x, e.clientY - this.drag.y) > DRAG_THRESHOLD_PX) this.swallowNextClick();\n this.drag = null;\n }\n };\n\n private swallowNextClick(): void {\n const area = this.ctx.videoAreaEl;\n const swallow = (ev: Event): void => {\n ev.stopPropagation();\n ev.preventDefault();\n };\n area.addEventListener('click', swallow, { capture: true, once: true });\n // Tık hiç gelmezse (ör. dokunmatik) sonraki gerçek tık yutulmasın.\n setTimeout(() => area.removeEventListener('click', swallow, { capture: true }), 400);\n }\n\n private touchDistance(): number {\n const [a, b] = [...this.touches.values()];\n return a && b ? Math.hypot(a.x - b.x, a.y - b.y) || 1 : 1;\n }\n\n // ── Klavye ──\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if (e.defaultPrevented || e.ctrlKey || e.metaKey || e.altKey) return;\n if (this.shortcutsEl && e.key === 'Escape') {\n e.preventDefault();\n this.closeShortcuts();\n return;\n }\n if (e.key === '?' && this.options.shortcuts !== false) {\n e.preventDefault();\n if (this.shortcutsEl) this.closeShortcuts();\n else this.openShortcuts();\n return;\n }\n if (this.zoomLevels.length < 2) return;\n if (e.key === '+' || e.key === '=') {\n e.preventDefault();\n this.setZoom(this.zoomLevels.find((z) => z > this.state.zoom + 0.001) ?? this.state.zoom);\n } else if (e.key === '-' || e.key === '_') {\n e.preventDefault();\n this.setZoom([...this.zoomLevels].reverse().find((z) => z < this.state.zoom - 0.001) ?? 1);\n } else if (e.key === '0' && this.state.zoom > 1) {\n e.preventDefault();\n this.setZoom(1);\n } else if (e.shiftKey && this.state.zoom > 1 && e.key.startsWith('Arrow')) {\n // Shift + ok: yakınlaştırılmış görüntüde gezin (oklar tek başına sarma / ses olarak kalır).\n e.preventDefault();\n if (e.key === 'ArrowLeft') this.panX = clamp(this.panX - PAN_STEP);\n if (e.key === 'ArrowRight') this.panX = clamp(this.panX + PAN_STEP);\n if (e.key === 'ArrowUp') this.panY = clamp(this.panY - PAN_STEP);\n if (e.key === 'ArrowDown') this.panY = clamp(this.panY + PAN_STEP);\n this.applyZoom();\n }\n };\n\n // ── Kısayol paneli ──\n\n private openShortcuts(): void {\n if (this.shortcutsEl) return;\n const t = this.ctx.i18n;\n const el = document.createElement('div');\n el.className = 'hp-shortcuts';\n el.setAttribute('part', 'shortcuts');\n el.setAttribute('role', 'dialog');\n el.setAttribute('aria-modal', 'true');\n el.setAttribute('aria-labelledby', 'hp-shortcuts-title');\n\n const box = document.createElement('div');\n box.className = 'hp-shortcuts-box';\n const head = document.createElement('div');\n head.className = 'hp-shortcuts-head';\n const title = document.createElement('h2');\n title.id = 'hp-shortcuts-title';\n title.textContent = t.a11yShortcuts;\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-shortcuts-close';\n close.setAttribute('aria-label', t.a11yClose);\n close.textContent = '✕';\n close.addEventListener('click', () => this.closeShortcuts());\n head.append(title, close);\n\n const rows: [string[], string][] = [\n [['Space', 'K'], t.a11yKeyPlay],\n [['←', '→', 'J', 'L'], t.a11yKeySeek(this.ctx.seekStep())],\n [['↑', '↓'], t.a11yKeyVolume],\n [['M'], t.a11yKeyMute],\n [['F'], t.a11yKeyFullscreen],\n [[',', '.'], t.a11yKeyFrame],\n ];\n if (this.zoomLevels.length > 1) {\n rows.push([['+', '−', '0'], t.a11yKeyZoom]);\n rows.push([['Shift', '+', '←↑↓→'], t.a11yKeyPan]);\n }\n for (const s of this.ctx.extraShortcuts?.() ?? []) rows.push([s.keys, s.description]);\n rows.push([['?'], t.a11yKeyShortcuts]);\n\n const list = document.createElement('dl');\n list.className = 'hp-shortcuts-list';\n for (const [keys, desc] of rows) {\n const dt = document.createElement('dt');\n for (const k of keys) {\n if (k === '+' && keys[0] === 'Shift') {\n dt.append(' + ');\n continue;\n }\n const kbd = document.createElement('kbd');\n kbd.textContent = k;\n dt.appendChild(kbd);\n }\n const dd = document.createElement('dd');\n dd.textContent = desc;\n list.append(dt, dd);\n }\n box.append(head, list);\n el.appendChild(box);\n // Arka plana tıklama kapatır; panelin içindeki tıklama oynat/duraklat'a geçmez.\n el.addEventListener('click', (e) => {\n e.stopPropagation();\n if (e.target === el) this.closeShortcuts();\n });\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n // Odak paneli terk etmesin (Tab tek butonda kalır).\n el.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n close.focus();\n }\n });\n this.ctx.videoAreaEl.appendChild(el);\n this.shortcutsEl = el;\n close.focus({ preventScroll: true });\n }\n\n private closeShortcuts(): void {\n if (!this.shortcutsEl) return;\n const hadFocus = this.shortcutsEl.contains((this.ctx.hostEl.shadowRoot ?? document).activeElement);\n this.shortcutsEl.remove();\n this.shortcutsEl = null;\n if (hadFocus) this.ctx.hostEl.focus({ preventScroll: true });\n }\n}\n\nfunction normalizeLevels(levels: number[]): number[] {\n const valid = levels.filter((n) => Number.isFinite(n) && n >= 1 && n <= 8);\n return [...new Set([1, ...valid])].sort((a, b) => a - b);\n}\n\nconst clamp = (n: number): number => Math.min(1, Math.max(-1, n));\nconst pct = (n: number): string => `${Math.round(n * 100)}%`;\n","import { Accessibility, type AccessibilityPlayerContext } from './Accessibility';\nimport type { AccessibilityOptions } from '../../types';\n\nexport function installAccessibility(ctx: AccessibilityPlayerContext, options: AccessibilityOptions): Accessibility {\n return new Accessibility(ctx, options);\n}\n\nexport { Accessibility };\nexport type { AccessibilityPlayerContext };\n"],"names":["SIMULATE","SHIFT","I","mul","a","b","r","i","j","daltonizeMatrix","kind","s","err","v","shifted","cache","colorBlindFilterUrl","url","m","n","svg","DEFAULT_ZOOM","DEFAULT_BOOST","ALL_FILTERS","STORAGE_KEY","PAN_STEP","SUBMENU_KEY","DRAG_THRESHOLD_PX","CONTROL_SELECTOR","CSS_FILTERS","body","QUICK_ICONS","Accessibility","ctx","options","__publicField","z","maxX","maxY","_a","e","target","max","clamp","normalizeLevels","f","area","btn","items","sub","label","value","children","pct","ok","key","title","t","specs","spec","src","source","gain","saved","filter","mono","boost","largeControls","swallow","ev","_b","el","box","head","close","rows","list","keys","desc","dt","k","kbd","dd","hadFocus","levels","valid","installAccessibility"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var P = Object.defineProperty;
|
|
2
2
|
var k = (d, e, t) => e in d ? P(d, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : d[e] = t;
|
|
3
3
|
var r = (d, e, t) => k(d, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
-
import { t as E, g as M, m as L } from "./player-
|
|
4
|
+
import { t as E, g as M, m as L } from "./player-DV4Hf5Cw.js";
|
|
5
5
|
const x = 8e3;
|
|
6
6
|
class C {
|
|
7
7
|
constructor(e) {
|
|
@@ -641,7 +641,7 @@ class _ {
|
|
|
641
641
|
const m = await this.getOrCreatePrebidInstance(e, o);
|
|
642
642
|
m.isAvailable() && (a = await m.runAuction(a));
|
|
643
643
|
}
|
|
644
|
-
if (!this.adsLoader || !this.ima) return;
|
|
644
|
+
if (this.ctx.transformTag && (a = await this.ctx.transformTag(a, e.toLowerCase())), !this.adsLoader || !this.ima) return;
|
|
645
645
|
const l = new this.ima.AdsRequest();
|
|
646
646
|
l.adTagUrl = a, l.linearAdSlotWidth = this.ctx.videoEl.clientWidth || 640, l.linearAdSlotHeight = this.ctx.videoEl.clientHeight || 360, l.nonLinearAdSlotWidth = this.ctx.videoEl.clientWidth || 640, l.nonLinearAdSlotHeight = Math.round((this.ctx.videoEl.clientHeight || 360) / 3), l.vastLoadTimeout = this.options.vastLoadTimeoutMs ?? 1e4;
|
|
647
647
|
try {
|
|
@@ -819,4 +819,4 @@ export {
|
|
|
819
819
|
_ as AdsController,
|
|
820
820
|
G as installAds
|
|
821
821
|
};
|
|
822
|
-
//# sourceMappingURL=ads-
|
|
822
|
+
//# sourceMappingURL=ads-C4tDPsUs.js.map
|