@capgo/capacitor-jw-player 0.0.13 → 0.0.20

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.
@@ -6,67 +6,346 @@ const JwPlayer = core.registerPlugin('JwPlayer', {
6
6
  web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.JwPlayerWeb()),
7
7
  });
8
8
 
9
+ /// <reference types="jwplayer" />
9
10
  class JwPlayerWeb extends core.WebPlugin {
11
+ constructor() {
12
+ super(...arguments);
13
+ // Track if our overlay is currently displayed
14
+ this.overlayDiv = null;
15
+ // Store JW Player instance
16
+ this.jwPlayerInstance = null;
17
+ }
18
+ // Generate a UUID that works in all browsers
19
+ generateUUID() {
20
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
21
+ const r = (Math.random() * 16) | 0;
22
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
23
+ return v.toString(16);
24
+ });
25
+ }
10
26
  async initialize(options) {
11
27
  console.log('INITIALIZE', options);
28
+ if (!options.playerUrl) {
29
+ throw new Error('playerUrl is required for web implementation');
30
+ }
31
+ const playerUrl = options.playerUrl;
32
+ await new Promise((resolve, reject) => {
33
+ const script = document.createElement('script');
34
+ script.src = playerUrl;
35
+ script.onload = () => resolve(null);
36
+ script.onerror = () => reject(new Error('Failed to load JW Player script'));
37
+ document.head.appendChild(script);
38
+ });
39
+ // Check if jwplayer() is available globally
40
+ if (typeof window.jwplayer !== 'function') {
41
+ throw new Error('JW Player script failed to load properly - jwplayer() function not found');
42
+ }
43
+ }
44
+ async play(options) {
45
+ if (!window.jwplayer) {
46
+ throw new Error('JW Player script failed to load properly - jwplayer() function not found');
47
+ }
48
+ // Create fullscreen overlay div
49
+ if (this.overlayDiv) {
50
+ // Remove existing overlay if it exists
51
+ document.body.removeChild(this.overlayDiv);
52
+ this.overlayDiv = null;
53
+ }
54
+ // Create new overlay div (this will be our red background container)
55
+ this.overlayDiv = document.createElement('div');
56
+ // Style the outer overlay to take up 100% of screen
57
+ Object.assign(this.overlayDiv.style, {
58
+ position: 'fixed',
59
+ top: '0',
60
+ left: '0',
61
+ width: '100%',
62
+ height: '100%',
63
+ zIndex: '9999',
64
+ display: 'flex',
65
+ });
66
+ // Create the inner div for the player
67
+ const playerDiv = document.createElement('div');
68
+ const uniqueId = this.generateUUID();
69
+ const id = `jw-player-${uniqueId}`;
70
+ playerDiv.id = id;
71
+ // Style the inner player div
72
+ Object.assign(playerDiv.style, {
73
+ width: '100%',
74
+ height: '100%',
75
+ margin: '0 auto',
76
+ });
77
+ // Create close (X) button
78
+ const closeButton = document.createElement('button');
79
+ closeButton.textContent = 'X';
80
+ Object.assign(closeButton.style, {
81
+ position: 'absolute',
82
+ top: '10px',
83
+ left: '10px',
84
+ background: 'rgba(0, 0, 0, 0.5)',
85
+ color: 'white',
86
+ border: 'none',
87
+ borderRadius: '50%',
88
+ width: '30px',
89
+ height: '30px',
90
+ fontSize: '16px',
91
+ fontWeight: 'bold',
92
+ cursor: 'pointer',
93
+ zIndex: '10000',
94
+ display: 'flex',
95
+ justifyContent: 'center',
96
+ alignItems: 'center',
97
+ padding: '0',
98
+ });
99
+ // Add click handler to close button
100
+ closeButton.addEventListener('click', () => {
101
+ var _a;
102
+ if (this.jwPlayerInstance) {
103
+ this.jwPlayerInstance.remove();
104
+ this.jwPlayerInstance = null;
105
+ }
106
+ if ((_a = this.overlayDiv) === null || _a === void 0 ? void 0 : _a.parentNode) {
107
+ document.body.removeChild(this.overlayDiv);
108
+ this.overlayDiv = null;
109
+ this.notifyListeners('playerDismissed', {});
110
+ }
111
+ });
112
+ // Append inner div to the red overlay
113
+ this.overlayDiv.appendChild(playerDiv);
114
+ // Append close button to overlay
115
+ this.overlayDiv.appendChild(closeButton);
116
+ // Append outer div to body
117
+ document.body.appendChild(this.overlayDiv);
118
+ // Setup player on the inner div
119
+ this.jwPlayerInstance = jwplayer(id).setup({
120
+ playlist: options.mediaType === 'playlist' ? options.mediaUrl : [{ file: options.mediaUrl, title: 'Video' }],
121
+ width: '100%',
122
+ height: '100%',
123
+ autostart: options.autostart || false,
124
+ controls: true,
125
+ displaytitle: false,
126
+ });
127
+ // Add unified event handlers to match iOS and Android
128
+ this.setupEventHandlers();
12
129
  return;
13
130
  }
