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