@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.
- package/assets/media-control/container.scss +2 -3
- package/assets/poster/poster.ejs +3 -1
- package/assets/poster/poster.scss +3 -3
- package/assets/style/main.scss +1 -1
- package/assets/thumbnails/scrub-thumbnails.ejs +5 -10
- package/assets/thumbnails/style.scss +4 -5
- package/dist/core.js +1 -1
- package/dist/index.css +533 -532
- package/dist/index.js +273 -377
- package/dist/player.d.ts +63 -33
- package/docs/api/{player.seektime.bindevents.md → player.clapprstats.clearmetrics.md} +3 -3
- package/docs/api/player.clapprstats.md +14 -0
- package/docs/api/player.extendedevents.md +14 -0
- package/docs/api/player.md +13 -2
- package/docs/api/player.seektime.attributes.md +0 -1
- package/docs/api/player.seektime.md +6 -197
- package/docs/api/{player.seektime.render.md → player.seektimesettings.md} +7 -7
- package/docs/api/player.skiptime.md +3 -184
- package/lib/plugins/clips/Clips.d.ts +7 -0
- package/lib/plugins/clips/Clips.d.ts.map +1 -1
- package/lib/plugins/clips/Clips.js +8 -0
- package/lib/plugins/media-control/MediaControl.d.ts +1 -7
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +9 -18
- package/lib/plugins/poster/Poster.d.ts +24 -14
- package/lib/plugins/poster/Poster.d.ts.map +1 -1
- package/lib/plugins/poster/Poster.js +67 -97
- package/lib/plugins/thumbnails/Thumbnails.d.ts +36 -33
- package/lib/plugins/thumbnails/Thumbnails.d.ts.map +1 -1
- package/lib/plugins/thumbnails/Thumbnails.js +174 -259
- package/lib/plugins/thumbnails/utils.d.ts +5 -0
- package/lib/plugins/thumbnails/utils.d.ts.map +1 -0
- package/lib/plugins/thumbnails/utils.js +12 -0
- package/lib/testUtils.d.ts +13 -39
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +15 -67
- package/package.json +2 -1
- package/src/plugins/clips/Clips.ts +10 -1
- package/src/plugins/media-control/MediaControl.ts +10 -21
- package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +1 -1
- package/src/plugins/poster/Poster.ts +91 -110
- package/src/plugins/poster/__tests__/Poster.test.ts +119 -0
- package/src/plugins/poster/__tests__/__snapshots__/Poster.test.ts.snap +8 -0
- package/src/plugins/source-controller/__tests__/SourceController.test.ts +1 -2
- package/src/plugins/thumbnails/Thumbnails.ts +228 -330
- package/src/plugins/thumbnails/__tests__/Thumbnails.test.ts +72 -0
- package/src/plugins/thumbnails/__tests__/__snapshots__/Thumbnails.test.ts.snap +10 -0
- package/src/plugins/thumbnails/utils.ts +12 -0
- package/src/testUtils.ts +15 -88
- package/temp/player.api.json +295 -829
- package/tsconfig.tsbuildinfo +1 -1
- package/docs/api/player.seektime.durationshown.md +0 -14
- package/docs/api/player.seektime.getseektime.md +0 -20
- package/docs/api/player.seektime.islivestreamwithdvr.md +0 -14
- package/docs/api/player.seektime.mediacontrol.md +0 -14
- package/docs/api/player.seektime.mediacontrolcontainer.md +0 -14
- package/docs/api/player.seektime.shouldbevisible.md +0 -18
- package/docs/api/player.seektime.template.md +0 -14
- package/docs/api/player.seektime.update.md +0 -18
- package/docs/api/player.skiptime.attributes.md +0 -17
- package/docs/api/player.skiptime.bindevents.md +0 -18
- package/docs/api/player.skiptime.events.md +0 -18
- package/docs/api/player.skiptime.handlerewindclicks.md +0 -18
- package/docs/api/player.skiptime.render.md +0 -18
- package/docs/api/player.skiptime.setback.md +0 -18
- package/docs/api/player.skiptime.setforward.md +0 -18
- package/docs/api/player.skiptime.setmidclick.md +0 -18
- package/docs/api/player.skiptime.template.md +0 -14
- 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("https://example.com/sprite.png"); background-size: 600px 900px; background-position: -100px -100px;"></div><div class="thumbnail-container" style="width: 100px; height: 100px; background-image: url("https://example.com/sprite.png"); 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 { $,
|
|
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()
|