@gcorevideo/player 2.22.30 → 2.23.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 (69) hide show
  1. package/assets/media-control/container.scss +2 -3
  2. package/assets/poster/poster.ejs +3 -1
  3. package/assets/poster/poster.scss +3 -3
  4. package/assets/style/main.scss +1 -1
  5. package/assets/thumbnails/scrub-thumbnails.ejs +5 -10
  6. package/assets/thumbnails/style.scss +4 -5
  7. package/dist/core.js +1 -1
  8. package/dist/index.css +533 -532
  9. package/dist/index.js +273 -377
  10. package/dist/player.d.ts +63 -33
  11. package/docs/api/{player.seektime.bindevents.md → player.clapprstats.clearmetrics.md} +3 -3
  12. package/docs/api/player.clapprstats.md +14 -0
  13. package/docs/api/player.extendedevents.md +14 -0
  14. package/docs/api/player.md +13 -2
  15. package/docs/api/player.seektime.attributes.md +0 -1
  16. package/docs/api/player.seektime.md +6 -197
  17. package/docs/api/{player.seektime.render.md → player.seektimesettings.md} +7 -7
  18. package/docs/api/player.skiptime.md +3 -184
  19. package/lib/plugins/clips/Clips.d.ts +7 -0
  20. package/lib/plugins/clips/Clips.d.ts.map +1 -1
  21. package/lib/plugins/clips/Clips.js +8 -0
  22. package/lib/plugins/media-control/MediaControl.d.ts +1 -7
  23. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  24. package/lib/plugins/media-control/MediaControl.js +9 -18
  25. package/lib/plugins/poster/Poster.d.ts +24 -14
  26. package/lib/plugins/poster/Poster.d.ts.map +1 -1
  27. package/lib/plugins/poster/Poster.js +67 -97
  28. package/lib/plugins/thumbnails/Thumbnails.d.ts +36 -33
  29. package/lib/plugins/thumbnails/Thumbnails.d.ts.map +1 -1
  30. package/lib/plugins/thumbnails/Thumbnails.js +174 -259
  31. package/lib/plugins/thumbnails/utils.d.ts +5 -0
  32. package/lib/plugins/thumbnails/utils.d.ts.map +1 -0
  33. package/lib/plugins/thumbnails/utils.js +12 -0
  34. package/lib/testUtils.d.ts +13 -39
  35. package/lib/testUtils.d.ts.map +1 -1
  36. package/lib/testUtils.js +15 -67
  37. package/package.json +2 -1
  38. package/src/plugins/clips/Clips.ts +10 -1
  39. package/src/plugins/media-control/MediaControl.ts +10 -21
  40. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +1 -1
  41. package/src/plugins/poster/Poster.ts +91 -110
  42. package/src/plugins/poster/__tests__/Poster.test.ts +119 -0
  43. package/src/plugins/poster/__tests__/__snapshots__/Poster.test.ts.snap +8 -0
  44. package/src/plugins/source-controller/__tests__/SourceController.test.ts +1 -2
  45. package/src/plugins/thumbnails/Thumbnails.ts +228 -330
  46. package/src/plugins/thumbnails/__tests__/Thumbnails.test.ts +72 -0
  47. package/src/plugins/thumbnails/__tests__/__snapshots__/Thumbnails.test.ts.snap +10 -0
  48. package/src/plugins/thumbnails/utils.ts +12 -0
  49. package/src/testUtils.ts +15 -88
  50. package/temp/player.api.json +295 -829
  51. package/tsconfig.tsbuildinfo +1 -1
  52. package/docs/api/player.seektime.durationshown.md +0 -14
  53. package/docs/api/player.seektime.getseektime.md +0 -20
  54. package/docs/api/player.seektime.islivestreamwithdvr.md +0 -14
  55. package/docs/api/player.seektime.mediacontrol.md +0 -14
  56. package/docs/api/player.seektime.mediacontrolcontainer.md +0 -14
  57. package/docs/api/player.seektime.shouldbevisible.md +0 -18
  58. package/docs/api/player.seektime.template.md +0 -14
  59. package/docs/api/player.seektime.update.md +0 -18
  60. package/docs/api/player.skiptime.attributes.md +0 -17
  61. package/docs/api/player.skiptime.bindevents.md +0 -18
  62. package/docs/api/player.skiptime.events.md +0 -18
  63. package/docs/api/player.skiptime.handlerewindclicks.md +0 -18
  64. package/docs/api/player.skiptime.render.md +0 -18
  65. package/docs/api/player.skiptime.setback.md +0 -18
  66. package/docs/api/player.skiptime.setforward.md +0 -18
  67. package/docs/api/player.skiptime.setmidclick.md +0 -18
  68. package/docs/api/player.skiptime.template.md +0 -14
  69. package/docs/api/player.skiptime.togglefullscreen.md +0 -18
