@amazon/vinyl 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/index.cjs +603 -317
  2. package/dist/index.cjs.map +4 -4
  3. package/dist/index.js +622 -329
  4. package/dist/index.js.map +4 -4
  5. package/dist/test/benchmark.es5.js +8 -5
  6. package/dist/test/benchmark.js +228 -0
  7. package/dist/test/benchmark.js.map +4 -4
  8. package/dist/test/integ.es5.js +182 -156
  9. package/dist/test/integ.js +1853 -796
  10. package/dist/test/integ.js.map +4 -4
  11. package/dist/types/current/index.d.ts +4 -0
  12. package/dist/types/current/index.d.ts.map +1 -1
  13. package/dist/types/current/index.js +4 -0
  14. package/dist/types/current/streaming/AudioOptions.d.ts +39 -0
  15. package/dist/types/current/streaming/AudioOptions.d.ts.map +1 -0
  16. package/dist/types/current/streaming/AudioOptions.js +15 -0
  17. package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts +2 -2
  18. package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts.map +1 -1
  19. package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.js +5 -5
  20. package/dist/types/current/text/HtmlTextTrackRenderer.d.ts +60 -0
  21. package/dist/types/current/text/HtmlTextTrackRenderer.d.ts.map +1 -0
  22. package/dist/types/current/text/HtmlTextTrackRenderer.js +231 -0
  23. package/dist/types/current/text/SidecarTextTrackController.d.ts +65 -53
  24. package/dist/types/current/text/SidecarTextTrackController.d.ts.map +1 -1
  25. package/dist/types/current/text/SidecarTextTrackController.js +167 -154
  26. package/dist/types/current/text/SidecarTextTrackLoader.d.ts +5 -0
  27. package/dist/types/current/text/SidecarTextTrackLoader.d.ts.map +1 -1
  28. package/dist/types/current/text/SidecarTextTrackLoader.js +13 -7
  29. package/dist/types/current/text/TextTrack.d.ts +74 -20
  30. package/dist/types/current/text/TextTrack.d.ts.map +1 -1
  31. package/dist/types/current/text/TextTrack.js +20 -0
  32. package/dist/types/current/text/TextTrackRenderer.d.ts +24 -0
  33. package/dist/types/current/text/TextTrackRenderer.d.ts.map +1 -0
  34. package/dist/types/current/text/TextTrackRenderer.js +5 -0
  35. package/dist/types/current/text/mediaTextTrackProvider.d.ts +34 -0
  36. package/dist/types/current/text/mediaTextTrackProvider.d.ts.map +1 -0
  37. package/dist/types/current/text/mediaTextTrackProvider.js +42 -0
  38. package/dist/types/current/text/parseWebVtt.d.ts +16 -2
  39. package/dist/types/current/text/parseWebVtt.d.ts.map +1 -1
  40. package/dist/types/current/text/parseWebVtt.js +176 -48
  41. package/dist/types/current/text/pickPreferredTextTrack.d.ts +2 -1
  42. package/dist/types/current/text/pickPreferredTextTrack.d.ts.map +1 -1
  43. package/dist/types/current/text/pickPreferredTextTrack.js +6 -3
  44. package/dist/types/current/track/Track.d.ts +1 -1
  45. package/dist/types/current/track/dash/createDashFactories.d.ts +21 -10
  46. package/dist/types/current/track/dash/createDashFactories.d.ts.map +1 -1
  47. package/dist/types/current/track/dash/createDashFactories.js +9 -21
  48. package/dist/types/current/track/hls/createHlsFactories.d.ts +21 -10
  49. package/dist/types/current/track/hls/createHlsFactories.d.ts.map +1 -1
  50. package/dist/types/current/track/hls/createHlsFactories.js +9 -21
  51. package/dist/types/current/track/mse/MseTrack.d.ts +1 -2
  52. package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
  53. package/dist/types/current/track/mse/MseTrack.js +3 -7
  54. package/dist/types/current/tsconfig.tsbuildinfo +1 -1
  55. package/dist/types/current/vinyl/VinylOptions.d.ts +18 -40
  56. package/dist/types/current/vinyl/VinylOptions.d.ts.map +1 -1
  57. package/dist/types/current/vinyl/VinylOptions.js +12 -11
  58. package/dist/types/current/vinyl/VinylPlayer.d.ts +0 -6
  59. package/dist/types/current/vinyl/VinylPlayer.d.ts.map +1 -1
  60. package/dist/types/current/vinyl/VinylPlayer.js +2 -23
  61. package/dist/types/current/vinyl/createVinylFactories.d.ts +32 -18
  62. package/dist/types/current/vinyl/createVinylFactories.d.ts.map +1 -1
  63. package/dist/types/current/vinyl/createVinylFactories.js +6 -0
  64. package/dist/types/ts3.7/index.d.ts +4 -0
  65. package/dist/types/ts3.7/streaming/AudioOptions.d.ts +39 -0
  66. package/dist/types/ts3.7/streaming/createDefaultMediaTimelineTransformer.d.ts +2 -2
  67. package/dist/types/ts3.7/text/HtmlTextTrackRenderer.d.ts +60 -0
  68. package/dist/types/ts3.7/text/SidecarTextTrackController.d.ts +65 -53
  69. package/dist/types/ts3.7/text/SidecarTextTrackLoader.d.ts +5 -0
  70. package/dist/types/ts3.7/text/TextTrack.d.ts +74 -20
  71. package/dist/types/ts3.7/text/TextTrackRenderer.d.ts +24 -0
  72. package/dist/types/ts3.7/text/mediaTextTrackProvider.d.ts +34 -0
  73. package/dist/types/ts3.7/text/parseWebVtt.d.ts +16 -2
  74. package/dist/types/ts3.7/text/pickPreferredTextTrack.d.ts +2 -1
  75. package/dist/types/ts3.7/track/Track.d.ts +1 -1
  76. package/dist/types/ts3.7/track/dash/createDashFactories.d.ts +21 -10
  77. package/dist/types/ts3.7/track/hls/createHlsFactories.d.ts +21 -10
  78. package/dist/types/ts3.7/track/mse/MseTrack.d.ts +1 -2
  79. package/dist/types/ts3.7/vinyl/VinylOptions.d.ts +18 -40
  80. package/dist/types/ts3.7/vinyl/VinylPlayer.d.ts +0 -6
  81. package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +32 -18
  82. package/dist/types/ts4.1/index.d.ts +4 -0
  83. package/dist/types/ts4.1/streaming/AudioOptions.d.ts +39 -0
  84. package/dist/types/ts4.1/streaming/createDefaultMediaTimelineTransformer.d.ts +2 -2
  85. package/dist/types/ts4.1/text/HtmlTextTrackRenderer.d.ts +60 -0
  86. package/dist/types/ts4.1/text/SidecarTextTrackController.d.ts +65 -53
  87. package/dist/types/ts4.1/text/SidecarTextTrackLoader.d.ts +5 -0
  88. package/dist/types/ts4.1/text/TextTrack.d.ts +74 -20
  89. package/dist/types/ts4.1/text/TextTrackRenderer.d.ts +24 -0
  90. package/dist/types/ts4.1/text/mediaTextTrackProvider.d.ts +34 -0
  91. package/dist/types/ts4.1/text/parseWebVtt.d.ts +16 -2
  92. package/dist/types/ts4.1/text/pickPreferredTextTrack.d.ts +2 -1
  93. package/dist/types/ts4.1/track/Track.d.ts +1 -1
  94. package/dist/types/ts4.1/track/dash/createDashFactories.d.ts +21 -10
  95. package/dist/types/ts4.1/track/hls/createHlsFactories.d.ts +21 -10
  96. package/dist/types/ts4.1/track/mse/MseTrack.d.ts +1 -2
  97. package/dist/types/ts4.1/vinyl/VinylOptions.d.ts +18 -40
  98. package/dist/types/ts4.1/vinyl/VinylPlayer.d.ts +0 -6
  99. package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +32 -18
  100. package/dist/types/ts4.7/index.d.ts +4 -0
  101. package/dist/types/ts4.7/streaming/AudioOptions.d.ts +39 -0
  102. package/dist/types/ts4.7/streaming/createDefaultMediaTimelineTransformer.d.ts +2 -2
  103. package/dist/types/ts4.7/text/HtmlTextTrackRenderer.d.ts +60 -0
  104. package/dist/types/ts4.7/text/SidecarTextTrackController.d.ts +65 -53
  105. package/dist/types/ts4.7/text/SidecarTextTrackLoader.d.ts +5 -0
  106. package/dist/types/ts4.7/text/TextTrack.d.ts +74 -20
  107. package/dist/types/ts4.7/text/TextTrackRenderer.d.ts +24 -0
  108. package/dist/types/ts4.7/text/mediaTextTrackProvider.d.ts +34 -0
  109. package/dist/types/ts4.7/text/parseWebVtt.d.ts +16 -2
  110. package/dist/types/ts4.7/text/pickPreferredTextTrack.d.ts +2 -1
  111. package/dist/types/ts4.7/track/Track.d.ts +1 -1
  112. package/dist/types/ts4.7/track/dash/createDashFactories.d.ts +21 -10
  113. package/dist/types/ts4.7/track/hls/createHlsFactories.d.ts +21 -10
  114. package/dist/types/ts4.7/track/mse/MseTrack.d.ts +1 -2
  115. package/dist/types/ts4.7/vinyl/VinylOptions.d.ts +18 -40
  116. package/dist/types/ts4.7/vinyl/VinylPlayer.d.ts +0 -6
  117. package/dist/types/ts4.7/vinyl/createVinylFactories.d.ts +32 -18
  118. package/dist/unit/types/current/index.d.ts +2 -0
  119. package/dist/unit/types/current/index.d.ts.map +1 -1
  120. package/dist/unit/types/current/index.js +2 -0
  121. package/dist/unit/types/current/streaming/MseTrack.test.js +13 -7
  122. package/dist/unit/types/current/streaming/createDefaultMediaTimelineTransformer.test.js +8 -4
  123. package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.d.ts +2 -0
  124. package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.d.ts.map +1 -0
  125. package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.js +231 -0
  126. package/dist/unit/types/current/text/SidecarTextTrackController.test.js +432 -333
  127. package/dist/unit/types/current/text/SidecarTextTrackLoader.test.js +29 -0
  128. package/dist/unit/types/current/text/mediaTextTrackProvider.test.d.ts +2 -0
  129. package/dist/unit/types/current/text/mediaTextTrackProvider.test.d.ts.map +1 -0
  130. package/dist/unit/types/current/text/mediaTextTrackProvider.test.js +86 -0
  131. package/dist/unit/types/current/text/parseWebVtt.test.js +187 -6
  132. package/dist/unit/types/current/text/pickPreferredTextTrack.test.js +12 -1
  133. package/dist/unit/types/current/track/dash/createDashFactories.test.js +1 -2
  134. package/dist/unit/types/current/track/hls/buildHlsMediaTimeline.test.js +1 -2
  135. package/dist/unit/types/current/track/hls/createHlsFactories.test.js +1 -2
  136. package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
  137. package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.js +102 -177
  138. package/dist/unit/types/current/vinyl/createVinylFactories.test.js +2 -0
  139. package/dist/vinylTestUtil/index.js +14 -8
  140. package/dist/vinylTestUtil/index.js.map +2 -2
  141. package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.d.ts +3 -2
  142. package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.d.ts.map +1 -1
  143. package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.js +5 -2
  144. package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.d.ts +3 -3
  145. package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.d.ts.map +1 -1
  146. package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.js +3 -3
  147. package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.d.ts +1 -2
  148. package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.d.ts.map +1 -1
  149. package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.js +3 -2
  150. package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.d.ts +1 -2
  151. package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.d.ts.map +1 -1
  152. package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.js +3 -2
  153. package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
  154. package/dist/vinylTestUtil/types/ts3.7/mock/player/MockVinylPlayerDependencies.d.ts +3 -2
  155. package/dist/vinylTestUtil/types/ts3.7/mock/text/MockTextTrackController.d.ts +3 -3
  156. package/dist/vinylTestUtil/types/ts3.7/mock/track/dash/createMockDashDependencies.d.ts +1 -2
  157. package/dist/vinylTestUtil/types/ts3.7/mock/track/hls/createMockHlsDependencies.d.ts +1 -2
  158. package/dist/vinylTestUtil/types/ts4.1/mock/player/MockVinylPlayerDependencies.d.ts +3 -2
  159. package/dist/vinylTestUtil/types/ts4.1/mock/text/MockTextTrackController.d.ts +3 -3
  160. package/dist/vinylTestUtil/types/ts4.1/mock/track/dash/createMockDashDependencies.d.ts +1 -2
  161. package/dist/vinylTestUtil/types/ts4.1/mock/track/hls/createMockHlsDependencies.d.ts +1 -2
  162. package/dist/vinylTestUtil/types/ts4.7/mock/player/MockVinylPlayerDependencies.d.ts +3 -2
  163. package/dist/vinylTestUtil/types/ts4.7/mock/text/MockTextTrackController.d.ts +3 -3
  164. package/dist/vinylTestUtil/types/ts4.7/mock/track/dash/createMockDashDependencies.d.ts +1 -2
  165. package/dist/vinylTestUtil/types/ts4.7/mock/track/hls/createMockHlsDependencies.d.ts +1 -2
  166. package/docs/USAGE.md +82 -31
  167. package/package.json +12 -12
