@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.
- package/Package.swift +0 -5
- package/README.md +4 -4
- package/android/src/main/java/ee/forgr/capacitor_jw_player/PlayerActivity.java +16 -10
- package/dist/docs.json +6 -2
- package/dist/esm/definitions.d.ts +101 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/web.d.ts +21 -9
- package/dist/esm/web.js +307 -28
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +307 -28
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +307 -28
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/JwPlayerPlugin/JwPlayerPlugin.swift +183 -68
- package/ios/Sources/JwPlayerPlugin/VideosToPlay.swift +1 -0
- package/package.json +3 -2
package/dist/plugin.cjs.js
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
24
|
-
|
|
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(
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
36
|
-
|
|
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(
|
|
39
|
-
|
|
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(
|
|
42
|
-
|
|
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(
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
63
|
-
|
|
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
|
-
|
|
337
|
+
if (this.jwPlayerInstance) {
|
|
338
|
+
return this.jwPlayerInstance.getPlaylist();
|
|
339
|
+
}
|
|
340
|
+
throw new Error('Player not active');
|
|
67
341
|
}
|
|
68
342
|
async resume() {
|
|
69
|
-
|
|
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
|
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -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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"}
|