14
- async play(_options) {
15
- throw this.unimplemented('JW Player is not available in web.');
131
+ // Setup unified event handlers to match iOS and Android
132
+ setupEventHandlers() {
133
+ if (!this.jwPlayerInstance)
134
+ return;
135
+ // Ready event
136
+ this.jwPlayerInstance.on('ready', () => {
137
+ this.notifyListeners('ready', {});
138
+ });
139
+ // Error event
140
+ this.jwPlayerInstance.on('error', (error) => {
141
+ this.notifyListeners('error', {
142
+ message: (error === null || error === void 0 ? void 0 : error.message) || 'Unknown error',
143
+ code: (error === null || error === void 0 ? void 0 : error.code) || -1,
144
+ });
145
+ });
146
+ // Play event
147
+ this.jwPlayerInstance.on('play', () => {
148
+ this.notifyListeners('play', { reason: 'external' });
149
+ });
150
+ // Pause event
151
+ this.jwPlayerInstance.on('pause', () => {
152
+ this.notifyListeners('pause', { reason: 'external' });
153
+ });
154
+ // Complete event
155
+ this.jwPlayerInstance.on('complete', () => {
156
+ this.notifyListeners('complete', {});
157
+ });
158
+ // Seek event
159
+ this.jwPlayerInstance.on('seek', (event) => {
160
+ this.notifyListeners('seek', {
161
+ position: event.position,
162
+ offset: event.offset,
163
+ });
164
+ });
165
+ // Time event (throttled to not fire too often)
166
+ let lastTimeUpdate = 0;
167
+ this.jwPlayerInstance.on('time', (event) => {
168
+ const now = Date.now();
169
+ // Throttle to once per second max
170
+ if (now - lastTimeUpdate > 1000) {
171
+ this.notifyListeners('time', {
172
+ position: event.position,
173
+ duration: event.duration,
174
+ });
175
+ lastTimeUpdate = now;
176
+ }
177
+ });
178
+ // Playlist item event
179
+ this.jwPlayerInstance.on('playlistItem', (event) => {
180
+ var _a;
181
+ this.notifyListeners('playlistItem', {
182
+ index: event.index,
183
+ title: ((_a = event.item) === null || _a === void 0 ? void 0 : _a.title) || '',
184
+ });
185
+ });
186
+ // Playlist complete event
187
+ this.jwPlayerInstance.on('playlistComplete', () => {
188
+ this.notifyListeners('playlistComplete', {});
189
+ });
190
+ // Controls visibility event
191
+ this.jwPlayerInstance.on('controls', (event) => {
192
+ this.notifyListeners('controlsChanged', {
193
+ visible: event.controls,
194
+ });
195
+ });
16
196
  }
17
197
  async pause() {
18
- throw this.unimplemented('JW Player is not available in web.');
198
+ if (this.jwPlayerInstance) {
199
+ this.jwPlayerInstance.pause();
200
+ // Event is fired by the event handler
201
+ return;
202
+ }
203
+ throw new Error('Player not active');
19
204
  }
20
205
  async stop() {
21
- throw this.unimplemented('JW Player is not available in web.');
206
+ var _a;
207
+ if (this.jwPlayerInstance) {
208
+ this.jwPlayerInstance.remove();
209
+ this.jwPlayerInstance = null;
210
+ if ((_a = this.overlayDiv) === null || _a === void 0 ? void 0 : _a.parentNode) {
211
+ document.body.removeChild(this.overlayDiv);
212
+ this.overlayDiv = null;
213
+ }
214
+ // The complete event will be triggered by the JW Player event handler,
215
+ // but since we're removing the player instance, we need to send it manually here
216
+ this.notifyListeners('playerDismissed', {});
217
+ return;
218
+ }
219
+ throw new Error('Player not active');
22
220
  }
23
- async seekTo(_options) {
24
- throw this.unimplemented('JW Player is not available in web.');
221
+ async seekTo(options) {
222
+ if (this.jwPlayerInstance) {
223
+ this.jwPlayerInstance.seek(options.time);
224
+ return;
225
+ }
226
+ throw new Error('Player not active');
25
227
  }
26
- async setVolume(_options) {
27
- throw this.unimplemented('JW Player is not available in web.');
228
+ async setVolume(options) {
229
+ if (this.jwPlayerInstance) {
230
+ this.jwPlayerInstance.setVolume(options.volume);
231
+ return;
232
+ }
233
+ throw new Error('Player not active');
28
234
  }
29
235
  async getPosition() {
30
- throw this.unimplemented('JW Player is not available in web.');
236
+ if (this.jwPlayerInstance) {
237
+ return { position: this.jwPlayerInstance.getPosition() };
238
+ }
239
+ throw new Error('Player not active');
31
240
  }
32
241
  async getState() {
33
- throw this.unimplemented('JW Player is not available in web.');
242
+ if (!this.jwPlayerInstance) {
243
+ // IDLE (no player)
244
+ return { state: 0 };
245
+ }
246
+ // Convert JW Player state to our state format
247
+ // jwplayer: BUFFERING(3), IDLE(0), COMPLETE(4), PAUSED(2), PLAYING(1)
248
+ // our API: IDLE(0), BUFFERING(1), PLAYING(2), PAUSED(3), COMPLETE(4)
249
+ const jwState = this.jwPlayerInstance.getState();
250
+ let state = 0;
251
+ switch (jwState) {
252
+ case 'buffering':
253
+ state = 1;
254
+ break;
255
+ case 'playing':
256
+ state = 2;
257
+ break;
258
+ case 'paused':
259
+ state = 3;
260
+ break;
261
+ default:
262
+ state = 0; // idle
263
+ }
264
+ return { state };
34
265
  }
35
- async setSpeed(_options) {
36
- throw this.unimplemented('JW Player is not available in web.');
266
+ async setSpeed(options) {
267
+ if (this.jwPlayerInstance) {
268
+ this.jwPlayerInstance.setPlaybackRate(options.speed);
269
+ return;
270
+ }
271
+ throw new Error('Player not active');
37
272
  }
38
- async setPlaylistIndex(_options) {
39
- throw this.unimplemented('JW Player is not available in web.');
273
+ async setPlaylistIndex(options) {
274
+ if (this.jwPlayerInstance) {
275
+ this.jwPlayerInstance.playlistItem(options.index);
276
+ return;
277
+ }
278
+ throw new Error('Player not active');
40
279
  }
41
- async loadPlaylist(_options) {
42
- throw this.unimplemented('JW Player is not available in web.');
280
+ async loadPlaylist(options) {
281
+ if (this.jwPlayerInstance) {
282
+ this.jwPlayerInstance.load(options.playlistUrl);
283
+ return;
284
+ }
285
+ throw new Error('Player not active');
43
286
  }
44
- async loadPlaylistWithItems(_options) {
45
- throw this.unimplemented('JW Player is not available in web.');
287
+ async loadPlaylistWithItems(options) {
288
+ if (this.jwPlayerInstance) {
289
+ this.jwPlayerInstance.load(options.playlist);
290
+ return;
291
+ }
292
+ throw new Error('Player not active');
46
293
  }
47
294
  async getAudioTracks() {
48
- throw this.unimplemented('JW Player is not available in web.');
295
+ if (this.jwPlayerInstance) {
296
+ const tracks = this.jwPlayerInstance.getAudioTracks();
297
+ return { tracks };
298
+ }
299
+ throw new Error('Player not active');
49
300
  }
50
301
  async getCurrentAudioTrack() {
51
- throw this.unimplemented('JW Player is not available in web.');
302
+ if (this.jwPlayerInstance) {
303
+ const index = this.jwPlayerInstance.getCurrentAudioTrack();
304
+ return { index };
305
+ }
306
+ throw new Error('Player not active');
52
307
  }
53
- async setCurrentAudioTrack(_options) {
54
- throw this.unimplemented('JW Player is not available in web.');
308
+ async setCurrentAudioTrack(options) {
309
+ if (this.jwPlayerInstance) {
310
+ this.jwPlayerInstance.setCurrentAudioTrack(options.index);
311
+ return;
312
+ }
313
+ throw new Error('Player not active');
55
314
  }
56
315
  async getCaptions() {
57
- throw this.unimplemented('JW Player is not available in web.');
316
+ if (this.jwPlayerInstance) {
317
+ const captions = this.jwPlayerInstance.getCaptionsList();
318
+ return { captions };
319
+ }
320
+ throw new Error('Player not active');
58
321
  }
59
322
  async getCurrentCaptions() {
60
- throw this.unimplemented('JW Player is not available in web.');
323
+ if (this.jwPlayerInstance) {
324
+ const index = this.jwPlayerInstance.getCurrentCaptions();
325
+ return { index };
326
+ }
327
+ throw new Error('Player not active');
61
328
  }
62
- async setCurrentCaptions(_options) {
63
- throw this.unimplemented('JW Player is not available in web.');
329
+ async setCurrentCaptions(options) {
330
+ if (this.jwPlayerInstance) {
331
+ this.jwPlayerInstance.setCurrentCaptions(options.index);
332
+ return;
333
+ }
334
+ throw new Error('Player not active');
64
335
  }
65
336
  async currentPlaylist() {
66
- throw this.unimplemented('JW Player is not available in web.');
337
+ if (this.jwPlayerInstance) {
338
+ return this.jwPlayerInstance.getPlaylist();
339
+ }
340
+ throw new Error('Player not active');
67
341
  }
68
342
  async resume() {
69
- throw this.unimplemented('JW Player is not available in web.');
343
+ if (this.jwPlayerInstance) {
344
+ this.jwPlayerInstance.play();
345
+ // Event is fired by the event handler
346
+ return;
347
+ }
348
+ throw new Error('Player not active');
70
349
  }
71
350
  }
72
351
 
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst JwPlayer = registerPlugin('JwPlayer', {\n web: () => import('./web').then((m) => new m.JwPlayerWeb()),\n});\nexport * from './definitions';\nexport { JwPlayer };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class JwPlayerWeb extends WebPlugin {\n async initialize(options) {\n console.log('INITIALIZE', options);\n return;\n }\n async play(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async pause() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async stop() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async seekTo(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async setVolume(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async getPosition() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async getState() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async setSpeed(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async setPlaylistIndex(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async loadPlaylist(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async loadPlaylistWithItems(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async getAudioTracks() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async getCurrentAudioTrack() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async setCurrentAudioTrack(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async getCaptions() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async getCurrentCaptions() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async setCurrentCaptions(_options) {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async currentPlaylist() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n async resume() {\n throw this.unimplemented('JW Player is not available in web.');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AACK,MAAC,QAAQ,GAAGA,mBAAc,CAAC,UAAU,EAAE;AAC5C,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/D,CAAC;;ACFM,MAAM,WAAW,SAASC,cAAS,CAAC;AAC3C,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE;AAC9B,QAAQ,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC;AAC1C,QAAQ;AACR;AACA,IAAI,MAAM,IAAI,CAAC,QAAQ,EAAE;AACzB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,KAAK,GAAG;AAClB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,IAAI,GAAG;AACjB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,MAAM,CAAC,QAAQ,EAAE;AAC3B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,SAAS,CAAC,QAAQ,EAAE;AAC9B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,WAAW,GAAG;AACxB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,QAAQ,GAAG;AACrB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,QAAQ,CAAC,QAAQ,EAAE;AAC7B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,gBAAgB,CAAC,QAAQ,EAAE;AACrC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,YAAY,CAAC,QAAQ,EAAE;AACjC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,qBAAqB,CAAC,QAAQ,EAAE;AAC1C,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,cAAc,GAAG;AAC3B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,oBAAoB,GAAG;AACjC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,oBAAoB,CAAC,QAAQ,EAAE;AACzC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,WAAW,GAAG;AACxB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,kBAAkB,GAAG;AAC/B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,kBAAkB,CAAC,QAAQ,EAAE;AACvC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA,IAAI,MAAM,MAAM,GAAG;AACnB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC;AACtE;AACA;;;;;;;;;"}
1
+ {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst JwPlayer = registerPlugin('JwPlayer', {\n web: () => import('./web').then((m) => new m.JwPlayerWeb()),\n});\nexport * from './definitions';\nexport { JwPlayer };\n//# sourceMappingURL=index.js.map","/// <reference types=\"jwplayer\" />\nimport { WebPlugin } from '@capacitor/core';\nexport class JwPlayerWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n // Track if our overlay is currently displayed\n this.overlayDiv = null;\n // Store JW Player instance\n this.jwPlayerInstance = null;\n }\n // Generate a UUID that works in all browsers\n generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n async initialize(options) {\n console.log('INITIALIZE', options);\n if (!options.playerUrl) {\n throw new Error('playerUrl is required for web implementation');\n }\n const playerUrl = options.playerUrl;\n await new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = playerUrl;\n script.onload = () => resolve(null);\n script.onerror = () => reject(new Error('Failed to load JW Player script'));\n document.head.appendChild(script);\n });\n // Check if jwplayer() is available globally\n if (typeof window.jwplayer !== 'function') {\n throw new Error('JW Player script failed to load properly - jwplayer() function not found');\n }\n }\n async play(options) {\n if (!window.jwplayer) {\n throw new Error('JW Player script failed to load properly - jwplayer() function not found');\n }\n // Create fullscreen overlay div\n if (this.overlayDiv) {\n // Remove existing overlay if it exists\n document.body.removeChild(this.overlayDiv);\n this.overlayDiv = null;\n }\n // Create new overlay div (this will be our red background container)\n this.overlayDiv = document.createElement('div');\n // Style the outer overlay to take up 100% of screen\n Object.assign(this.overlayDiv.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n zIndex: '9999',\n display: 'flex',\n });\n // Create the inner div for the player\n const playerDiv = document.createElement('div');\n const uniqueId = this.generateUUID();\n const id = `jw-player-${uniqueId}`;\n playerDiv.id = id;\n // Style the inner player div\n Object.assign(playerDiv.style, {\n width: '100%',\n height: '100%',\n margin: '0 auto',\n });\n // Create close (X) button\n const closeButton = document.createElement('button');\n closeButton.textContent = 'X';\n Object.assign(closeButton.style, {\n position: 'absolute',\n top: '10px',\n left: '10px',\n background: 'rgba(0, 0, 0, 0.5)',\n color: 'white',\n border: 'none',\n borderRadius: '50%',\n width: '30px',\n height: '30px',\n fontSize: '16px',\n fontWeight: 'bold',\n cursor: 'pointer',\n zIndex: '10000',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '0',\n });\n // Add click handler to close button\n closeButton.addEventListener('click', () => {\n var _a;\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.remove();\n this.jwPlayerInstance = null;\n }\n if ((_a = this.overlayDiv) === null || _a === void 0 ? void 0 : _a.parentNode) {\n document.body.removeChild(this.overlayDiv);\n this.overlayDiv = null;\n this.notifyListeners('playerDismissed', {});\n }\n });\n // Append inner div to the red overlay\n this.overlayDiv.appendChild(playerDiv);\n // Append close button to overlay\n this.overlayDiv.appendChild(closeButton);\n // Append outer div to body\n document.body.appendChild(this.overlayDiv);\n // Setup player on the inner div\n this.jwPlayerInstance = jwplayer(id).setup({\n playlist: options.mediaType === 'playlist' ? options.mediaUrl : [{ file: options.mediaUrl, title: 'Video' }],\n width: '100%',\n height: '100%',\n autostart: options.autostart || false,\n controls: true,\n displaytitle: false,\n });\n // Add unified event handlers to match iOS and Android\n this.setupEventHandlers();\n return;\n }\n // Setup unified event handlers to match iOS and Android\n setupEventHandlers() {\n if (!this.jwPlayerInstance)\n return;\n // Ready event\n this.jwPlayerInstance.on('ready', () => {\n this.notifyListeners('ready', {});\n });\n // Error event\n this.jwPlayerInstance.on('error', (error) => {\n this.notifyListeners('error', {\n message: (error === null || error === void 0 ? void 0 : error.message) || 'Unknown error',\n code: (error === null || error === void 0 ? void 0 : error.code) || -1,\n });\n });\n // Play event\n this.jwPlayerInstance.on('play', () => {\n this.notifyListeners('play', { reason: 'external' });\n });\n // Pause event\n this.jwPlayerInstance.on('pause', () => {\n this.notifyListeners('pause', { reason: 'external' });\n });\n // Complete event\n this.jwPlayerInstance.on('complete', () => {\n this.notifyListeners('complete', {});\n });\n // Seek event\n this.jwPlayerInstance.on('seek', (event) => {\n this.notifyListeners('seek', {\n position: event.position,\n offset: event.offset,\n });\n });\n // Time event (throttled to not fire too often)\n let lastTimeUpdate = 0;\n this.jwPlayerInstance.on('time', (event) => {\n const now = Date.now();\n // Throttle to once per second max\n if (now - lastTimeUpdate > 1000) {\n this.notifyListeners('time', {\n position: event.position,\n duration: event.duration,\n });\n lastTimeUpdate = now;\n }\n });\n // Playlist item event\n this.jwPlayerInstance.on('playlistItem', (event) => {\n var _a;\n this.notifyListeners('playlistItem', {\n index: event.index,\n title: ((_a = event.item) === null || _a === void 0 ? void 0 : _a.title) || '',\n });\n });\n // Playlist complete event\n this.jwPlayerInstance.on('playlistComplete', () => {\n this.notifyListeners('playlistComplete', {});\n });\n // Controls visibility event\n this.jwPlayerInstance.on('controls', (event) => {\n this.notifyListeners('controlsChanged', {\n visible: event.controls,\n });\n });\n }\n async pause() {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.pause();\n // Event is fired by the event handler\n return;\n }\n throw new Error('Player not active');\n }\n async stop() {\n var _a;\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.remove();\n this.jwPlayerInstance = null;\n if ((_a = this.overlayDiv) === null || _a === void 0 ? void 0 : _a.parentNode) {\n document.body.removeChild(this.overlayDiv);\n this.overlayDiv = null;\n }\n // The complete event will be triggered by the JW Player event handler,\n // but since we're removing the player instance, we need to send it manually here\n this.notifyListeners('playerDismissed', {});\n return;\n }\n throw new Error('Player not active');\n }\n async seekTo(options) {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.seek(options.time);\n return;\n }\n throw new Error('Player not active');\n }\n async setVolume(options) {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.setVolume(options.volume);\n return;\n }\n throw new Error('Player not active');\n }\n async getPosition() {\n if (this.jwPlayerInstance) {\n return { position: this.jwPlayerInstance.getPosition() };\n }\n throw new Error('Player not active');\n }\n async getState() {\n if (!this.jwPlayerInstance) {\n // IDLE (no player)\n return { state: 0 };\n }\n // Convert JW Player state to our state format\n // jwplayer: BUFFERING(3), IDLE(0), COMPLETE(4), PAUSED(2), PLAYING(1)\n // our API: IDLE(0), BUFFERING(1), PLAYING(2), PAUSED(3), COMPLETE(4)\n const jwState = this.jwPlayerInstance.getState();\n let state = 0;\n switch (jwState) {\n case 'buffering':\n state = 1;\n break;\n case 'playing':\n state = 2;\n break;\n case 'paused':\n state = 3;\n break;\n default:\n state = 0; // idle\n }\n return { state };\n }\n async setSpeed(options) {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.setPlaybackRate(options.speed);\n return;\n }\n throw new Error('Player not active');\n }\n async setPlaylistIndex(options) {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.playlistItem(options.index);\n return;\n }\n throw new Error('Player not active');\n }\n async loadPlaylist(options) {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.load(options.playlistUrl);\n return;\n }\n throw new Error('Player not active');\n }\n async loadPlaylistWithItems(options) {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.load(options.playlist);\n return;\n }\n throw new Error('Player not active');\n }\n async getAudioTracks() {\n if (this.jwPlayerInstance) {\n const tracks = this.jwPlayerInstance.getAudioTracks();\n return { tracks };\n }\n throw new Error('Player not active');\n }\n async getCurrentAudioTrack() {\n if (this.jwPlayerInstance) {\n const index = this.jwPlayerInstance.getCurrentAudioTrack();\n return { index };\n }\n throw new Error('Player not active');\n }\n async setCurrentAudioTrack(options) {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.setCurrentAudioTrack(options.index);\n return;\n }\n throw new Error('Player not active');\n }\n async getCaptions() {\n if (this.jwPlayerInstance) {\n const captions = this.jwPlayerInstance.getCaptionsList();\n return { captions };\n }\n throw new Error('Player not active');\n }\n async getCurrentCaptions() {\n if (this.jwPlayerInstance) {\n const index = this.jwPlayerInstance.getCurrentCaptions();\n return { index };\n }\n throw new Error('Player not active');\n }\n async setCurrentCaptions(options) {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.setCurrentCaptions(options.index);\n return;\n }\n throw new Error('Player not active');\n }\n async currentPlaylist() {\n if (this.jwPlayerInstance) {\n return this.jwPlayerInstance.getPlaylist();\n }\n throw new Error('Player not active');\n }\n async resume() {\n if (this.jwPlayerInstance) {\n this.jwPlayerInstance.play();\n // Event is fired by the event handler\n return;\n }\n throw new Error('Player not active');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}