@@ -58,6 +58,7 @@ export * from './playback/PlaybackSourceImpl';
58
58
  export * from './playback/ReadonlyPlaybackController';
59
59
  export * from './streaming/abr/QualitySelector';
60
60
  export * from './streaming/abr/QualitySelectorImpl';
61
+ export * from './streaming/AudioOptions';
61
62
  export * from './streaming/buffering/BufferingController';
62
63
  export * from './streaming/buffering/codecDenylist';
63
64
  export * from './streaming/buffering/error/SourceBufferError';
@@ -87,11 +88,14 @@ export * from './streaming/StreamingEventMap';
87
88
  export * from './streaming/util/segment';
88
89
  export * from './text/discoverDashTextTracks';
89
90
  export * from './text/discoverHlsTextTracks';
91
+ export * from './text/HtmlTextTrackRenderer';
92
+ export * from './text/mediaTextTrackProvider';
90
93
  export * from './text/parseWebVtt';
91
94
  export * from './text/pickPreferredTextTrack';
92
95
  export * from './text/SidecarTextTrackController';
93
96
  export * from './text/SidecarTextTrackLoader';
94
97
  export * from './text/TextTrack';
98
+ export * from './text/TextTrackRenderer';
95
99
  export * from './text/VttCueStyle';
96
100
  export * from './track/AutoResetController';
