vidply 1.2.1 → 1.2.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.
Files changed (106) hide show
  1. package/README.md +30 -2
  2. package/dist/dev/{vidply.AudioDescriptionManager-6RFVF27Z.js → vidply.AudioDescriptionManager-JYYLK5KB.js} +6 -6
  3. package/dist/dev/{vidply.CaptionStyleMenu-R2SCQ6VP.js → vidply.CaptionStyleMenu-47RCKQF5.js} +4 -4
  4. package/dist/dev/{vidply.DASHRenderer-EOVEW73H.js → vidply.DASHRenderer-VEJ4HDHO.js} +3 -3
  5. package/dist/dev/{vidply.FloatingPlayerManager-V5XQWS75.js → vidply.FloatingPlayerManager-C2UVRPZY.js} +5 -5
  6. package/dist/dev/{vidply.HLSRenderer-ZBEFVH5W.js → vidply.HLSRenderer-ZVBK2TNQ.js} +4 -4
  7. package/dist/dev/vidply.HTML5Renderer-HLRQUOCU.js +12 -0
  8. package/dist/dev/{vidply.SignLanguageManager-7IAJOVF6.js → vidply.SignLanguageManager-FLUCBW5H.js} +8 -8
  9. package/dist/dev/{vidply.SoundCloudRenderer-OA7QQYGN.js → vidply.SoundCloudRenderer-MGMAJ7NK.js} +3 -3
  10. package/dist/dev/{vidply.TranscriptManager-BPM3T23L.js → vidply.TranscriptManager-Y2RYXHJW.js} +10 -10
  11. package/dist/dev/{vidply.VimeoRenderer-BRHFYPNJ.js → vidply.VimeoRenderer-RQFQD7OE.js} +3 -3
  12. package/dist/dev/{vidply.YouTubeRenderer-HRTN4EJ5.js → vidply.YouTubeRenderer-EU2BARZF.js} +3 -3
  13. package/dist/dev/{vidply.chunk-UHMVDBDB.js → vidply.chunk-6LYZYI5G.js} +3 -3
  14. package/dist/dev/{vidply.chunk-W5BR65JY.js → vidply.chunk-A4ESEOQ2.js} +6 -6
  15. package/dist/dev/{vidply.chunk-XAK3DPTO.js → vidply.chunk-CGYIED2I.js} +2 -2
  16. package/dist/dev/{vidply.chunk-YVCYQZJI.js → vidply.chunk-HZ7UOKOU.js} +3 -3
  17. package/dist/dev/{vidply.chunk-NSMAZCMB.js → vidply.chunk-I6EDRYGJ.js} +33 -6
  18. package/dist/dev/{vidply.chunk-NSMAZCMB.js.map → vidply.chunk-I6EDRYGJ.js.map} +2 -2
  19. package/dist/dev/{vidply.chunk-LDVFAFGC.js → vidply.chunk-JKMQGLCJ.js} +5 -5
  20. package/dist/dev/{vidply.chunk-HOYEMJSD.js → vidply.chunk-JZNZX32Z.js} +2 -2
  21. package/dist/dev/{vidply.chunk-JAKZNGOR.js → vidply.chunk-P25MRJ6O.js} +2 -2
  22. package/dist/dev/{vidply.chunk-5IK3IC5V.js → vidply.chunk-PRFNESYA.js} +2 -2
  23. package/dist/dev/{vidply.chunk-RQG3MA7W.js → vidply.chunk-UI3RYCVF.js} +4 -3
  24. package/dist/dev/{vidply.chunk-RQG3MA7W.js.map → vidply.chunk-UI3RYCVF.js.map} +2 -2
  25. package/dist/dev/{vidply.chunk-C55OBT5H.js → vidply.chunk-UNFGMABP.js} +2 -2
  26. package/dist/dev/{vidply.de-5W5LBFSJ.js → vidply.de-VAUVSQXC.js} +29 -2
  27. package/dist/dev/{vidply.de-5W5LBFSJ.js.map → vidply.de-VAUVSQXC.js.map} +2 -2
  28. package/dist/dev/{vidply.es-SHDAT6L6.js → vidply.es-G65HFWO6.js} +29 -2
  29. package/dist/dev/{vidply.es-SHDAT6L6.js.map → vidply.es-G65HFWO6.js.map} +2 -2
  30. package/dist/dev/vidply.esm.js +594 -20
  31. package/dist/dev/vidply.esm.js.map +3 -3
  32. package/dist/dev/{vidply.fr-2JANOMNB.js → vidply.fr-MJNOZELM.js} +29 -2
  33. package/dist/dev/{vidply.fr-2JANOMNB.js.map → vidply.fr-MJNOZELM.js.map} +2 -2
  34. package/dist/dev/{vidply.ja-WWMSTEJH.js → vidply.ja-INMDHIYJ.js} +29 -2
  35. package/dist/dev/{vidply.ja-WWMSTEJH.js.map → vidply.ja-INMDHIYJ.js.map} +2 -2
  36. package/dist/legacy/vidply.js +718 -3
  37. package/dist/legacy/vidply.js.map +3 -3
  38. package/dist/legacy/vidply.min.js +2 -2
  39. package/dist/legacy/vidply.min.meta.json +72 -19
  40. package/dist/prod/{vidply.AudioDescriptionManager-YTDVDQBO.min.js → vidply.AudioDescriptionManager-EKWUNOPE.min.js} +2 -2
  41. package/dist/prod/{vidply.CaptionStyleMenu-2AFF3HF2.min.js → vidply.CaptionStyleMenu-JTWSNHRQ.min.js} +2 -2
  42. package/dist/prod/{vidply.DASHRenderer-URDOTOKS.min.js → vidply.DASHRenderer-CIDAHFWM.min.js} +2 -2
  43. package/dist/prod/{vidply.FloatingPlayerManager-QUBFK7CQ.min.js → vidply.FloatingPlayerManager-VZXHPCPM.min.js} +2 -2
  44. package/dist/prod/{vidply.HLSRenderer-46KNUVAB.min.js → vidply.HLSRenderer-Q6EFYKID.min.js} +2 -2
  45. package/dist/prod/vidply.HTML5Renderer-XRDJUTOO.min.js +6 -0
  46. package/dist/prod/{vidply.SignLanguageManager-H4C36EVL.min.js → vidply.SignLanguageManager-JUOSA5AM.min.js} +2 -2
  47. package/dist/prod/{vidply.SoundCloudRenderer-OYSWMW7D.min.js → vidply.SoundCloudRenderer-7ODD46PO.min.js} +2 -2
  48. package/dist/prod/{vidply.TranscriptManager-BA3DAS63.min.js → vidply.TranscriptManager-4B2QKYGQ.min.js} +2 -2
  49. package/dist/prod/{vidply.VimeoRenderer-NF3COTHU.min.js → vidply.VimeoRenderer-MR3UYLY7.min.js} +2 -2
  50. package/dist/prod/{vidply.YouTubeRenderer-UCQKYIJ4.min.js → vidply.YouTubeRenderer-ITRTC7NR.min.js} +2 -2
  51. package/dist/prod/{vidply.chunk-7S5AFTST.min.js → vidply.chunk-3EEDXU4T.min.js} +2 -2
  52. package/dist/prod/{vidply.chunk-EUOA2DJK.min.js → vidply.chunk-5HTX5QXW.min.js} +1 -1
  53. package/dist/prod/{vidply.chunk-JPMAK3NS.min.js → vidply.chunk-6OGHHIYP.min.js} +2 -2
  54. package/dist/prod/{vidply.chunk-XXUH7ADU.min.js → vidply.chunk-GUPGMFUZ.min.js} +2 -2
  55. package/dist/prod/{vidply.chunk-M76ABMKB.min.js → vidply.chunk-MWEBITCP.min.js} +1 -1
  56. package/dist/prod/{vidply.chunk-G6KGXNEW.min.js → vidply.chunk-PL3P3JHR.min.js} +1 -1
  57. package/dist/prod/{vidply.chunk-6ECBIYVI.min.js → vidply.chunk-QQZGV7TD.min.js} +2 -2
  58. package/dist/prod/{vidply.chunk-2HNCP64N.min.js → vidply.chunk-U5IRRYG5.min.js} +1 -1
  59. package/dist/prod/{vidply.chunk-WRVDVD33.min.js → vidply.chunk-VKHV4QHA.min.js} +2 -2
  60. package/dist/prod/{vidply.chunk-L4O44K63.min.js → vidply.chunk-XA4M574A.min.js} +1 -1
  61. package/dist/prod/{vidply.chunk-X2FQEQYR.min.js → vidply.chunk-ZPTV4JEP.min.js} +2 -2
  62. package/dist/prod/{vidply.de-JMCATTKZ.min.js → vidply.de-UZHFCEZU.min.js} +2 -2
  63. package/dist/prod/{vidply.es-YVG37V7Z.min.js → vidply.es-BOISUV2S.min.js} +2 -2
  64. package/dist/prod/vidply.esm.min.js +2 -2
  65. package/dist/prod/{vidply.fr-OGKGN2R4.min.js → vidply.fr-ICSMKPFM.min.js} +2 -2
  66. package/dist/prod/{vidply.ja-Z6DS7QLS.min.js → vidply.ja-VQ2HKGAY.min.js} +2 -2
  67. package/dist/vidply.css +56 -0
  68. package/dist/vidply.esm.min.meta.json +154 -112
  69. package/dist/vidply.min.css +1 -1
  70. package/package.json +7 -7
  71. package/src/controls/ControlBar.ts +32 -0
  72. package/src/controls/KeyboardHelp.ts +326 -0
  73. package/src/controls/KeyboardManager.ts +4 -0
  74. package/src/core/MediaSessionManager.ts +341 -0
  75. package/src/core/Player.ts +59 -1
  76. package/src/i18n/languages/de.ts +27 -0
  77. package/src/i18n/languages/en.ts +27 -0
  78. package/src/i18n/languages/es.ts +27 -0
  79. package/src/i18n/languages/fr.ts +27 -0
  80. package/src/i18n/languages/ja.ts +27 -0
  81. package/src/icons/Icons.ts +2 -1
  82. package/src/styles/vidply.css +56 -0
  83. package/src/types/events.ts +4 -0
  84. package/src/types/options.ts +14 -0
  85. package/dist/dev/vidply.HTML5Renderer-P7ICKYU4.js +0 -12
  86. package/dist/prod/vidply.HTML5Renderer-7TQDMIGY.min.js +0 -6
  87. /package/dist/dev/{vidply.AudioDescriptionManager-6RFVF27Z.js.map → vidply.AudioDescriptionManager-JYYLK5KB.js.map} +0 -0
  88. /package/dist/dev/{vidply.CaptionStyleMenu-R2SCQ6VP.js.map → vidply.CaptionStyleMenu-47RCKQF5.js.map} +0 -0
  89. /package/dist/dev/{vidply.DASHRenderer-EOVEW73H.js.map → vidply.DASHRenderer-VEJ4HDHO.js.map} +0 -0
  90. /package/dist/dev/{vidply.FloatingPlayerManager-V5XQWS75.js.map → vidply.FloatingPlayerManager-C2UVRPZY.js.map} +0 -0
  91. /package/dist/dev/{vidply.HLSRenderer-ZBEFVH5W.js.map → vidply.HLSRenderer-ZVBK2TNQ.js.map} +0 -0
  92. /package/dist/dev/{vidply.HTML5Renderer-P7ICKYU4.js.map → vidply.HTML5Renderer-HLRQUOCU.js.map} +0 -0
  93. /package/dist/dev/{vidply.SignLanguageManager-7IAJOVF6.js.map → vidply.SignLanguageManager-FLUCBW5H.js.map} +0 -0
  94. /package/dist/dev/{vidply.SoundCloudRenderer-OA7QQYGN.js.map → vidply.SoundCloudRenderer-MGMAJ7NK.js.map} +0 -0
  95. /package/dist/dev/{vidply.TranscriptManager-BPM3T23L.js.map → vidply.TranscriptManager-Y2RYXHJW.js.map} +0 -0
  96. /package/dist/dev/{vidply.VimeoRenderer-BRHFYPNJ.js.map → vidply.VimeoRenderer-RQFQD7OE.js.map} +0 -0
  97. /package/dist/dev/{vidply.YouTubeRenderer-HRTN4EJ5.js.map → vidply.YouTubeRenderer-EU2BARZF.js.map} +0 -0
  98. /package/dist/dev/{vidply.chunk-UHMVDBDB.js.map → vidply.chunk-6LYZYI5G.js.map} +0 -0
  99. /package/dist/dev/{vidply.chunk-W5BR65JY.js.map → vidply.chunk-A4ESEOQ2.js.map} +0 -0
  100. /package/dist/dev/{vidply.chunk-XAK3DPTO.js.map → vidply.chunk-CGYIED2I.js.map} +0 -0
  101. /package/dist/dev/{vidply.chunk-YVCYQZJI.js.map → vidply.chunk-HZ7UOKOU.js.map} +0 -0
  102. /package/dist/dev/{vidply.chunk-LDVFAFGC.js.map → vidply.chunk-JKMQGLCJ.js.map} +0 -0
  103. /package/dist/dev/{vidply.chunk-HOYEMJSD.js.map → vidply.chunk-JZNZX32Z.js.map} +0 -0
  104. /package/dist/dev/{vidply.chunk-JAKZNGOR.js.map → vidply.chunk-P25MRJ6O.js.map} +0 -0
  105. /package/dist/dev/{vidply.chunk-5IK3IC5V.js.map → vidply.chunk-PRFNESYA.js.map} +0 -0
  106. /package/dist/dev/{vidply.chunk-C55OBT5H.js.map → vidply.chunk-UNFGMABP.js.map} +0 -0
