@scalemule/gallop 0.0.1
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/LICENSE +21 -0
- package/README.md +201 -0
- package/dist/EventEmitter-CiUv3YL_.d.cts +12 -0
- package/dist/EventEmitter-CkfpgRij.d.ts +12 -0
- package/dist/chunk-2JQGJ7NX.cjs +40 -0
- package/dist/chunk-PKRNWEEX.cjs +265 -0
- package/dist/chunk-QTV4W7FA.js +2886 -0
- package/dist/chunk-SQPWH6EI.js +38 -0
- package/dist/chunk-UFFGSURS.js +263 -0
- package/dist/chunk-VCNMR5AB.cjs +2893 -0
- package/dist/element.cjs +342 -0
- package/dist/element.d.cts +38 -0
- package/dist/element.d.ts +38 -0
- package/dist/element.js +340 -0
- package/dist/gallop.embed.global.js +568 -0
- package/dist/gallop.umd.global.js +568 -0
- package/dist/iframe.cjs +11 -0
- package/dist/iframe.d.cts +50 -0
- package/dist/iframe.d.ts +50 -0
- package/dist/iframe.js +2 -0
- package/dist/index.cjs +11 -0
- package/dist/index.d.cts +74 -0
- package/dist/index.d.ts +74 -0
- package/dist/index.js +2 -0
- package/dist/react.cjs +77 -0
- package/dist/react.d.cts +34 -0
- package/dist/react.d.ts +34 -0
- package/dist/react.js +74 -0
- package/dist/types-D9Oqcpr1.d.cts +235 -0
- package/dist/types-D9Oqcpr1.d.ts +235 -0
- package/package.json +93 -0
package/dist/element.js
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { GALLOP_VERSION, GallopPlayerCore } from './chunk-QTV4W7FA.js';
|
|
2
|
+
import { GallopIframeController } from './chunk-UFFGSURS.js';
|
|
3
|
+
import { EventEmitter } from './chunk-SQPWH6EI.js';
|
|
4
|
+
|
|
5
|
+
// src/core/GallopPlayerProxy.ts
|
|
6
|
+
var GallopPlayerProxy = class extends EventEmitter {
|
|
7
|
+
constructor(container, config) {
|
|
8
|
+
super();
|
|
9
|
+
this.container = container;
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.isSwapping = false;
|
|
12
|
+
this.backend = new GallopPlayerCore(container, config);
|
|
13
|
+
this.setupListeners();
|
|
14
|
+
this.backend.on("error", (err) => {
|
|
15
|
+
if (err.code === "CSP_BLOCKED" && !this.isSwapping) {
|
|
16
|
+
this.fallbackToIframe();
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
setupListeners() {
|
|
21
|
+
const events = [
|
|
22
|
+
"ready",
|
|
23
|
+
"play",
|
|
24
|
+
"pause",
|
|
25
|
+
"ended",
|
|
26
|
+
"timeupdate",
|
|
27
|
+
"volumechange",
|
|
28
|
+
"qualitychange",
|
|
29
|
+
"qualitylevels",
|
|
30
|
+
"buffering",
|
|
31
|
+
"seeked",
|
|
32
|
+
"ratechange",
|
|
33
|
+
"fullscreenchange",
|
|
34
|
+
"statuschange",
|
|
35
|
+
"error",
|
|
36
|
+
"destroy"
|
|
37
|
+
];
|
|
38
|
+
events.forEach((event) => {
|
|
39
|
+
this.backend.on(event, (data) => {
|
|
40
|
+
this.emit(event, data);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
fallbackToIframe() {
|
|
45
|
+
this.isSwapping = true;
|
|
46
|
+
console.warn("[Gallop] CSP blocked inline player, falling back to iframe mode");
|
|
47
|
+
this.emit("error", {
|
|
48
|
+
code: "BACKEND_SWITCHED",
|
|
49
|
+
message: "Player backend switched from inline to iframe"
|
|
50
|
+
});
|
|
51
|
+
this.backend.destroy();
|
|
52
|
+
this.backend = new GallopIframeController(this.container, this.config);
|
|
53
|
+
this.setupListeners();
|
|
54
|
+
this.emit("system:modefallback", { mode: "iframe" });
|
|
55
|
+
this.isSwapping = false;
|
|
56
|
+
}
|
|
57
|
+
// --- Delegate GallopPlayer Implementation ---
|
|
58
|
+
get currentTime() {
|
|
59
|
+
return this.backend.currentTime;
|
|
60
|
+
}
|
|
61
|
+
get duration() {
|
|
62
|
+
return this.backend.duration;
|
|
63
|
+
}
|
|
64
|
+
get paused() {
|
|
65
|
+
return this.backend.paused;
|
|
66
|
+
}
|
|
67
|
+
get status() {
|
|
68
|
+
return this.backend.status;
|
|
69
|
+
}
|
|
70
|
+
get isFullscreen() {
|
|
71
|
+
return this.backend.isFullscreen;
|
|
72
|
+
}
|
|
73
|
+
get volume() {
|
|
74
|
+
return this.backend.volume;
|
|
75
|
+
}
|
|
76
|
+
set volume(v) {
|
|
77
|
+
this.backend.volume = v;
|
|
78
|
+
}
|
|
79
|
+
get muted() {
|
|
80
|
+
return this.backend.muted;
|
|
81
|
+
}
|
|
82
|
+
set muted(m) {
|
|
83
|
+
this.backend.muted = m;
|
|
84
|
+
}
|
|
85
|
+
get playbackRate() {
|
|
86
|
+
return this.backend.playbackRate;
|
|
87
|
+
}
|
|
88
|
+
set playbackRate(r) {
|
|
89
|
+
this.backend.playbackRate = r;
|
|
90
|
+
}
|
|
91
|
+
play() {
|
|
92
|
+
return this.backend.play();
|
|
93
|
+
}
|
|
94
|
+
pause() {
|
|
95
|
+
return this.backend.pause();
|
|
96
|
+
}
|
|
97
|
+
seek(time) {
|
|
98
|
+
return this.backend.seek(time);
|
|
99
|
+
}
|
|
100
|
+
setQualityLevel(index) {
|
|
101
|
+
return this.backend.setQualityLevel(index);
|
|
102
|
+
}
|
|
103
|
+
setAutoQuality() {
|
|
104
|
+
return this.backend.setAutoQuality();
|
|
105
|
+
}
|
|
106
|
+
toggleFullscreen() {
|
|
107
|
+
return this.backend.toggleFullscreen();
|
|
108
|
+
}
|
|
109
|
+
getQualityLevels() {
|
|
110
|
+
return this.backend.getQualityLevels();
|
|
111
|
+
}
|
|
112
|
+
getCurrentQuality() {
|
|
113
|
+
return this.backend.getCurrentQuality();
|
|
114
|
+
}
|
|
115
|
+
getDiagnostics() {
|
|
116
|
+
return this.backend.getDiagnostics();
|
|
117
|
+
}
|
|
118
|
+
query(key) {
|
|
119
|
+
return this.backend.query(key);
|
|
120
|
+
}
|
|
121
|
+
destroy() {
|
|
122
|
+
this.backend.destroy();
|
|
123
|
+
this.removeAllListeners();
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// src/factory.ts
|
|
128
|
+
var Gallop = {
|
|
129
|
+
/**
|
|
130
|
+
* Creates an inline player instance.
|
|
131
|
+
*/
|
|
132
|
+
createInline(container, config) {
|
|
133
|
+
return new GallopPlayerCore(container, config);
|
|
134
|
+
},
|
|
135
|
+
/**
|
|
136
|
+
* Creates an iframe-based player instance.
|
|
137
|
+
*/
|
|
138
|
+
createIframe(container, config) {
|
|
139
|
+
return new GallopIframeController(container, config);
|
|
140
|
+
},
|
|
141
|
+
/**
|
|
142
|
+
* Unified factory for Gallop Player.
|
|
143
|
+
* Supports 'inline', 'iframe', and 'auto' modes.
|
|
144
|
+
*/
|
|
145
|
+
create(container, config) {
|
|
146
|
+
const mode = config.mode || "inline";
|
|
147
|
+
switch (mode) {
|
|
148
|
+
case "iframe":
|
|
149
|
+
return this.createIframe(container, config);
|
|
150
|
+
case "inline":
|
|
151
|
+
return this.createInline(container, config);
|
|
152
|
+
case "auto":
|
|
153
|
+
return new GallopPlayerProxy(container, config);
|
|
154
|
+
default:
|
|
155
|
+
console.warn(`[Gallop] Unknown mode: ${mode}, falling back to inline`);
|
|
156
|
+
return this.createInline(container, config);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
version: GALLOP_VERSION
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// src/element.ts
|
|
163
|
+
var OBSERVED_ATTRS = [
|
|
164
|
+
"video-id",
|
|
165
|
+
"api-key",
|
|
166
|
+
"embed-token",
|
|
167
|
+
"mode",
|
|
168
|
+
"src",
|
|
169
|
+
"poster",
|
|
170
|
+
"autoplay",
|
|
171
|
+
"muted",
|
|
172
|
+
"loop",
|
|
173
|
+
"controls",
|
|
174
|
+
"aspect-ratio",
|
|
175
|
+
"nonce",
|
|
176
|
+
"debug"
|
|
177
|
+
];
|
|
178
|
+
var GallopPlayerElement = class extends HTMLElement {
|
|
179
|
+
constructor() {
|
|
180
|
+
super(...arguments);
|
|
181
|
+
this.player = null;
|
|
182
|
+
this.shadowContainer = null;
|
|
183
|
+
}
|
|
184
|
+
static get observedAttributes() {
|
|
185
|
+
return [...OBSERVED_ATTRS];
|
|
186
|
+
}
|
|
187
|
+
connectedCallback() {
|
|
188
|
+
if (this.player) return;
|
|
189
|
+
const shadow = this.attachShadow({ mode: "open" });
|
|
190
|
+
this.shadowContainer = document.createElement("div");
|
|
191
|
+
this.shadowContainer.style.width = "100%";
|
|
192
|
+
this.shadowContainer.style.height = "100%";
|
|
193
|
+
shadow.appendChild(this.shadowContainer);
|
|
194
|
+
this.initializePlayer();
|
|
195
|
+
}
|
|
196
|
+
initializePlayer() {
|
|
197
|
+
this.player?.destroy();
|
|
198
|
+
this.player = Gallop.create(this.shadowContainer, this.buildConfig());
|
|
199
|
+
this.bindEvents();
|
|
200
|
+
}
|
|
201
|
+
bindEvents() {
|
|
202
|
+
if (!this.player) return;
|
|
203
|
+
const events = [
|
|
204
|
+
"ready",
|
|
205
|
+
"play",
|
|
206
|
+
"pause",
|
|
207
|
+
"ended",
|
|
208
|
+
"timeupdate",
|
|
209
|
+
"volumechange",
|
|
210
|
+
"qualitychange",
|
|
211
|
+
"qualitylevels",
|
|
212
|
+
"buffering",
|
|
213
|
+
"seeked",
|
|
214
|
+
"ratechange",
|
|
215
|
+
"fullscreenchange",
|
|
216
|
+
"statuschange",
|
|
217
|
+
"error",
|
|
218
|
+
"destroy"
|
|
219
|
+
];
|
|
220
|
+
events.forEach((event) => {
|
|
221
|
+
this.player.on(event, (data) => {
|
|
222
|
+
this.dispatchEvent(new CustomEvent(`gallop-${event}`, {
|
|
223
|
+
detail: data,
|
|
224
|
+
bubbles: false,
|
|
225
|
+
composed: true
|
|
226
|
+
}));
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
disconnectedCallback() {
|
|
231
|
+
this.player?.destroy();
|
|
232
|
+
this.player = null;
|
|
233
|
+
}
|
|
234
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
235
|
+
if (oldValue === newValue || !this.player) return;
|
|
236
|
+
const triggerReinit = ["video-id", "api-key", "embed-token", "mode", "src"];
|
|
237
|
+
if (triggerReinit.includes(name)) {
|
|
238
|
+
this.initializePlayer();
|
|
239
|
+
} else {
|
|
240
|
+
this.updatePlayerProperty(name, newValue);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
updatePlayerProperty(name, value) {
|
|
244
|
+
if (!this.player) return;
|
|
245
|
+
switch (name) {
|
|
246
|
+
case "muted":
|
|
247
|
+
this.player.muted = value !== null;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
buildConfig() {
|
|
252
|
+
const config = {};
|
|
253
|
+
config.videoId = this.getAttribute("video-id") || void 0;
|
|
254
|
+
config.apiKey = this.getAttribute("api-key") || void 0;
|
|
255
|
+
config.embedToken = this.getAttribute("embed-token") || void 0;
|
|
256
|
+
config.mode = this.getAttribute("mode") || "inline";
|
|
257
|
+
config.src = this.getAttribute("src") || void 0;
|
|
258
|
+
config.poster = this.getAttribute("poster") || void 0;
|
|
259
|
+
config.autoplay = this.hasAttribute("autoplay");
|
|
260
|
+
config.muted = this.hasAttribute("muted");
|
|
261
|
+
config.loop = this.hasAttribute("loop");
|
|
262
|
+
config.controls = !this.hasAttribute("no-controls");
|
|
263
|
+
config.aspectRatio = this.getAttribute("aspect-ratio") || void 0;
|
|
264
|
+
config.nonce = this.getAttribute("nonce") || void 0;
|
|
265
|
+
config.debug = this.hasAttribute("debug");
|
|
266
|
+
return config;
|
|
267
|
+
}
|
|
268
|
+
// --- Public API Passthrough ---
|
|
269
|
+
play() {
|
|
270
|
+
return this.player?.play();
|
|
271
|
+
}
|
|
272
|
+
pause() {
|
|
273
|
+
return this.player?.pause();
|
|
274
|
+
}
|
|
275
|
+
seek(time) {
|
|
276
|
+
return this.player?.seek(time);
|
|
277
|
+
}
|
|
278
|
+
setQualityLevel(index) {
|
|
279
|
+
return this.player?.setQualityLevel(index);
|
|
280
|
+
}
|
|
281
|
+
setAutoQuality() {
|
|
282
|
+
return this.player?.setAutoQuality();
|
|
283
|
+
}
|
|
284
|
+
toggleFullscreen() {
|
|
285
|
+
return this.player?.toggleFullscreen();
|
|
286
|
+
}
|
|
287
|
+
getQualityLevels() {
|
|
288
|
+
return this.player?.getQualityLevels() ?? [];
|
|
289
|
+
}
|
|
290
|
+
getCurrentQuality() {
|
|
291
|
+
return this.player?.getCurrentQuality() ?? -1;
|
|
292
|
+
}
|
|
293
|
+
query(key) {
|
|
294
|
+
return this.player?.query(key);
|
|
295
|
+
}
|
|
296
|
+
get currentTime() {
|
|
297
|
+
return this.player?.currentTime ?? 0;
|
|
298
|
+
}
|
|
299
|
+
set currentTime(t) {
|
|
300
|
+
void this.player?.seek(t);
|
|
301
|
+
}
|
|
302
|
+
get duration() {
|
|
303
|
+
return this.player?.duration ?? 0;
|
|
304
|
+
}
|
|
305
|
+
get volume() {
|
|
306
|
+
return this.player?.volume ?? 1;
|
|
307
|
+
}
|
|
308
|
+
set volume(v) {
|
|
309
|
+
if (this.player) this.player.volume = v;
|
|
310
|
+
}
|
|
311
|
+
get muted() {
|
|
312
|
+
return this.player?.muted ?? false;
|
|
313
|
+
}
|
|
314
|
+
set muted(m) {
|
|
315
|
+
if (this.player) this.player.muted = m;
|
|
316
|
+
}
|
|
317
|
+
get playbackRate() {
|
|
318
|
+
return this.player?.playbackRate ?? 1;
|
|
319
|
+
}
|
|
320
|
+
set playbackRate(r) {
|
|
321
|
+
if (this.player) this.player.playbackRate = r;
|
|
322
|
+
}
|
|
323
|
+
get isFullscreen() {
|
|
324
|
+
return this.player?.isFullscreen ?? false;
|
|
325
|
+
}
|
|
326
|
+
get status() {
|
|
327
|
+
return this.player?.status ?? "loading";
|
|
328
|
+
}
|
|
329
|
+
get paused() {
|
|
330
|
+
return this.player?.paused ?? true;
|
|
331
|
+
}
|
|
332
|
+
getDiagnostics() {
|
|
333
|
+
return this.player?.getDiagnostics();
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
if (typeof customElements !== "undefined" && !customElements.get("gallop-player")) {
|
|
337
|
+
customElements.define("gallop-player", GallopPlayerElement);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export { GallopPlayerElement };
|