@boldarialblack/multi-stream-player 1.0.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.
@@ -0,0 +1,638 @@
1
+ import { defineComponent as G, openBlock as Q, createBlock as M, createVNode as v, ref as A, reactive as $, watchEffect as ee, onMounted as V, onBeforeUnmount as J, createElementBlock as I, normalizeClass as E, createElementVNode as c, renderSlot as f, unref as y, withDirectives as te, withCtx as m, createTextVNode as P, watch as F, normalizeProps as X, guardReactiveProps as W, createSlots as q, createCommentVNode as O, toDisplayString as R, nextTick as oe } from "vue";
2
+ import j from "hls.js";
3
+ import z from "flv.js";
4
+ import { ElButton as U, ElTooltip as ne, ElSlider as se, ElLoading as ie, ElDialog as ae } from "element-plus";
5
+ class K {
6
+ async init(o) {
7
+ }
8
+ play() {
9
+ }
10
+ pause() {
11
+ }
12
+ destroy() {
13
+ }
14
+ }
15
+ class le extends K {
16
+ constructor(o) {
17
+ super(), this.video = o, this.hls = null;
18
+ }
19
+ async init(o) {
20
+ j.isSupported() ? (this.hls = new j(), this.hls.loadSource(o), this.hls.attachMedia(this.video)) : this.video.src = o;
21
+ }
22
+ play() {
23
+ this.video.play();
24
+ }
25
+ pause() {
26
+ this.video.pause();
27
+ }
28
+ destroy() {
29
+ this.hls && this.hls.destroy();
30
+ }
31
+ }
32
+ class re extends K {
33
+ constructor(o) {
34
+ super(), this.video = o, this.player = null;
35
+ }
36
+ async init(o) {
37
+ z.isSupported() && (this.player = z.createPlayer({ type: "flv", url: o }), this.player.attachMediaElement(this.video), this.player.load());
38
+ }
39
+ play() {
40
+ this.video.play();
41
+ }
42
+ pause() {
43
+ this.video.pause();
44
+ }
45
+ destroy() {
46
+ this.player && (this.player.unload(), this.player.detachMediaElement(), this.player.destroy(), this.player = null);
47
+ }
48
+ }
49
+ class ce extends K {
50
+ constructor(o, e, t = [{ urls: "stun:stun.l.google.com:19302" }]) {
51
+ super(), this.video = o, this.pc = null, this.signaling = e || null, this.iceServers = t, this.bindings = {
52
+ onRemoteDescription: null,
53
+ onIceCandidate: null,
54
+ onTrack: null
55
+ };
56
+ }
57
+ async init(o) {
58
+ if (this.pc = new RTCPeerConnection({
59
+ // 你可以在这里配置 TURN/STUN 服务器
60
+ iceServers: this.iceServers
61
+ }), this.pc.ontrack = (e) => {
62
+ const t = e.streams && e.streams[0] ? e.streams[0] : null;
63
+ t ? (this.video.srcObject = t, typeof this.bindings.onTrack == "function" && this.bindings.onTrack(t)) : e.streams && e.streams.length && (this.video.srcObject = e.streams[0]);
64
+ }, this.pc.onicecandidate = (e) => {
65
+ e.candidate && this.signaling && typeof this.signaling.send == "function" && this.signaling.send({ type: "ice-candidate", candidate: e.candidate });
66
+ }, this.signaling && typeof this.signaling.onMessage == "function" && this.signaling.onMessage(async (e) => {
67
+ if (!(!e || !e.type))
68
+ switch (e.type) {
69
+ case "remote-description":
70
+ {
71
+ const t = new RTCSessionDescription(e.description);
72
+ if (await this.pc.setRemoteDescription(t), t.type === "offer") {
73
+ const l = await this.pc.createAnswer();
74
+ await this.pc.setLocalDescription(l), this.signaling.send({ type: "answer", description: this.pc.localDescription });
75
+ }
76
+ }
77
+ break;
78
+ case "ice-candidate":
79
+ try {
80
+ await this.pc.addIceCandidate(new RTCIceCandidate(e.candidate));
81
+ } catch (t) {
82
+ console.warn("Failed to add ICE candidate:", t);
83
+ }
84
+ break;
85
+ }
86
+ }), o) {
87
+ const e = await this.pc.createOffer({ offerToReceiveVideo: !0 });
88
+ await this.pc.setLocalDescription(e);
89
+ try {
90
+ const l = await (await fetch(o, {
91
+ method: "POST",
92
+ headers: { "Content-Type": "application/sdp" },
93
+ body: e.sdp
94
+ })).text();
95
+ await this.pc.setRemoteDescription({ type: "answer", sdp: l });
96
+ } catch (t) {
97
+ console.error("WebRTC init remote description failed:", t);
98
+ }
99
+ }
100
+ }
101
+ // 通过显式的信令发送 remote description(若使用外部信令渠道)
102
+ async setRemoteDescription(o) {
103
+ if (!this.pc)
104
+ throw new Error("RTCPeerConnection is not initialized");
105
+ await this.pc.setRemoteDescription(o);
106
+ }
107
+ // 提供给外部调用,主动添加本地音视频轨(若需要)
108
+ addTrack(o, e) {
109
+ if (!this.pc)
110
+ throw new Error("RTCPeerConnection is not initialized");
111
+ if (e)
112
+ e.addTrack(o);
113
+ else if (o) {
114
+ const t = this.video.srcObject || new MediaStream();
115
+ t.addTrack(o), this.video.srcObject = t;
116
+ }
117
+ }
118
+ play() {
119
+ this.video.play().catch(() => {
120
+ });
121
+ }
122
+ pause() {
123
+ this.video.pause();
124
+ }
125
+ // 清理资源
126
+ destroy() {
127
+ if (this.pc) {
128
+ try {
129
+ this.pc.close();
130
+ } catch {
131
+ }
132
+ this.pc = null;
133
+ }
134
+ this.signaling && typeof this.signaling.close == "function" && this.signaling.close(), this.video && (this.video.srcObject = null);
135
+ }
136
+ // 可选:绑定外部信令事件监听器
137
+ bindSignalingHandlers({ onRemoteDescription: o, onIceCandidate: e, onTrack: t } = {}) {
138
+ typeof o == "function" && (this.bindings.onRemoteDescription = o), typeof e == "function" && (this.bindings.onIceCandidate = e), typeof t == "function" && (this.bindings.onTrack = t);
139
+ }
140
+ }
141
+ function de(n) {
142
+ return {
143
+ info: (...o) => console.log(`[${n}]`, ...o),
144
+ error: (...o) => console.error(`[${n}]`, ...o)
145
+ };
146
+ }
147
+ const ue = "data:image/png;base64,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", pe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAABCcAAAQnAEmzTo0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGCSURBVHgB7Vchd8IwEP7KQ63TxU+DLh6Pr5/Hr5pp9ivq8fPzoDfNsOts91172QJvtGmzDgTfe/eaprl8yeUudwXOhMA0iqII+ZhTxugHe0oWBMHum5ikER9Lygj94p2yIHk+1I7EIn2h5NqeUkJV2MANY53L1gl1LtmgWDUzxJEh5WoezQxqiQlly/4nOIA6CyXe2TrsT/mIdWEYHOl9oiU4YUJZUeYNQz/slyE8oA6Z6OstZe2qO4AHxEnwc47PLVT9dqzkKXc+MmGCaufexG+onCvWM8xPDeR3cRpxRnMP7OFBLGc2QxUO93CHLDCrG1B7xjRfGfBwj2Ho2NQy/a9oPGMlT/HH8PLqK/GV+CKJG8OJN9IdqgukFRiGm87Emltn6ADqHuT2YzSZ2unCP4Ha3F67Y654yZVP0B45dV/RlVjJ29zTzriYcLpBfzjwF2PqLaqEP+WZPqAm4XeEhGOs7bJAMAW9fFjhfwr6MlfbvzBStkjFGKEfiFXXWiCeD19pa3LqeLh36gAAAABJRU5ErkJggg==", Ae = {
148
+ beforeMount(n, o) {
149
+ n.__clickOutsideHandler__ = (e) => {
150
+ !n.contains(e.target) && typeof o.value == "function" && o.value(e);
151
+ }, document.addEventListener("mousedown", n.__clickOutsideHandler__);
152
+ },
153
+ unmounted(n) {
154
+ document.removeEventListener("mousedown", n.__clickOutsideHandler__), n.__clickOutsideHandler__ = null;
155
+ }
156
+ };
157
+ var S = G({
158
+ name: "Setting"
159
+ });
160
+ const ge = {
161
+ xmlns: "http://www.w3.org/2000/svg",
162
+ viewBox: "0 0 1024 1024"
163
+ }, Ce = /* @__PURE__ */ v("path", {
164
+ fill: "currentColor",
165
+ d: "M600.704 64a32 32 0 0 1 30.464 22.208l35.2 109.376c14.784 7.232 28.928 15.36 42.432 24.512l112.384-24.192a32 32 0 0 1 34.432 15.36L944.32 364.8a32 32 0 0 1-4.032 37.504l-77.12 85.12a357.12 357.12 0 0 1 0 49.024l77.12 85.248a32 32 0 0 1 4.032 37.504l-88.704 153.6a32 32 0 0 1-34.432 15.296L708.8 803.904c-13.44 9.088-27.648 17.28-42.368 24.512l-35.264 109.376A32 32 0 0 1 600.704 960H423.296a32 32 0 0 1-30.464-22.208L357.696 828.48a351.616 351.616 0 0 1-42.56-24.64l-112.32 24.256a32 32 0 0 1-34.432-15.36L79.68 659.2a32 32 0 0 1 4.032-37.504l77.12-85.248a357.12 357.12 0 0 1 0-48.896l-77.12-85.248A32 32 0 0 1 79.68 364.8l88.704-153.6a32 32 0 0 1 34.432-15.296l112.32 24.256c13.568-9.152 27.776-17.408 42.56-24.64l35.2-109.312A32 32 0 0 1 423.232 64H600.64zm-23.424 64H446.72l-36.352 113.088-24.512 11.968a294.113 294.113 0 0 0-34.816 20.096l-22.656 15.36-116.224-25.088-65.28 113.152 79.68 88.192-1.92 27.136a293.12 293.12 0 0 0 0 40.192l1.92 27.136-79.808 88.192 65.344 113.152 116.224-25.024 22.656 15.296a294.113 294.113 0 0 0 34.816 20.096l24.512 11.968L446.72 896h130.688l36.48-113.152 24.448-11.904a288.282 288.282 0 0 0 34.752-20.096l22.592-15.296 116.288 25.024 65.28-113.152-79.744-88.192 1.92-27.136a293.12 293.12 0 0 0 0-40.256l-1.92-27.136 79.808-88.128-65.344-113.152-116.288 24.96-22.592-15.232a287.616 287.616 0 0 0-34.752-20.096l-24.448-11.904L577.344 128zM512 320a192 192 0 1 1 0 384 192 192 0 0 1 0-384zm0 64a128 128 0 1 0 0 256 128 128 0 0 0 0-256z"
166
+ }, null, -1);
167
+ function he(n, o, e, t, l, a) {
168
+ return Q(), M("svg", ge, [
169
+ Ce
170
+ ]);
171
+ }
172
+ S.render = he;
173
+ S.__file = "packages/components/Setting.vue";
174
+ const ye = S;
175
+ var Y = G({
176
+ name: "ZoomIn"
177
+ });
178
+ const ve = {
179
+ xmlns: "http://www.w3.org/2000/svg",
180
+ viewBox: "0 0 1024 1024"
181
+ }, fe = /* @__PURE__ */ v("path", {
182
+ fill: "currentColor",
183
+ d: "m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704zm-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64h96z"
184
+ }, null, -1);
185
+ function me(n, o, e, t, l, a) {
186
+ return Q(), M("svg", ve, [
187
+ fe
188
+ ]);
189
+ }
190
+ Y.render = me;
191
+ Y.__file = "packages/components/ZoomIn.vue";
192
+ const we = Y;
193
+ var k = G({
194
+ name: "ZoomOut"
195
+ });
196
+ const Qe = {
197
+ xmlns: "http://www.w3.org/2000/svg",
198
+ viewBox: "0 0 1024 1024"
199
+ }, Be = /* @__PURE__ */ v("path", {
200
+ fill: "currentColor",
201
+ d: "m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704zM352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64z"
202
+ }, null, -1);
203
+ function Ee(n, o, e, t, l, a) {
204
+ return Q(), M("svg", Qe, [
205
+ Be
206
+ ]);
207
+ }
208
+ k.render = Ee;
209
+ k.__file = "packages/components/ZoomOut.vue";
210
+ const Ie = k;
211
+ const Ue = { class: "trigger-btn" }, Fe = { class: "controller" }, Me = { class: "controller-content" }, De = { class: "header" }, Oe = { class: "operation" }, xe = ["src"], Le = { class: "cockpit-container" }, Te = { class: "cockpit-wrapper" }, Ge = ["src"], Ke = { class: "block" }, Se = { class: "block" }, Ye = {
212
+ name: "StreamPlayerControls"
213
+ }, L = /* @__PURE__ */ Object.assign(Ye, {
214
+ props: {
215
+ playControlStart: {
216
+ type: Function,
217
+ default: () => {
218
+ }
219
+ },
220
+ playControlStop: {
221
+ type: Function,
222
+ default: () => {
223
+ }
224
+ },
225
+ setPerspective: {
226
+ type: Function,
227
+ default: () => {
228
+ }
229
+ },
230
+ savePerspective: {
231
+ type: Function,
232
+ default: () => {
233
+ }
234
+ }
235
+ },
236
+ setup(n) {
237
+ const o = Ae, e = n, t = A(5), l = $({
238
+ 1: "慢",
239
+ 7: "快"
240
+ }), a = A(""), B = A(!1), u = A(!0);
241
+ ee(() => {
242
+ }), V(() => {
243
+ }), J(() => {
244
+ a.value && e.playControlStop({
245
+ command: a.value,
246
+ speed: t.value
247
+ });
248
+ });
249
+ function d(g) {
250
+ a.value = g, e.playControlStart({
251
+ command: g,
252
+ speed: t.value
253
+ });
254
+ }
255
+ function p() {
256
+ e.playControlStop({
257
+ command: a.value,
258
+ speed: t.value
259
+ });
260
+ }
261
+ function w(g) {
262
+ B.value = g === 2, e.setPerspective({
263
+ type: g
264
+ });
265
+ }
266
+ function i() {
267
+ e.savePerspective();
268
+ }
269
+ return (g, s) => (Q(), I("div", {
270
+ class: E(["player-controls", { "is-collapsed": u.value }])
271
+ }, [
272
+ c("div", {
273
+ class: "controller-trigger",
274
+ onClick: s[0] || (s[0] = (C) => {
275
+ u.value = !u.value;
276
+ })
277
+ }, [
278
+ f(g.$slots, "controller-trigger", {}, () => [
279
+ c("div", Ue, [
280
+ v(y(ye))
281
+ ])
282
+ ])
283
+ ]),
284
+ te((Q(), I("div", Fe, [
285
+ f(g.$slots, "controller-panel", {}, () => [
286
+ c("div", Me, [
287
+ c("div", De, [
288
+ c("div", Oe, [
289
+ v(y(U), {
290
+ type: "primary",
291
+ size: "small",
292
+ onClick: s[1] || (s[1] = (C) => w(1))
293
+ }, {
294
+ default: m(() => [...s[10] || (s[10] = [
295
+ P("当前画面", -1)
296
+ ])]),
297
+ _: 1
298
+ }),
299
+ v(y(U), {
300
+ type: "primary",
301
+ size: "small",
302
+ onClick: s[2] || (s[2] = (C) => w(2))
303
+ }, {
304
+ default: m(() => [...s[11] || (s[11] = [
305
+ P("布防画面", -1)
306
+ ])]),
307
+ _: 1
308
+ })
309
+ ]),
310
+ v(y(ne), {
311
+ content: "存为默认画面",
312
+ placement: "top"
313
+ }, {
314
+ default: m(() => [
315
+ c("img", {
316
+ class: "save-icon cursor-pointer",
317
+ src: y(pe),
318
+ onClick: i
319
+ }, null, 8, xe)
320
+ ]),
321
+ _: 1
322
+ })
323
+ ]),
324
+ c("div", Le, [
325
+ c("div", Te, [
326
+ c("img", {
327
+ class: "cockpit-bg",
328
+ src: y(ue)
329
+ }, null, 8, Ge),
330
+ c("div", {
331
+ class: E(["up cockpit-btn", { "is-active": a.value === "TILT_UP" }]),
332
+ onMousedown: s[3] || (s[3] = (C) => d("TILT_UP")),
333
+ onMouseup: p
334
+ }, null, 34),
335
+ c("div", {
336
+ class: E(["down cockpit-btn", { "is-active": a.value === "TILT_DOWN" }]),
337
+ onMousedown: s[4] || (s[4] = (C) => d("TILT_DOWN")),
338
+ onMouseup: p
339
+ }, null, 34),
340
+ c("div", {
341
+ class: E(["left cockpit-btn", { "is-active": a.value === "PAN_LEFT" }]),
342
+ onMousedown: s[5] || (s[5] = (C) => d("PAN_LEFT")),
343
+ onMouseup: p
344
+ }, null, 34),
345
+ c("div", {
346
+ class: E(["right cockpit-btn", { "is-active": a.value === "PAN_RIGHT" }]),
347
+ onMousedown: s[6] || (s[6] = (C) => d("PAN_RIGHT")),
348
+ onMouseup: p
349
+ }, null, 34)
350
+ ])
351
+ ]),
352
+ c("div", Ke, [
353
+ s[12] || (s[12] = c("div", { class: "description" }, "云台转速", -1)),
354
+ v(y(se), {
355
+ modelValue: t.value,
356
+ "onUpdate:modelValue": s[7] || (s[7] = (C) => t.value = C),
357
+ min: 1,
358
+ max: 7,
359
+ "show-stops": "",
360
+ marks: l,
361
+ style: { "margin-top": "-8px", "margin-bottom": "18px" }
362
+ }, null, 8, ["modelValue", "marks"])
363
+ ]),
364
+ c("div", Se, [
365
+ s[13] || (s[13] = c("div", { class: "description" }, "画面缩放", -1)),
366
+ v(y(U), {
367
+ icon: y(we),
368
+ circle: "",
369
+ onMousedown: s[8] || (s[8] = (C) => d("ZOOM_IN")),
370
+ onMouseup: p
371
+ }, null, 8, ["icon"]),
372
+ v(y(U), {
373
+ icon: y(Ie),
374
+ circle: "",
375
+ onMousedown: s[9] || (s[9] = (C) => d("ZOOM_OUT")),
376
+ onMouseup: p
377
+ }, null, 8, ["icon"])
378
+ ])
379
+ ])
380
+ ])
381
+ ])), [
382
+ [y(o), () => u.value = !0]
383
+ ])
384
+ ], 2));
385
+ }
386
+ });
387
+ const ke = (n, o) => {
388
+ const e = n.__vccOpts || n;
389
+ for (const [t, l] of o)
390
+ e[t] = l;
391
+ return e;
392
+ }, be = ["autoplay"], He = { class: "video-overlay" }, Pe = {
393
+ key: 1,
394
+ class: "status-overlay"
395
+ }, Re = {
396
+ key: 2,
397
+ class: "status-overlay error"
398
+ }, je = {
399
+ name: "StreamPlayer"
400
+ }, ze = /* @__PURE__ */ Object.assign(je, {
401
+ props: {
402
+ src: { type: String, required: !0 },
403
+ protocol: { type: String, default: "hls" },
404
+ autoplay: { type: Boolean, default: !1 },
405
+ showControls: { type: Boolean, default: !0 },
406
+ fitMode: {
407
+ type: String,
408
+ default: "contain"
409
+ // 'contain' | 'fill' | 'cover'
410
+ },
411
+ reconnect: { type: Boolean, default: !0 },
412
+ // 自动重连开关
413
+ maxRetries: { type: Number, default: 3 },
414
+ // 最大重试次数
415
+ retryDelay: { type: Number, default: 3e3 },
416
+ // 每次重试间隔
417
+ beforeInit: { type: Function, default: () => {
418
+ } }
419
+ },
420
+ emits: [
421
+ "init",
422
+ // 播放器初始化
423
+ "loaded",
424
+ // 视频加载完毕
425
+ "play",
426
+ // 开始播放
427
+ "pause",
428
+ // 暂停播放
429
+ "error",
430
+ // 播放错误
431
+ "destroy"
432
+ // 销毁
433
+ ],
434
+ setup(n, { expose: o, emit: e }) {
435
+ const t = n, l = e, a = A(null), B = A(null), u = A(null), d = A(!1), p = A(!1), w = A(!1), i = A(0), g = de("VideoPlayer");
436
+ function s(r, h) {
437
+ switch (r) {
438
+ case "flv":
439
+ return new re(h);
440
+ case "webrtc":
441
+ return new ce(h);
442
+ case "hls":
443
+ default:
444
+ return new le(h);
445
+ }
446
+ }
447
+ async function C() {
448
+ if (!(!a.value || !t.src)) {
449
+ H(), p.value = !0, w.value = !1;
450
+ try {
451
+ u.value = s(t.protocol, a.value), t.beforeInit && await t.beforeInit(), await u.value.init(t.src), l("init", { protocol: t.protocol });
452
+ const r = a.value;
453
+ r && (r.addEventListener("loadeddata", () => l("loaded")), r.addEventListener("playing", () => l("play")), r.addEventListener("pause", () => l("pause")), r.addEventListener("error", (h) => b(h))), t.autoplay && (await u.value.play(), d.value = !0), p.value = !1, i.value = 0;
454
+ } catch (r) {
455
+ b(r);
456
+ }
457
+ }
458
+ }
459
+ function b(r) {
460
+ g.error("Playback error:", r), l("error", r), w.value = !0, p.value = !1, t.reconnect && i.value < t.maxRetries ? (i.value++, setTimeout(async () => {
461
+ l("reconnect", { attempt: i.value }), await oe(), await C();
462
+ }, t.retryDelay)) : g.warn("Max retry reached or reconnect disabled");
463
+ }
464
+ function Z() {
465
+ u.value && (d.value ? (u.value.pause(), l("pause")) : (u.value.play(), l("play")), d.value = !d.value);
466
+ }
467
+ function N() {
468
+ const r = a.value;
469
+ if (!r)
470
+ return;
471
+ const h = document.createElement("canvas");
472
+ h.width = r.videoWidth, h.height = r.videoHeight, h.getContext("2d").drawImage(r, 0, 0, h.width, h.height);
473
+ const _ = h.toDataURL("image/png"), D = document.createElement("a");
474
+ D.href = _, D.download = "snapshot.png", D.click();
475
+ }
476
+ function H() {
477
+ u.value && (u.value.destroy(), l("destroy"), u.value = null, d.value = !1);
478
+ }
479
+ return F(() => t.src, C), V(C), J(H), o({
480
+ togglePlay: Z,
481
+ screenshot: N
482
+ }), (r, h) => (Q(), I("div", {
483
+ class: "video-player",
484
+ ref_key: "container",
485
+ ref: B
486
+ }, [
487
+ c("video", {
488
+ ref_key: "videoRef",
489
+ ref: a,
490
+ class: E([n.fitMode, "video-element"]),
491
+ autoplay: n.autoplay,
492
+ playsinline: "",
493
+ controls: ""
494
+ }, null, 10, be),
495
+ c("div", He, [
496
+ f(r.$slots, "overlay", {}, void 0, !0)
497
+ ]),
498
+ n.showControls ? f(r.$slots, "controller", { key: 0 }, () => [
499
+ v(L, X(W(r.$attrs)), q({ _: 2 }, [
500
+ r.$slots["controller-trigger"] ? {
501
+ name: "controller-trigger",
502
+ fn: m(() => [
503
+ f(r.$slots, "controller-trigger", {}, void 0, !0)
504
+ ]),
505
+ key: "0"
506
+ } : void 0,
507
+ r.$slots["controller-panel"] ? {
508
+ name: "controller-panel",
509
+ fn: m(() => [
510
+ f(r.$slots, "controller-panel", {}, void 0, !0)
511
+ ]),
512
+ key: "1"
513
+ } : void 0
514
+ ]), 1040)
515
+ ], !0) : O("", !0),
516
+ p.value ? (Q(), I("div", Pe, "加载中...")) : O("", !0),
517
+ w.value ? (Q(), I("div", Re, "连接错误,正在重试(" + R(i.value) + "/" + R(n.maxRetries) + ")...", 1)) : O("", !0)
518
+ ], 512));
519
+ }
520
+ }), T = /* @__PURE__ */ ke(ze, [["__scopeId", "data-v-3ced781c"]]);
521
+ const Ve = { class: "dialog-content-wrapper" }, Je = { class: "stream-player-wrapper" }, Xe = {
522
+ name: "StreamPlayerDialog"
523
+ }, x = /* @__PURE__ */ Object.assign(Xe, {
524
+ props: {
525
+ value: Boolean,
526
+ title: {
527
+ type: String,
528
+ default: ""
529
+ },
530
+ dialogClass: {
531
+ type: String,
532
+ default: ""
533
+ },
534
+ onOpen: Function,
535
+ onClose: Function,
536
+ beforeClose: Function
537
+ },
538
+ emits: ["update:value"],
539
+ setup(n, { expose: o, emit: e }) {
540
+ const t = n, l = e, a = A(t.value), B = A(!1), u = A(!1), d = A();
541
+ F(
542
+ () => t.value,
543
+ (i) => {
544
+ a.value = i;
545
+ }
546
+ ), F(a, (i) => {
547
+ l("update:value", i);
548
+ }), F(u, (i) => {
549
+ i ? d.value = ie.service({
550
+ target: ".stream-player-wrapper"
551
+ }) : d.value && d.value.close();
552
+ });
553
+ function p() {
554
+ a.value = !0, B.value = !0, typeof t.onOpen == "function" && t.onOpen();
555
+ }
556
+ function w(i) {
557
+ a.value = !1, typeof t.beforeClose == "function" && t.beforeClose(), B.value && l("update:value", !1), typeof i == "function" && i();
558
+ }
559
+ return o({
560
+ open: p,
561
+ close: w
562
+ }), (i, g) => (Q(), M(y(ae), {
563
+ visible: a.value,
564
+ "onUpdate:visible": g[0] || (g[0] = (s) => a.value = s),
565
+ "before-close": w,
566
+ "append-to-body": !0,
567
+ class: E([n.dialogClass, "stream-player-dialog"]),
568
+ top: "3vh",
569
+ width: "90vw",
570
+ modal: "",
571
+ "destroy-on-close": "",
572
+ onOpen: n.onOpen,
573
+ onClose: n.onClose
574
+ }, {
575
+ default: m(() => [
576
+ c("div", Ve, [
577
+ c("div", Je, [
578
+ v(T, X(W(i.$attrs)), q({ _: 2 }, [
579
+ i.$slots.overlay ? {
580
+ name: "overlay",
581
+ fn: m(() => [
582
+ f(i.$slots, "overlay")
583
+ ]),
584
+ key: "0"
585
+ } : void 0,
586
+ i.$slots.controller ? {
587
+ name: "controller",
588
+ fn: m(() => [
589
+ f(i.$slots, "controller")
590
+ ]),
591
+ key: "1"
592
+ } : void 0,
593
+ i.$slots["controller-trigger"] ? {
594
+ name: "controller-trigger",
595
+ fn: m(() => [
596
+ f(i.$slots, "controller-trigger")
597
+ ]),
598
+ key: "2"
599
+ } : void 0,
600
+ i.$slots["controller-panel"] ? {
601
+ name: "controller-panel",
602
+ fn: m(() => [
603
+ f(i.$slots, "controller-panel")
604
+ ]),
605
+ key: "3"
606
+ } : void 0
607
+ ]), 1040)
608
+ ]),
609
+ f(i.$slots, "dialog-content")
610
+ ])
611
+ ]),
612
+ _: 3
613
+ }, 8, ["visible", "class", "onOpen", "onClose"]));
614
+ }
615
+ }), $e = {
616
+ install(n) {
617
+ n.component(T.name, T), n.component(L.name, L);
618
+ const o = n.extend(x), e = new o();
619
+ document.body.appendChild(e.$mount().$el), n.component(x.name, x), n.prototype.$streamPlayer = {
620
+ open({ title: t, dialogClass: l, onOpen: a, onClose: B, beforeClose: u, ...d }) {
621
+ e.title = t, e.value = !0, e.dialogClass = l, e.onOpen = a, e.onClose = B, e.beforeClose = u;
622
+ for (let p in d)
623
+ e[p] = d[p];
624
+ return e.open(), e;
625
+ },
626
+ close() {
627
+ e.close();
628
+ }
629
+ };
630
+ }
631
+ };
632
+ export {
633
+ T as StreamPlayer,
634
+ L as StreamPlayerControls,
635
+ x as StreamPlayerDialog,
636
+ $e as default
637
+ };
638
+ //# sourceMappingURL=stream-player.js.map