@@ -0,0 +1,72 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
2
+
3
+ import { Events } from '@clappr/core'
4
+
5
+
6
+ import { createMockCore, createMockMediaControl } from '../../../testUtils'
7
+
8
+ import { Thumbnails } from '../Thumbnails'
9
+ import { loadImageDimensions } from '../utils'
10
+
11
+ import { Logger, LogTracer, setTracer } from '@gcorevideo/utils'
12
+
13
+ // Logger.enable('*')
14
+ // setTracer(new LogTracer('Thumbnails.test'))
15
+
16
+ vi.mock('../utils.ts', () => ({
17
+ loadImageDimensions: vi.fn().mockResolvedValue({ width: 600, height: 900 }),
18
+ }))
19
+
20
+ describe('Thumbnails', () => {
21
+ let core: any
22
+ let mediaControl: any
23
+ let thumbnails: Thumbnails
24
+ beforeEach(() => {
25
+ core = createMockCore({
26
+ thumbnails: {
27
+ backdropHeight: 100,
28
+ spotlightHeight: 100,
29
+ sprite: 'https://example.com/sprite.png',
30
+ vtt: `
31
+ 1
32
+ 00:00:00.000 --> 00:00:01.000
33
+ sprite.png#xywh=100,100,100,100
34
+
35
+ 2
36
+ 00:00:01.000 --> 00:00:02.000
37
+ sprite.png#xywh=200,200,100,100
38
+ `,
39
+ },
40
+ })
41
+ mediaControl = createMockMediaControl(core)
42
+ core.getPlugin.mockImplementation((name) => {
43
+ switch (name) {
44
+ case 'media_control':
45
+ return mediaControl
46
+ }
47
+ });
48
+ thumbnails = new Thumbnails(core)
49
+ })
50
+ describe('loading', () => {
51
+ beforeEach(async () => {
52
+ core.emit(Events.CORE_READY)
53
+ await new Promise(resolve => setTimeout(resolve, 1))
54
+ })
55
+ it('should render', () => {
56
+ expect(thumbnails.$el.html()).toMatchSnapshot()
57
+ })
58
+ it('should mount to media controls', () => {
59
+ expect(mediaControl.$el.find('.scrub-thumbnails')).toHaveLength(1)
60
+ })
61
+ it('should load image dimensions', () => {
62
+ expect(loadImageDimensions).toHaveBeenCalledWith('https://example.com/sprite.png')
63
+ })
64
+ it('should parse sprite sheet and create thumbnails', () => {
65
+ const thumbs = mediaControl.$el.find('#thumbnails-carousel .thumbnail-container')
66
+ expect(thumbs).toHaveLength(2)
67
+ })
68
+ it('should hide', () => {
69
+ expect(thumbnails.$el.hasClass('hidden')).toBe(true)
70
+ })
71
+ })
72
+ })
@@ -0,0 +1,10 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`Thumbnails > loading > should render 1`] = `
4
+ "<div class="thumbnails-text" id="thumbnails-text"></div>
5
+ <div class="backdrop" id="thumbnails-backdrop" style="height: 100px;">
6
+ <div class="carousel" id="thumbnails-carousel"><div class="thumbnail-container" style="width: 100px; height: 100px; background-image: url(&quot;https://example.com/sprite.png&quot;); background-size: 600px 900px; background-position: -100px -100px;"></div><div class="thumbnail-container" style="width: 100px; height: 100px; background-image: url(&quot;https://example.com/sprite.png&quot;); background-size: 600px 900px; background-position: -200px -200px;"></div></div>
7
+ </div>
8
+ <div class="spotlight" id="thumbnails-spotlight" style="height: 100px;"></div>
9
+ "
10
+ `;
@@ -0,0 +1,12 @@
1
+ export function loadImageDimensions(url: string): Promise<{ width: number, height: number }> {
2
+ return new Promise((resolve, reject) => {
3
+ const img = new Image()
4
+ img.src = url
5
+ img.onload = () => {
6
+ resolve({ width: img.width, height: img.height })
7
+ }
8
+ img.onerror = () => {
9
+ reject(new Error('Failed to load image'))
10
+ }
11
+ })
12
+ }
package/src/testUtils.ts CHANGED
@@ -1,86 +1,6 @@
1
- import { $, Playback, UICorePlugin } from '@clappr/core'
1
+ import { $, UICorePlugin } from '@clappr/core'
2
2
  import Events from 'eventemitter3'
