@gcorevideo/player 2.22.18 → 2.22.20

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 (84) hide show
  1. package/assets/audio-selector/track-selector.ejs +3 -3
  2. package/assets/bottom-gear/bottomgear.ejs +3 -3
  3. package/assets/dvr-controls/dvr_controls.scss +0 -12
  4. package/dist/core.js +1 -1
  5. package/dist/index.css +803 -810
  6. package/dist/index.js +195 -176
  7. package/dist/player.d.ts +121 -108
  8. package/dist/plugins/index.css +904 -911
  9. package/dist/plugins/index.js +132 -112
  10. package/docs/api/player.bitratetrackrecord.md +20 -0
  11. package/docs/api/player.clapprstats.exportmetrics.md +2 -2
  12. package/docs/api/player.clapprstats.md +0 -4
  13. package/docs/api/player.clapprstatschronograph.md +115 -0
  14. package/docs/api/player.clapprstatscounter.md +211 -0
  15. package/docs/api/player.clapprstatsevents.md +51 -0
  16. package/docs/api/player.clapprstatsmetrics.md +52 -0
  17. package/docs/api/player.clipspluginsettings.md +1 -1
  18. package/docs/api/player.md +57 -2
  19. package/docs/api/player.nerdstats.md +3 -3
  20. package/docs/api/player.playerconfig.md +1 -1
  21. package/docs/api/player.playerconfig.playbacktype.md +6 -1
  22. package/docs/api/player.timeupdate.md +6 -3
  23. package/lib/plugins/audio-selector/AudioSelector.d.ts +1 -1
  24. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  25. package/lib/plugins/audio-selector/AudioSelector.js +15 -8
  26. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
  27. package/lib/plugins/bottom-gear/BottomGear.js +2 -2
  28. package/lib/plugins/clappr-nerd-stats/NerdStats.d.ts +4 -4
  29. package/lib/plugins/clappr-nerd-stats/NerdStats.js +4 -4
  30. package/lib/plugins/clappr-stats/ClapprStats.d.ts +5 -2
  31. package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
  32. package/lib/plugins/clappr-stats/ClapprStats.js +31 -33
  33. package/lib/plugins/clappr-stats/types.d.ts +21 -21
  34. package/lib/plugins/clappr-stats/types.d.ts.map +1 -1
  35. package/lib/plugins/clappr-stats/types.js +22 -22
  36. package/lib/plugins/clappr-stats/utils.d.ts +2 -2
  37. package/lib/plugins/clappr-stats/utils.d.ts.map +1 -1
  38. package/lib/plugins/click-to-pause/ClickToPause.js +1 -1
  39. package/lib/plugins/clips/Clips.d.ts +1 -1
  40. package/lib/plugins/dvr-controls/DvrControls.d.ts +6 -2
  41. package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
  42. package/lib/plugins/dvr-controls/DvrControls.js +39 -27
  43. package/lib/plugins/media-control/MediaControl.d.ts +6 -2
  44. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  45. package/lib/plugins/media-control/MediaControl.js +20 -9
  46. package/lib/plugins/picture-in-picture/PictureInPicture.js +1 -1
  47. package/lib/plugins/subtitles/ClosedCaptions.js +1 -1
  48. package/lib/plugins/vast-ads/VastAds.js +1 -1
  49. package/lib/plugins/vast-ads/rollmanager.js +1 -1
  50. package/lib/testUtils.d.ts.map +1 -1
  51. package/lib/testUtils.js +7 -4
  52. package/lib/types.d.ts +1 -1
  53. package/package.json +3 -3
  54. package/src/playback/__tests__/HTML5Video.test.ts +2 -2
  55. package/src/plugins/audio-selector/AudioSelector.ts +14 -7
  56. package/src/plugins/audio-selector/__tests__/AudioSelector.test.ts +8 -8
  57. package/src/plugins/audio-selector/__tests__/__snapshots__/AudioSelector.test.ts.snap +15 -15
  58. package/src/plugins/bottom-gear/BottomGear.ts +2 -2
  59. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +8 -5
  60. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +3 -3
  61. package/src/plugins/clappr-nerd-stats/NerdStats.ts +5 -5
  62. package/src/plugins/clappr-stats/ClapprStats.ts +41 -40
  63. package/src/plugins/clappr-stats/__tests__/ClapprStats.test.ts +12 -12
  64. package/src/plugins/clappr-stats/types.ts +21 -21
  65. package/src/plugins/clappr-stats/utils.ts +2 -2
  66. package/src/plugins/click-to-pause/ClickToPause.ts +1 -1
  67. package/src/plugins/clips/Clips.ts +1 -1
  68. package/src/plugins/clips/__tests__/Clips.test.ts +1 -1
  69. package/src/plugins/clips/__tests__/__snapshots__/Clips.test.ts.snap +1 -1
  70. package/src/plugins/dvr-controls/DvrControls.ts +51 -37
  71. package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +84 -26
  72. package/src/plugins/dvr-controls/__tests__/__snapshots__/DvrControls.test.ts.snap +0 -12
  73. package/src/plugins/media-control/MediaControl.ts +21 -9
  74. package/src/plugins/media-control/__tests__/MediaControl.test.ts +8 -5
  75. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +20 -20
  76. package/src/plugins/picture-in-picture/PictureInPicture.ts +1 -1
  77. package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
  78. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +1 -1
  79. package/src/plugins/vast-ads/VastAds.ts +1 -1
  80. package/src/plugins/vast-ads/rollmanager.ts +1 -1
  81. package/src/testUtils.ts +11 -5
  82. package/src/types.ts +1 -1
  83. package/temp/player.api.json +630 -12
  84. package/tsconfig.tsbuildinfo +1 -1