97
101
  export * from './track/createSegmentDataProvider';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,7 @@ export * from './playback/PlaybackSourceImpl';
58
58
  export * from './playback/ReadonlyPlaybackController';
59
59
  export * from './streaming/abr/QualitySelector';
60
60
  export * from './streaming/abr/QualitySelectorImpl';
61
+ export * from './streaming/AudioOptions';
61
62
  export * from './streaming/buffering/BufferingController';
62
63
  export * from './streaming/buffering/codecDenylist';
63
64
  export * from './streaming/buffering/error/SourceBufferError';
@@ -87,11 +88,14 @@ export * from './streaming/StreamingEventMap';
87
88
  export * from './streaming/util/segment';
88
89
  export * from './text/discoverDashTextTracks';
89
90
  export * from './text/discoverHlsTextTracks';
91
+ export * from './text/HtmlTextTrackRenderer';
92
+ export * from './text/mediaTextTrackProvider';
90
93
  export * from './text/parseWebVtt';
91
94
  export * from './text/pickPreferredTextTrack';
92
95
  export * from './text/SidecarTextTrackController';
93
96
  export * from './text/SidecarTextTrackLoader';
94
97
  export * from './text/TextTrack';
98
+ export * from './text/TextTrackRenderer';
95
99
  export * from './text/VttCueStyle';
96
100
  export * from './track/AutoResetController';
97
101
  export * from './track/createSegmentDataProvider';