3
3
  import { vi } from 'vitest'
4
- /**
5
- * @internal
6
- * @deprecated
7
- * TODO use createMockPlayback() instead
8
- */
9
- export class _MockPlayback extends Events {
10
- constructor(
11
- protected options: any,
12
- readonly i18n: any,
13
- protected playerError?: any,
14
- ) {
15
- super()
16
- }
17
-
18
- get name() {
19
- return 'mock'
20
- }
21
-
22
- consent() {}
23
-
24
- play() {}
25
-
26
- pause() {}
27
-
28
- stop() {}
29
-
30
- destroy() {}
31
-
32
- seek() {}
33
-
34
- seekPercentage() {}
35
-
36
- getDuration() {
37
- return 100
38
- }
39
-
40
- enterPiP() {}
41
-
42
- exitPiP() {}
43
-
44
- getPlaybackType() {
45
- return Playback.LIVE
46
- }
47
-
48
- getStartTimeOffset() {
49
- return 0
50
- }
51
-
52
- getCurrentTime() {
53
- return 0
54
- }
55
-
56
- isHighDefinitionInUse() {
57
- return false
58
- }
59
-
60
- mute() {}
61
-
62
- unmute() {}
63
-
64
- volume() {}
65
-
66
- configure() {}
67
-
68
- attemptAutoPlay() {
69
- return true
70
- }
71
-
72
- canAutoPlay() {
73
- return true
74
- }
75
-
76
- onResize() {
77
- return true
78
- }
79
-
80
- trigger(event: string, ...args: any[]) {
81
- this.emit(event, ...args)
82
- }
83
- }
84
4
 
85
5
  export function createMockCore(
86
6
  options: Record<string, unknown> = {},
@@ -129,11 +49,12 @@ export function createMockPlayback(name = 'mock') {
129
49
  el: document.createElement('video'),
130
50
  dvrEnabled: false,
131
51
  dvrInUse: false,
52
+ isAudioOnly: false,
132
53
  levels: [],
133
- consent() {},
134
- play() {},
135
- pause() {},
136
- stop() {},
54
+ consent: vi.fn(),
55
+ play: vi.fn(),
56
+ pause: vi.fn(),
57
+ stop: vi.fn(),
137
58
  destroy: vi.fn(),
138
59
  seek: vi.fn(),
139
60
  seekPercentage: vi.fn(),
@@ -166,13 +87,20 @@ export function createMockContainer(
166
87
  return Object.assign(emitter, {
167
88
  el,
168
89
  playback,
169
- options,
90
+ options: {
91
+ ...options,
92
+ },
170
93
  $el: $(el),
94
+ disableMediaControl: vi.fn(),
95
+ enableMediaControl: vi.fn(),
96
+ enterPiP: vi.fn(),
97
+ exitPiP: vi.fn(),
171
98
  getDuration: vi.fn().mockReturnValue(0),
172
99
  getPlugin: vi.fn(),
173
100
  getPlaybackType: vi.fn(),
174
101
  isDvrInUse: vi.fn().mockReturnValue(false),
175
102
  isDvrEnabled: vi.fn().mockReturnValue(false),
103
+ isHighDefinitionInUse: vi.fn().mockReturnValue(false),
176
104
  isPlaying: vi.fn().mockReturnValue(false),
177
105
  play: vi.fn(),
178
106
  seek: vi.fn(),
@@ -184,14 +112,13 @@ export function createMockContainer(
184
112
 
185
113
  export function createMockMediaControl(core: any) {
186
114
  const mediaControl = new UICorePlugin(core)
115
+ // TODO <div class="media-control-layer">
187
116
  mediaControl.$el.html(
188
117
  `<div class="media-control-left-panel" data-media-control></div>
189
118
  <div class="media-control-right-panel" data-media-control></div>
190
119
  <div class="media-control-center-panel" data-media-control></div>`,
191
120
  )
192
121
  // @ts-ignore
193
- mediaControl.putElement = vi.fn()
194
- // @ts-ignore
195
122
  mediaControl.mount = vi.fn()
196
123
  // @ts-ignore
197
124
  mediaControl.toggleElement = vi.fn()