@@ -8,6 +8,7 @@ import {DOMUtils} from '../utils/DOMUtils.js';
8
8
  import {ControlBar} from '../controls/ControlBar.js';
9
9
  import {CaptionManager} from '../controls/CaptionManager.js';
10
10
  import {KeyboardManager} from '../controls/KeyboardManager.js';
11
+ import {MediaSessionManager} from './MediaSessionManager.js';
11
12
  import {HTML5Renderer} from '../renderers/HTML5Renderer.js';
12
13
  import {createPlayOverlay} from '../icons/Icons.js';
13
14
  import {i18n} from '../i18n/i18n.js';
@@ -41,6 +42,7 @@ import type {FloatingPlayerManager} from './FloatingPlayerManager.js';
41
42
  import type {TranscriptManager} from '../controls/TranscriptManager.js';
42
43
  import type {PlaylistManager} from '../features/PlaylistManager.js';
43
44
  import type {SettingsDialog} from '../controls/SettingsDialog.js';
45
+ import {KeyboardHelp} from '../controls/KeyboardHelp.js';
44
46
 
45
47
  // Typed dynamic loaders. Each loader returns the constructor for the
46
48
  // lazily imported manager, so call sites get full IntelliSense and
@@ -167,9 +169,11 @@ export class Player extends EventEmitter<PlayerEventMap> {
167
169
  controlBar: ControlBar | null = null;
168
170
  captionManager: CaptionManager | null = null;
169
171
  keyboardManager: KeyboardManager | null = null;
172
+ mediaSessionManager: MediaSessionManager | null = null;
170
173
  transcriptManager: TranscriptManager | null = null;
171
174
  playlistManager: PlaylistManager | null = null;
172
175
  settingsDialog: SettingsDialog | null = null;
176
+ keyboardHelp: KeyboardHelp | null = null;
173
177
  audioDescriptionManager: AudioDescriptionManager | null = null;
174
178
  signLanguageManager: SignLanguageManager | null = null;
175
179
  floatingPlayerManager: FloatingPlayerManager | null = null;
@@ -310,6 +314,12 @@ export class Player extends EventEmitter<PlayerEventMap> {
310
314
  responsive: true,
311
315
  fillContainer: false,
312
316
 
317
+ // Media metadata + OS media controls (Media Session API)
318
+ title: null,
319
+ artist: null,
320
+ album: null,
321
+ mediaSession: true,
322
+
313
323
  // Playback
314
324
  autoplay: false,
315
325
  loop: false,
@@ -357,6 +367,7 @@ export class Player extends EventEmitter<PlayerEventMap> {
357
367
  captionsButton: true,
358
368
  transcriptButton: true,
359
369
  fullscreenButton: true,
370
+ helpButton: true,
360
371
  pipButton: false,
361
372
  floating: false,
362
373
  floatingPosition: 'bottom-right',
@@ -417,7 +428,8 @@ export class Player extends EventEmitter<PlayerEventMap> {
417
428
  'speed-menu': ['s'],
418
429
  'quality-menu': ['q'],
419
430
  'chapters-menu': ['j'],
420
- 'transcript-toggle': ['t']
431
+ 'transcript-toggle': ['t'],
432
+ 'help': ['?']
421
433
  },
422
434
 
423
435
  // Accessibility
@@ -817,6 +829,11 @@ export class Player extends EventEmitter<PlayerEventMap> {
817
829
  this.keyboardManager = new KeyboardManager(this);
818
830
  }
819
831
 
832
+ // Integrate with OS media controls (Media Session API)
833
+ if (this.options.mediaSession) {
834
+ this.mediaSessionManager = new MediaSessionManager(this);
835
+ }
836
+
820
837
  // Set up responsive handlers
821
838
  this.setupResponsiveHandlers();
822
839
 
@@ -2607,6 +2624,29 @@ export class Player extends EventEmitter<PlayerEventMap> {
2607
2624
  // No-op - settings dialog removed
2608
2625
  }
2609
2626
 
2627
+ /**
2628
+ * Lazily build (on first use) and toggle the keyboard-shortcuts help
2629
+ * dialog. Reflects the live `keyboardShortcuts` bindings, including any
2630
+ * consumer overrides.
2631
+ */
2632
+ toggleKeyboardHelp() {
2633
+ if (!this.keyboardHelp) {
2634
+ this.keyboardHelp = new KeyboardHelp(this);
2635
+ }
2636
+ this.keyboardHelp.toggle();
2637
+ }
2638
+
2639
+ showKeyboardHelp() {
2640
+ if (!this.keyboardHelp) {
2641
+ this.keyboardHelp = new KeyboardHelp(this);
2642
+ }
2643
+ this.keyboardHelp.show();
2644
+ }
2645
+
2646
+ hideKeyboardHelp() {
2647
+ this.keyboardHelp?.hide();
2648
+ }
2649
+
2610
2650
  // Utility methods
2611
2651
  getCurrentTime() {
2612
2652
  return this.state.currentTime;
@@ -2778,6 +2818,24 @@ export class Player extends EventEmitter<PlayerEventMap> {
2778
2818
  this.settingsDialog = null;
2779
2819
  }
2780
2820
 
2821
+ if (this.keyboardHelp && typeof this.keyboardHelp.destroy === 'function') {
2822
+ try {
2823
+ this.keyboardHelp.destroy();
2824
+ } catch (err) {
2825
+ this.log(`KeyboardHelp.destroy failed: ${err}`, 'warn');
2826
+ }
2827
+ this.keyboardHelp = null;
2828
+ }
2829
+
2830
+ if (this.mediaSessionManager && typeof this.mediaSessionManager.destroy === 'function') {
2831
+ try {
2832
+ this.mediaSessionManager.destroy();
2833
+ } catch (err) {
2834
+ this.log(`MediaSessionManager.destroy failed: ${err}`, 'warn');
2835
+ }
2836
+ this.mediaSessionManager = null;
2837
+ }
2838
+
2781
2839
  // Clean up floating player manager (disconnects IntersectionObserver,
2782
2840
  // returns the container to its original parent if still floating)
2783
2841
  if (this.floatingPlayerManager) {
@@ -175,6 +175,33 @@ export const de = {
175
175
  reset: 'Zurücksetzen',
176
176
  close: 'Schließen'
177
177
  },
178
+ help: {
179
+ title: 'Tastaturkürzel',
180
+ button: 'Tastaturkürzel',
181
+ close: 'Schließen',
182
+ or: 'oder',
183
+ keys: {
184
+ space: 'Leertaste'
185
+ },
186
+ actions: {
187
+ 'play-pause': 'Wiedergabe / Pause',
188
+ 'seek-backward': 'Zurückspulen',
189
+ 'seek-forward': 'Vorspulen',
190
+ 'volume-up': 'Lauter',
191
+ 'volume-down': 'Leiser',
192
+ 'mute': 'Stumm / Ton an',
193
+ 'captions': 'Untertitel umschalten',
194
+ 'caption-style-menu': 'Untertitel-Stil',
195
+ 'speed-down': 'Langsamer',
196
+ 'speed-up': 'Schneller',
197
+ 'speed-menu': 'Wiedergabegeschwindigkeit',
198
+ 'quality-menu': 'Qualität',
199
+ 'chapters-menu': 'Kapitel',
200
+ 'transcript-toggle': 'Transkript umschalten',
201
+ 'fullscreen': 'Vollbild umschalten',
202
+ 'help': 'Tastaturkürzel'
203
+ }
204
+ },
178
205
  speeds: {
179
206
  normal: 'Normal'
180
207
  },
@@ -176,6 +176,33 @@ export const en = {
176
176
  reset: 'Reset to defaults',
177
177
  close: 'Close'
178
178
  },
179
+ help: {
180
+ title: 'Keyboard shortcuts',
181
+ button: 'Keyboard shortcuts',
182
+ close: 'Close',
183
+ or: 'or',
184
+ keys: {
185
+ space: 'Space'
186
+ },
187
+ actions: {
188
+ 'play-pause': 'Play / Pause',
189
+ 'seek-backward': 'Seek backward',
190
+ 'seek-forward': 'Seek forward',
191
+ 'volume-up': 'Volume up',
192
+ 'volume-down': 'Volume down',
193
+ 'mute': 'Mute / Unmute',
194
+ 'captions': 'Toggle captions',
195
+ 'caption-style-menu': 'Caption styling',
196
+ 'speed-down': 'Decrease speed',
197
+ 'speed-up': 'Increase speed',
198
+ 'speed-menu': 'Playback speed',
199
+ 'quality-menu': 'Quality',
200
+ 'chapters-menu': 'Chapters',
201
+ 'transcript-toggle': 'Toggle transcript',
202
+ 'fullscreen': 'Toggle fullscreen',
203
+ 'help': 'Keyboard shortcuts'
204
+ }
205
+ },
179
206
  speeds: {
180
207
  normal: 'Normal'
181
208
  },
@@ -172,6 +172,33 @@ export const es = {
172
172
  reset: 'Restablecer',
173
173
  close: 'Cerrar'
174
174
  },
175
+ help: {
176
+ title: 'Atajos de teclado',
177
+ button: 'Atajos de teclado',
178
+ close: 'Cerrar',
179
+ or: 'o',
180
+ keys: {
181
+ space: 'Espacio'
182
+ },
183
+ actions: {
184
+ 'play-pause': 'Reproducir / Pausar',
185
+ 'seek-backward': 'Retroceder',
186
+ 'seek-forward': 'Avanzar',
187
+ 'volume-up': 'Subir volumen',
188
+ 'volume-down': 'Bajar volumen',
189
+ 'mute': 'Silenciar / Activar sonido',
190
+ 'captions': 'Alternar subtítulos',
191
+ 'caption-style-menu': 'Estilo de subtítulos',
192
+ 'speed-down': 'Reducir velocidad',
193
+ 'speed-up': 'Aumentar velocidad',
194
+ 'speed-menu': 'Velocidad de reproducción',
195
+ 'quality-menu': 'Calidad',
196
+ 'chapters-menu': 'Capítulos',
197
+ 'transcript-toggle': 'Alternar transcripción',
198
+ 'fullscreen': 'Alternar pantalla completa',
199
+ 'help': 'Atajos de teclado'
200
+ }
201
+ },
175
202
  speeds: {
176
203
  normal: 'Normal'
177
204
  },
@@ -172,6 +172,33 @@ export const fr = {
172
172
  reset: 'Réinitialiser',
173
173
  close: 'Fermer'
174
174
  },
175
+ help: {
176
+ title: 'Raccourcis clavier',
177
+ button: 'Raccourcis clavier',
178
+ close: 'Fermer',
179
+ or: 'ou',
180
+ keys: {
181
+ space: 'Espace'
182
+ },
183
+ actions: {
184
+ 'play-pause': 'Lecture / Pause',
185
+ 'seek-backward': 'Reculer',
186
+ 'seek-forward': 'Avancer',
187
+ 'volume-up': 'Augmenter le volume',
188
+ 'volume-down': 'Baisser le volume',
189
+ 'mute': 'Couper / Activer le son',
190
+ 'captions': 'Activer/désactiver les sous-titres',
191
+ 'caption-style-menu': 'Style des sous-titres',
192
+ 'speed-down': 'Ralentir',
193
+ 'speed-up': 'Accélérer',
194
+ 'speed-menu': 'Vitesse de lecture',
195
+ 'quality-menu': 'Qualité',
196
+ 'chapters-menu': 'Chapitres',
197
+ 'transcript-toggle': 'Activer/désactiver la transcription',
198
+ 'fullscreen': 'Activer/désactiver le plein écran',
199
+ 'help': 'Raccourcis clavier'
200
+ }
201
+ },
175
202
  speeds: {
176
203
  normal: 'Normal'
177
204
  },
@@ -172,6 +172,33 @@ export const ja = {
172
172
  reset: 'リセット',
173
173
  close: '閉じる'
174
174
  },
175
+ help: {
176
+ title: 'キーボードショートカット',
177
+ button: 'キーボードショートカット',
178
+ close: '閉じる',
179
+ or: 'または',
180
+ keys: {
181
+ space: 'スペース'
182
+ },
183
+ actions: {
184
+ 'play-pause': '再生 / 一時停止',
185
+ 'seek-backward': '巻き戻し',
186
+ 'seek-forward': '早送り',
187
+ 'volume-up': '音量を上げる',
188
+ 'volume-down': '音量を下げる',
189
+ 'mute': 'ミュート / ミュート解除',
190
+ 'captions': '字幕の切り替え',
191
+ 'caption-style-menu': '字幕スタイル',
192
+ 'speed-down': '速度を下げる',
193
+ 'speed-up': '速度を上げる',
194
+ 'speed-menu': '再生速度',
195
+ 'quality-menu': '画質',
196
+ 'chapters-menu': 'チャプター',
197
+ 'transcript-toggle': '文字起こしの切り替え',
198
+ 'fullscreen': '全画面表示の切り替え',
199
+ 'help': 'キーボードショートカット'
200
+ }
201
+ },
175
202
  speeds: {
176
203
  normal: '通常'
177
204
  },
@@ -37,7 +37,8 @@ const iconPaths: Record<string, string> = {
37
37
  move: `<path d="M10 9h4V6h3l-5-5-5 5h3v3zm-1 1H6V7l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3H7l5 5 5-5h-3v-3z"/>`,
38
38
  resize: `<path d="M21.71 11.29l-9-9c-.39-.39-1.02-.39-1.41 0l-9 9c-.39.39-.39 1.02 0 1.41l9 9c.39.39 1.02.39 1.41 0l9-9c.39-.38.39-1.01 0-1.41zM14 14.5V12h-4v2.5L7 11l3-3.5V10h4V7.5l3 3.5-3 3.5z"/>`,
39
39
  clock: `<path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/><path d="M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"/>`,
40
- download: `<path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/>`
40
+ download: `<path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/>`,
41
+ help: `<path d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"/>`
41
42
  };
42
43
 
43
44
  // The `xmlns` declaration is mandatory for `DOMParser.parseFromString`
@@ -2707,6 +2707,62 @@ video[data-vidply]:not(.vidply-initialized) {
2707
2707
  background: var(--vidply-white-20);
2708
2708
  }
2709
2709
 
2710
+ /* Keyboard shortcuts help dialog */
2711
+ .vidply-help-list {
2712
+ align-items: center;
2713
+ column-gap: var(--vidply-gap-lg);
2714
+ display: grid;
2715
+ grid-template-columns: 1fr auto;
2716
+ margin: 0;
2717
+ row-gap: var(--vidply-gap-md);
2718
+ }
2719
+
2720
+ .vidply-help-action {
2721
+ color: var(--vidply-white-90);
2722
+ font-size: var(--vidply-font-md);
2723
+ grid-column: 1;
2724
+ margin: 0;
2725
+ }
2726
+
2727
+ .vidply-help-keys {
2728
+ align-items: center;
2729
+ display: flex;
2730
+ flex-wrap: wrap;
2731
+ gap: var(--vidply-gap-xs);
2732
+ grid-column: 2;
2733
+ justify-content: flex-end;
2734
+ margin: 0;
2735
+ }
2736
+
2737
+ .vidply-help-key {
2738
+ background: var(--vidply-white-10);
2739
+ border: 0.0625rem solid var(--vidply-white-20);
2740
+ border-radius: var(--vidply-radius-md);
2741
+ color: var(--vidply-white);
2742
+ font-family: monospace;
2743
+ font-size: var(--vidply-font-base);
2744
+ line-height: 1;
2745
+ min-width: 1.5rem;
2746
+ padding: 0.25rem 0.4rem;
2747
+ text-align: center;
2748
+ }
2749
+
2750
+ .vidply-help-key-sep {
2751
+ color: var(--vidply-text-muted);
2752
+ font-size: var(--vidply-font-base);
2753
+ padding: 0 0.15rem;
2754
+ }
2755
+
2756
+ .vidply-theme-light .vidply-help-action {
2757
+ color: #1a1a1a;
2758
+ }
2759
+
2760
+ .vidply-theme-light .vidply-help-key {
2761
+ background: #f0f0f0;
2762
+ border-color: rgb(0 0 0 / 20%);
2763
+ color: #1a1a1a;
2764
+ }
2765
+
2710
2766
  /* Fullscreen Styles */
2711
2767
  .vidply-player:is(.vidply-fullscreen, :fullscreen) {
2712
2768
  background: #000;
@@ -78,6 +78,10 @@ export interface PlayerEventMap {
78
78
  settingsopen: void;
79
79
  settingsclose: void;
80
80
 
81
+ // Keyboard shortcuts help
82
+ keyboardhelpopen: void;
83
+ keyboardhelpclose: void;
84
+
81
85
  // Audio description
82
86
  audiodescriptionenabled: void;
83
87
  audiodescriptiondisabled: void;
@@ -16,6 +16,7 @@ export interface KeyboardShortcuts {
16
16
  'quality-menu'?: string[];
17
17
  'chapters-menu'?: string[];
18
18
  'transcript-toggle'?: string[];
19
+ 'help'?: string[];
19
20
  }
20
21
 
21
22
  export interface PlayerOptions {
@@ -27,6 +28,18 @@ export interface PlayerOptions {
27
28
  fillContainer: boolean;
28
29
  mediaType?: 'video' | 'audio';
29
30
 
31
+ // Media metadata (used for the Media Session API: OS / lock-screen
32
+ // controls and now-playing info). For playlists, the per-track
33
+ // title/artist/poster take precedence over these.
34
+ title?: string | null;
35
+ artist?: string | null;
36
+ album?: string | null;
37
+
38
+ // Integrate with the OS media controls via the Media Session API
39
+ // (lock-screen / notification controls, headset buttons, now-playing
40
+ // metadata and artwork). Set to false to opt out.
41
+ mediaSession: boolean;
42
+
30
43
  // Playback
31
44
  autoplay: boolean;
32
45
  loop: boolean;
@@ -70,6 +83,7 @@ export interface PlayerOptions {
70
83
  downloadFileSize: number | null;
71
84
  downloadFetchSize: boolean;
72
85
  playlistToggleButton?: boolean;
86
+ helpButton: boolean;
73
87
 
74
88
  // Seeking
75
89
  seekInterval: number;
@@ -1,12 +0,0 @@
1
- /*!
2
- * VidPly v1.2.1 - Universal, Accessible Video Player
3
- * (c) 2026 Matthias Peltzer
4
- * Released under GPL-2.0-or-later License
5
- */
6
- import {
7
- HTML5Renderer
8
- } from "./vidply.chunk-XAK3DPTO.js";
9
- export {
10
- HTML5Renderer
11
- };
12
- //# sourceMappingURL=vidply.HTML5Renderer-P7ICKYU4.js.map
@@ -1,6 +0,0 @@
1
- /*!
2
- * VidPly v1.2.1 - Universal, Accessible Video Player
3
- * (c) 2026 Matthias Peltzer
4
- * Released under GPL-2.0-or-later License
5
- */
6
- import{HTML5Renderer as i}from"./vidply.chunk-2HNCP64N.min.js";export{i as HTML5Renderer};