@@ -8,8 +8,13 @@ import type {
8
8
 
9
9
  import { CLAPPR_VERSION } from '../../build.js'
10
10
  import { TimerId } from '../../utils/types.js'
11
- import type { Metrics } from './types.js'
12
- import { ClapprStatsEvents, Chronograph, Counter } from './types.js'
11
+ import type { ClapprStatsMetrics } from './types.js'
12
+ import {
13
+ ClapprStatsEvents,
14
+ ClapprStatsChronograph,
15
+ ClapprStatsCounter,
16
+ } from './types.js'
17
+ export * from './types.js'
13
18
  import { newMetrics } from './utils.js'
14
19
 
15
20
  export type ClapprStatsSettings = {
@@ -26,6 +31,8 @@ export type ClapprStatsSettings = {
26
31
  * @remarks
27
32
  * This plugin does not render anything and is supposed to be extended or used together with other plugins that actually render something.
28
33
  *
34
+ * @see {@link NerdStats} - a plugin that visualises the playback metrics
35
+ *
29
36
  * Configuration options - {@link ClapprStatsSettings}
30
37
  *
31
38
  * Events - {@link ClapprStatsEvents}
@@ -35,14 +42,14 @@ export class ClapprStats extends ContainerPlugin {
35
42
 
36
43
  private lastDecodedFramesCount = 0
37
44
 
38
- private metrics: Metrics = newMetrics()
45
+ private metrics: ClapprStatsMetrics = newMetrics()
39
46
 
40
- private timers: Record<Chronograph, number> = {
41
- [Chronograph.Startup]: 0,
42
- [Chronograph.Watch]: 0,
43
- [Chronograph.Pause]: 0,
44
- [Chronograph.Buffering]: 0,
45
- [Chronograph.Session]: 0,
47
+ private timers: Record<ClapprStatsChronograph, number> = {
48
+ [ClapprStatsChronograph.Startup]: 0,
49
+ [ClapprStatsChronograph.Watch]: 0,
50
+ [ClapprStatsChronograph.Pause]: 0,
51
+ [ClapprStatsChronograph.Buffering]: 0,
52
+ [ClapprStatsChronograph.Session]: 0,
46
53
  }
47
54
 
48
55
  private runEach: number
@@ -78,21 +85,15 @@ export class ClapprStats extends ContainerPlugin {
78
85
  : new Date().getTime()
79
86
  }
80
87
 
81
- private inc(counter: Counter) {
88
+ private inc(counter: ClapprStatsCounter) {
82
89
  this.metrics.counters[counter] += 1
83
90
  }
84
91
 
85
- // _timerHasStarted(timer) {
86
- // return this[`_start${timer}`] !== undefined;
87
- // }
88
-
89
- private start(timer: Chronograph) {
90
- // this[`_start${timer}`] = this._now();
92
+ private start(timer: ClapprStatsChronograph) {
91
93
  this.timers[timer] = this.now()
92
94
  }
93
95
 
94
- private stop(timer: Chronograph) {
95
- // this._metrics.timers[timer] += this._now() - this[`_start${timer}`];
96
+ private stop(timer: ClapprStatsChronograph) {
96
97
  this.metrics.chrono[timer] += this.now() - this.timers[timer]
97
98
  }
98
99
 
@@ -131,16 +132,16 @@ export class ClapprStats extends ContainerPlugin {
131
132
  )
132
133
  this.listenTo(this.container, CoreEvents.CONTAINER_SEEK, this.onSeek)
133
134
  this.listenTo(this.container, CoreEvents.CONTAINER_ERROR, () =>
134
- this.inc(Counter.Error),
135
+ this.inc(ClapprStatsCounter.Error),
135
136
  )
136
137
  this.listenTo(this.container, CoreEvents.CONTAINER_FULLSCREEN, () =>
137
- this.inc(Counter.Fullscreen),
138
+ this.inc(ClapprStatsCounter.Fullscreen),
138
139
  )
139
140
  this.listenTo(
140
141
  this.container,
141
142
  CoreEvents.CONTAINER_PLAYBACKDVRSTATECHANGED,
142
143
  (dvrInUse: boolean) => {
143
- dvrInUse && this.inc(Counter.DvrUsage)
144
+ dvrInUse && this.inc(ClapprStatsCounter.DvrUsage)
144
145
  },
145
146
  )
146
147
  this.listenTo(
@@ -186,7 +187,7 @@ export class ClapprStats extends ContainerPlugin {
186
187
 
187
188
  this.metrics.extra.bitratesHistory.push({ start: this.now(), bitrate })
188
189
 
189
- this.inc(Counter.ChangeLevel)
190
+ this.inc(ClapprStatsCounter.ChangeLevel)
190
191
  }
191
192
 
192
193
  private stopReporting() {
@@ -200,8 +201,8 @@ export class ClapprStats extends ContainerPlugin {
200
201
 
201
202
  private startTimers() {
202
203
  this.timerId = setInterval(this.buildReport.bind(this), this.runEach)
203
- this.start(Chronograph.Session)
204
- this.start(Chronograph.Startup)
204
+ this.start(ClapprStatsChronograph.Session)
205
+ this.start(ClapprStatsChronograph.Startup)
205
206
  }
206
207
 
207
208
  private onFirstPlaying() {
@@ -211,8 +212,8 @@ export class ClapprStats extends ContainerPlugin {
211
212
  this.onContainerUpdateWhilePlaying,
212
213
  )
213
214
 
214
- this.start(Chronograph.Watch)
215
- this.stop(Chronograph.Startup)
215
+ this.start(ClapprStatsChronograph.Watch)
216
+ this.stop(ClapprStatsChronograph.Startup)
216
217
  }
217
218
 
218
219
  private playAfterPause() {
@@ -221,18 +222,18 @@ export class ClapprStats extends ContainerPlugin {
221
222
  CoreEvents.CONTAINER_TIMEUPDATE,
222
223
  this.onContainerUpdateWhilePlaying,
223
224
  )
224
- this.stop(Chronograph.Pause)
225
- this.start(Chronograph.Watch)
225
+ this.stop(ClapprStatsChronograph.Pause)
226
+ this.start(ClapprStatsChronograph.Watch)
226
227
  }
227
228
 
228
229
  private onPlay() {
229
- this.inc(Counter.Play)
230
+ this.inc(ClapprStatsCounter.Play)
230
231
  }
231
232
 
232
233
  private onPause() {
233
- this.stop(Chronograph.Watch)
234
- this.start(Chronograph.Pause)
235
- this.inc(Counter.Pause)
234
+ this.stop(ClapprStatsChronograph.Watch)
235
+ this.start(ClapprStatsChronograph.Pause)
236
+ this.inc(ClapprStatsCounter.Pause)
236
237
  this.listenToOnce(
237
238
  this.container,
238
239
  CoreEvents.CONTAINER_PLAY,
@@ -246,7 +247,7 @@ export class ClapprStats extends ContainerPlugin {
246
247
  }
247
248
 
248
249
  private onSeek(e: number) {
249
- this.inc(Counter.Seek)
250
+ this.inc(ClapprStatsCounter.Seek)
250
251
  this.metrics.extra.watchHistory.push([e * 1000, e * 1000])
251
252
  }
252
253
 
@@ -282,14 +283,14 @@ export class ClapprStats extends ContainerPlugin {
282
283
 
283
284
  private onContainerUpdateWhilePlaying() {
284
285
  if (this.container.playback.isPlaying()) {
285
- this.stop(Chronograph.Watch)
286
- this.start(Chronograph.Watch)
286
+ this.stop(ClapprStatsChronograph.Watch)
287
+ this.start(ClapprStatsChronograph.Watch)
287
288
  }
288
289
  }
289
290
 
290
291
  private onBuffering() {
291
- this.inc(Counter.Buffering)
292
- this.start(Chronograph.Buffering)
292
+ this.inc(ClapprStatsCounter.Buffering)
293
+ this.start(ClapprStatsChronograph.Buffering)
293
294
  this.listenToOnce(
294
295
  this.container,
295
296
  CoreEvents.CONTAINER_STATE_BUFFERFULL,
@@ -298,7 +299,7 @@ export class ClapprStats extends ContainerPlugin {
298
299
  }
299
300
 
300
301
  private onBufferfull() {
301
- this.stop(Chronograph.Buffering)
302
+ this.stop(ClapprStatsChronograph.Buffering)
302
303
  this.listenToOnce(
303
304
  this.container,
304
305
  CoreEvents.CONTAINER_STATE_BUFFERING,
@@ -317,8 +318,8 @@ export class ClapprStats extends ContainerPlugin {
317
318
  }
318
319
 
319
320
  private buildReport() {
320
- this.stop(Chronograph.Session)
321
- this.start(Chronograph.Session)
321
+ this.stop(ClapprStatsChronograph.Session)
322
+ this.start(ClapprStatsChronograph.Session)
322
323
 
323
324
  this.metrics.extra.playbackName = this.playbackName
324
325
  this.metrics.extra.playbackType = this.playbackType
@@ -4,7 +4,7 @@ import FakeTimers from '@sinonjs/fake-timers'
4
4
 
5
5
  import { ClapprStats } from '../ClapprStats'
6
6
  import { createMockCore } from '../../../testUtils'
7
- import { Chronograph, ClapprStatsEvents, Counter } from '../types'
7
+ import { ClapprStatsChronograph, ClapprStatsCounter, ClapprStatsEvents } from '../types'
8
8
 
9
9
  describe('ClapprStats', () => {
10
10
  let core: any
@@ -29,7 +29,7 @@ describe('ClapprStats', () => {
29
29
  })
30
30
  it('should measure', () => {
31
31
  const metrics = stats.exportMetrics()
32
- expect(metrics.chrono[Chronograph.Startup]).toBe(155)
32
+ expect(metrics.chrono[ClapprStatsChronograph.Startup]).toBe(155)
33
33
  // expect(metrics.times[Chronograph.Session]).toBe(155)
34
34
  })
35
35
  })
@@ -50,8 +50,8 @@ describe('ClapprStats', () => {
50
50
  })
51
51
  it('should measure cumulative play and pause durations', () => {
52
52
  const metrics = stats.exportMetrics()
53
- expect(metrics.chrono[Chronograph.Watch]).toBe(3850)
54
- expect(metrics.chrono[Chronograph.Pause]).toBe(2900)
53
+ expect(metrics.chrono[ClapprStatsChronograph.Watch]).toBe(3850)
54
+ expect(metrics.chrono[ClapprStatsChronograph.Pause]).toBe(2900)
55
55
  })
56
56
  })
57
57
  describe('buffering', () => {
@@ -71,7 +71,7 @@ describe('ClapprStats', () => {
71
71
  })
72
72
  it('should measure cumulative buffering durations', () => {
73
73
  const metrics = stats.exportMetrics()
74
- expect(metrics.chrono[Chronograph.Buffering]).toBe(200)
74
+ expect(metrics.chrono[ClapprStatsChronograph.Buffering]).toBe(200)
75
75
  })
76
76
  })
77
77
  describe('session', () => {
@@ -88,7 +88,7 @@ describe('ClapprStats', () => {
88
88
  it('should measure', () => {
89
89
  expect(onReport).toHaveBeenCalledWith(expect.objectContaining({
90
90
  chrono: expect.objectContaining({
91
- [Chronograph.Session]: 60200,
91
+ [ClapprStatsChronograph.Session]: 60200,
92
92
  }),
93
93
  }))
94
94
  })
@@ -116,16 +116,16 @@ describe('ClapprStats', () => {
116
116
  it('should measure fps', () => {
117
117
  expect(onReport).toHaveBeenNthCalledWith(1, expect.objectContaining({
118
118
  counters: expect.objectContaining({
119
- [Counter.DecodedFrames]: 126,
120
- [Counter.DroppedFrames]: 3,
121
- [Counter.Fps]: expect.closeTo(25, 0),
119
+ [ClapprStatsCounter.DecodedFrames]: 126,
120
+ [ClapprStatsCounter.DroppedFrames]: 3,
121
+ [ClapprStatsCounter.Fps]: expect.closeTo(25, 0),
122
122
  }),
123
123
  }))
124
124
  expect(onReport).toHaveBeenNthCalledWith(2, expect.objectContaining({
125
125
  counters: expect.objectContaining({
126
- [Counter.DecodedFrames]: 275,
127
- [Counter.DroppedFrames]: 4,
128
- [Counter.Fps]: expect.closeTo(30, 0),
126
+ [ClapprStatsCounter.DecodedFrames]: 275,
127
+ [ClapprStatsCounter.DroppedFrames]: 4,
128
+ [ClapprStatsCounter.Fps]: expect.closeTo(30, 0),
129
129
  }),
130
130
  }))
131
131
  })
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @beta
3
3
  */
4
- export enum Chronograph {
4
+ export enum ClapprStatsChronograph {
5
5
  Startup = 'startup',
6
6
  Watch = 'watch',
7
7
  Pause = 'pause',
@@ -13,7 +13,7 @@ export enum Chronograph {
13
13
  /**
14
14
  * @beta
15
15
  */
16
- export enum Counter {
16
+ export enum ClapprStatsCounter {
17
17
  Play = 'play',
18
18
  Pause = 'pause',
19
19
  Error = 'error',
@@ -30,7 +30,7 @@ export enum Counter {
30
30
  /**
31
31
  * @beta
32
32
  */
33
- export type Metrics = {
33
+ export type ClapprStatsMetrics = {
34
34
  /**
35
35
  * Events count counters
36
36
  */
@@ -38,17 +38,17 @@ export type Metrics = {
38
38
  /**
39
39
  *
40
40
  */
41
- [Counter.Play]: number
42
- [Counter.Pause]: number
43
- [Counter.Error]: number
44
- [Counter.Buffering]: number
45
- [Counter.DecodedFrames]: number
46
- [Counter.DroppedFrames]: number
47
- [Counter.Fps]: number
48
- [Counter.ChangeLevel]: number
49
- [Counter.Seek]: number
50
- [Counter.Fullscreen]: number
51
- [Counter.DvrUsage]: number
41
+ [ClapprStatsCounter.Play]: number
42
+ [ClapprStatsCounter.Pause]: number
43
+ [ClapprStatsCounter.Error]: number
44
+ [ClapprStatsCounter.Buffering]: number
45
+ [ClapprStatsCounter.DecodedFrames]: number
46
+ [ClapprStatsCounter.DroppedFrames]: number
47
+ [ClapprStatsCounter.Fps]: number
48
+ [ClapprStatsCounter.ChangeLevel]: number
49
+ [ClapprStatsCounter.Seek]: number
50
+ [ClapprStatsCounter.Fullscreen]: number
51
+ [ClapprStatsCounter.DvrUsage]: number
52
52
  }
53
53
  /**
54
54
  * Time measurements - accumulated duration of time-based activities
@@ -57,23 +57,23 @@ export type Metrics = {
57
57
  /**
58
58
  * Time spent in the startup phase
59
59
  */
60
- [Chronograph.Startup]: number
60
+ [ClapprStatsChronograph.Startup]: number
61
61
  /**
62
62
  * Total time spent in the watch phase
63
63
  */
64
- [Chronograph.Watch]: number
64
+ [ClapprStatsChronograph.Watch]: number
65
65
  /**
66
66
  *
67
67
  */
68
- [Chronograph.Pause]: number
69
- [Chronograph.Buffering]: number
70
- [Chronograph.Session]: number
68
+ [ClapprStatsChronograph.Pause]: number
69
+ [ClapprStatsChronograph.Buffering]: number
70
+ [ClapprStatsChronograph.Session]: number
71
71
  // [Chronograph.Latency]: number;
72
72
  }
73
73
  extra: {
74
74
  playbackName: string
75
75
  playbackType: string
76
- bitratesHistory: BitrateTrackRecord[]
76
+ bitratesHistory: ClapprStatsBitrateTrack[]
77
77
  bitrateWeightedMean: number
78
78
  bitrateMostUsed: number
79
79
  buffersize: number
@@ -89,7 +89,7 @@ export type Metrics = {
89
89
  /**
90
90
  * @beta
91
91
  */
92
- export type BitrateTrackRecord = {
92
+ export type ClapprStatsBitrateTrack = {
93
93
  start: number
94
94
  end?: number
95
95
  time?: number
@@ -1,6 +1,6 @@
1
- import type { Metrics } from './types'
1
+ import type { ClapprStatsMetrics } from './types'
2
2
 
3
- export function newMetrics(): Metrics {
3
+ export function newMetrics(): ClapprStatsMetrics {
4
4
  return {
5
5
  counters: {
6
6
  play: 0,
@@ -25,7 +25,7 @@ export class ClickToPause extends ContainerPlugin {
25
25
  * @internal
26
26
  */
27
27
  get name() {
28
- return 'click_to_pause_custom'
28
+ return 'click_to_pause'
29
29
  }
30
30
 
31
31
  /**
@@ -12,7 +12,7 @@ import clipsHTML from '../../../assets/clips/clips.ejs'
12
12
  const T = 'plugins.clips'
13
13
 
14
14
  /**
15
- * Configuration options for the {@link ClipsPlugin} plugin.
15
+ * Configuration options for the {@link Clips} plugin.
16
16
  * @beta
17
17
  */
18
18
  export interface ClipsPluginSettings {
@@ -8,7 +8,7 @@ import { Events } from '@clappr/core'
8
8
  // Logger.enable('*')
9
9
  // setTracer(new LogTracer('Clips.text'))
10
10
 
11
- describe('ClipsPlugin', () => {
11
+ describe('Clips', () => {
12
12
  let core: any
13
13
  let mediaControl: any
14
14
  let clips: Clips
@@ -1,6 +1,6 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`ClipsPlugin > should render indicator 1`] = `
3
+ exports[`Clips > should render indicator 1`] = `
4
4
  "<div class="media-clip-text" id="clips-text">Introduction</div><svg width="0" height="0">
5
5
  <defs>
6
6
  <clipPath id="myClip">
@@ -1,14 +1,14 @@
1
- import { Core, Events, Playback, UICorePlugin, template } from '@clappr/core'
1
+ import { Events, Playback, UICorePlugin, template } from '@clappr/core'
2
2
  import assert from 'assert'
3
3
 
4
4
  import { CLAPPR_VERSION } from '../../build.js'
5
5
 
6
6
  import dvrHTML from '../../../assets/dvr-controls/index.ejs'
7
7
  import '../../../assets/dvr-controls/dvr_controls.scss'
8
- import { trace } from '@gcorevideo/utils'
8
+ // import { trace } from '@gcorevideo/utils'
9
9
  import { MediaControl } from '../media-control/MediaControl.js'
10
10
 
11
- const T = 'plugins.dvr_controls'
11
+ // const T = 'plugins.dvr_controls'
12
12
 
13
13
  /**
14
14
  * `PLUGIN` that adds the DVR controls to the media control UI
@@ -63,11 +63,11 @@ export class DvrControls extends UICorePlugin {
63
63
  * @internal
64
64
  */
65
65
  override bindEvents() {
66
- this.listenTo(this.core, Events.CORE_READY, this.onCoreReady)
66
+ this.listenToOnce(this.core, Events.CORE_READY, this.onCoreReady)
67
67
  this.listenTo(
68
68
  this.core,
69
69
  Events.CORE_ACTIVE_CONTAINER_CHANGED,
70
- this.bindContainerEvents,
70
+ this.onActiveContainerChanged,
71
71
  )
72
72
  }
73
73
 
@@ -75,21 +75,19 @@ export class DvrControls extends UICorePlugin {
75
75
  const mediaControl = this.core.getPlugin('media_control')
76
76
  assert(mediaControl, 'media_control plugin is required')
77
77
 
78
- this.listenTo(
79
- mediaControl,
80
- Events.MEDIACONTROL_RENDERED,
81
- this.render,
82
- )
83
- // MediaControl has been rendered
84
- this.render()
78
+ this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.mount)
85
79
  }
86
80
 
87
- private bindContainerEvents() {
88
- trace(`${T} bindContainerEvents`)
89
- this.listenToOnce(
81
+ private onActiveContainerChanged() {
82
+ this.listenTo(
90
83
  this.core.activeContainer,
91
- Events.CONTAINER_TIMEUPDATE,
92
- this.render,
84
+ Events.CONTAINER_LOADEDMETADATA,
85
+ this.onMetadataLoaded,
86
+ )
87
+ this.listenTo(
88
+ this.core.activeContainer,
89
+ Events.CONTAINER_PLAYBACKDVRSTATECHANGED,
90
+ this.onDvrStateChanged,
93
91
  )
94
92
  }
95
93
 
@@ -101,36 +99,52 @@ export class DvrControls extends UICorePlugin {
101
99
  container.seek(container.getDuration())
102
100
  }
103
101
 
104
- private shouldRender() {
105
- return this.core.getPlaybackType() === Playback.LIVE
106
- }
107
-
108
102
  /**
109
103
  * @internal
110
104
  */
111
105
  override render() {
112
- trace(`${T} render`, {
113
- dvrEnabled: this.core.activePlayback?.dvrEnabled,
114
- playbackType: this.core.getPlaybackType(),
115
- })
116
- const mediaControl = this.core.getPlugin('media_control') as MediaControl
117
- if (!mediaControl) {
118
- return this
119
- }
120
- if (!this.shouldRender()) {
121
- return this
122
- }
123
-
124
- mediaControl.toggleElement('duration', false)
125
- mediaControl.toggleElement('position', false)
126
-
127
106
  this.$el.html(
128
107
  DvrControls.template({
129
108
  i18n: this.core.i18n,
130
109
  }),
131
110
  )
132
- mediaControl.putElement('dvr', this.$el)
133
111
 
134
112
  return this
135
113
  }
114
+
115
+ private onMediacontrolRendered() {
116
+ this.render()
117
+ }
118
+
119
+ private onMetadataLoaded() {
120
+ this.mount()
121
+ this.toggleState(this.core.activeContainer.isDvrInUse())
122
+ }
123
+
124
+ private mount() {
125
+ // TODO move mount point management logic to MediaControl
126
+ if (this.core.getPlaybackType() !== Playback.LIVE) {
127
+ return
128
+ }
129
+ const mediaControl = this.core.getPlugin('media_control') as MediaControl
130
+ assert(mediaControl, 'media_control plugin is required')
131
+ // TODO -> to MediaControl
132
+ mediaControl.toggleElement('duration', false)
133
+ mediaControl.toggleElement('position', false)
134
+ mediaControl.mount('dvr', this.$el)
135
+ }
136
+
137
+ private onDvrStateChanged(dvrInUse: boolean) {
138
+ this.toggleState(dvrInUse)
139
+ }
140
+
141
+ private toggleState(dvrInUse: boolean) {
142
+ if (dvrInUse) {
143
+ this.$el.find('#media-control-back-to-live').show()
144
+ this.$el.find('#media-control-live').hide()
145
+ } else {
146
+ this.$el.find('#media-control-back-to-live').hide()
147
+ this.$el.find('#media-control-live').show()
148
+ }
149
+ }
136
150
  }