@@ -0,0 +1,39 @@
1
+ import type { ObjectSchema } from '@amazon/vinyl-validation';
2
+ /**
3
+ * Criteria used to pick which audio rendition to play.
4
+ */
5
+ export interface AudioSelection {
6
+ /**
7
+ * Preferred language(s) for audio content, as RFC 5646 codes (e.g. `'en'`,
8
+ * `'ja'`, `'fr-CA'`). May be a single tag or an ordered list of tags —
9
+ * earlier entries are preferred, with the best relatedness match kept for
10
+ * each period (audio without a language tag is always kept). `null` (the
11
+ * default) is NOT "no preference": it orders by the platform's
12
+ * `navigator.languages`. To keep every language, this option is not the
13
+ * mechanism — omit language content or pass a tag matching all.
14
+ */
15
+ readonly language?: string | readonly string[] | null;
16
+ /**
17
+ * Opt in to audio-description (a.k.a. described-video / DVS) audio: audio
18
+ * renditions carrying an accessibility "describes video" characteristic that
19
+ * narrate on-screen action. `false` (the default) keeps them out of the
20
+ * automatic default-audio selection — they are chosen only when this is set.
21
+ * When `true`, a description rendition is preferred where one exists for the
22
+ * selected language. Changing this reselects audio immediately.
23
+ */
24
+ readonly descriptive?: boolean;
25
+ }
26
+ /**
27
+ * Declarative audio configuration. Mirrors `VinylOptions.text`: the audio
28
+ * rendition is chosen from {@link selection}; changing it reselects audio
29
+ * immediately.
30
+ */
31
+ export interface AudioOptions {
32
+ /**
33
+ * The audio selection criteria (language / descriptive).
34
+ */
35
+ readonly selection?: AudioSelection;
36
+ }
37
+ export declare const defaultAudioOptions: AudioOptions;
38
+ export declare const audioOptionsValidator: ObjectSchema<AudioOptions>;
39
+ //# sourceMappingURL=AudioOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioOptions.d.ts","sourceRoot":"","sources":["../../../../src/streaming/AudioOptions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAErD;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IACzB;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAA;CACtC;AAED,eAAO,MAAM,mBAAmB,EAAE,YAEjC,CAAA;AAOD,eAAO,MAAM,qBAAqB,EAAE,YAAY,CAAC,YAAY,CAE3D,CAAA"}
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { array, boolean, object, string } from '@amazon/vinyl-validation';
6
+ export const defaultAudioOptions = {
7
+ selection: { language: null, descriptive: false },
8
+ };
9
+ const audioSelectionValidator = object({
10
+ language: string().or(array(string()).readonly()).orNull().optional(),
11
+ descriptive: boolean().optional(),
12
+ });
13
+ export const audioOptionsValidator = object({
14
+ selection: audioSelectionValidator.optional(),
15
+ });
@@ -3,13 +3,13 @@ import type { Capabilities } from '../client/Capabilities';
3
3
  import type { DrmController } from '../drm/DrmController';
4
4
  import type { MediaTimeline } from './MediaTimeline';
5
5
  import type { CodecOverrides } from '../util/media/codecOverrides';
