@vplayer/core 0.1.6 → 0.1.8

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.
@@ -1,4 +1,2 @@
1
- import type { PlayerIcons, PlayerLabels } from './types';
1
+ import type { PlayerLabels } from './types';
2
2
  export declare const defaultPlayerLabels: PlayerLabels;
3
- /** @see https://iconify.design/icon-sets/lucide/ */
4
- export declare const defaultPlayerIcons: PlayerIcons;
package/dist/index.d.ts CHANGED
@@ -15,9 +15,9 @@ export type { PlayerSource, SourceKind } from './source-resolver';
15
15
  export { canUseMSE, canUseNativeHLS, canUseFullscreen, canUsePictureInPicture, canUseTextTracks, getMediaCapabilities, isFiniteDuration, } from './media-capabilities';
16
16
  export type { MediaCapabilitiesSnapshot } from './media-capabilities';
17
17
  export { formatTime } from './utils';
18
- export { defaultPlayerLabels, defaultPlayerIcons } from './defaults';
18
+ export { defaultPlayerLabels } from './defaults';
19
19
  export { BaseMediaEngine, NativeVideoEngine, HlsMediaEngine, DashMediaEngine } from './media-engine';
20
20
  export type { MediaEngine, MediaEngineDimensions, MediaEngineError, MediaEngineEvent, MediaEngineEventHandler, HlsMediaEngineOptions, DashMediaEngineOptions, } from './media-engine';
21
21
  export { createMediaStore, getInitialMediaState, selectMedia, selectAudio, selectPreferences, selectUI, selectPlugins, selectThumbnails, selectError, } from './state/slices';
22
- export type { PlayerOptions, TransformThumbnailVTT, MediaState, MediaRemote, PlayerLabels, PlayerIcons, SvgIcon, PlayerInstance, PlayerSystems, PlayerError, PlaybackStatus, } from './types';
22
+ export type { PlayerOptions, TransformThumbnailVTT, MediaState, MediaRemote, PlayerLabels, PlayerInstance, PlayerSystems, PlayerError, PlaybackStatus, } from './types';
23
23
  export type { ControlRegistration, SettingRegistration, LayerRegistration, ContextMenuItem, ContextMenuRegistration, PlayerPlugin, PluginAPI, RemoteRef, PlayerContextRef, FlipState, AspectRatioState, SettingItem, } from './plugin-api';
