vidply 1.2.0 → 1.2.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.
Files changed (164) hide show
  1. package/README.md +946 -946
  2. package/dist/dev/{vidply.AudioDescriptionManager-R47Q4YR4.js → vidply.AudioDescriptionManager-6RFVF27Z.js} +275 -19
  3. package/dist/dev/vidply.AudioDescriptionManager-6RFVF27Z.js.map +7 -0
  4. package/dist/dev/{vidply.CaptionStyleMenu-7XHRBWUM.js → vidply.CaptionStyleMenu-R2SCQ6VP.js} +4 -4
  5. package/dist/dev/{vidply.DASHRenderer-PWEMC3BT.js → vidply.DASHRenderer-EOVEW73H.js} +3 -3
  6. package/dist/dev/vidply.DASHRenderer-EOVEW73H.js.map +7 -0
  7. package/dist/dev/{vidply.FloatingPlayerManager-PKNNNAS2.js → vidply.FloatingPlayerManager-V5XQWS75.js} +5 -5
  8. package/dist/dev/vidply.FloatingPlayerManager-V5XQWS75.js.map +7 -0
  9. package/dist/dev/{vidply.HLSRenderer-E7RQ74HI.js → vidply.HLSRenderer-ZBEFVH5W.js} +4 -4
  10. package/dist/dev/vidply.HLSRenderer-ZBEFVH5W.js.map +7 -0
  11. package/dist/dev/vidply.HTML5Renderer-P7ICKYU4.js +12 -0
  12. package/dist/dev/{vidply.SignLanguageManager-FET5FQZ7.js → vidply.SignLanguageManager-7IAJOVF6.js} +8 -8
  13. package/dist/dev/vidply.SignLanguageManager-7IAJOVF6.js.map +7 -0
  14. package/dist/dev/{vidply.SoundCloudRenderer-RVSJZODO.js → vidply.SoundCloudRenderer-OA7QQYGN.js} +3 -3
  15. package/dist/dev/vidply.SoundCloudRenderer-OA7QQYGN.js.map +7 -0
  16. package/dist/dev/{vidply.TranscriptManager-5GXOQCLX.js → vidply.TranscriptManager-BPM3T23L.js} +10 -10
  17. package/dist/dev/vidply.TranscriptManager-BPM3T23L.js.map +7 -0
  18. package/dist/dev/{vidply.VimeoRenderer-ER2LSBBW.js → vidply.VimeoRenderer-BRHFYPNJ.js} +3 -3
  19. package/dist/dev/vidply.VimeoRenderer-BRHFYPNJ.js.map +7 -0
  20. package/dist/dev/{vidply.YouTubeRenderer-NFTOWJAB.js → vidply.YouTubeRenderer-HRTN4EJ5.js} +3 -3
  21. package/dist/dev/vidply.YouTubeRenderer-HRTN4EJ5.js.map +7 -0
  22. package/dist/dev/{vidply.chunk-6RQA4ROD.js → vidply.chunk-5IK3IC5V.js} +2 -2
  23. package/dist/dev/{vidply.chunk-JJ47NO24.js → vidply.chunk-C55OBT5H.js} +2 -2
  24. package/dist/dev/vidply.chunk-C55OBT5H.js.map +7 -0
  25. package/dist/dev/{vidply.chunk-DZSDO3B7.js → vidply.chunk-HOYEMJSD.js} +2 -2
  26. package/dist/dev/{vidply.chunk-VMSQAZM7.js → vidply.chunk-JAKZNGOR.js} +2 -2
  27. package/dist/dev/{vidply.chunk-64WXMTGL.js → vidply.chunk-LDVFAFGC.js} +5 -5
  28. package/dist/dev/vidply.chunk-LDVFAFGC.js.map +7 -0
  29. package/dist/dev/{vidply.chunk-RZWZGDV7.js → vidply.chunk-NSMAZCMB.js} +6 -6
  30. package/dist/dev/vidply.chunk-NSMAZCMB.js.map +7 -0
  31. package/dist/dev/{vidply.chunk-KI7C3QVL.js → vidply.chunk-RQG3MA7W.js} +2 -2
  32. package/dist/dev/vidply.chunk-RQG3MA7W.js.map +7 -0
  33. package/dist/dev/{vidply.chunk-BNFIUL2Z.js → vidply.chunk-UHMVDBDB.js} +3 -3
  34. package/dist/dev/vidply.chunk-UHMVDBDB.js.map +7 -0
  35. package/dist/dev/{vidply.chunk-NQPURMQY.js → vidply.chunk-W5BR65JY.js} +6 -6
  36. package/dist/dev/vidply.chunk-W5BR65JY.js.map +7 -0
  37. package/dist/dev/{vidply.chunk-W25HUCHS.js → vidply.chunk-XAK3DPTO.js} +2 -2
  38. package/dist/dev/vidply.chunk-XAK3DPTO.js.map +7 -0
  39. package/dist/dev/{vidply.chunk-SK4V2DAU.js → vidply.chunk-YVCYQZJI.js} +3 -3
  40. package/dist/dev/{vidply.de-4YAT7FFM.js → vidply.de-5W5LBFSJ.js} +2 -2
  41. package/dist/dev/vidply.de-5W5LBFSJ.js.map +7 -0
  42. package/dist/dev/{vidply.es-LEWIRUBH.js → vidply.es-SHDAT6L6.js} +2 -2
  43. package/dist/dev/vidply.es-SHDAT6L6.js.map +7 -0
  44. package/dist/dev/vidply.esm.js +73 -34
  45. package/dist/dev/vidply.esm.js.map +2 -2
  46. package/dist/dev/{vidply.fr-Q4GV2NOE.js → vidply.fr-2JANOMNB.js} +2 -2
  47. package/dist/dev/vidply.fr-2JANOMNB.js.map +7 -0
  48. package/dist/dev/{vidply.ja-S6ITA6WU.js → vidply.ja-WWMSTEJH.js} +2 -2
  49. package/dist/dev/vidply.ja-WWMSTEJH.js.map +7 -0
  50. package/dist/legacy/vidply.js +345 -32
  51. package/dist/legacy/vidply.js.map +3 -3
  52. package/dist/legacy/vidply.min.js +2 -2
  53. package/dist/legacy/vidply.min.meta.json +66 -47
  54. package/dist/prod/vidply.AudioDescriptionManager-YTDVDQBO.min.js +6 -0
  55. package/dist/prod/{vidply.CaptionStyleMenu-M3KVQWB5.min.js → vidply.CaptionStyleMenu-2AFF3HF2.min.js} +2 -2
  56. package/dist/prod/{vidply.DASHRenderer-DN3S27AV.min.js → vidply.DASHRenderer-URDOTOKS.min.js} +2 -2
  57. package/dist/prod/{vidply.FloatingPlayerManager-SKAZ4J43.min.js → vidply.FloatingPlayerManager-QUBFK7CQ.min.js} +2 -2
  58. package/dist/prod/{vidply.HLSRenderer-62HH4YTK.min.js → vidply.HLSRenderer-46KNUVAB.min.js} +2 -2
  59. package/dist/prod/vidply.HTML5Renderer-7TQDMIGY.min.js +6 -0
  60. package/dist/prod/{vidply.SignLanguageManager-V3OBTSSF.min.js → vidply.SignLanguageManager-H4C36EVL.min.js} +2 -2
  61. package/dist/prod/{vidply.SoundCloudRenderer-CXRVZIAJ.min.js → vidply.SoundCloudRenderer-OYSWMW7D.min.js} +2 -2
  62. package/dist/prod/{vidply.TranscriptManager-SYM3DFUY.min.js → vidply.TranscriptManager-BA3DAS63.min.js} +2 -2
  63. package/dist/prod/{vidply.VimeoRenderer-72TWRYFQ.min.js → vidply.VimeoRenderer-NF3COTHU.min.js} +2 -2
  64. package/dist/prod/{vidply.YouTubeRenderer-UMHEV3KD.min.js → vidply.YouTubeRenderer-UCQKYIJ4.min.js} +2 -2
  65. package/dist/prod/{vidply.chunk-Z3YDSA7O.min.js → vidply.chunk-2HNCP64N.min.js} +1 -1
  66. package/dist/prod/{vidply.chunk-EKEYJWMG.min.js → vidply.chunk-6ECBIYVI.min.js} +2 -2
  67. package/dist/prod/{vidply.chunk-YEENJS3Q.min.js → vidply.chunk-7S5AFTST.min.js} +2 -2
  68. package/dist/prod/{vidply.chunk-P4UXOHWA.min.js → vidply.chunk-EUOA2DJK.min.js} +1 -1
  69. package/dist/prod/{vidply.chunk-2TB6MUHO.min.js → vidply.chunk-G6KGXNEW.min.js} +1 -1
  70. package/dist/prod/{vidply.chunk-ABPXVDLZ.min.js → vidply.chunk-JPMAK3NS.min.js} +1 -1
  71. package/dist/prod/{vidply.chunk-P3PQBY7N.min.js → vidply.chunk-L4O44K63.min.js} +1 -1
  72. package/dist/prod/{vidply.chunk-WX3MVEAL.min.js → vidply.chunk-M76ABMKB.min.js} +1 -1
  73. package/dist/prod/{vidply.chunk-TM6AXJVD.min.js → vidply.chunk-WRVDVD33.min.js} +2 -2
  74. package/dist/prod/{vidply.chunk-RI3X7WHK.min.js → vidply.chunk-X2FQEQYR.min.js} +2 -2
  75. package/dist/prod/{vidply.chunk-UK7YGOB5.min.js → vidply.chunk-XXUH7ADU.min.js} +2 -2
  76. package/dist/prod/{vidply.de-BCHXRQ53.min.js → vidply.de-JMCATTKZ.min.js} +1 -1
  77. package/dist/prod/{vidply.es-PICAKMZD.min.js → vidply.es-YVG37V7Z.min.js} +1 -1
  78. package/dist/prod/vidply.esm.min.js +2 -2
  79. package/dist/prod/{vidply.fr-ZILI7CDR.min.js → vidply.fr-OGKGN2R4.min.js} +1 -1
  80. package/dist/prod/{vidply.ja-5WQ4OK4J.min.js → vidply.ja-Z6DS7QLS.min.js} +1 -1
  81. package/dist/vidply.css +5796 -5796
  82. package/dist/vidply.esm.min.meta.json +148 -135
  83. package/package.json +7 -7
  84. package/src/controls/CaptionManager.ts +598 -598
  85. package/src/controls/ControlBar.ts +4159 -4159
  86. package/src/controls/KeyboardManager.ts +383 -383
  87. package/src/controls/SettingsDialog.ts +488 -488
  88. package/src/controls/TranscriptManager.ts +2426 -2426
  89. package/src/core/AudioDescriptionManager.ts +863 -774
  90. package/src/core/DescriptionSpeechManager.ts +232 -0
  91. package/src/core/FloatingPlayerManager.ts +674 -674
  92. package/src/core/LazyInit.ts +80 -80
  93. package/src/core/MetadataAlertsManager.ts +514 -514
  94. package/src/core/Player.ts +2915 -2872
  95. package/src/core/PosterManager.ts +169 -169
  96. package/src/core/PseudoFullscreen.ts +179 -179
  97. package/src/core/ResponsiveManager.ts +231 -231
  98. package/src/core/ResumeManager.ts +236 -236
  99. package/src/core/SignLanguageManager.ts +1308 -1308
  100. package/src/core/ThemeManager.ts +157 -157
  101. package/src/features/PlaylistManager.ts +1838 -1827
  102. package/src/i18n/i18n.ts +223 -223
  103. package/src/i18n/languages/de.ts +217 -217
  104. package/src/i18n/languages/en.ts +218 -218
  105. package/src/i18n/languages/es.ts +214 -214
  106. package/src/i18n/languages/fr.ts +214 -214
  107. package/src/i18n/languages/ja.ts +214 -214
  108. package/src/icons/Icons.ts +167 -167
  109. package/src/index.ts +196 -193
  110. package/src/renderers/DASHRenderer.ts +1077 -1077
  111. package/src/renderers/HLSRenderer.ts +944 -944
  112. package/src/renderers/HTML5Renderer.ts +389 -389
  113. package/src/renderers/SoundCloudRenderer.ts +437 -437
  114. package/src/renderers/VimeoRenderer.ts +298 -298
  115. package/src/renderers/YouTubeRenderer.ts +290 -290
  116. package/src/styles/vidply.css +5796 -5796
  117. package/src/types/events.ts +124 -122
  118. package/src/types/globals.d.ts +313 -313
  119. package/src/types/options.ts +185 -182
  120. package/src/types/renderer.ts +58 -58
  121. package/src/utils/DOMUtils.ts +281 -281
  122. package/src/utils/DownloadInfo.ts +171 -171
  123. package/src/utils/DraggablePanel.ts +539 -539
  124. package/src/utils/DraggablePanelMenu.ts +195 -195
  125. package/src/utils/DraggableResizable.ts +997 -997
  126. package/src/utils/EventEmitter.ts +59 -59
  127. package/src/utils/FormUtils.ts +95 -95
  128. package/src/utils/MenuFactory.ts +483 -483
  129. package/src/utils/Sanitize.ts +70 -70
  130. package/src/utils/SettingsMenuFactory.ts +289 -289
  131. package/src/utils/StorageManager.ts +287 -287
  132. package/src/utils/TrackLabelUtils.ts +52 -52
  133. package/src/utils/UrlSafe.ts +69 -69
  134. package/src/utils/VideoFrameCapture.ts +114 -114
  135. package/src/utils/WindowComponents.ts +250 -250
  136. package/dist/dev/vidply.AudioDescriptionManager-R47Q4YR4.js.map +0 -7
  137. package/dist/dev/vidply.DASHRenderer-PWEMC3BT.js.map +0 -7
  138. package/dist/dev/vidply.FloatingPlayerManager-PKNNNAS2.js.map +0 -7
  139. package/dist/dev/vidply.HLSRenderer-E7RQ74HI.js.map +0 -7
  140. package/dist/dev/vidply.HTML5Renderer-BU4QJJJY.js +0 -12
  141. package/dist/dev/vidply.SignLanguageManager-FET5FQZ7.js.map +0 -7
  142. package/dist/dev/vidply.SoundCloudRenderer-RVSJZODO.js.map +0 -7
  143. package/dist/dev/vidply.TranscriptManager-5GXOQCLX.js.map +0 -7
  144. package/dist/dev/vidply.VimeoRenderer-ER2LSBBW.js.map +0 -7
  145. package/dist/dev/vidply.YouTubeRenderer-NFTOWJAB.js.map +0 -7
  146. package/dist/dev/vidply.chunk-64WXMTGL.js.map +0 -7
  147. package/dist/dev/vidply.chunk-BNFIUL2Z.js.map +0 -7
  148. package/dist/dev/vidply.chunk-JJ47NO24.js.map +0 -7
  149. package/dist/dev/vidply.chunk-KI7C3QVL.js.map +0 -7
  150. package/dist/dev/vidply.chunk-NQPURMQY.js.map +0 -7
  151. package/dist/dev/vidply.chunk-RZWZGDV7.js.map +0 -7
  152. package/dist/dev/vidply.chunk-W25HUCHS.js.map +0 -7
  153. package/dist/dev/vidply.de-4YAT7FFM.js.map +0 -7
  154. package/dist/dev/vidply.es-LEWIRUBH.js.map +0 -7
  155. package/dist/dev/vidply.fr-Q4GV2NOE.js.map +0 -7
  156. package/dist/dev/vidply.ja-S6ITA6WU.js.map +0 -7
  157. package/dist/prod/vidply.AudioDescriptionManager-RHLIJW5C.min.js +0 -6
  158. package/dist/prod/vidply.HTML5Renderer-IU5T3WEW.min.js +0 -6
  159. /package/dist/dev/{vidply.CaptionStyleMenu-7XHRBWUM.js.map → vidply.CaptionStyleMenu-R2SCQ6VP.js.map} +0 -0
  160. /package/dist/dev/{vidply.HTML5Renderer-BU4QJJJY.js.map → vidply.HTML5Renderer-P7ICKYU4.js.map} +0 -0
  161. /package/dist/dev/{vidply.chunk-6RQA4ROD.js.map → vidply.chunk-5IK3IC5V.js.map} +0 -0
  162. /package/dist/dev/{vidply.chunk-DZSDO3B7.js.map → vidply.chunk-HOYEMJSD.js.map} +0 -0
  163. /package/dist/dev/{vidply.chunk-VMSQAZM7.js.map → vidply.chunk-JAKZNGOR.js.map} +0 -0
  164. /package/dist/dev/{vidply.chunk-SK4V2DAU.js.map → vidply.chunk-YVCYQZJI.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * VidPly v1.2.0 - Universal, Accessible Video Player
2
+ * VidPly v1.2.1 - Universal, Accessible Video Player
3
3
  * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
@@ -217,4 +217,4 @@ var fr = {
217
217
  export {
218
218
  fr
219
219
  };
220
- //# sourceMappingURL=vidply.fr-Q4GV2NOE.js.map
220
+ //# sourceMappingURL=vidply.fr-2JANOMNB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/i18n/languages/fr.ts"],
4
+ "sourcesContent": ["/**\n * French translations for VidPly\n */\n\nexport const fr = {\n player: {\n label: 'Lecteur vidéo',\n play: 'Lecture',\n pause: 'Pause',\n stop: 'Arrêt',\n restart: 'Redémarrer du début',\n rewind: 'Reculer',\n forward: 'Avancer',\n rewindSeconds: 'Reculer de {seconds} secondes',\n forwardSeconds: 'Avancer de {seconds} secondes',\n previous: 'Piste précédente',\n next: 'Piste suivante',\n playlist: 'Basculer la liste de lecture',\n volume: 'Volume',\n mute: 'Muet',\n unmute: 'Activer le son',\n fullscreen: 'Plein écran',\n exitFullscreen: 'Quitter le plein écran',\n captions: 'Sous-titres',\n chapters: 'Chapitres',\n quality: 'Qualité',\n captionStyling: 'Style des sous-titres',\n transcript: 'Activer/désactiver la transcription',\n audioDescription: 'Audiodescription',\n signLanguage: 'Vidéo en langue des signes',\n settings: 'Paramètres',\n speed: 'Vitesse de lecture',\n pip: 'Image dans l\\'image',\n floatingPlayer: 'Lecteur flottant',\n floatingPlayerClose: 'Fermer le lecteur flottant',\n floatingPlayerEnter: 'D\\u00e9tacher la vid\\u00e9o',\n floatingPlayerExit: 'Rattacher la vid\\u00e9o',\n floatingPlayerDialog: 'Lecteur vid\\u00e9o flottant. Appuyez sur D pour d\\u00e9placer, R pour redimensionner, \\u00c9chap pour fermer.',\n download: 'Télécharger',\n downloadWithFormat: 'Télécharger {format}',\n downloadWithSize: 'Télécharger ({size})',\n downloadWithFormatSize: 'Télécharger {format} ({size})',\n currentTime: 'Temps actuel',\n duration: 'Durée',\n progress: 'Progression',\n seekForward: 'Avancer de {seconds} secondes',\n seekBackward: 'Reculer de {seconds} secondes',\n volumeUp: 'Augmenter le volume',\n volumeDown: 'Diminuer le volume',\n loading: 'Chargement...',\n loadingChapters: 'Chargement des chapitres...',\n error: 'Erreur de chargement',\n buffering: 'Mise en mémoire tampon...',\n signLanguageVideo: 'Vidéo en Langue des Signes',\n closeSignLanguage: 'Fermer la vidéo en langue des signes',\n signLanguageSettings: 'Paramètres de la langue des signes',\n noChapters: 'Aucun chapitre disponible',\n noCaptions: 'Aucun sous-titre disponible',\n auto: 'Automatique',\n autoQuality: 'Automatique (sélection de qualité non disponible)',\n noQuality: 'Sélection de qualité non disponible',\n signLanguageDragResize: 'Vidéo en Langue des Signes - Appuyez sur D pour déplacer avec le clavier, R pour redimensionner',\n signLanguageDragActive: 'Vidéo en Langue des Signes - Mode glissement actif. Utilisez les touches fléchées pour déplacer, Échap pour quitter.',\n signLanguageResizeActive: 'Vidéo en Langue des Signes - Mode redimensionnement actif. Utilisez les touches fléchées gauche/droite pour redimensionner, Échap pour quitter.',\n enableSignDragMode: 'Activer le mode glissement. Raccourci : touche D',\n disableSignDragMode: 'Désactiver le mode glissement. Raccourci : touche D',\n enableSignDragModeAria: 'Activer le mode glissement clavier avec les touches fléchées. Raccourci : touche D',\n disableSignDragModeAria: 'Désactiver le mode glissement clavier avec les touches fléchées. Raccourci : touche D',\n enableSignResizeMode: 'Activer le mode redimensionnement. Raccourci : touche R',\n disableSignResizeMode: 'Désactiver le mode redimensionnement. Raccourci : touche R',\n enableSignResizeModeAria: 'Activer le mode redimensionnement clavier avec les touches fléchées. Raccourci : touche R',\n disableSignResizeModeAria: 'Désactiver le mode redimensionnement clavier avec les touches fléchées. Raccourci : touche R',\n signDragModeHint: 'Mode glissement : flèches pour déplacer, Échap pour quitter',\n signResizeModeHint: 'Mode redimensionnement : flèches pour redimensionner, Échap pour quitter',\n signDragModeDisabled: 'Mode glissement de la vidéo en langue des signes désactivé.',\n signResizeModeDisabled: 'Mode redimensionnement de la vidéo en langue des signes désactivé.',\n resizeHandle: 'Redimensionner coin {direction}',\n moreOptions: 'Plus d\\'options',\n noMoreOptions: 'Aucune option supplémentaire disponible',\n playing: 'Lecture en cours',\n paused: 'En pause',\n muted: 'Muet',\n unmuted: 'Son activé',\n captionsOn: 'Sous-titres activés',\n captionsOff: 'Sous-titres désactivés',\n volumePercent: 'Volume {percent} pour cent',\n volumePercentMuted: 'Muet',\n speedRate: 'Vitesse {rate}x'\n },\n captions: {\n off: 'Désactivé',\n select: 'Sélectionner les sous-titres',\n fontSize: 'Taille de police',\n fontFamily: 'Police',\n color: 'Couleur du texte',\n backgroundColor: 'Couleur de fond',\n opacity: 'Opacité'\n },\n fontSizes: {\n small: 'Petit',\n normal: 'Normal',\n large: 'Grand',\n xlarge: 'Très grand'\n },\n fontFamilies: {\n sansSerif: 'Sans-serif',\n serif: 'Serif',\n monospace: 'Monospace'\n },\n styleLabels: {\n textColor: 'Couleur du texte',\n background: 'Arrière-plan',\n font: 'Police',\n fontSize: 'Taille de police',\n opacity: 'Opacité'\n },\n audioDescription: {\n enable: 'Activer l\\'audiodescription',\n disable: 'Désactiver l\\'audiodescription'\n },\n signLanguage: {\n show: 'Afficher la vidéo en langue des signes',\n hide: 'Masquer la vidéo en langue des signes',\n showInMainView: 'Afficher langue des signes dans la vidéo principale',\n hideInMainView: 'Masquer langue des signes de la vidéo principale'\n },\n transcript: {\n title: 'Transcription',\n ariaLabel: 'Transcription vidéo',\n close: 'Fermer la transcription',\n loading: 'Chargement de la transcription...',\n noTranscript: 'Aucune transcription disponible pour cette vidéo.',\n settings: 'Paramètres de transcription. Appuyez sur Entrée pour ouvrir le menu ou D pour activer le mode glissement',\n keyboardDragMode: 'Basculer le mode glissement avec les touches fléchées. Raccourci: touche D',\n keyboardDragActive: '⌨️ Mode Glissement Clavier Actif (Touches fléchées pour déplacer, Maj+Fléchées pour grands pas, D ou Échap pour quitter)',\n dragResizePrompt: 'Appuyez sur D pour déplacer ou R pour redimensionner. Home réinitialise la position, Échap ferme.',\n dragModeEnabled: 'Mode glissement clavier activé. Utilisez les flèches pour déplacer, Maj+Flèches pour de grands pas. Appuyez sur D ou Échap pour quitter.',\n dragModeDisabled: 'Mode glissement clavier désactivé.',\n enableDragMode: 'Activer le mode glissement. Raccourci : touche D',\n disableDragMode: 'Désactiver le mode glissement. Raccourci : touche D',\n enableDragModeAria: 'Activer le mode glissement clavier avec les touches fléchées. Raccourci : touche D',\n disableDragModeAria: 'Désactiver le mode glissement clavier avec les touches fléchées. Raccourci : touche D',\n resizeWindow: 'Redimensionner la fenêtre',\n disableResizeWindow: 'Désactiver le mode de redimensionnement',\n enableResizeMode: 'Activer le mode redimensionnement. Raccourci : touche R',\n disableResizeMode: 'Désactiver le mode redimensionnement. Raccourci : touche R',\n enableResizeModeAria: 'Activer le mode redimensionnement clavier avec les touches fléchées. Raccourci : touche R',\n disableResizeModeAria: 'Désactiver le mode redimensionnement clavier avec les touches fléchées. Raccourci : touche R',\n resizeModeHint: 'Poignées activées. Faites glisser les bords ou les coins pour ajuster. Appuyez sur Échap ou R pour quitter.',\n resizeModeEnabled: 'Mode redimensionnement activé. Faites glisser les bords ou coins. Appuyez sur Échap ou R pour quitter.',\n resizeModeDisabled: 'Mode redimensionnement désactivé.',\n dragModeBadge: 'Mode déplacement : flèches pour déplacer, Échap pour quitter',\n resizeModeBadge: 'Mode redimensionnement : faites glisser les bords ou les coins, Échap pour quitter',\n positionReset: 'Position de la transcription réinitialisée.',\n styleTranscript: 'Ouvrir les paramètres de style de transcription',\n closeMenu: 'Fermer le menu',\n styleTitle: 'Style de Transcription',\n autoscroll: 'Défilement automatique',\n settingsMenu: 'Paramètres de dialogue de transcription',\n showTimestamps: 'Afficher les horodatages',\n hideTimestamps: 'Masquer les horodatages',\n showTimestampsAria: 'Afficher les horodatages dans la transcription',\n hideTimestampsAria: 'Masquer les horodatages dans la transcription',\n seekTo: 'Aller à {time}'\n },\n settings: {\n title: 'Paramètres',\n quality: 'Qualité',\n speed: 'Vitesse',\n captions: 'Sous-titres',\n language: 'Langue',\n reset: 'Réinitialiser',\n close: 'Fermer'\n },\n speeds: {\n normal: 'Normal'\n },\n time: {\n display: 'Affichage du temps',\n durationPrefix: 'Durée : ',\n of: 'sur',\n hour: '{count} heure',\n hours: '{count} heures',\n minute: '{count} minute',\n minutes: '{count} minutes',\n second: '{count} seconde',\n seconds: '{count} secondes'\n },\n resume: {\n prompt: 'Reprendre à {time} ?',\n resume: 'Reprendre',\n startOver: 'Recommencer'\n },\n playlist: {\n title: 'Liste de lecture',\n trackOf: 'Piste {current} sur {total}',\n nowPlaying: 'Lecture en cours : Piste {current} sur {total}. {title}{artist}',\n by: ' par ',\n untitled: 'Sans titre',\n trackUntitled: 'Piste {number}',\n currentlyPlaying: 'En cours de lecture',\n notPlaying: 'Non en lecture',\n pressEnterPlay: 'Appuyez sur Entrée pour lire',\n pressEnterRestart: 'Appuyez sur Entrée pour recommencer',\n keyboardInstructions: 'Navigation de la liste de lecture : Utilisez les touches fléchées haut et bas pour naviguer entre les pistes. Appuyez sur Page précédente ou Page suivante pour sauter 5 pistes. Appuyez sur Début pour aller à la première piste, Fin pour la dernière piste. Appuyez sur Entrée ou Espace pour lire la piste sélectionnée.',\n endOfPlaylist: 'Fin de la liste de lecture. {current} sur {total}.',\n beginningOfPlaylist: 'Début de la liste de lecture. 1 sur {total}.',\n jumpedToLastTrack: 'Sauté à la dernière piste. {current} sur {total}.',\n jumpedToFirstTrack: 'Sauté à la première piste. 1 sur {total}.',\n firstTrack: 'Première piste. 1 sur {total}.',\n lastTrack: 'Dernière piste. {current} sur {total}.'\n }\n};\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * VidPly v1.2.0 - Universal, Accessible Video Player
2
+ * VidPly v1.2.1 - Universal, Accessible Video Player
3
3
  * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
@@ -217,4 +217,4 @@ var ja = {
217
217
  export {
218
218
  ja
219
219
  };
220
- //# sourceMappingURL=vidply.ja-S6ITA6WU.js.map
220
+ //# sourceMappingURL=vidply.ja-WWMSTEJH.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/i18n/languages/ja.ts"],
4
+ "sourcesContent": ["/**\n * Japanese translations for VidPly\n */\n\nexport const ja = {\n player: {\n label: 'ビデオプレーヤー',\n play: '再生',\n pause: '一時停止',\n stop: '停止',\n restart: '最初から再生',\n rewind: '巻き戻し',\n forward: '早送り',\n rewindSeconds: '{seconds}秒戻す',\n forwardSeconds: '{seconds}秒進める',\n previous: '前のトラック',\n next: '次のトラック',\n playlist: 'プレイリストの切り替え',\n volume: '音量',\n mute: 'ミュート',\n unmute: 'ミュート解除',\n fullscreen: '全画面表示',\n exitFullscreen: '全画面表示を終了',\n captions: '字幕',\n chapters: 'チャプター',\n quality: '画質',\n captionStyling: '字幕スタイル',\n transcript: '文字起こし切り替え',\n audioDescription: '音声解説',\n signLanguage: '手話動画',\n settings: '設定',\n speed: '再生速度',\n pip: 'ピクチャーインピクチャー',\n floatingPlayer: 'フローティングプレーヤー',\n floatingPlayerClose: 'フローティングプレーヤーを閉じる',\n floatingPlayerEnter: 'ビデオを切り離す',\n floatingPlayerExit: 'ビデオを戻す',\n floatingPlayerDialog: 'フローティング動画プレーヤー。Dキーで移動、Rキーでサイズ変更、Escで閉じる。',\n download: 'ダウンロード',\n downloadWithFormat: '{format} をダウンロード',\n downloadWithSize: 'ダウンロード ({size})',\n downloadWithFormatSize: '{format} をダウンロード ({size})',\n currentTime: '現在の時間',\n duration: '再生時間',\n progress: '進行状況',\n seekForward: '{seconds}秒進める',\n seekBackward: '{seconds}秒戻す',\n volumeUp: '音量を上げる',\n volumeDown: '音量を下げる',\n loading: '読み込み中...',\n loadingChapters: 'チャプター読み込み中...',\n error: '読み込みエラー',\n buffering: 'バッファリング中...',\n signLanguageVideo: '手話動画',\n closeSignLanguage: '手話動画を閉じる',\n signLanguageSettings: '手話設定',\n noChapters: 'チャプターがありません',\n noCaptions: '字幕がありません',\n auto: '自動',\n autoQuality: '自動(画質選択不可)',\n noQuality: '画質選択不可',\n signLanguageDragResize: '手話動画 - キーボードでドラッグするにはDキーを、サイズ変更するにはRキーを押してください',\n signLanguageDragActive: '手話動画 - ドラッグモードが有効です。矢印キーで移動、Escapeで終了します。',\n signLanguageResizeActive: '手話動画 - サイズ変更モードが有効です。左右の矢印キーでサイズ変更、Escapeで終了します。',\n enableSignDragMode: 'ドラッグモードを有効にする。ショートカット:Dキー',\n disableSignDragMode: 'ドラッグモードを無効にする。ショートカット:Dキー',\n enableSignDragModeAria: '矢印キーでキーボードドラッグモードを有効にする。ショートカット:Dキー',\n disableSignDragModeAria: '矢印キーでキーボードドラッグモードを無効にする。ショートカット:Dキー',\n enableSignResizeMode: 'サイズ変更モードを有効にする。ショートカット:Rキー',\n disableSignResizeMode: 'サイズ変更モードを無効にする。ショートカット:Rキー',\n enableSignResizeModeAria: '矢印キーでキーボードサイズ変更モードを有効にする。ショートカット:Rキー',\n disableSignResizeModeAria: '矢印キーでキーボードサイズ変更モードを無効にする。ショートカット:Rキー',\n signDragModeHint: 'ドラッグモード:矢印キーで移動、Escで終了',\n signResizeModeHint: 'サイズ変更モード:矢印キーでサイズ変更、Escで終了',\n signDragModeDisabled: '手話動画のドラッグモードを無効にしました。',\n signResizeModeDisabled: '手話動画のサイズ変更モードを無効にしました。',\n resizeHandle: '{direction}コーナーのサイズ変更',\n moreOptions: 'その他のオプション',\n noMoreOptions: '追加のオプションはありません',\n playing: '再生中',\n paused: '一時停止中',\n muted: 'ミュート中',\n unmuted: 'ミュート解除',\n captionsOn: '字幕オン',\n captionsOff: '字幕オフ',\n volumePercent: '音量 {percent} パーセント',\n volumePercentMuted: 'ミュート',\n speedRate: '速度 {rate}x'\n },\n captions: {\n off: 'オフ',\n select: '字幕を選択',\n fontSize: 'フォントサイズ',\n fontFamily: 'フォント',\n color: 'テキストの色',\n backgroundColor: '背景色',\n opacity: '不透明度'\n },\n fontSizes: {\n small: '小',\n normal: '標準',\n large: '大',\n xlarge: '特大'\n },\n fontFamilies: {\n sansSerif: 'サンセリフ',\n serif: 'セリフ',\n monospace: '等幅'\n },\n styleLabels: {\n textColor: 'テキストの色',\n background: '背景',\n font: 'フォント',\n fontSize: 'フォントサイズ',\n opacity: '不透明度'\n },\n audioDescription: {\n enable: '音声解説を有効にする',\n disable: '音声解説を無効にする'\n },\n signLanguage: {\n show: '手話動画を表示',\n hide: '手話動画を非表示',\n showInMainView: 'メイン動画に手話を表示',\n hideInMainView: 'メイン動画から手話を削除'\n },\n transcript: {\n title: '文字起こし',\n ariaLabel: 'ビデオ文字起こし',\n close: '文字起こしを閉じる',\n loading: '文字起こしを読み込み中...',\n noTranscript: 'このビデオの文字起こしはありません。',\n settings: '文字起こし設定。Enterキーでメニューを開く、またはDキーでドラッグモードを有効にする',\n keyboardDragMode: '矢印キーでキーボードドラッグモードを切り替え。ショートカット:Dキー',\n keyboardDragActive: '⌨️ キーボードドラッグモード有効(矢印キーで移動、Shift+矢印キーで大きく移動、DまたはESCで終了)',\n dragResizePrompt: 'Dキーで移動、Rキーでサイズ変更。Homeで位置をリセット、Escで閉じます。',\n dragModeEnabled: 'キーボードドラッグモードを有効にしました。矢印キーで移動、Shift+矢印キーで大きく移動できます。終了するには D または Esc を押します。',\n dragModeDisabled: 'キーボードドラッグモードを無効にしました。',\n enableDragMode: 'ドラッグモードを有効にする。ショートカット:Dキー',\n disableDragMode: 'ドラッグモードを無効にする。ショートカット:Dキー',\n enableDragModeAria: '矢印キーでキーボードドラッグモードを有効にする。ショートカット:Dキー',\n disableDragModeAria: '矢印キーでキーボードドラッグモードを無効にする。ショートカット:Dキー',\n resizeWindow: 'ウィンドウのサイズ変更',\n disableResizeWindow: 'サイズ変更モードを無効にする',\n enableResizeMode: 'サイズ変更モードを有効にする。ショートカット:Rキー',\n disableResizeMode: 'サイズ変更モードを無効にする。ショートカット:Rキー',\n enableResizeModeAria: '矢印キーでキーボードサイズ変更モードを有効にする。ショートカット:Rキー',\n disableResizeModeAria: '矢印キーでキーボードサイズ変更モードを無効にする。ショートカット:Rキー',\n resizeModeHint: 'リサイズハンドルが有効になりました。辺や角をドラッグして調整します。Esc または R で終了します。',\n resizeModeEnabled: 'サイズ変更モードを有効にしました。辺や角をドラッグして調整します。Esc または R で終了します。',\n resizeModeDisabled: 'サイズ変更モードを無効にしました。',\n dragModeBadge: '移動モード:矢印キーで移動、Escで終了',\n resizeModeBadge: 'サイズ変更モード:辺や角をドラッグ、Escで終了',\n positionReset: '文字起こしの位置をリセットしました。',\n styleTranscript: '文字起こしスタイル設定を開く',\n closeMenu: 'メニューを閉じる',\n styleTitle: '文字起こしスタイル',\n autoscroll: '自動スクロール',\n settingsMenu: '文字起こしダイアログ設定',\n showTimestamps: 'タイムスタンプを表示',\n hideTimestamps: 'タイムスタンプを非表示',\n showTimestampsAria: '文字起こしにタイムスタンプを表示',\n hideTimestampsAria: '文字起こしのタイムスタンプを非表示',\n seekTo: '{time} へ移動'\n },\n settings: {\n title: '設定',\n quality: '画質',\n speed: '速度',\n captions: '字幕',\n language: '言語',\n reset: 'リセット',\n close: '閉じる'\n },\n speeds: {\n normal: '通常'\n },\n time: {\n display: '時間表示',\n durationPrefix: '再生時間: ',\n of: '/',\n hour: '{count}時間',\n hours: '{count}時間',\n minute: '{count}分',\n minutes: '{count}分',\n second: '{count}秒',\n seconds: '{count}秒'\n },\n resume: {\n prompt: '{time}から再開しますか?',\n resume: '再開',\n startOver: '最初から'\n },\n playlist: {\n title: 'プレイリスト',\n trackOf: 'トラック {current}/{total}',\n nowPlaying: '再生中: トラック {current}/{total}. {title}{artist}',\n by: ' - ',\n untitled: 'タイトルなし',\n trackUntitled: 'トラック {number}',\n currentlyPlaying: '再生中',\n notPlaying: '停止中',\n pressEnterPlay: 'Enterキーで再生',\n pressEnterRestart: 'Enterキーで最初から再生',\n keyboardInstructions: 'プレイリストナビゲーション:上下の矢印キーでトラック間を移動します。Page UpまたはPage Downで5トラックをスキップします。Homeで最初のトラックへ、Endで最後のトラックへ移動します。EnterまたはSpaceで選択したトラックを再生します。',\n endOfPlaylist: 'プレイリストの終わりです。{current}/{total}。',\n beginningOfPlaylist: 'プレイリストの始めです。1/{total}。',\n jumpedToLastTrack: '最後のトラックにジャンプしました。{current}/{total}。',\n jumpedToFirstTrack: '最初のトラックにジャンプしました。1/{total}。',\n firstTrack: '最初のトラックです。1/{total}。',\n lastTrack: '最後のトラックです。{current}/{total}。'\n }\n};\n\n"],
5
+ "mappings": ";;;;;;;AAIO,IAAM,KAAK;AAAA,EAChB,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,eAAe;AAAA,IACf,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,WAAW;AAAA,EACb;AAAA,EACA,UAAU;AAAA,IACR,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AAAA,EACA,aAAa;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IAChB,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AACF;",
6
+ "names": []
7
+ }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * VidPly v1.2.0 - Universal, Accessible Video Player
2
+ * VidPly v1.2.1 - Universal, Accessible Video Player
3
3
  * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
@@ -8,8 +8,13 @@
8
8
  var __defProp = Object.defineProperty;
9
9
  var __getOwnPropNames = Object.getOwnPropertyNames;
10
10
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
- var __esm = (fn, res) => function __init() {
12
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
+ var __esm = (fn, res, err) => function __init() {
12
+ if (err) throw err[0];
13
+ try {
14
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
15
+ } catch (e) {
16
+ throw err = [e], e;
17
+ }
13
18
  };
14
19
  var __export = (target, all) => {
15
20
  for (var name in all)
@@ -3153,6 +3158,194 @@
3153
3158
  }
3154
3159
  });
3155
3160
 
3161
+ // src/core/DescriptionSpeechManager.ts
3162
+ var DescriptionSpeechManager;
3163
+ var init_DescriptionSpeechManager = __esm({
3164
+ "src/core/DescriptionSpeechManager.ts"() {
3165
+ "use strict";
3166
+ DescriptionSpeechManager = class {
3167
+ constructor(player) {
3168
+ __publicField(this, "player");
3169
+ __publicField(this, "enabled", false);
3170
+ __publicField(this, "descriptionTrack", null);
3171
+ __publicField(this, "cueChangeHandler", null);
3172
+ __publicField(this, "seekedHandler", null);
3173
+ __publicField(this, "wasPlayingBeforeCue", false);
3174
+ __publicField(this, "speaking", false);
3175
+ __publicField(this, "lastSpokenCueKey", null);
3176
+ __publicField(this, "_pendingUtterance", null);
3177
+ this.player = player;
3178
+ }
3179
+ /**
3180
+ * Whether speech synthesis is available and enabled in player options.
3181
+ */
3182
+ canUseSpeech() {
3183
+ if (this.player.options.audioDescriptionSpeech === false) {
3184
+ return false;
3185
+ }
3186
+ return typeof window !== "undefined" && "speechSynthesis" in window;
3187
+ }
3188
+ /**
3189
+ * Resolve the descriptions track, preferring the active caption language.
3190
+ */
3191
+ findDescriptionTrack() {
3192
+ var _a, _b, _c;
3193
+ const textTracks = this.player.element ? Array.from(this.player.element.textTracks || []) : [];
3194
+ const descriptionsTracks = textTracks.filter(
3195
+ (track) => track.kind === "descriptions" && !track._vidplyStale
3196
+ );
3197
+ if (descriptionsTracks.length === 0) {
3198
+ return null;
3199
+ }
3200
+ const captionLang = (_c = (_b = (_a = this.player.captionManager) == null ? void 0 : _a.currentTrack) == null ? void 0 : _b.track) == null ? void 0 : _c.language;
3201
+ if (captionLang) {
3202
+ const match = descriptionsTracks.find((track) => track.language === captionLang);
3203
+ if (match) {
3204
+ return match;
3205
+ }
3206
+ }
3207
+ return descriptionsTracks[0] ?? null;
3208
+ }
3209
+ /**
3210
+ * Enable VTT speech mode: wire cuechange/seeked listeners.
3211
+ */
3212
+ enable() {
3213
+ const track = this.findDescriptionTrack();
3214
+ if (!track) {
3215
+ return false;
3216
+ }
3217
+ if (!this.canUseSpeech()) {
3218
+ track.mode = "showing";
3219
+ return true;
3220
+ }
3221
+ this.descriptionTrack = track;
3222
+ track.mode = "hidden";
3223
+ this.cueChangeHandler = () => {
3224
+ this.handleCueChange();
3225
+ };
3226
+ track.addEventListener("cuechange", this.cueChangeHandler);
3227
+ this.seekedHandler = () => {
3228
+ this.cancelSpeech();
3229
+ this.lastSpokenCueKey = null;
3230
+ this.handleCueChange();
3231
+ };
3232
+ this.player.on("seeked", this.seekedHandler);
3233
+ this.enabled = true;
3234
+ this.handleCueChange();
3235
+ return true;
3236
+ }
3237
+ /**
3238
+ * Disable VTT speech mode and restore track state.
3239
+ */
3240
+ disable() {
3241
+ this.cancelSpeech();
3242
+ this.lastSpokenCueKey = null;
3243
+ this.enabled = false;
3244
+ if (this.descriptionTrack && this.cueChangeHandler) {
3245
+ this.descriptionTrack.removeEventListener("cuechange", this.cueChangeHandler);
3246
+ }
3247
+ if (this.seekedHandler) {
3248
+ this.player.off("seeked", this.seekedHandler);
3249
+ }
3250
+ if (this.descriptionTrack) {
3251
+ this.descriptionTrack.mode = "hidden";
3252
+ }
3253
+ this.cueChangeHandler = null;
3254
+ this.seekedHandler = null;
3255
+ this.descriptionTrack = null;
3256
+ this.wasPlayingBeforeCue = false;
3257
+ }
3258
+ /**
3259
+ * Handle active description cues on the wired track.
3260
+ */
3261
+ handleCueChange() {
3262
+ var _a;
3263
+ if (!this.enabled || !this.descriptionTrack || !this.canUseSpeech()) {
3264
+ return;
3265
+ }
3266
+ const activeCues = this.descriptionTrack.activeCues;
3267
+ if (!activeCues || activeCues.length === 0) {
3268
+ return;
3269
+ }
3270
+ const cue = activeCues[0];
3271
+ const text = (_a = cue.text) == null ? void 0 : _a.trim();
3272
+ if (!text) {
3273
+ return;
3274
+ }
3275
+ const cueKey = `${cue.startTime}:${cue.endTime}:${text}`;
3276
+ if (this.speaking && this.lastSpokenCueKey === cueKey) {
3277
+ return;
3278
+ }
3279
+ if (this.lastSpokenCueKey === cueKey && !this.player.state.playing) {
3280
+ return;
3281
+ }
3282
+ this.speakCue(cue, cueKey);
3283
+ }
3284
+ /**
3285
+ * Pause playback and speak a description cue.
3286
+ */
3287
+ speakCue(cue, cueKey) {
3288
+ var _a;
3289
+ if (!this.canUseSpeech()) {
3290
+ return;
3291
+ }
3292
+ if (this.player.state.paused && !this.speaking && !this.wasPlayingBeforeCue) {
3293
+ return;
3294
+ }
3295
+ this.cancelSpeech();
3296
+ this.wasPlayingBeforeCue = this.player.state.playing;
3297
+ if (this.wasPlayingBeforeCue) {
3298
+ this.player.pause();
3299
+ }
3300
+ this.speaking = true;
3301
+ this.lastSpokenCueKey = cueKey;
3302
+ const detail = {
3303
+ time: cue.startTime,
3304
+ endTime: cue.endTime,
3305
+ text: cue.text.trim(),
3306
+ cue
3307
+ };
3308
+ this.player.emit("audiodescriptioncuestart", detail);
3309
+ const utterance = new SpeechSynthesisUtterance(detail.text);
3310
+ const lang = ((_a = this.descriptionTrack) == null ? void 0 : _a.language) || this.player.options.language || "en";
3311
+ utterance.lang = lang;
3312
+ const finish = () => {
3313
+ if (this._pendingUtterance !== utterance) {
3314
+ return;
3315
+ }
3316
+ this._pendingUtterance = null;
3317
+ this.speaking = false;
3318
+ this.player.emit("audiodescriptioncueend", detail);
3319
+ const extended = this.player.options.audioDescriptionExtended !== false;
3320
+ const shouldResume = extended ? this.wasPlayingBeforeCue : this.wasPlayingBeforeCue && this.player.state.currentTime < cue.endTime;
3321
+ if (shouldResume && this.enabled) {
3322
+ void this.player.play();
3323
+ }
3324
+ this.wasPlayingBeforeCue = false;
3325
+ };
3326
+ utterance.onend = finish;
3327
+ utterance.onerror = finish;
3328
+ this._pendingUtterance = utterance;
3329
+ window.speechSynthesis.speak(utterance);
3330
+ }
3331
+ /**
3332
+ * Cancel any in-progress speech synthesis.
3333
+ */
3334
+ cancelSpeech() {
3335
+ if (typeof window !== "undefined" && window.speechSynthesis) {
3336
+ window.speechSynthesis.cancel();
3337
+ }
3338
+ this._pendingUtterance = null;
3339
+ this.speaking = false;
3340
+ this.wasPlayingBeforeCue = false;
3341
+ }
3342
+ destroy() {
3343
+ this.disable();
3344
+ }
3345
+ };
3346
+ }
3347
+ });
3348
+
3156
3349
  // src/core/AudioDescriptionManager.ts
3157
3350
  var AudioDescriptionManager_exports = {};
3158
3351
  __export(AudioDescriptionManager_exports, {
@@ -3163,6 +3356,7 @@
3163
3356
  "src/core/AudioDescriptionManager.ts"() {
3164
3357
  "use strict";
3165
3358
  init_CaptionManager();
3359
+ init_DescriptionSpeechManager();
3166
3360
  AudioDescriptionManager = class {
3167
3361
  constructor(player) {
3168
3362
  __publicField(this, "player");
@@ -3172,6 +3366,7 @@
3172
3366
  __publicField(this, "originalSource");
3173
3367
  __publicField(this, "sourceElement");
3174
3368
  __publicField(this, "src");
3369
+ __publicField(this, "speechManager");
3175
3370
  this.player = player;
3176
3371
  this.enabled = false;
3177
3372
  this.desiredState = false;
@@ -3179,6 +3374,49 @@
3179
3374
  this.sourceElement = null;
3180
3375
  this.originalSource = null;
3181
3376
  this.captionTracks = [];
3377
+ this.speechManager = null;
3378
+ }
3379
+ /**
3380
+ * Whether a described video source swap is configured.
3381
+ */
3382
+ _hasSwapSource() {
3383
+ const hasSourceElementsWithDesc = this.player.sourceElements.some(
3384
+ (el) => el.getAttribute("data-desc-src")
3385
+ );
3386
+ return Boolean(this.src || hasSourceElementsWithDesc);
3387
+ }
3388
+ /**
3389
+ * Whether a descriptions VTT track is present on the media element.
3390
+ */
3391
+ _hasDescriptionsTrack() {
3392
+ return Boolean(this.player.findTextTrack("descriptions"));
3393
+ }
3394
+ /**
3395
+ * Resolve which audio-description delivery mode applies for the current media.
3396
+ */
3397
+ resolveDeliveryMode() {
3398
+ const configured = this.player.options.audioDescriptionMode ?? "auto";
3399
+ const hasSwap = this._hasSwapSource();
3400
+ const hasDescriptions = this._hasDescriptionsTrack();
3401
+ if (configured === "swap") {
3402
+ return hasSwap ? "swap" : "none";
3403
+ }
3404
+ if (configured === "vtt_speech") {
3405
+ return hasDescriptions ? "vtt_speech" : "none";
3406
+ }
3407
+ if (hasSwap) {
3408
+ return "swap";
3409
+ }
3410
+ if (hasDescriptions) {
3411
+ return "vtt_speech";
3412
+ }
3413
+ return "none";
3414
+ }
3415
+ _ensureSpeechManager() {
3416
+ if (!this.speechManager) {
3417
+ this.speechManager = new DescriptionSpeechManager(this.player);
3418
+ }
3419
+ return this.speechManager;
3182
3420
  }
3183
3421
  /**
3184
3422
  * Initialize audio description from source elements
@@ -3232,24 +3470,35 @@
3232
3470
  * Check if audio description is available
3233
3471
  */
3234
3472
  isAvailable() {
3235
- const hasSourceElementsWithDesc = this.player.sourceElements.some(
3236
- (el) => el.getAttribute("data-desc-src")
3237
- );
3238
- return Boolean(this.src || hasSourceElementsWithDesc || this.captionTracks.length > 0);
3473
+ const mode = this.resolveDeliveryMode();
3474
+ if (mode === "swap" || mode === "vtt_speech") {
3475
+ return true;
3476
+ }
3477
+ return this.captionTracks.length > 0;
3239
3478
  }
3240
3479
  /**
3241
3480
  * Enable audio description
3242
3481
  */
3243
3482
  async enable() {
3244
- const hasSourceElementsWithDesc = this.player.sourceElements.some(
3245
- (el) => el.getAttribute("data-desc-src")
3246
- );
3483
+ const deliveryMode = this.resolveDeliveryMode();
3247
3484
  const hasTracksWithDesc = this.captionTracks.length > 0;
3248
- if (!this.src && !hasSourceElementsWithDesc && !hasTracksWithDesc) {
3249
- console.warn("VidPly: No audio description source, source elements, or tracks provided");
3485
+ if (deliveryMode === "none" && !hasTracksWithDesc) {
3486
+ console.warn("VidPly: No audio description source, descriptions track, or tracks provided");
3250
3487
  return;
3251
3488
  }
3252
3489
  this.desiredState = true;
3490
+ if (deliveryMode === "vtt_speech") {
3491
+ const speechManager = this._ensureSpeechManager();
3492
+ const started = speechManager.enable();
3493
+ if (!started) {
3494
+ console.warn("VidPly: No descriptions track available for VTT speech mode");
3495
+ return;
3496
+ }
3497
+ this.enabled = true;
3498
+ this.player.state.audioDescriptionEnabled = true;
3499
+ this.player.emit("audiodescriptionenabled");
3500
+ return;
3501
+ }
3253
3502
  const currentTime = this.player.state.currentTime;
3254
3503
  const wasPlaying = this.player.state.playing;
3255
3504
  const posterValue = this.player.element.poster || this.player.element.getAttribute("poster") || this.player.options.poster;
@@ -3269,7 +3518,15 @@
3269
3518
  * Disable audio description
3270
3519
  */
3271
3520
  async disable() {
3521
+ var _a;
3272
3522
  this.desiredState = false;
3523
+ if ((_a = this.speechManager) == null ? void 0 : _a.enabled) {
3524
+ this.speechManager.disable();
3525
+ this.enabled = false;
3526
+ this.player.state.audioDescriptionEnabled = false;
3527
+ this.player.emit("audiodescriptiondisabled");
3528
+ return;
3529
+ }
3273
3530
  const hasTracksWithDesc = this.captionTracks.length > 0;
3274
3531
  if (!this.sourceElement && !this.src && hasTracksWithDesc) {
3275
3532
  await this._swapCaptionTracks(false);
@@ -3295,19 +3552,30 @@
3295
3552
  * Toggle audio description
3296
3553
  */
3297
3554
  async toggle() {
3555
+ const deliveryMode = this.resolveDeliveryMode();
3298
3556
  const descriptionTrack = this.player.findTextTrack("descriptions");
3299
- const hasAudioDescriptionSrc = this.isAvailable();
3300
- if (descriptionTrack && !hasAudioDescriptionSrc) {
3557
+ const hasSwapOrTracks = this._hasSwapSource() || this.captionTracks.length > 0;
3558
+ if (deliveryMode === "vtt_speech") {
3559
+ if (this.enabled) {
3560
+ await this.disable();
3561
+ } else {
3562
+ await this.enable();
3563
+ }
3564
+ return;
3565
+ }
3566
+ if (descriptionTrack && !hasSwapOrTracks) {
3301
3567
  if (descriptionTrack.mode === "showing") {
3302
3568
  descriptionTrack.mode = "hidden";
3303
3569
  this.enabled = false;
3570
+ this.player.state.audioDescriptionEnabled = false;
3304
3571
  this.player.emit("audiodescriptiondisabled");
3305
3572
  } else {
3306
3573
  descriptionTrack.mode = "showing";
3307
3574
  this.enabled = true;
3575
+ this.player.state.audioDescriptionEnabled = true;
3308
3576
  this.player.emit("audiodescriptionenabled");
3309
3577
  }
3310
- } else if (descriptionTrack && hasAudioDescriptionSrc) {
3578
+ } else if (descriptionTrack && hasSwapOrTracks) {
3311
3579
  if (this.enabled) {
3312
3580
  this.desiredState = false;
3313
3581
  await this.disable();
@@ -3316,7 +3584,7 @@
3316
3584
  this.desiredState = true;
3317
3585
  await this.enable();
3318
3586
  }
3319
- } else if (hasAudioDescriptionSrc) {
3587
+ } else if (hasSwapOrTracks) {
3320
3588
  if (this.enabled) {
3321
3589
  this.desiredState = false;
3322
3590
  await this.disable();
@@ -3715,6 +3983,9 @@
3715
3983
  * Update sources (called when playlist changes)
3716
3984
  */
3717
3985
  updateSources(audioDescriptionSrc) {
3986
+ var _a;
3987
+ (_a = this.speechManager) == null ? void 0 : _a.destroy();
3988
+ this.speechManager = null;
3718
3989
  this.src = audioDescriptionSrc || null;
3719
3990
  this.enabled = false;
3720
3991
  this.desiredState = false;
@@ -3733,6 +4004,9 @@
3733
4004
  * Cleanup
3734
4005
  */
3735
4006
  destroy() {
4007
+ var _a;
4008
+ (_a = this.speechManager) == null ? void 0 : _a.destroy();
4009
+ this.speechManager = null;
3736
4010
  this.enabled = false;
3737
4011
  this.desiredState = false;
3738
4012
  this.captionTracks = [];
@@ -16104,6 +16378,9 @@
16104
16378
  audioDescriptionSrc: null,
16105
16379
  // URL to audio-described version
16106
16380
  audioDescriptionButton: true,
16381
+ audioDescriptionMode: "auto",
16382
+ audioDescriptionSpeech: true,
16383
+ audioDescriptionExtended: true,
16107
16384
  // Sign Language
16108
16385
  signLanguage: true,
16109
16386
  signLanguageSrc: null,
@@ -16589,15 +16866,33 @@
16589
16866
  if (this.audioDescriptionManager) {
16590
16867
  return this.audioDescriptionManager;
16591
16868
  }
16592
- const hasAudioDescSrc = this.options.audioDescriptionSrc || this.audioDescriptionSrc;
16593
- const hasAudioDescButton = this.options.audioDescriptionButton;
16594
- if (!hasAudioDescSrc && !hasAudioDescButton) {
16869
+ if (!this.hasAudioDescriptionContent()) {
16595
16870
  return null;
16596
16871
  }
16597
16872
  const AudioDescManager = await loadAudioDescriptionManager();
16598
16873
  this.audioDescriptionManager = new AudioDescManager(this);
16599
16874
  return this.audioDescriptionManager;
16600
16875
  }
16876
+ /**
16877
+ * True when the current media actually exposes audio-description content:
16878
+ * an explicit described-audio source, `<source>` elements carrying
16879
+ * `data-desc-src` / `data-orig-src`, or a `descriptions` text track.
16880
+ * Mirrors `ControlBar.hasAudioDescription()` so the chunk load and the
16881
+ * button visibility stay in lock-step.
16882
+ */
16883
+ hasAudioDescriptionContent() {
16884
+ if (this.options.audioDescriptionSrc || this.audioDescriptionSrc) {
16885
+ return true;
16886
+ }
16887
+ const hasSourceElementsWithDesc = this.sourceElements.some(
16888
+ (el) => el.getAttribute("data-desc-src") || el.getAttribute("data-orig-src")
16889
+ );
16890
+ if (hasSourceElementsWithDesc) {
16891
+ return true;
16892
+ }
16893
+ const textTracks = this.element ? Array.from(this.element.textTracks || []) : [];
16894
+ return textTracks.some((track) => track.kind === "descriptions");
16895
+ }
16601
16896
  // ============================================
16602
16897
  // Resume Playback Methods
16603
16898
  // ============================================
@@ -16609,16 +16904,24 @@
16609
16904
  if (this.signLanguageManager) {
16610
16905
  return this.signLanguageManager;
16611
16906
  }
16612
- const hasSignLangSrc = this.options.signLanguageSrc || this.signLanguageSrc;
16613
- const hasSignLangSources = this.options.signLanguageSources && Object.keys(this.options.signLanguageSources).length > 0;
16614
- const hasSignLangButton = this.options.signLanguageButton;
16615
- if (!hasSignLangSrc && !hasSignLangSources && !hasSignLangButton) {
16907
+ if (!this.hasSignLanguageContent()) {
16616
16908
  return null;
16617
16909
  }
16618
16910
  const SignLangManager = await loadSignLanguageManager();
16619
16911
  this.signLanguageManager = new SignLangManager(this);
16620
16912
  return this.signLanguageManager;
16621
16913
  }
16914
+ /**
16915
+ * True when a sign-language video source (single `signLanguageSrc` or a
16916
+ * `signLanguageSources` map) is configured. Mirrors
16917
+ * `ControlBar.hasSignLanguage()`.
16918
+ */
16919
+ hasSignLanguageContent() {
16920
+ if (this.options.signLanguageSrc || this.signLanguageSrc) {
16921
+ return true;
16922
+ }
16923
+ return !!(this.options.signLanguageSources && Object.keys(this.options.signLanguageSources).length > 0);
16924
+ }
16622
16925
  /**
16623
16926
  * Lazy-load and instantiate the floating (in-page PiP) manager. Only
16624
16927
  * created when `options.floating === true` and the media element is a
@@ -16643,13 +16946,10 @@
16643
16946
  */
16644
16947
  async initFeatureManagers() {
16645
16948
  const promises = [];
16646
- const hasSourceElementsWithDesc = this.sourceElements.some(
16647
- (el) => el.getAttribute("data-desc-src") || el.getAttribute("data-orig-src")
16648
- );
16649
- if (this.options.audioDescriptionButton || this.options.audioDescriptionSrc || this.audioDescriptionSrc || hasSourceElementsWithDesc) {
16949
+ if (this.hasAudioDescriptionContent()) {
16650
16950
  promises.push(this.ensureAudioDescriptionManager());
16651
16951
  }
16652
- if (this.options.signLanguageButton || this.options.signLanguageSrc || this.signLanguageSrc || this.options.signLanguageSources && Object.keys(this.options.signLanguageSources).length > 0) {
16952
+ if (this.hasSignLanguageContent()) {
16653
16953
  promises.push(this.ensureSignLanguageManager());
16654
16954
  }
16655
16955
  if (this.options.floating && this.element && this.element.tagName === "VIDEO") {
@@ -16991,6 +17291,9 @@
16991
17291
  }
16992
17292
  this.currentSource = src;
16993
17293
  this._pendingSource = null;
17294
+ if (this.hasAudioDescriptionContent()) {
17295
+ await this.ensureAudioDescriptionManager();
17296
+ }
16994
17297
  (_b = this.audioDescriptionManager) == null ? void 0 : _b.initFromSourceElements(this.sourceElements, this.trackElements);
16995
17298
  if (!this.originalSrc) {
16996
17299
  this.originalSrc = src;
@@ -18466,7 +18769,7 @@
18466
18769
  * @param {number} index - Track index
18467
18770
  */
18468
18771
  selectTrack(index) {
18469
- var _a, _b, _c, _d;
18772
+ var _a, _b, _c, _d, _e, _f;
18470
18773
  if (index < 0 || index >= this.tracks.length) {
18471
18774
  console.warn("VidPly Playlist: Invalid track index", index);
18472
18775
  return;
@@ -18527,12 +18830,19 @@
18527
18830
  if (typeof this.player.invalidateTrackCache === "function") {
18528
18831
  this.player.invalidateTrackCache();
18529
18832
  }
18530
- if (this.player.audioDescriptionManager && typeof this.player.audioDescriptionManager.initFromSourceElements === "function") {
18833
+ const reinitAudioDescription = (adm) => {
18834
+ if (!adm || typeof adm.initFromSourceElements !== "function") return;
18531
18835
  try {
18532
- this.player.audioDescriptionManager.captionTracks = [];
18533
- this.player.audioDescriptionManager.initFromSourceElements(this.player.sourceElements, this.player.trackElements);
18836
+ adm.captionTracks = [];
18837
+ adm.initFromSourceElements(this.player.sourceElements, this.player.trackElements);
18534
18838
  } catch {
18535
18839
  }
18840
+ };
18841
+ if (this.player.audioDescriptionManager) {
18842
+ reinitAudioDescription(this.player.audioDescriptionManager);
18843
+ } else if ((_f = (_e = this.player).hasAudioDescriptionContent) == null ? void 0 : _f.call(_e)) {
18844
+ void this.player.ensureAudioDescriptionManager().then(reinitAudioDescription).catch(() => {
18845
+ });
18536
18846
  }
18537
18847
  if (this.player.captionManager && typeof this.player.captionManager.loadTracks === "function") {
18538
18848
  try {
@@ -19397,6 +19707,9 @@
19397
19707
  signLanguageDisplayMode: "signLanguageDisplayMode",
19398
19708
  audioDescriptionSrc: "audioDescriptionSrc",
19399
19709
  audioDescriptionButton: "audioDescriptionButton",
19710
+ audioDescriptionMode: "audioDescriptionMode",
19711
+ audioDescriptionSpeech: "audioDescriptionSpeech",
19712
+ audioDescriptionExtended: "audioDescriptionExtended",
19400
19713
  autoplay: "autoplay",
19401
19714
  loop: "loop",
19402
19715
  muted: "muted",