6
+ import type { AudioOptions } from './AudioOptions';
6
7
  export interface DefaultMediaTimelineTransformerDeps {
7
8
  readonly capabilities: Capabilities;
8
9
  readonly drmController: DrmController;
9
10
  readonly mediaTimeline: ObservableValue<Promise<MediaTimeline>>;
10
11
  readonly options: ObservableValue<{
11
- readonly preferredAudioLanguage: string | readonly string[] | null;
12
- readonly preferDescriptiveAudio?: boolean;
12
+ readonly audio: AudioOptions;
13
13
  readonly codecOverrides?: CodecOverrides;
14
14
  }>;
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createDefaultMediaTimelineTransformer.d.ts","sourceRoot":"","sources":["../../../../src/streaming/createDefaultMediaTimelineTransformer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAuBpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAGlE,MAAM,WAAW,mCAAmC;IAChD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;QAC9B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;QAClE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;QACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAA;KAC3C,CAAC,CAAA;CACL;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACjD,IAAI,EAAE,mCAAmC,GAC1C,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CA6EzC"}
1
+ {"version":3,"file":"createDefaultMediaTimelineTransformer.d.ts","sourceRoot":"","sources":["../../../../src/streaming/createDefaultMediaTimelineTransformer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAuBpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,WAAW,mCAAmC;IAChD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;QAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAA;KAC3C,CAAC,CAAA;CACL;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACjD,IAAI,EAAE,mCAAmC,GAC1C,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAwEzC"}
@@ -38,7 +38,7 @@ export function createDefaultMediaTimelineTransformer(deps) {
38
38
  t = filterTimelineQualities((quality, index, array) => supportsAudioSamplingRate(deps, quality, index, array), throwSamplingRatesUnsupported, t);
39
39
  // Resolve audio-description eligibility BEFORE the language filter.
40
40
  // Description renditions are an accessibility opt-in, not general audio,
41
- // so they must be gated out (unless opted in via preferDescriptiveAudio)
41
+ // so they must be gated out (unless opted in via audio.selection.descriptive)
42
42
  // before language selection runs. Otherwise a description rendition
43
43
  // whose language tag happens to score higher than the main audio's
44
44
  // (e.g. a described 'en' beating a main 'en-US') could win language
@@ -46,14 +46,14 @@ export function createDefaultMediaTimelineTransformer(deps) {
46
46
  // described audio they never opted into. With this gate first, the
47
47
  // language filter only ever picks among eligible (main, or opted-in
48
48
  // description) renditions.
49
- t = filterTimelineQualities(createAudioDescriptionFilter(deps.options.value.preferDescriptiveAudio ?? false), throwNoPlayableAudio, t);
50
- t = filterTimelineQualities(createLanguageFilter(deps.options.value.preferredAudioLanguage, 'audio'), throwLanguagesUnsupported, t);
49
+ const selection = deps.options.value.audio.selection;
50
+ t = filterTimelineQualities(createAudioDescriptionFilter(selection?.descriptive ?? false), throwNoPlayableAudio, t);
51
+ t = filterTimelineQualities(createLanguageFilter(selection?.language ?? null, 'audio'), throwLanguagesUnsupported, t);
51
52
  return t;
52
53
  }
53
54
  return combineData({
54
55
  timeline: deps.mediaTimeline,
55
- preferredAudioLanguage: deps.options.pick('preferredAudioLanguage'),
56
- preferDescriptiveAudio: deps.options.pick('preferDescriptiveAudio'),
56
+ audio: deps.options.pick('audio'),
57
57
  codecOverrides: deps.options.pick('codecOverrides'),
58
58
  }).map(async ({ timeline }) => {
59
59
  return transformTimeline(await timeline);
@@ -0,0 +1,60 @@
1
+ import type { Disposable } from '@amazon/vinyl-util';
2
+ import type { TextTrackRenderer } from './TextTrackRenderer';
3
+ /**
4
+ * The subset of a `VTTCue`'s positioning properties {@link computeCueLayout}
5
+ * reads. A native `VTTCue` satisfies this; a plain `TextTrackCue` (platforms
6
+ * without `VTTCue`) leaves them undefined and falls back to defaults.
7
+ */
8
+ export interface CueGeometry {
9
+ readonly align?: string | null;
10
+ readonly line?: number | AutoKeyword;
11
+ readonly lineAlign?: LineAlignSetting;
12
+ readonly position?: number | AutoKeyword;
13
+ readonly positionAlign?: PositionAlignSetting;
14
+ readonly size?: number;
15
+ readonly snapToLines?: boolean;
16
+ readonly vertical?: DirectionSetting;
17
+ }
18
+ /** Inline styles (camelCase CSS properties) to apply to a rendered cue box. */
19
+ export type CueLayout = Record<string, string>;
20
+ /**
21
+ * Maps a cue's WebVTT positioning settings to inline CSS. Pure and DOM-free so
22
+ * the (branchy) placement logic is unit-testable in isolation.
23
+ *
24
+ * A cue with neither `line` nor `position` set flows in the renderer's
25
+ * bottom-anchored, centered container (the common subtitle case). Otherwise it
26
+ * is absolutely positioned: `size` → width, `position`/`positionAlign` →
27
+ * horizontal, `line`/`lineAlign`/`snapToLines` → vertical (percentage lines, or
28
+ * whole rows counted from the bottom for negative integers), `align` → text
29
+ * alignment, `vertical` → writing mode.
30
+ */
31
+ export declare function computeCueLayout(cue: CueGeometry): CueLayout;
32
+ /**
33
+ * Renders a cue's text payload as safe HTML. Text is escaped (so it can't
34
+ * inject nodes); newlines become `<br>`; and WebVTT cue tags are converted:
35
+ * `<c.foo>`→`<span class="foo">`, `<i>/<b>/<u>/<ruby>/<rt>` pass through,
36
+ * `<v Name>`→`<span title>`, `<lang xx>`→`<span lang>`, timestamp tags are
37
+ * dropped. Class-based styling requires matching app CSS (STYLE blocks in the
38
+ * VTT are not applied).
39
+ */
40
+ export declare function renderCueText(text: string): string;
41
+ /**
42
+ * A {@link TextTrackRenderer} that paints cues as HTML into {@link element}.
43
+ * Mount `element` over the video; it stacks cues at the bottom, centered, and
44
+ * positions any cue that carries explicit WebVTT settings. The DOM track is
45
+ * expected to be `'hidden'` so only this renderer paints.
46
+ */
47
+ export declare class HtmlTextTrackRenderer implements TextTrackRenderer, Disposable {
48
+ /** The overlay container to mount over the video. */
49
+ readonly element: HTMLElement;
50
+ private track;
51
+ private readonly styleElement;
52
+ private readonly onCueChange;
53
+ constructor();
54
+ setTextTrack(track: TextTrack | null): void;
55
+ setStyles(styles: readonly string[]): void;
56
+ dispose(): void;
57
+ private renderActiveCues;
58
+ private createCueBox;
59
+ }
60
+ //# sourceMappingURL=HtmlTextTrackRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HtmlTextTrackRenderer.d.ts","sourceRoot":"","sources":["../../../../src/text/HtmlTextTrackRenderer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5D;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAA;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAA;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CACvC;AAED,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAK9C;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAmD5D;AAmDD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBlD;AAeD;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB,EAAE,UAAU;IACvE,qDAAqD;IACrD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAE7B,OAAO,CAAC,KAAK,CAAyB;IAGtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;;IAgB5D,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAe3C,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAI1C,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,YAAY;CAOvB"}
@@ -0,0 +1,231 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ /** Approximate row height for integer (snap-to-lines) `line` offsets. */
6
+ const ROW_EM = 1.5;
7
+ /**
8
+ * Maps a cue's WebVTT positioning settings to inline CSS. Pure and DOM-free so
9
+ * the (branchy) placement logic is unit-testable in isolation.
10
+ *
11
+ * A cue with neither `line` nor `position` set flows in the renderer's
12
+ * bottom-anchored, centered container (the common subtitle case). Otherwise it
13
+ * is absolutely positioned: `size` → width, `position`/`positionAlign` →
14
+ * horizontal, `line`/`lineAlign`/`snapToLines` → vertical (percentage lines, or
15
+ * whole rows counted from the bottom for negative integers), `align` → text
16
+ * alignment, `vertical` → writing mode.
17
+ */
18
+ export function computeCueLayout(cue) {
19
+ const style = {};
20
+ // WebVTT's default text alignment is 'center'.
21
+ style.textAlign = cue.align || 'center';
22
+ if (cue.vertical === 'rl')
23
+ style.writingMode = 'vertical-rl';
24
+ else if (cue.vertical === 'lr')
25
+ style.writingMode = 'vertical-lr';
26
+ const size = typeof cue.size === 'number' ? cue.size : 100;
27
+ style.maxWidth = `${size}%`;
28
+ const line = typeof cue.line === 'number' ? cue.line : null;
29
+ const position = typeof cue.position === 'number' ? cue.position : null;
30
+ if (line == null && position == null)
31
+ return style;
32
+ style.position = 'absolute';
33
+ const transforms = [];
34
+ if (position == null) {
35
+ style.left = '50%';
36
+ transforms.push('translateX(-50%)');
37
+ }
38
+ else {
39
+ if (cue.positionAlign === 'line-right') {
40
+ style.right = `${100 - position}%`;
41
+ }
42
+ else if (cue.positionAlign === 'line-left') {
43
+ style.left = `${position}%`;
44
+ }
45
+ else {
46
+ style.left = `${position}%`;
47
+ transforms.push('translateX(-50%)');
48
+ }
49
+ }
50
+ if (line == null) {
51
+ style.bottom = '0';
52
+ }
53
+ else {
54
+ if (cue.snapToLines === false) {
55
+ if (cue.lineAlign === 'end') {
56
+ style.bottom = `${100 - line}%`;
57
+ }
58
+ else if (cue.lineAlign === 'center') {
59
+ style.top = `${line}%`;
60
+ transforms.push('translateY(-50%)');
61
+ }
62
+ else {
63
+ style.top = `${line}%`;
64
+ }
65
+ }
66
+ else if (line < 0) {
67
+ style.bottom = `${(-line - 1) * ROW_EM}em`;
68
+ }
69
+ else {
70
+ style.top = `${line * ROW_EM}em`;
71
+ }
72
+ }
73
+ if (transforms.length > 0)
74
+ style.transform = transforms.join(' ');
75
+ return style;
76
+ }
77
+ const HTML_ESCAPE = {
78
+ '&': '&amp;',
79
+ '<': '&lt;',
80
+ '>': '&gt;',
81
+ '"': '&quot;',
82
+ };
83
+ /** Escapes text (and attribute values) for safe insertion via innerHTML. */
84
+ function escapeHtml(text) {
85
+ // Character class, no backtracking.
86
+ return text.replace(/["&<>]/g, (ch) => HTML_ESCAPE[ch]);
87
+ }
88
+ // WebVTT inline tags rendered as the matching HTML element.
89
+ const PASSTHROUGH_TAGS = new Set(['i', 'b', 'u', 'ruby', 'rt']);
90
+ // Tags rendered as a <span> (styling/metadata carried via class/attributes).
91
+ const SPAN_TAGS = new Set(['c', 'v', 'lang']);
92
+ /** Opening HTML for a WebVTT start tag `inner` (the text between `<` and `>`). */
93
+ function openTag(inner) {
94
+ // Timestamp tags (`<00:00:00.000>`) carry no styling — drop them.
95
+ if (/^\d/.test(inner))
96
+ return '';
97
+ // The head (before any annotation) is `name` plus `.class` segments.
98
+ const head = inner.split(/\s/, 1)[0];
99
+ const [name, ...classes] = head.split('.');
100
+ const annotation = inner.slice(head.length).trim();
101
+ const classAttr = classes.filter(Boolean).length
102
+ ? ` class="${escapeHtml(classes.filter(Boolean).join(' '))}"`
103
+ : '';
104
+ if (PASSTHROUGH_TAGS.has(name))
105
+ return `<${name}${classAttr}>`;
106
+ if (name === 'v') {
107
+ const title = annotation ? ` title="${escapeHtml(annotation)}"` : '';
108
+ return `<span${classAttr}${title}>`;
109
+ }
110
+ if (name === 'lang') {
111
+ const lang = annotation ? ` lang="${escapeHtml(annotation)}"` : '';
112
+ return `<span${classAttr}${lang}>`;
113
+ }
114
+ if (name === 'c')
115
+ return `<span${classAttr}>`;
116
+ return ''; // unknown tag: drop
117
+ }
118
+ /** Closing HTML for a WebVTT end tag named `name`. */
119
+ function closeTag(name) {
120
+ if (PASSTHROUGH_TAGS.has(name))
121
+ return `</${name}>`;
122
+ if (SPAN_TAGS.has(name))
123
+ return '</span>';
124
+ return '';
125
+ }
126
+ /**
127
+ * Renders a cue's text payload as safe HTML. Text is escaped (so it can't
128
+ * inject nodes); newlines become `<br>`; and WebVTT cue tags are converted:
129
+ * `<c.foo>`→`<span class="foo">`, `<i>/<b>/<u>/<ruby>/<rt>` pass through,
130
+ * `<v Name>`→`<span title>`, `<lang xx>`→`<span lang>`, timestamp tags are
131
+ * dropped. Class-based styling requires matching app CSS (STYLE blocks in the
132
+ * VTT are not applied).
133
+ */
134
+ export function renderCueText(text) {
135
+ let html = '';
136
+ // Each match is one tag (`<…>`), a run of non-`<` text, or a stray `<`.
137
+ // The tag body excludes `<` (as well as `>`) so a failed tag match on a
138
+ // `<`-heavy string bails after one char rather than scanning to the end —
139
+ // keeping this linear (no polynomial backtracking) on adversarial input.
140
+ for (const token of text.match(/<[^<>]*>|[^<]+|</g) ?? []) {
141
+ if (token[0] !== '<' || token === '<') {
142
+ html += escapeHtml(token).replace(/\n/g, '<br>');
143
+ }
144
+ else {
145
+ const inner = token.slice(1, -1);
146
+ html +=
147
+ inner[0] === '/'
148
+ ? closeTag(inner.slice(1).split(/[.\s]/, 1)[0].toLowerCase())
149
+ : openTag(inner);
150
+ }
151
+ }
152
+ return html;
153
+ }
154
+ /**
155
+ * Rewrites a WebVTT `STYLE` block's `::cue` selectors to target this renderer's
156
+ * HTML cue elements: `::cue(<sel>)` → `.vinyl-text-cue <sel>` (cue components
157
+ * become descendants of the cue box) and bare `::cue` → `.vinyl-text-cue`.
158
+ * Rules are global to `.vinyl-text-cue`, so concurrent players share them.
159
+ */
160
+ function scopeCueRules(css) {
161
+ // Bounded character classes; no nested quantifiers, so no backtracking blowup.
162
+ return css
163
+ .replace(/::cue\(([^)]*)\)/g, '.vinyl-text-cue $1')
164
+ .replace(/::cue\b/g, '.vinyl-text-cue');
165
+ }
166
+ /**
167
+ * A {@link TextTrackRenderer} that paints cues as HTML into {@link element}.
168
+ * Mount `element` over the video; it stacks cues at the bottom, centered, and
169
+ * positions any cue that carries explicit WebVTT settings. The DOM track is
170
+ * expected to be `'hidden'` so only this renderer paints.
171
+ */
172
+ export class HtmlTextTrackRenderer {
173
+ /** The overlay container to mount over the video. */
174
+ element;
175
+ track = null;
176
+ // Holds the authored STYLE-block CSS (::cue rules rewritten to target our
177
+ // cue elements). A <style> renders nothing itself, so it lives in-container.
178
+ styleElement;
179
+ onCueChange = () => this.renderActiveCues();
180
+ constructor() {
181
+ this.element = document.createElement('div');
182
+ this.element.className = 'vinyl-text-container';
183
+ Object.assign(this.element.style, {
184
+ display: 'flex',
185
+ flexDirection: 'column',
186
+ justifyContent: 'flex-end',
187
+ alignItems: 'center',
188
+ pointerEvents: 'none',
189
+ });
190
+ this.styleElement = document.createElement('style');
191
+ this.element.appendChild(this.styleElement);
192
+ }
193
+ setTextTrack(track) {
194
+ if (track === this.track)
195
+ return;
196
+ this.track?.removeEventListener('cuechange', this.onCueChange);
197
+ this.track = track;
198
+ // Drop the previous track's authored styles; the new one supplies its
199
+ // own via setStyles once loaded.
200
+ this.styleElement.textContent = '';
201
+ if (!track) {
202
+ this.element.replaceChildren(this.styleElement);
203
+ return;
204
+ }
205
+ track.addEventListener('cuechange', this.onCueChange);
206
+ this.renderActiveCues();
207
+ }
208
+ setStyles(styles) {
209
+ this.styleElement.textContent = styles.map(scopeCueRules).join('\n');
210
+ }
211
+ dispose() {
212
+ this.setTextTrack(null);
213
+ }
214
+ renderActiveCues() {
215
+ // Only invoked while a track is attached (from setTextTrack / cuechange).
216
+ const active = this.track.activeCues ?? [];
217
+ // Keep the <style> element; replace only the cue boxes.
218
+ const children = [this.styleElement];
219
+ for (let i = 0; i < active.length; i++) {
220
+ children.push(this.createCueBox(active[i]));
221
+ }
222
+ this.element.replaceChildren(...children);
223
+ }
224
+ createCueBox(cue) {
225
+ const box = document.createElement('div');
226
+ box.className = 'vinyl-text-cue';
227
+ Object.assign(box.style, computeCueLayout(cue));
228
+ box.innerHTML = renderCueText(cue.text ?? '');
229
+ return box;
230
+ }
231
+ }
@@ -1,91 +1,103 @@
1
1
  import { EventHostImpl, type Maybe, type RequestInitOptions } from '@amazon/vinyl-util';
2
- import type { TextTrackController, TextTrackEventMap, TextTrackInfo } from './TextTrack';
2
+ import type { TextTrackController, TextTrackControllerOptions, TextTrackEventMap, TextTrackInfo } from './TextTrack';
3
3
  import type { ObservableValue } from '@amazon/vinyl-observable';
4
- import { type VttCueStyle } from './VttCueStyle';
4
+ import type { MediaTextTrackProvider } from './mediaTextTrackProvider';
5
+ import type { ReadonlyPlaybackController } from '../playback/ReadonlyPlaybackController';
6
+ import type { TextTrackRenderer } from './TextTrackRenderer';
5
7
  export interface SidecarTextTrackControllerDeps {
6
8
  /**
7
- * The HTML media element on which to attach the in-band TextTrack
8
- * representation. Cues for the active text track are added to a TextTrack
9
- * created via `media.addTextTrack`. Setting this to null disables DOM
10
- * integration; cues are still loaded and surfaced via events.
9
+ * Hands out (memoized) DOM text tracks. Text tracks can only be created on a
10
+ * media element and never removed, so the provider reuses one track per
11
+ * rendition rather than accumulating them.
11
12
  */
12
- readonly media: HTMLMediaElement | null;
13
+ readonly textTrackProvider: MediaTextTrackProvider;
13
14
  /**
14
15
  * Optional request init options forwarded with each VTT fetch (e.g. CORS).
15
16
  */
16
17
  readonly requestInit?: Maybe<RequestInitOptions>;
17
18
  /**
18
- * Preferred caption language(s), most-preferred first. A non-null
19
- * preference auto-selects the best-matching track, re-applied as the track
20
- * list changes. Changing the preference to null clears the selection
21
- * (captions off). An initial null (or an absent observable) is "no
22
- * preference": forced tracks still auto-select until the app makes an
23
- * explicit choice — it does not force captions off.
19
+ * The discovered text tracks, re-emitted whenever the manifest changes.
24
20
  */
25
- readonly preferredTextLanguage?: ObservableValue<string | readonly string[] | null>;
21
+ readonly textTracks: ObservableValue<Promise<readonly TextTrackInfo[]>>;
26
22
  /**
27
- * Layout style applied to each rendered VTTCue (see
28
- * {@link VttCueStyle}). Read per cue as it is appended, so a change affects
29
- * subsequently-rendered cues. Absent means no styling (browser defaults).
23
+ * Declarative selection / rendering configuration. Re-applied on change.
30
24
  */
31
- readonly cueStyle?: ObservableValue<VttCueStyle | null>;
25
+ readonly options: ObservableValue<TextTrackControllerOptions>;
26
+ /**
27
+ * Supplies the current playhead used to fetch caption segments in a window
28
+ * around it.
29
+ */
30
+ readonly playbackController: ReadonlyPlaybackController;
31
+ /**
32
+ * Optional renderer that paints cues itself (HTML overlay). When provided,
33
+ * the DOM text track is kept `'hidden'` (timing only) and the renderer is
34
+ * handed the active track; without one, the track renders natively
35
+ * (`'showing'`).
36
+ */
37
+ readonly textTrackRenderer?: Maybe<TextTrackRenderer>;
32
38
  }
39
+ /**
40
+ * Selects the text track that matches the given options, or null for none.
41
+ *
42
+ * The `enabled` mode gates everything: `'off'` renders nothing (default is
43
+ * `'forced'`). Otherwise an explicit {@link TextTrackSelection.id} wins; else
44
+ * the best language match is chosen among tracks filtered by kind and
45
+ * forced-ness. Forced-ness comes from {@link TextTrackSelection.forced} when
46
+ * set, otherwise from the mode (`'forced'` keeps only forced tracks, `'on'`
47
+ * only full tracks).
48
+ *
49
+ * @private
50
+ */
51
+ export declare function resolveSelectedTrack(tracks: readonly TextTrackInfo[], options: TextTrackControllerOptions): TextTrackInfo | null;
33
52
  /**
34
53
  * Manages a sidecar WebVTT-based text track lifecycle:
35
54
  *
36
- * - holds a discovered list of {@link TextTrackInfo}
37
- * - on activation, fetches the chosen track's WebVTT and pushes cues to a
38
- * `TextTrack` created on the `HTMLMediaElement`
39
- * - clears any previously activated cues when switching tracks
55
+ * - tracks the discovered {@link TextTrackInfo} list (from the `textTracks`
56
+ * observable) and the current selection (from the `options` observable)
57
+ * - on selection, fetches the chosen track's WebVTT and pushes cues to a DOM
58
+ * `TextTrack` obtained from the {@link MediaTextTrackProvider}
59
+ * - clears cues and hides the DOM track when the selection changes or clears
40
60
  *
41
- * The controller is intentionally agnostic of HLS/DASH discovery details. Its
42
- * input is whatever list of {@link TextTrackInfo} entries the manifest layer
43
- * decides to surface.
61
+ * The controller is agnostic of HLS/DASH discovery details; its inputs are the
62
+ * observables supplied by the manifest layer.
44
63
  */
45
64
  export declare class SidecarTextTrackController extends EventHostImpl<TextTrackEventMap> implements TextTrackController {
46
65
  private readonly deps;
47
66
  get [Symbol.toStringTag](): string;
48
- private _tracks;
49
67
  private _active;
50
- private _domTrack;
51
- private loadAbort;
52
- private _userSelected;
53
- private readonly preferredLanguageSub;
68
+ private _tracks;
69
+ private _activeTextTrack;
70
+ private _ref;
71
+ private readonly loadAbort;
72
+ private readonly disposer;
54
73
  constructor(deps: SidecarTextTrackControllerDeps);
55
74
  get textTracks(): readonly TextTrackInfo[];
56
75
  get activeTextTrack(): TextTrackInfo | null;
76
+ get active(): boolean;
77
+ get disposed(): boolean;
57
78
  /**
58
- * Replaces the discovered text track list. Emits `textTracksChange`. If
59
- * the previously active track is no longer present, clears the active
60
- * selection and emits `activeTextTrackChange`.
61
- */
62
- setTextTracks(tracks: readonly TextTrackInfo[]): void;
63
- setActiveTextTrack(id: string | null): void;
64
- /**
65
- * Selects the track best matching the preferred language(s), or clears the
66
- * selection when the preference is null or nothing matches.
79
+ * Replaces the discovered track list, emits `textTracksChange`, then
80
+ * re-applies the current selection against the new list.
67
81
  */
68
- private applyPreferredLanguage;
82
+ private setTracks;
69
83
  /**
70
- * Applies a selection by id (null clears it) without marking it as an
71
- * explicit user choice. Shared by setActiveTextTrack and forced auto-select.
84
+ * Recomputes the selection from the current options and track list,
85
+ * emitting `activeTextTrackChange` on change and (re)rendering when active.
72
86
  */
73
- private selectById;
87
+ private refreshSelection;
88
+ deactivate(): void;
89
+ activate(): void;
90
+ private startLoad;
91
+ private appendCues;
74
92
  /**
75
- * The forced track to auto-select, or null. Prefers the default track's
76
- * language, else the first forced track.
93
+ * Clears cues from the current DOM track and hides it, keeping the track for
94
+ * later reuse via the provider.
77
95
  */
78
- private pickForcedTrack;
79
- suspend(): void;
80
- resume(): void;
96
+ private hideCurrent;
81
97
  /**
82
- * Cancels any in-flight load, clears the DOM TextTrack, and resets state.
98
+ * Cancels any in-flight load, hides the DOM text track, and resets state.
83
99
  * Called by the host when the underlying media is unloaded.
84
100
  */
85
101
  dispose(): void;
86
- private startLoad;
87
- private ensureDomTrack;
88
- private appendCues;
89
- private clearDomTrack;
90
102
  }
91
103
  //# sourceMappingURL=SidecarTextTrackController.d.ts.map