package/dist/index.js CHANGED
@@ -726,61 +726,77 @@ function J(e) {
726
726
  function Y(e) {
727
727
  let r = x(), i = { ...e }, o = new t(), s = new j(), c = new a(i.lang);
728
728
  i.translations && c.addTranslations(i.lang ?? "en", i.translations);
729
- let l = new n(), u = i.reconnectMax ?? 3, p = i.reconnectSleep ?? 1500, m = null, h = null, g = null, _ = null, v = null, S = 0, C = null;
730
- function w() {
729
+ let l = new n(), u = i.reconnectMax ?? 3, p = i.reconnectSleep ?? 1500, m = null, h = null, g = null, _ = null, v = null, S = 0, C = null, w = null;
730
+ function T() {
731
+ w && typeof navigator < "u" && "mediaSession" in navigator && navigator.mediaSession.metadata === w && (navigator.mediaSession.metadata = null), w = null;
732
+ }
733
+ function E() {
734
+ if (typeof navigator > "u" || !("mediaSession" in navigator) || typeof MediaMetadata > "u") return;
735
+ let e = i.title?.trim();
736
+ if (!e) {
737
+ T();
738
+ return;
739
+ }
740
+ let t = new MediaMetadata({
741
+ title: e,
742
+ artwork: i.poster ? [{ src: i.poster }] : []
743
+ });
744
+ navigator.mediaSession.metadata = t, w = t;
745
+ }
746
+ function D() {
731
747
  l.register({
732
748
  key: "Space",
733
749
  description: "Toggle play/pause",
734
750
  handler: (e) => {
735
- e.preventDefault(), E.togglePlay();
751
+ e.preventDefault(), k.togglePlay();
736
752
  }
737
753
  }), l.register({
738
754
  key: "KeyK",
739
755
  description: "Toggle play/pause",
740
756
  handler: (e) => {
741
- e.preventDefault(), E.togglePlay();
757
+ e.preventDefault(), k.togglePlay();
742
758
  }
743
759
  }), l.register({
744
760
  key: "KeyL",
745
761
  description: "Toggle loop",
746
762
  handler: (e) => {
747
- e.preventDefault(), E.toggleLoop();
763
+ e.preventDefault(), k.toggleLoop();
748
764
  }
749
765
  }), l.register({
750
766
  key: "KeyI",
751
767
  description: "Toggle info panel",
752
768
  handler: (e) => {
753
- e.preventDefault(), E.toggleInfoPanel();
769
+ e.preventDefault(), k.toggleInfoPanel();
754
770
  }
755
771
  }), l.register({
756
772
  key: "KeyF",
757
773
  description: "Toggle fullscreen",
758
774
  handler: (e) => {
759
- e.preventDefault(), E.toggleFullscreen();
775
+ e.preventDefault(), k.toggleFullscreen();
760
776
  }
761
777
  }), l.register({
762
778
  key: "KeyA",
763
779
  description: "Cycle aspect ratio",
764
780
  handler: (e) => {
765
- e.preventDefault(), E.cycleAspectRatio();
781
+ e.preventDefault(), k.cycleAspectRatio();
766
782
  }
767
783
  }), l.register({
768
784
  key: "KeyM",
769
785
  description: "Toggle mute",
770
786
  handler: (e) => {
771
- e.preventDefault(), E.toggleMute();
787
+ e.preventDefault(), k.toggleMute();
772
788
  }
773
789
  }), l.register({
774
790
  key: "ArrowLeft",
775
791
  description: "Seek backward 5s",
776
792
  handler: (e) => {
777
- e.preventDefault(), E.skip(-5);
793
+ e.preventDefault(), k.skip(-5);
778
794
  }
779
795
  }), l.register({
780
796
  key: "ArrowRight",
781
797
  description: "Seek forward 5s",
782
798
  handler: (e) => {
783
- e.preventDefault(), E.skip(5);
799
+ e.preventDefault(), k.skip(5);
784
800
  }
785
801
  }), l.register({
786
802
  key: "ArrowUp",
@@ -788,7 +804,7 @@ function Y(e) {
788
804
  handler: (e) => {
789
805
  e.preventDefault();
790
806
  let t = Math.min(1, r.state.volume + .1);
791
- E.setVolume(t);
807
+ k.setVolume(t);
792
808
  }
793
809
  }), l.register({
794
810
  key: "ArrowDown",
@@ -796,12 +812,12 @@ function Y(e) {
796
812
  handler: (e) => {
797
813
  e.preventDefault();
798
814
  let t = Math.max(0, r.state.volume - .1);
799
- E.setVolume(t);
815
+ k.setVolume(t);
800
816
  }
801
817
  });
802
818
  }
803
- i.defaultHotkeys !== !1 && w();
804
- function T() {
819
+ i.defaultHotkeys !== !1 && D();
820
+ function O() {
805
821
  if (typeof document > "u") return;
806
822
  let e = document;
807
823
  r.setState((t) => ({
@@ -810,7 +826,7 @@ function Y(e) {
810
826
  capabilities: d(h?.element ?? void 0, m)
811
827
  }));
812
828
  }
813
- let E = {
829
+ let k = {
814
830
  play: () => {
815
831
  h?.play();
816
832
  },
@@ -853,7 +869,7 @@ function Y(e) {
853
869
  toggleFullscreen: () => {
854
870
  if (!m || typeof document > "u") return;
855
871
  let e = m, t = document, n = !!(document.fullscreenElement || t.webkitFullscreenElement), r = () => {
856
- m?.focus({ preventScroll: !0 }), T();
872
+ m?.focus({ preventScroll: !0 }), O();
857
873
  }, i = n ? typeof document.exitFullscreen == "function" ? document.exitFullscreen() : t.webkitExitFullscreen?.() : typeof m.requestFullscreen == "function" ? m.requestFullscreen() : e.webkitRequestFullscreen?.();
858
874
  Promise.resolve(i).then(r, r);
859
875
  },
@@ -901,7 +917,7 @@ function Y(e) {
901
917
  },
902
918
  cycleAspectRatio: () => {
903
919
  let e = r.state.aspectRatio, t = U[(U.indexOf(e) + 1) % U.length] ?? "default";
904
- E.setAspectRatio(t);
920
+ k.setAspectRatio(t);
905
921
  },
906
922
  toggleLoop: () => {
907
923
  let e = h;
@@ -917,10 +933,10 @@ function Y(e) {
917
933
  }));
918
934
  }
919
935
  };
920
- function D(e) {
936
+ function A(e) {
921
937
  return [
922
938
  e.on("play", () => {
923
- r.setState((e) => ({
939
+ E(), r.setState((e) => ({
924
940
  ...e,
925
941
  status: "playing",
926
942
  isPlaying: !0,
@@ -1069,8 +1085,8 @@ function Y(e) {
1069
1085
  })
1070
1086
  ];
1071
1087
  }
1072
- function O() {
1073
- k(), _ = setInterval(() => {
1088
+ function N() {
1089
+ P(), _ = setInterval(() => {
1074
1090
  let e = h;
1075
1091
  e && s.set(M.PLAYBACK_PROGRESS, {
1076
1092
  time: e.currentTime,
@@ -1078,14 +1094,14 @@ function Y(e) {
1078
1094
  });
1079
1095
  }, 5e3);
1080
1096
  }
1081
- function k() {
1097
+ function P() {
1082
1098
  _ !== null && (clearInterval(_), _ = null);
1083
1099
  }
1084
- let A = r.subscribe(() => {
1100
+ let F = r.subscribe(() => {
1085
1101
  let e = r.state;
1086
- e.isPlaying && e.duration > 0 ? _ === null && O() : k();
1087
- }), N = null;
1088
- function P() {
1102
+ e.isPlaying && e.duration > 0 ? _ === null && N() : P();
1103
+ }), I = null;
1104
+ function L() {
1089
1105
  if (!i.persistPreferences) return;
1090
1106
  let e = s.get(M.VOLUME), t = s.get(M.MUTED), n = s.get(M.PLAYBACK_RATE), a = s.get(M.LOOP), o = s.get(M.FLIP), c = s.get(M.ASPECT_RATIO);
1091
1107
  r.setState((r) => ({
@@ -1096,15 +1112,15 @@ function Y(e) {
1096
1112
  isLooping: a ?? r.isLooping,
1097
1113
  flip: o ?? r.flip,
1098
1114
  aspectRatio: q(c)
1099
- })), N = r.subscribe(() => {
1115
+ })), I = r.subscribe(() => {
1100
1116
  let e = r.state;
1101
1117
  e.volume !== 1 && s.set(M.VOLUME, e.volume), e.isMuted && s.set(M.MUTED, !0), e.playbackRate !== 1 && s.set(M.PLAYBACK_RATE, e.playbackRate), e.isLooping ? s.set(M.LOOP, !0) : s.remove(M.LOOP), e.flip === "normal" ? s.remove(M.FLIP) : s.set(M.FLIP, e.flip), e.aspectRatio === "default" ? s.remove(M.ASPECT_RATIO) : s.set(M.ASPECT_RATIO, e.aspectRatio);
1102
1118
  });
1103
1119
  }
1104
- function F() {
1105
- N &&= (N(), null);
1120
+ function R() {
1121
+ I &&= (I(), null);
1106
1122
  }
1107
- function I(e) {
1123
+ function z(e) {
1108
1124
  if (C?.abort(), C = null, !e) {
1109
1125
  r.setState((e) => ({
1110
1126
  ...e,
@@ -1125,11 +1141,11 @@ function Y(e) {
1125
1141
  })));
1126
1142
  });
1127
1143
  }
1128
- function L(e) {
1144
+ function B(e) {
1129
1145
  return {
1130
1146
  name: e,
1131
1147
  store: r,
1132
- remote: E,
1148
+ remote: k,
1133
1149
  events: o,
1134
1150
  storage: s,
1135
1151
  hotkeys: l,
@@ -1208,15 +1224,15 @@ function Y(e) {
1208
1224
  }
1209
1225
  };
1210
1226
  }
1211
- let R = [];
1212
- function z() {
1227
+ let H = [];
1228
+ function Y() {
1213
1229
  v !== null && (clearTimeout(v), v = null), S = 0;
1214
- for (let e of R) e();
1215
- R = [], h && (h.destroy(), h = null, Y.engine = null);
1230
+ for (let e of H) e();
1231
+ H = [], h && (h.destroy(), h = null, Q.engine = null);
1216
1232
  }
1217
- function B(e) {
1233
+ function X(e) {
1218
1234
  let t = y(i), n = b(e, i);
1219
- h = n, Y.engine = n, R = D(n), e.playsInline = !0, e.autoplay = !!i.autoPlay, e.preload = e.preload || "metadata", r.setState((n) => ({
1235
+ h = n, Q.engine = n, H = A(n), e.playsInline = !0, e.autoplay = !!i.autoPlay, e.preload = e.preload || "metadata", r.setState((n) => ({
1220
1236
  ...n,
1221
1237
  status: "loading",
1222
1238
  source: t,
@@ -1231,16 +1247,16 @@ function Y(e) {
1231
1247
  error: null
1232
1248
  })), i.autoPlay && n.play();
1233
1249
  }
1234
- function H() {
1250
+ function Z() {
1235
1251
  let e = h?.element;
1236
1252
  if (e) {
1237
- for (z(), e.pause(), e.removeAttribute("src"); e.firstChild;) e.removeChild(e.firstChild);
1238
- e.load(), B(e);
1253
+ for (Y(), e.pause(), e.removeAttribute("src"); e.firstChild;) e.removeChild(e.firstChild);
1254
+ e.load(), X(e);
1239
1255
  }
1240
1256
  }
1241
- let Y = {
1257
+ let Q = {
1242
1258
  store: r,
1243
- remote: E,
1259
+ remote: k,
1244
1260
  events: o,
1245
1261
  storage: s,
1246
1262
  i18n: c,
@@ -1251,7 +1267,7 @@ function Y(e) {
1251
1267
  i = {
1252
1268
  ...i,
1253
1269
  ...e
1254
- }, r.setState((t) => {
1270
+ }, (r.state.isPlaying || w) && E(), r.setState((t) => {
1255
1271
  let n = e.subtitles ?? t.subtitleTracks, r = e.qualities ?? t.qualities;
1256
1272
  return {
1257
1273
  ...t,
@@ -1260,18 +1276,18 @@ function Y(e) {
1260
1276
  activeSubtitle: e.subtitles ? t.activeSubtitle && e.subtitles.some((e) => e.lang === t.activeSubtitle.lang) ? t.activeSubtitle : e.subtitles.find((e) => e.default) ?? e.subtitles[0] ?? null : t.activeSubtitle,
1261
1277
  activeQuality: e.qualities ? e.qualities.includes(t.activeQuality) ? t.activeQuality : e.qualities[0] ?? "Auto" : t.activeQuality
1262
1278
  };
1263
- }), (a || o) && I(i.thumbnails), (t || n) && H();
1279
+ }), (a || o) && z(i.thumbnails), (t || n) && Z();
1264
1280
  },
1265
1281
  setThumbnails(e) {
1266
1282
  i = {
1267
1283
  ...i,
1268
1284
  thumbnails: e
1269
- }, I(e);
1285
+ }, z(e);
1270
1286
  },
1271
1287
  initPlugins(e) {
1272
1288
  let t = [];
1273
1289
  for (let n of e) {
1274
- let e = L(n.name);
1290
+ let e = B(n.name);
1275
1291
  try {
1276
1292
  let r = n.setup?.(e);
1277
1293
  typeof r == "function" && t.push(r);
@@ -1288,10 +1304,10 @@ function Y(e) {
1288
1304
  };
1289
1305
  },
1290
1306
  mount(e, t) {
1291
- h && this.unmount(), m = t, B(e), g = T, document.addEventListener("fullscreenchange", g), document.addEventListener("webkitfullscreenchange", g), I(i.thumbnails), P(), E.setAspectRatio(r.state.aspectRatio);
1307
+ h && this.unmount(), m = t, X(e), g = O, document.addEventListener("fullscreenchange", g), document.addEventListener("webkitfullscreenchange", g), z(i.thumbnails), L(), k.setAspectRatio(r.state.aspectRatio);
1292
1308
  },
1293
1309
  unmount() {
1294
- z(), m = null, k(), C?.abort(), C = null, F(), v !== null && (clearTimeout(v), v = null), g &&= (document.removeEventListener("fullscreenchange", g), document.removeEventListener("webkitfullscreenchange", g), null), r.setState((e) => ({
1310
+ Y(), T(), m = null, P(), C?.abort(), C = null, R(), v !== null && (clearTimeout(v), v = null), g &&= (document.removeEventListener("fullscreenchange", g), document.removeEventListener("webkitfullscreenchange", g), null), r.setState((e) => ({
1295
1311
  ...e,
1296
1312
  status: "idle",
1297
1313
  isPlaying: !1,
@@ -1301,10 +1317,10 @@ function Y(e) {
1301
1317
  }));
1302
1318
  },
1303
1319
  destroy() {
1304
- this.unmount(), A(), o.clear();
1320
+ this.unmount(), F(), o.clear();
1305
1321
  }
1306
1322
  };
1307
- return Y;
1323
+ return Q;
1308
1324
  }
1309
1325
  //#endregion
1310
1326
  //#region src/gesture-engine.ts
@@ -1415,29 +1431,6 @@ var Q = {
1415
1431
  contextMenuLoop: "Loop",
1416
1432
  infoPanel: "Debug stats",
1417
1433
  loop: "Loop"
1418
- }, $ = {
1419
- play: "lucide:play",
1420
- pause: "lucide:pause",
1421
- replay: "lucide:rotate-ccw",
1422
- skipBack: "lucide:skip-back",
1423
- skipForward: "lucide:skip-forward",
1424
- volumeHigh: "lucide:volume-2",
1425
- volumeLow: "lucide:volume-1",
1426
- volumeOff: "lucide:volume-x",
1427
- settings: "lucide:settings-2",
1428
- pip: "lucide:picture-in-picture-2",
1429
- miniPlayer: "lucide:minimize-2",
1430
- close: "lucide:x",
1431
- fullscreen: "lucide:maximize",
1432
- fullscreenExit: "lucide:minimize",
1433
- chevronLeft: "lucide:chevron-left",
1434
- check: "lucide:check",
1435
- spinner: "lucide:loader-2",
1436
- screenshot: "lucide:camera",
1437
- flip: "lucide:flip-horizontal-2",
1438
- aspectRatio: "lucide:monitor",
1439
- info: "lucide:info",
1440
- loop: "lucide:repeat"
1441
1434
  };
1442
1435
  //#endregion
1443
- export { p as BaseMediaEngine, g as DashMediaEngine, t as EventBus, h as HlsMediaEngine, n as HotkeyRegistry, a as I18n, m as NativeVideoEngine, M as STORAGE_KEYS, j as Storage, c as canUseFullscreen, o as canUseMSE, s as canUseNativeHLS, l as canUsePictureInPicture, u as canUseTextTracks, X as createGestureEngine, x as createMediaStore, Y as createPlayer, b as createResolvedMediaEngine, $ as defaultPlayerIcons, Q as defaultPlayerLabels, v as detectSourceKind, I as fetchSubtitles, V as fetchThumbnails, Z as formatTime, L as getActiveCue, S as getInitialMediaState, d as getMediaCapabilities, H as getThumbnailAtTime, f as isFiniteDuration, P as parseSRT, z as parseThumbnailVTT, N as parseTimestamp, F as parseVTT, w as selectAudio, k as selectError, C as selectMedia, D as selectPlugins, T as selectPreferences, O as selectThumbnails, E as selectUI, y as toPlayerSource };
1436
+ export { p as BaseMediaEngine, g as DashMediaEngine, t as EventBus, h as HlsMediaEngine, n as HotkeyRegistry, a as I18n, m as NativeVideoEngine, M as STORAGE_KEYS, j as Storage, c as canUseFullscreen, o as canUseMSE, s as canUseNativeHLS, l as canUsePictureInPicture, u as canUseTextTracks, X as createGestureEngine, x as createMediaStore, Y as createPlayer, b as createResolvedMediaEngine, Q as defaultPlayerLabels, v as detectSourceKind, I as fetchSubtitles, V as fetchThumbnails, Z as formatTime, L as getActiveCue, S as getInitialMediaState, d as getMediaCapabilities, H as getThumbnailAtTime, f as isFiniteDuration, P as parseSRT, z as parseThumbnailVTT, N as parseTimestamp, F as parseVTT, w as selectAudio, k as selectError, C as selectMedia, D as selectPlugins, T as selectPreferences, O as selectThumbnails, E as selectUI, y as toPlayerSource };
package/dist/types.d.ts CHANGED
@@ -12,36 +12,12 @@ import type { MediaState } from './state/slices';
12
12
  import type { Storage } from './storage';
13
13
  import type { SubtitleTrack } from './subtitle-parser';
14
14
  export type { MediaState };
15
- /** Iconify icon identifier, e.g. "lucide:play" or "mdi:play" */
16
- export type SvgIcon = string;
17
- export interface PlayerIcons {
18
- play: SvgIcon;
19
- pause: SvgIcon;
20
- replay: SvgIcon;
21
- skipBack: SvgIcon;
22
- skipForward: SvgIcon;
23
- volumeHigh: SvgIcon;
24
- volumeLow: SvgIcon;
25
- volumeOff: SvgIcon;
26
- settings: SvgIcon;
27
- pip: SvgIcon;
28
- miniPlayer: SvgIcon;
29
- close: SvgIcon;
30
- fullscreen: SvgIcon;
31
- fullscreenExit: SvgIcon;
32
- chevronLeft: SvgIcon;
33
- check: SvgIcon;
34
- spinner: SvgIcon;
35
- screenshot: SvgIcon;
36
- flip: SvgIcon;
37
- aspectRatio: SvgIcon;
38
- info: SvgIcon;
39
- loop: SvgIcon;
40
- }
41
15
  export interface PlayerOptions {
42
16
  src: string;
43
17
  /** MIME/content type hint used by source provider selection. */
44
18
  type?: string;
19
+ /** Title exposed to browser and operating-system media controls. */
20
+ title?: string;
45
21
  poster?: string;
46
22
  subtitles?: SubtitleTrack[];
47
23
  qualities?: string[];
@@ -172,7 +148,7 @@ export interface PlayerInstance {
172
148
  hotkeys: HotkeyRegistry;
173
149
  /** The active media engine. Null before mount and after unmount. */
174
150
  engine: MediaEngine | null;
175
- updateOptions(opts: Partial<Pick<PlayerOptions, 'src' | 'type' | 'poster' | 'autoPlay' | 'subtitles' | 'qualities' | 'thumbnails' | 'transformThumbnailVTT'>>): void;
151
+ updateOptions(opts: Partial<Pick<PlayerOptions, 'src' | 'type' | 'title' | 'poster' | 'autoPlay' | 'subtitles' | 'qualities' | 'thumbnails' | 'transformThumbnailVTT'>>): void;
176
152
  setThumbnails(url?: string): void;
177
153
  initPlugins(plugins: PlayerPlugin[]): () => void;
178
154
  mount(videoEl: HTMLVideoElement, containerEl: HTMLDivElement): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vplayer/core",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",