ts-video-player 0.1.1 → 0.1.3
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/dist/cdn.min.js +76 -76
- package/dist/{chunk-z1ehbz9f.js → chunk-ds1nj487.js} +35 -35
- package/dist/{chunk-36x4yhjn.js → chunk-rhykj0qy.js} +58 -58
- package/dist/{chunk-eajts2jv.js → chunk-yfrrczn9.js} +221 -194
- package/dist/elements/index.js +49 -50
- package/dist/features/index.js +25 -26
- package/dist/index.js +368 -368
- package/dist/plugins/index.js +2143 -15
- package/dist/providers/html5.d.ts +4 -0
- package/dist/providers/youtube.d.ts +4 -0
- package/dist/stx/index.js +4 -4
- package/dist/ui/index.js +730 -11
- package/package.json +3 -5
- package/src/providers/html5.ts +1 -1
- package/src/providers/index.ts +36 -2
- package/src/providers/youtube.ts +18 -5
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from "./chunk-
|
|
2
|
+
StateStore2,
|
|
3
|
+
onFullscreenChange2,
|
|
4
|
+
onPiPChange2,
|
|
5
|
+
createKeyboardHandler2,
|
|
6
|
+
createGestureDetector2,
|
|
7
|
+
detectVolumeAvailability2,
|
|
8
|
+
probeVolumeAvailability2,
|
|
9
|
+
detectFullscreenAvailability2,
|
|
10
|
+
detectPipAvailability2
|
|
11
|
+
} from "./chunk-rhykj0qy.js";
|
|
12
12
|
|
|
13
13
|
// src/features/playback.ts
|
|
14
|
-
var
|
|
14
|
+
var playback2 = {
|
|
15
15
|
name: "playback",
|
|
16
16
|
stateKeys: ["paused", "playing", "ended", "seeking", "waiting", "currentTime", "duration", "playbackRate", "loop", "autoplay", "playbackState"],
|
|
17
17
|
setup(ctx) {
|
|
@@ -72,13 +72,13 @@ var playback = {
|
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
74
|
// src/features/volume.ts
|
|
75
|
-
var
|
|
75
|
+
var volume2 = {
|
|
76
76
|
name: "volume",
|
|
77
77
|
stateKeys: ["volume", "muted", "volumeAvailability"],
|
|
78
78
|
setup(ctx) {
|
|
79
79
|
const { store, getMediaElement } = ctx;
|
|
80
80
|
const media = getMediaElement();
|
|
81
|
-
store.set("volumeAvailability",
|
|
81
|
+
store.set("volumeAvailability", detectVolumeAvailability2(media));
|
|
82
82
|
const onVolumeChange = () => {
|
|
83
83
|
const m = getMediaElement();
|
|
84
84
|
if (m)
|
|
@@ -88,7 +88,7 @@ var volume = {
|
|
|
88
88
|
const m = getMediaElement();
|
|
89
89
|
if (!m)
|
|
90
90
|
return;
|
|
91
|
-
|
|
91
|
+
probeVolumeAvailability2(m).then((availability) => {
|
|
92
92
|
store.set("volumeAvailability", availability);
|
|
93
93
|
});
|
|
94
94
|
};
|
|
@@ -106,21 +106,21 @@ var volume = {
|
|
|
106
106
|
}
|
|
107
107
|
};
|
|
108
108
|
// src/features/fullscreen.ts
|
|
109
|
-
var
|
|
109
|
+
var fullscreen2 = {
|
|
110
110
|
name: "fullscreen",
|
|
111
111
|
stateKeys: ["fullscreen", "fullscreenAvailability", "canFullscreen"],
|
|
112
112
|
setup(ctx) {
|
|
113
113
|
const { store, container, getMediaElement } = ctx;
|
|
114
114
|
const update = () => {
|
|
115
115
|
const video = getMediaElement();
|
|
116
|
-
const availability =
|
|
116
|
+
const availability = detectFullscreenAvailability2(container, video);
|
|
117
117
|
store.batch({
|
|
118
118
|
fullscreenAvailability: availability,
|
|
119
119
|
canFullscreen: availability === "available"
|
|
120
120
|
});
|
|
121
121
|
};
|
|
122
122
|
update();
|
|
123
|
-
const cleanup =
|
|
123
|
+
const cleanup = onFullscreenChange2((fs) => {
|
|
124
124
|
store.set("fullscreen", fs);
|
|
125
125
|
});
|
|
126
126
|
const onMeta = () => update();
|
|
@@ -134,14 +134,14 @@ var fullscreen = {
|
|
|
134
134
|
}
|
|
135
135
|
};
|
|
136
136
|
// src/features/pip.ts
|
|
137
|
-
var
|
|
137
|
+
var pip2 = {
|
|
138
138
|
name: "pip",
|
|
139
139
|
stateKeys: ["pictureInPicture", "pipAvailability", "canPictureInPicture"],
|
|
140
140
|
setup(ctx) {
|
|
141
141
|
const { store, getMediaElement } = ctx;
|
|
142
142
|
const update = () => {
|
|
143
143
|
const video = getMediaElement();
|
|
144
|
-
const availability =
|
|
144
|
+
const availability = detectPipAvailability2(video);
|
|
145
145
|
store.batch({
|
|
146
146
|
pipAvailability: availability,
|
|
147
147
|
canPictureInPicture: availability === "available"
|
|
@@ -151,7 +151,7 @@ var pip = {
|
|
|
151
151
|
let cleanupPiP = null;
|
|
152
152
|
const media = getMediaElement();
|
|
153
153
|
if (media instanceof HTMLVideoElement) {
|
|
154
|
-
cleanupPiP =
|
|
154
|
+
cleanupPiP = onPiPChange2(media, (isPiP) => {
|
|
155
155
|
store.set("pictureInPicture", isPiP);
|
|
156
156
|
});
|
|
157
157
|
}
|
|
@@ -165,17 +165,17 @@ var pip = {
|
|
|
165
165
|
}
|
|
166
166
|
};
|
|
167
167
|
// src/features/captions.ts
|
|
168
|
-
var
|
|
168
|
+
var captions2 = {
|
|
169
169
|
name: "captions",
|
|
170
170
|
stateKeys: ["textTracks"],
|
|
171
171
|
setup(ctx) {
|
|
172
172
|
const { store, getMediaElement } = ctx;
|
|
173
173
|
const syncTracks = () => {
|
|
174
|
-
const
|
|
175
|
-
if (!
|
|
174
|
+
const media = getMediaElement();
|
|
175
|
+
if (!media)
|
|
176
176
|
return;
|
|
177
177
|
const tracks = [];
|
|
178
|
-
const textTracks =
|
|
178
|
+
const textTracks = media.textTracks;
|
|
179
179
|
for (let i = 0;i < textTracks.length; i++) {
|
|
180
180
|
const track = textTracks[i];
|
|
181
181
|
tracks.push({
|
|
@@ -207,7 +207,7 @@ var captions = {
|
|
|
207
207
|
}
|
|
208
208
|
};
|
|
209
209
|
// src/features/quality.ts
|
|
210
|
-
var
|
|
210
|
+
var quality2 = {
|
|
211
211
|
name: "quality",
|
|
212
212
|
stateKeys: ["qualities", "autoQuality"],
|
|
213
213
|
setup(_ctx) {
|
|
@@ -215,7 +215,7 @@ var quality = {
|
|
|
215
215
|
}
|
|
216
216
|
};
|
|
217
217
|
// src/features/keyboard.ts
|
|
218
|
-
var
|
|
218
|
+
var keyboard2 = {
|
|
219
219
|
name: "keyboard",
|
|
220
220
|
setup(ctx) {
|
|
221
221
|
const { container, options } = ctx;
|
|
@@ -286,7 +286,7 @@ var keyboard = {
|
|
|
286
286
|
}
|
|
287
287
|
};
|
|
288
288
|
const config = typeof options.keyboard === "object" ? options.keyboard : {};
|
|
289
|
-
const handler =
|
|
289
|
+
const handler = createKeyboardHandler2(actions, {
|
|
290
290
|
seekStep: config.seekStep,
|
|
291
291
|
volumeStep: config.volumeStep
|
|
292
292
|
});
|
|
@@ -298,13 +298,13 @@ var keyboard = {
|
|
|
298
298
|
}
|
|
299
299
|
};
|
|
300
300
|
// src/features/gestures.ts
|
|
301
|
-
var
|
|
301
|
+
var gestures2 = {
|
|
302
302
|
name: "gestures",
|
|
303
303
|
setup(ctx) {
|
|
304
304
|
const { container, options } = ctx;
|
|
305
305
|
if (options.gestures === false)
|
|
306
306
|
return;
|
|
307
|
-
const cleanup =
|
|
307
|
+
const cleanup = createGestureDetector2(container, {
|
|
308
308
|
onDoubleTap: (x) => {
|
|
309
309
|
const rect = container.getBoundingClientRect();
|
|
310
310
|
const third = rect.width / 3;
|
|
@@ -333,8 +333,8 @@ var gestures = {
|
|
|
333
333
|
}
|
|
334
334
|
};
|
|
335
335
|
// src/features/create-player.ts
|
|
336
|
-
function
|
|
337
|
-
const store = new
|
|
336
|
+
function createComposablePlayer2(container, opts) {
|
|
337
|
+
const store = new StateStore2(opts.state);
|
|
338
338
|
const cleanups = [];
|
|
339
339
|
let mediaElement = null;
|
|
340
340
|
const getMediaElement = () => {
|
|
@@ -371,8 +371,8 @@ function createComposablePlayer(container, opts) {
|
|
|
371
371
|
};
|
|
372
372
|
}
|
|
373
373
|
// src/features/index.ts
|
|
374
|
-
var
|
|
375
|
-
var
|
|
376
|
-
var
|
|
374
|
+
var videoFeatures2 = [playback2, volume2, fullscreen2, pip2, captions2, quality2, keyboard2, gestures2];
|
|
375
|
+
var audioFeatures2 = [playback2, volume2, keyboard2];
|
|
376
|
+
var minimalFeatures2 = [playback2];
|
|
377
377
|
|
|
378
|
-
export {
|
|
378
|
+
export { playback2, volume2, fullscreen2, pip2, captions2, quality2, keyboard2, gestures2, createComposablePlayer2, videoFeatures2, audioFeatures2, minimalFeatures2 };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/core/state.ts
|
|
2
|
-
function
|
|
2
|
+
function shallowEqual2(a, b) {
|
|
3
3
|
if (a === b)
|
|
4
4
|
return true;
|
|
5
5
|
if (!a || !b)
|
|
@@ -14,7 +14,7 @@ function shallowEqual(a, b) {
|
|
|
14
14
|
}
|
|
15
15
|
return true;
|
|
16
16
|
}
|
|
17
|
-
function
|
|
17
|
+
function createSignal2(initial) {
|
|
18
18
|
let value = initial;
|
|
19
19
|
const listeners = new Set;
|
|
20
20
|
const get = () => value;
|
|
@@ -31,7 +31,7 @@ function createSignal(initial) {
|
|
|
31
31
|
};
|
|
32
32
|
return [get, set];
|
|
33
33
|
}
|
|
34
|
-
function
|
|
34
|
+
function computed2(fn, deps) {
|
|
35
35
|
let value;
|
|
36
36
|
let dirty = true;
|
|
37
37
|
deps.forEach((dep) => {
|
|
@@ -49,7 +49,7 @@ function computed(fn, deps) {
|
|
|
49
49
|
return value;
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
-
function
|
|
52
|
+
function createDefaultState2() {
|
|
53
53
|
return {
|
|
54
54
|
src: null,
|
|
55
55
|
sources: [],
|
|
@@ -102,13 +102,13 @@ function createDefaultState() {
|
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
class
|
|
105
|
+
class StateStore2 {
|
|
106
106
|
state;
|
|
107
107
|
listeners = new Map;
|
|
108
108
|
_pendingKeys = null;
|
|
109
109
|
_flushScheduled = false;
|
|
110
110
|
constructor(initial) {
|
|
111
|
-
this.state = { ...
|
|
111
|
+
this.state = { ...createDefaultState2(), ...initial };
|
|
112
112
|
}
|
|
113
113
|
getState() {
|
|
114
114
|
return this.state;
|
|
@@ -132,12 +132,12 @@ class StateStore {
|
|
|
132
132
|
}
|
|
133
133
|
subscribe(keyOrListener, listener) {
|
|
134
134
|
if (typeof keyOrListener === "function") {
|
|
135
|
-
const
|
|
136
|
-
if (!this.listeners.has(
|
|
137
|
-
this.listeners.set(
|
|
135
|
+
const key = "*";
|
|
136
|
+
if (!this.listeners.has(key)) {
|
|
137
|
+
this.listeners.set(key, new Set);
|
|
138
138
|
}
|
|
139
|
-
this.listeners.get(
|
|
140
|
-
return () => this.listeners.get(
|
|
139
|
+
this.listeners.get(key).add(keyOrListener);
|
|
140
|
+
return () => this.listeners.get(key)?.delete(keyOrListener);
|
|
141
141
|
}
|
|
142
142
|
const key = keyOrListener;
|
|
143
143
|
if (!listener)
|
|
@@ -149,7 +149,7 @@ class StateStore {
|
|
|
149
149
|
return () => this.listeners.get(key)?.delete(listener);
|
|
150
150
|
}
|
|
151
151
|
reset() {
|
|
152
|
-
this.state =
|
|
152
|
+
this.state = createDefaultState2();
|
|
153
153
|
this._pendingKeys = null;
|
|
154
154
|
this._flushScheduled = false;
|
|
155
155
|
this.notifyAll();
|
|
@@ -182,7 +182,7 @@ class StateStore {
|
|
|
182
182
|
this.listeners.get("*")?.forEach((listener) => listener(this.state));
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
|
-
function
|
|
185
|
+
function selectBufferedAmount2(state) {
|
|
186
186
|
if (state.duration === 0 || state.buffered.length === 0)
|
|
187
187
|
return 0;
|
|
188
188
|
let buffered = 0;
|
|
@@ -191,42 +191,42 @@ function selectBufferedAmount(state) {
|
|
|
191
191
|
}
|
|
192
192
|
return Math.min(buffered / state.duration, 1);
|
|
193
193
|
}
|
|
194
|
-
function
|
|
194
|
+
function selectProgress2(state) {
|
|
195
195
|
if (state.duration === 0)
|
|
196
196
|
return 0;
|
|
197
197
|
return Math.min(state.currentTime / state.duration, 1);
|
|
198
198
|
}
|
|
199
|
-
function
|
|
199
|
+
function selectRemainingTime2(state) {
|
|
200
200
|
return Math.max(state.duration - state.currentTime, 0);
|
|
201
201
|
}
|
|
202
|
-
function
|
|
202
|
+
function selectIsIdle2(state) {
|
|
203
203
|
return state.loadingState === "idle" && state.playbackState === "idle";
|
|
204
204
|
}
|
|
205
|
-
function
|
|
205
|
+
function selectIsLoading2(state) {
|
|
206
206
|
return state.loadingState === "loading" || state.waiting;
|
|
207
207
|
}
|
|
208
|
-
function
|
|
208
|
+
function selectIsLive2(state) {
|
|
209
209
|
return state.streamType.includes("live");
|
|
210
210
|
}
|
|
211
|
-
function
|
|
211
|
+
function selectIsDVR2(state) {
|
|
212
212
|
return state.streamType === "live:dvr";
|
|
213
213
|
}
|
|
214
|
-
function
|
|
214
|
+
function selectCurrentQuality2(state) {
|
|
215
215
|
const selected = state.qualities.find((q) => q.selected);
|
|
216
216
|
if (!selected)
|
|
217
217
|
return state.autoQuality ? "auto" : null;
|
|
218
218
|
return `${selected.height}p`;
|
|
219
219
|
}
|
|
220
|
-
function
|
|
220
|
+
function selectCurrentTextTrack2(state) {
|
|
221
221
|
const showing = state.textTracks.find((t) => t.mode === "showing");
|
|
222
222
|
return showing?.label || null;
|
|
223
223
|
}
|
|
224
|
-
function
|
|
224
|
+
function selectCurrentAudioTrack2(state) {
|
|
225
225
|
const selected = state.audioTracks.find((t) => t.selected);
|
|
226
226
|
return selected?.label || null;
|
|
227
227
|
}
|
|
228
228
|
var STORAGE_KEY = "ts-video-player";
|
|
229
|
-
function
|
|
229
|
+
function loadPersistedState2(storage = localStorage) {
|
|
230
230
|
try {
|
|
231
231
|
const data = storage.getItem(STORAGE_KEY);
|
|
232
232
|
if (data) {
|
|
@@ -235,14 +235,14 @@ function loadPersistedState(storage = localStorage) {
|
|
|
235
235
|
} catch {}
|
|
236
236
|
return {};
|
|
237
237
|
}
|
|
238
|
-
function
|
|
238
|
+
function savePersistedState2(state, storage = localStorage) {
|
|
239
239
|
try {
|
|
240
|
-
const existing =
|
|
240
|
+
const existing = loadPersistedState2(storage);
|
|
241
241
|
storage.setItem(STORAGE_KEY, JSON.stringify({ ...existing, ...state }));
|
|
242
242
|
} catch {}
|
|
243
243
|
}
|
|
244
|
-
function
|
|
245
|
-
const persisted =
|
|
244
|
+
function createStorageSync2(store, keys = ["volume", "muted", "playbackRate"], storage = localStorage) {
|
|
245
|
+
const persisted = loadPersistedState2(storage);
|
|
246
246
|
if (persisted.volume !== undefined)
|
|
247
247
|
store.set("volume", persisted.volume);
|
|
248
248
|
if (persisted.muted !== undefined)
|
|
@@ -251,13 +251,13 @@ function createStorageSync(store, keys = ["volume", "muted", "playbackRate"], st
|
|
|
251
251
|
store.set("playbackRate", persisted.playbackRate);
|
|
252
252
|
const unsubscribes = keys.map((key) => store.subscribe(key, (state) => {
|
|
253
253
|
const value = state[key];
|
|
254
|
-
|
|
254
|
+
savePersistedState2({ [key]: value }, storage);
|
|
255
255
|
}));
|
|
256
256
|
return () => unsubscribes.forEach((unsub) => unsub());
|
|
257
257
|
}
|
|
258
258
|
|
|
259
259
|
// src/core/events.ts
|
|
260
|
-
class
|
|
260
|
+
class EventEmitter2 {
|
|
261
261
|
listeners = new Map;
|
|
262
262
|
onceListeners = new Map;
|
|
263
263
|
on(event, handler) {
|
|
@@ -312,7 +312,7 @@ class EventEmitter {
|
|
|
312
312
|
}
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
class
|
|
315
|
+
class MediaEventsNormalizer2 {
|
|
316
316
|
media;
|
|
317
317
|
emitter;
|
|
318
318
|
listeners = [];
|
|
@@ -381,7 +381,7 @@ class MediaEventsNormalizer {
|
|
|
381
381
|
this.listeners = [];
|
|
382
382
|
}
|
|
383
383
|
}
|
|
384
|
-
function
|
|
384
|
+
function onFullscreenChange2(handler) {
|
|
385
385
|
const events = ["fullscreenchange", "webkitfullscreenchange", "mozfullscreenchange", "MSFullscreenChange"];
|
|
386
386
|
const listener = () => {
|
|
387
387
|
const fullscreen = !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement);
|
|
@@ -392,7 +392,7 @@ function onFullscreenChange(handler) {
|
|
|
392
392
|
events.forEach((event) => document.removeEventListener(event, listener));
|
|
393
393
|
};
|
|
394
394
|
}
|
|
395
|
-
function
|
|
395
|
+
function onPiPChange2(video, handler) {
|
|
396
396
|
const enterHandler = () => handler(true);
|
|
397
397
|
const leaveHandler = () => handler(false);
|
|
398
398
|
video.addEventListener("enterpictureinpicture", enterHandler);
|
|
@@ -402,7 +402,7 @@ function onPiPChange(video, handler) {
|
|
|
402
402
|
video.removeEventListener("leavepictureinpicture", leaveHandler);
|
|
403
403
|
};
|
|
404
404
|
}
|
|
405
|
-
var
|
|
405
|
+
var DEFAULT_KEYBOARD_SHORTCUTS2 = {
|
|
406
406
|
" ": "togglePlay",
|
|
407
407
|
k: "togglePlay",
|
|
408
408
|
m: "toggleMute",
|
|
@@ -430,14 +430,14 @@ var DEFAULT_KEYBOARD_SHORTCUTS = {
|
|
|
430
430
|
"8": "seek80",
|
|
431
431
|
"9": "seek90"
|
|
432
432
|
};
|
|
433
|
-
function
|
|
433
|
+
function createKeyboardHandler2(actions, options = {}) {
|
|
434
434
|
const { seekStep: _seekStep = 5, volumeStep: _volumeStep = 0.1, speedStep: _speedStep = 0.25 } = options;
|
|
435
435
|
return (event) => {
|
|
436
436
|
if (event.target instanceof HTMLInputElement || event.target instanceof HTMLTextAreaElement || event.target instanceof HTMLSelectElement || event.target?.isContentEditable) {
|
|
437
437
|
return;
|
|
438
438
|
}
|
|
439
439
|
const key = event.key;
|
|
440
|
-
const action =
|
|
440
|
+
const action = DEFAULT_KEYBOARD_SHORTCUTS2[key];
|
|
441
441
|
if (!action)
|
|
442
442
|
return;
|
|
443
443
|
event.preventDefault();
|
|
@@ -491,7 +491,7 @@ function createKeyboardHandler(actions, options = {}) {
|
|
|
491
491
|
}
|
|
492
492
|
};
|
|
493
493
|
}
|
|
494
|
-
function
|
|
494
|
+
function createActivityDetector2(element, options = {}) {
|
|
495
495
|
const { timeout = 3000, onActive, onInactive } = options;
|
|
496
496
|
let timer = null;
|
|
497
497
|
let active = true;
|
|
@@ -522,7 +522,7 @@ function createActivityDetector(element, options = {}) {
|
|
|
522
522
|
events.forEach((event) => element.removeEventListener(event, setActive));
|
|
523
523
|
};
|
|
524
524
|
}
|
|
525
|
-
function
|
|
525
|
+
function createGestureDetector2(element, handlers) {
|
|
526
526
|
let startX = 0;
|
|
527
527
|
let startY = 0;
|
|
528
528
|
let startTime = 0;
|
|
@@ -608,7 +608,7 @@ function createGestureDetector(element, handlers) {
|
|
|
608
608
|
}
|
|
609
609
|
|
|
610
610
|
// src/core/features.ts
|
|
611
|
-
function
|
|
611
|
+
function isIOSSafari2() {
|
|
612
612
|
if (typeof navigator === "undefined")
|
|
613
613
|
return false;
|
|
614
614
|
const ua = navigator.userAgent;
|
|
@@ -618,24 +618,24 @@ function isIOSSafari() {
|
|
|
618
618
|
return true;
|
|
619
619
|
return false;
|
|
620
620
|
}
|
|
621
|
-
function
|
|
621
|
+
function isSafari2() {
|
|
622
622
|
if (typeof navigator === "undefined")
|
|
623
623
|
return false;
|
|
624
624
|
return /^(?:(?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
625
625
|
}
|
|
626
|
-
function
|
|
626
|
+
function isStandalonePWA2() {
|
|
627
627
|
if (typeof window === "undefined")
|
|
628
628
|
return false;
|
|
629
629
|
return navigator.standalone === true || window.matchMedia("(display-mode: standalone)").matches;
|
|
630
630
|
}
|
|
631
|
-
function
|
|
632
|
-
if (
|
|
631
|
+
function detectVolumeAvailability2(media) {
|
|
632
|
+
if (isIOSSafari2())
|
|
633
633
|
return "unsupported";
|
|
634
634
|
if (!media)
|
|
635
635
|
return "unavailable";
|
|
636
636
|
return "available";
|
|
637
637
|
}
|
|
638
|
-
async function
|
|
638
|
+
async function probeVolumeAvailability2(media) {
|
|
639
639
|
const original = media.volume;
|
|
640
640
|
try {
|
|
641
641
|
const testValue = original === 1 ? 0.5 : 1;
|
|
@@ -651,7 +651,7 @@ async function probeVolumeAvailability(media) {
|
|
|
651
651
|
return "unsupported";
|
|
652
652
|
}
|
|
653
653
|
}
|
|
654
|
-
function
|
|
654
|
+
function detectFullscreenAvailability2(container, videoElement) {
|
|
655
655
|
const doc = typeof document !== "undefined" ? document : null;
|
|
656
656
|
if (!doc)
|
|
657
657
|
return "unsupported";
|
|
@@ -670,13 +670,13 @@ function detectFullscreenAvailability(container, videoElement) {
|
|
|
670
670
|
return "unavailable";
|
|
671
671
|
return "unsupported";
|
|
672
672
|
}
|
|
673
|
-
function
|
|
673
|
+
function isVideoOnlyFullscreen2() {
|
|
674
674
|
if (typeof document === "undefined")
|
|
675
675
|
return false;
|
|
676
676
|
const doc = document;
|
|
677
|
-
return
|
|
677
|
+
return isIOSSafari2() && !doc.fullscreenEnabled && !doc.webkitFullscreenEnabled;
|
|
678
678
|
}
|
|
679
|
-
async function
|
|
679
|
+
async function enterFullscreen2(container, media) {
|
|
680
680
|
const video = media;
|
|
681
681
|
if (container) {
|
|
682
682
|
const el = container;
|
|
@@ -695,7 +695,7 @@ async function enterFullscreen(container, media) {
|
|
|
695
695
|
return media.requestFullscreen();
|
|
696
696
|
}
|
|
697
697
|
}
|
|
698
|
-
async function
|
|
698
|
+
async function exitFullscreen2(media) {
|
|
699
699
|
const doc = document;
|
|
700
700
|
const video = media;
|
|
701
701
|
if (typeof doc.exitFullscreen === "function")
|
|
@@ -708,20 +708,20 @@ async function exitFullscreen(media) {
|
|
|
708
708
|
video.webkitExitFullscreen();
|
|
709
709
|
}
|
|
710
710
|
}
|
|
711
|
-
function
|
|
711
|
+
function detectPipAvailability2(videoElement) {
|
|
712
712
|
if (!videoElement)
|
|
713
713
|
return "unavailable";
|
|
714
714
|
if ("requestPictureInPicture" in videoElement) {
|
|
715
715
|
if (typeof document !== "undefined" && document.pictureInPictureEnabled === false) {
|
|
716
716
|
return "unavailable";
|
|
717
717
|
}
|
|
718
|
-
if (
|
|
718
|
+
if (isSafari2() && isStandalonePWA2())
|
|
719
719
|
return "unavailable";
|
|
720
720
|
return "available";
|
|
721
721
|
}
|
|
722
722
|
const video = videoElement;
|
|
723
723
|
if (typeof video.webkitSetPresentationMode === "function") {
|
|
724
|
-
if (
|
|
724
|
+
if (isStandalonePWA2())
|
|
725
725
|
return "unavailable";
|
|
726
726
|
if (typeof video.webkitSupportsPresentationMode === "function") {
|
|
727
727
|
return video.webkitSupportsPresentationMode("picture-in-picture") ? "available" : "unsupported";
|
|
@@ -730,7 +730,7 @@ function detectPipAvailability(videoElement) {
|
|
|
730
730
|
}
|
|
731
731
|
return "unsupported";
|
|
732
732
|
}
|
|
733
|
-
async function
|
|
733
|
+
async function enterPiP2(media) {
|
|
734
734
|
const video = media;
|
|
735
735
|
if (typeof video.requestPictureInPicture === "function") {
|
|
736
736
|
await video.requestPictureInPicture();
|
|
@@ -740,7 +740,7 @@ async function enterPiP(media) {
|
|
|
740
740
|
video.webkitSetPresentationMode("picture-in-picture");
|
|
741
741
|
}
|
|
742
742
|
}
|
|
743
|
-
async function
|
|
743
|
+
async function exitPiP2(media) {
|
|
744
744
|
if (document.pictureInPictureElement && typeof document.exitPictureInPicture === "function") {
|
|
745
745
|
await document.exitPictureInPicture();
|
|
746
746
|
return;
|
|
@@ -752,12 +752,12 @@ async function exitPiP(media) {
|
|
|
752
752
|
}
|
|
753
753
|
}
|
|
754
754
|
}
|
|
755
|
-
function
|
|
755
|
+
function detectAllFeatures2(container, videoElement, mediaElement) {
|
|
756
756
|
return {
|
|
757
|
-
volume:
|
|
758
|
-
fullscreen:
|
|
759
|
-
pip:
|
|
757
|
+
volume: detectVolumeAvailability2(mediaElement),
|
|
758
|
+
fullscreen: detectFullscreenAvailability2(container, videoElement),
|
|
759
|
+
pip: detectPipAvailability2(videoElement)
|
|
760
760
|
};
|
|
761
761
|
}
|
|
762
762
|
|
|
763
|
-
export {
|
|
763
|
+
export { shallowEqual2, createSignal2, computed2, createDefaultState2, StateStore2, selectBufferedAmount2, selectProgress2, selectRemainingTime2, selectIsIdle2, selectIsLoading2, selectIsLive2, selectIsDVR2, selectCurrentQuality2, selectCurrentTextTrack2, selectCurrentAudioTrack2, loadPersistedState2, savePersistedState2, createStorageSync2, EventEmitter2, MediaEventsNormalizer2, onFullscreenChange2, onPiPChange2, DEFAULT_KEYBOARD_SHORTCUTS2, createKeyboardHandler2, createActivityDetector2, createGestureDetector2, isIOSSafari2, isSafari2, isStandalonePWA2, detectVolumeAvailability2, probeVolumeAvailability2, detectFullscreenAvailability2, isVideoOnlyFullscreen2, enterFullscreen2, exitFullscreen2, detectPipAvailability2, enterPiP2, exitPiP2, detectAllFeatures2 };
|