unified-video-framework 1.4.151 → 1.4.154
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/package.json +1 -1
- package/packages/core/dist/chapter-manager.d.ts +39 -0
- package/packages/core/dist/chapter-manager.d.ts.map +1 -0
- package/packages/core/dist/chapter-manager.js +173 -0
- package/packages/core/dist/chapter-manager.js.map +1 -0
- package/packages/core/dist/index.d.ts +2 -0
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +1 -0
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/interfaces/IVideoPlayer.d.ts +10 -0
- package/packages/core/dist/interfaces/IVideoPlayer.d.ts.map +1 -1
- package/packages/core/dist/interfaces.d.ts +33 -1
- package/packages/core/dist/interfaces.d.ts.map +1 -1
- package/packages/core/src/chapter-manager.ts +290 -0
- package/packages/core/src/index.ts +4 -0
- package/packages/core/src/interfaces/IVideoPlayer.ts +11 -0
- package/packages/core/src/interfaces.ts +47 -1
- package/packages/web/dist/WebPlayer.d.ts +24 -1
- package/packages/web/dist/WebPlayer.d.ts.map +1 -1
- package/packages/web/dist/WebPlayer.js +472 -1
- package/packages/web/dist/WebPlayer.js.map +1 -1
- package/packages/web/dist/chapters/ChapterManager.d.ts +38 -0
- package/packages/web/dist/chapters/ChapterManager.d.ts.map +1 -0
- package/packages/web/dist/chapters/ChapterManager.js +291 -0
- package/packages/web/dist/chapters/ChapterManager.js.map +1 -0
- package/packages/web/dist/chapters/SkipButtonController.d.ts +31 -0
- package/packages/web/dist/chapters/SkipButtonController.d.ts.map +1 -0
- package/packages/web/dist/chapters/SkipButtonController.js +213 -0
- package/packages/web/dist/chapters/SkipButtonController.js.map +1 -0
- package/packages/web/dist/chapters/UserPreferencesManager.d.ts +25 -0
- package/packages/web/dist/chapters/UserPreferencesManager.d.ts.map +1 -0
- package/packages/web/dist/chapters/UserPreferencesManager.js +232 -0
- package/packages/web/dist/chapters/UserPreferencesManager.js.map +1 -0
- package/packages/web/dist/chapters/index.d.ts +12 -0
- package/packages/web/dist/chapters/index.d.ts.map +1 -0
- package/packages/web/dist/chapters/index.js +8 -0
- package/packages/web/dist/chapters/index.js.map +1 -0
- package/packages/web/dist/chapters/types/ChapterTypes.d.ts +98 -0
- package/packages/web/dist/chapters/types/ChapterTypes.d.ts.map +1 -0
- package/packages/web/dist/chapters/types/ChapterTypes.js +31 -0
- package/packages/web/dist/chapters/types/ChapterTypes.js.map +1 -0
- package/packages/web/dist/index.d.ts +1 -1
- package/packages/web/dist/index.d.ts.map +1 -1
- package/packages/web/dist/index.js +1 -1
- package/packages/web/dist/index.js.map +1 -1
- package/packages/web/dist/react/WebPlayerView.d.ts +2 -2
- package/packages/web/dist/react/WebPlayerView.d.ts.map +1 -1
- package/packages/web/dist/react/WebPlayerViewWithEPG.d.ts +2 -2
- package/packages/web/dist/react/WebPlayerViewWithEPG.d.ts.map +1 -1
- package/packages/web/dist/react/components/ChapterProgress.d.ts +22 -0
- package/packages/web/dist/react/components/ChapterProgress.d.ts.map +1 -0
- package/packages/web/dist/react/components/ChapterProgress.js +101 -0
- package/packages/web/dist/react/components/ChapterProgress.js.map +1 -0
- package/packages/web/dist/react/components/SkipButton.d.ts +18 -0
- package/packages/web/dist/react/components/SkipButton.d.ts.map +1 -0
- package/packages/web/dist/react/components/SkipButton.js +156 -0
- package/packages/web/dist/react/components/SkipButton.js.map +1 -0
- package/packages/web/dist/react/hooks/useChapters.d.ts +29 -0
- package/packages/web/dist/react/hooks/useChapters.d.ts.map +1 -0
- package/packages/web/dist/react/hooks/useChapters.js +158 -0
- package/packages/web/dist/react/hooks/useChapters.js.map +1 -0
- package/packages/web/package.json +0 -3
- package/packages/web/src/SecureVideoPlayer.ts +1 -1
- package/packages/web/src/WebPlayer.ts +587 -3
- package/packages/web/src/__tests__/WebPlayer.test.ts +1 -1
- package/packages/web/src/__tests__/epg-integration.test.ts +1 -1
- package/packages/web/src/chapters/ChapterManager.ts +464 -0
- package/packages/web/src/chapters/SkipButtonController.ts +353 -0
- package/packages/web/src/chapters/UserPreferencesManager.ts +324 -0
- package/packages/web/src/chapters/index.ts +34 -0
- package/packages/web/src/chapters/types/ChapterTypes.ts +236 -0
- package/packages/web/src/index.ts +1 -1
- package/packages/web/src/react/EPG.ts +1 -1
- package/packages/web/src/react/WebPlayerView.tsx +2 -2
- package/packages/web/src/react/WebPlayerViewWithEPG.tsx +3 -3
- package/packages/web/src/react/components/ChapterProgress.tsx +207 -0
- package/packages/web/src/react/components/EPGNavigationControls.tsx +1 -1
- package/packages/web/src/react/components/EPGOverlay-improved-positioning.tsx +1 -1
- package/packages/web/src/react/components/EPGOverlay.tsx +1 -1
- package/packages/web/src/react/components/EPGProgramGrid.tsx +1 -1
- package/packages/web/src/react/components/EPGTimelineHeader.tsx +1 -1
- package/packages/web/src/react/components/SkipButton.tsx +278 -0
- package/packages/web/src/react/hooks/useChapters.ts +308 -0
- package/packages/web/src/react/types/EPGTypes.ts +1 -1
- package/packages/web/src/react/utils/EPGUtils.ts +1 -1
- package/packages/web/src/test/epg-test.ts +1 -1
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { Chapter, ChapterSegment, ChapterConfig, EventHandler } from './interfaces';
|
|
2
|
+
|
|
3
|
+
export interface ChapterManagerEvents {
|
|
4
|
+
chapterchange: Chapter | null;
|
|
5
|
+
segmententered: ChapterSegment;
|
|
6
|
+
segmentexited: ChapterSegment;
|
|
7
|
+
segmentskipped: ChapterSegment;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class ChapterManager {
|
|
11
|
+
private config: ChapterConfig;
|
|
12
|
+
private chapters: Chapter[] = [];
|
|
13
|
+
private segments: ChapterSegment[] = [];
|
|
14
|
+
private currentChapter: Chapter | null = null;
|
|
15
|
+
private activeSegments: Set<string> = new Set();
|
|
16
|
+
private lastProcessedTime: number = -1;
|
|
17
|
+
private eventHandlers: Map<keyof ChapterManagerEvents, EventHandler[]> = new Map();
|
|
18
|
+
|
|
19
|
+
constructor(config: ChapterConfig = {}) {
|
|
20
|
+
this.config = { ...config };
|
|
21
|
+
this.chapters = config.chapters || [];
|
|
22
|
+
this.segments = config.segments || [];
|
|
23
|
+
|
|
24
|
+
// Initialize event handler arrays
|
|
25
|
+
this.eventHandlers.set('chapterchange', []);
|
|
26
|
+
this.eventHandlers.set('segmententered', []);
|
|
27
|
+
this.eventHandlers.set('segmentexited', []);
|
|
28
|
+
this.eventHandlers.set('segmentskipped', []);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Update the configuration
|
|
33
|
+
*/
|
|
34
|
+
updateConfig(config: ChapterConfig): void {
|
|
35
|
+
this.config = { ...this.config, ...config };
|
|
36
|
+
this.chapters = config.chapters || this.chapters;
|
|
37
|
+
this.segments = config.segments || this.segments;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Load chapter data from a URL
|
|
42
|
+
*/
|
|
43
|
+
async loadChapterData(url: string): Promise<void> {
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(url);
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new Error(`Failed to fetch chapter data: ${response.status}`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const data = await response.json();
|
|
51
|
+
if (data.chapters) {
|
|
52
|
+
this.chapters = data.chapters;
|
|
53
|
+
}
|
|
54
|
+
if (data.segments) {
|
|
55
|
+
this.segments = data.segments;
|
|
56
|
+
}
|
|
57
|
+
} catch (error) {
|
|
58
|
+
console.error('Error loading chapter data:', error);
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Initialize the chapter manager
|
|
65
|
+
*/
|
|
66
|
+
async initialize(): Promise<void> {
|
|
67
|
+
if (this.config.dataUrl) {
|
|
68
|
+
await this.loadChapterData(this.config.dataUrl);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Sort chapters and segments by start time
|
|
72
|
+
this.chapters.sort((a, b) => a.startTime - b.startTime);
|
|
73
|
+
this.segments.sort((a, b) => a.startTime - b.startTime);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Process current time and handle chapter/segment changes
|
|
78
|
+
*/
|
|
79
|
+
processTimeUpdate(currentTime: number): void {
|
|
80
|
+
if (Math.abs(currentTime - this.lastProcessedTime) < 0.1) {
|
|
81
|
+
return; // Skip if time hasn't changed significantly
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
this.lastProcessedTime = currentTime;
|
|
85
|
+
this.processChapterChange(currentTime);
|
|
86
|
+
this.processSegments(currentTime);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Process chapter changes
|
|
91
|
+
*/
|
|
92
|
+
private processChapterChange(currentTime: number): void {
|
|
93
|
+
const newChapter = this.getCurrentChapter(currentTime);
|
|
94
|
+
|
|
95
|
+
if (newChapter !== this.currentChapter) {
|
|
96
|
+
this.currentChapter = newChapter;
|
|
97
|
+
this.emit('chapterchange', newChapter);
|
|
98
|
+
|
|
99
|
+
if (this.config.onChapterChange) {
|
|
100
|
+
this.config.onChapterChange(newChapter);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Process segment enter/exit events
|
|
107
|
+
*/
|
|
108
|
+
private processSegments(currentTime: number): void {
|
|
109
|
+
const currentSegments = this.segments.filter(
|
|
110
|
+
segment => currentTime >= segment.startTime && currentTime <= segment.endTime
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
// Check for newly entered segments
|
|
114
|
+
for (const segment of currentSegments) {
|
|
115
|
+
if (!this.activeSegments.has(segment.id)) {
|
|
116
|
+
this.activeSegments.add(segment.id);
|
|
117
|
+
this.emit('segmententered', segment);
|
|
118
|
+
|
|
119
|
+
if (this.config.onSegmentEntered) {
|
|
120
|
+
this.config.onSegmentEntered(segment);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Auto-skip if enabled and segment has skip action
|
|
124
|
+
if (this.config.autoSkip && segment.action === 'skip') {
|
|
125
|
+
this.skipSegment(segment);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Check for exited segments
|
|
131
|
+
const currentSegmentIds = new Set(currentSegments.map(s => s.id));
|
|
132
|
+
for (const activeSegmentId of this.activeSegments) {
|
|
133
|
+
if (!currentSegmentIds.has(activeSegmentId)) {
|
|
134
|
+
const segment = this.segments.find(s => s.id === activeSegmentId);
|
|
135
|
+
if (segment) {
|
|
136
|
+
this.activeSegments.delete(activeSegmentId);
|
|
137
|
+
this.emit('segmentexited', segment);
|
|
138
|
+
|
|
139
|
+
if (this.config.onSegmentExited) {
|
|
140
|
+
this.config.onSegmentExited(segment);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Get the current chapter based on time
|
|
149
|
+
*/
|
|
150
|
+
getCurrentChapter(currentTime: number): Chapter | null {
|
|
151
|
+
return this.chapters.find(
|
|
152
|
+
chapter => currentTime >= chapter.startTime && currentTime <= chapter.endTime
|
|
153
|
+
) || null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Get all chapters
|
|
158
|
+
*/
|
|
159
|
+
getChapters(): Chapter[] {
|
|
160
|
+
return [...this.chapters];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Get all segments
|
|
165
|
+
*/
|
|
166
|
+
getSegments(): ChapterSegment[] {
|
|
167
|
+
return [...this.segments];
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Get segments at a specific time
|
|
172
|
+
*/
|
|
173
|
+
getSegmentsAtTime(currentTime: number): ChapterSegment[] {
|
|
174
|
+
return this.segments.filter(
|
|
175
|
+
segment => currentTime >= segment.startTime && currentTime <= segment.endTime
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Skip a segment
|
|
181
|
+
*/
|
|
182
|
+
skipSegment(segment: ChapterSegment): void {
|
|
183
|
+
this.emit('segmentskipped', segment);
|
|
184
|
+
|
|
185
|
+
if (this.config.onSegmentSkipped) {
|
|
186
|
+
this.config.onSegmentSkipped(segment);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Seek to a specific chapter
|
|
192
|
+
*/
|
|
193
|
+
seekToChapter(chapterId: string): Chapter | null {
|
|
194
|
+
const chapter = this.chapters.find(c => c.id === chapterId);
|
|
195
|
+
if (chapter) {
|
|
196
|
+
// The actual seeking will be handled by the player
|
|
197
|
+
// This method returns the chapter to seek to
|
|
198
|
+
return chapter;
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Get next chapter
|
|
205
|
+
*/
|
|
206
|
+
getNextChapter(currentTime: number): Chapter | null {
|
|
207
|
+
return this.chapters.find(chapter => chapter.startTime > currentTime) || null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Get previous chapter
|
|
212
|
+
*/
|
|
213
|
+
getPreviousChapter(currentTime: number): Chapter | null {
|
|
214
|
+
const previousChapters = this.chapters
|
|
215
|
+
.filter(chapter => chapter.startTime < currentTime)
|
|
216
|
+
.sort((a, b) => b.startTime - a.startTime);
|
|
217
|
+
|
|
218
|
+
return previousChapters[0] || null;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Add event listener
|
|
223
|
+
*/
|
|
224
|
+
on<K extends keyof ChapterManagerEvents>(event: K, handler: EventHandler): void {
|
|
225
|
+
const handlers = this.eventHandlers.get(event) || [];
|
|
226
|
+
handlers.push(handler);
|
|
227
|
+
this.eventHandlers.set(event, handlers);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Remove event listener
|
|
232
|
+
*/
|
|
233
|
+
off<K extends keyof ChapterManagerEvents>(event: K, handler?: EventHandler): void {
|
|
234
|
+
const handlers = this.eventHandlers.get(event) || [];
|
|
235
|
+
if (handler) {
|
|
236
|
+
const index = handlers.indexOf(handler);
|
|
237
|
+
if (index > -1) {
|
|
238
|
+
handlers.splice(index, 1);
|
|
239
|
+
}
|
|
240
|
+
} else {
|
|
241
|
+
handlers.length = 0;
|
|
242
|
+
}
|
|
243
|
+
this.eventHandlers.set(event, handlers);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Emit an event
|
|
248
|
+
*/
|
|
249
|
+
private emit<K extends keyof ChapterManagerEvents>(event: K, data: ChapterManagerEvents[K]): void {
|
|
250
|
+
const handlers = this.eventHandlers.get(event) || [];
|
|
251
|
+
handlers.forEach(handler => {
|
|
252
|
+
try {
|
|
253
|
+
handler(data);
|
|
254
|
+
} catch (error) {
|
|
255
|
+
console.error(`Error in chapter manager event handler for ${event}:`, error);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Reset the chapter manager state
|
|
262
|
+
*/
|
|
263
|
+
reset(): void {
|
|
264
|
+
this.currentChapter = null;
|
|
265
|
+
this.activeSegments.clear();
|
|
266
|
+
this.lastProcessedTime = -1;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Destroy the chapter manager and clean up
|
|
271
|
+
*/
|
|
272
|
+
destroy(): void {
|
|
273
|
+
this.reset();
|
|
274
|
+
this.eventHandlers.clear();
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Get the current chapter
|
|
279
|
+
*/
|
|
280
|
+
getCurrentChapterInfo(): Chapter | null {
|
|
281
|
+
return this.currentChapter;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Check if chapter functionality is enabled
|
|
286
|
+
*/
|
|
287
|
+
isEnabled(): boolean {
|
|
288
|
+
return this.config.enabled !== false;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
@@ -16,5 +16,9 @@ export type { Platform } from './VideoPlayerFactory';
|
|
|
16
16
|
// Export utilities
|
|
17
17
|
export { EventEmitter } from './utils/EventEmitter';
|
|
18
18
|
|
|
19
|
+
// Export chapter manager
|
|
20
|
+
export { ChapterManager } from './chapter-manager';
|
|
21
|
+
export type { ChapterManagerEvents } from './chapter-manager';
|
|
22
|
+
|
|
19
23
|
// Export version
|
|
20
24
|
export const VERSION = '1.0.0';
|
|
@@ -80,6 +80,17 @@ export interface PlayerEvents {
|
|
|
80
80
|
epgDataSet?: (data?: any) => void;
|
|
81
81
|
// Framework branding events
|
|
82
82
|
frameworkBrandingClick?: (data: { timestamp: number; url: string; userAgent: string }) => void;
|
|
83
|
+
// Chapter events
|
|
84
|
+
chapterchange?: (chapter: any) => void;
|
|
85
|
+
segmententered?: (segment: any) => void;
|
|
86
|
+
segmentexited?: (segment: any) => void;
|
|
87
|
+
segmentskipped?: (segment: any) => void;
|
|
88
|
+
chapterSegmentEntered?: (data: any) => void;
|
|
89
|
+
chapterSegmentSkipped?: (data: any) => void;
|
|
90
|
+
chapterSkipButtonShown?: (data: any) => void;
|
|
91
|
+
chapterSkipButtonHidden?: (data: any) => void;
|
|
92
|
+
chaptersLoaded?: (data: any) => void;
|
|
93
|
+
chaptersLoadError?: (data: any) => void;
|
|
83
94
|
}
|
|
84
95
|
|
|
85
96
|
export interface PlayerError {
|
|
@@ -157,6 +157,41 @@ export interface OfflineConfig {
|
|
|
157
157
|
downloadQuality?: 'auto' | 'high' | 'medium' | 'low';
|
|
158
158
|
}
|
|
159
159
|
|
|
160
|
+
// Chapter-related interfaces
|
|
161
|
+
export interface Chapter {
|
|
162
|
+
id: string;
|
|
163
|
+
title: string;
|
|
164
|
+
startTime: number; // in seconds
|
|
165
|
+
endTime: number; // in seconds
|
|
166
|
+
thumbnail?: string;
|
|
167
|
+
description?: string;
|
|
168
|
+
metadata?: Record<string, any>;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export interface ChapterSegment {
|
|
172
|
+
id: string;
|
|
173
|
+
startTime: number; // in seconds
|
|
174
|
+
endTime: number; // in seconds
|
|
175
|
+
category?: string;
|
|
176
|
+
action?: 'skip' | 'mute' | 'warn';
|
|
177
|
+
title?: string;
|
|
178
|
+
description?: string;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface ChapterConfig {
|
|
182
|
+
enabled?: boolean;
|
|
183
|
+
chapters?: Chapter[];
|
|
184
|
+
segments?: ChapterSegment[]; // For sponsor segments, intros, etc.
|
|
185
|
+
dataUrl?: string; // URL to fetch chapter data from
|
|
186
|
+
autoSkip?: boolean; // Auto-skip segments with action: 'skip'
|
|
187
|
+
showSkipButton?: boolean; // Show skip button for segments
|
|
188
|
+
skipButtonText?: string;
|
|
189
|
+
onChapterChange?: (chapter: Chapter | null) => void;
|
|
190
|
+
onSegmentEntered?: (segment: ChapterSegment) => void;
|
|
191
|
+
onSegmentExited?: (segment: ChapterSegment) => void;
|
|
192
|
+
onSegmentSkipped?: (segment: ChapterSegment) => void;
|
|
193
|
+
}
|
|
194
|
+
|
|
160
195
|
export interface WatermarkConfig {
|
|
161
196
|
enabled?: boolean; // Enable/disable watermark (default: true)
|
|
162
197
|
text?: string; // Custom watermark text (default: "PREMIUM")
|
|
@@ -251,7 +286,17 @@ export type PlayerEvent =
|
|
|
251
286
|
| 'castStateChanged'
|
|
252
287
|
| 'adstart'
|
|
253
288
|
| 'adend'
|
|
254
|
-
| 'aderror'
|
|
289
|
+
| 'aderror'
|
|
290
|
+
| 'chapterchange'
|
|
291
|
+
| 'segmententered'
|
|
292
|
+
| 'segmentexited'
|
|
293
|
+
| 'segmentskipped'
|
|
294
|
+
| 'chapterSegmentEntered'
|
|
295
|
+
| 'chapterSegmentSkipped'
|
|
296
|
+
| 'chapterSkipButtonShown'
|
|
297
|
+
| 'chapterSkipButtonHidden'
|
|
298
|
+
| 'chaptersLoaded'
|
|
299
|
+
| 'chaptersLoadError';
|
|
255
300
|
|
|
256
301
|
export type EventHandler = (data?: any) => void;
|
|
257
302
|
|
|
@@ -446,4 +491,5 @@ export interface PlayerConfig extends VideoPlayerConfig {
|
|
|
446
491
|
freeDuration?: number;
|
|
447
492
|
paywall?: PaywallConfig;
|
|
448
493
|
volume?: number;
|
|
494
|
+
chapters?: ChapterConfig;
|
|
449
495
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { BasePlayer } from '
|
|
1
|
+
import { BasePlayer } from '../../core/src/BasePlayer';
|
|
2
|
+
import { Chapter, ChapterSegment } from '../../core/src/index';
|
|
3
|
+
import { ChapterConfig, VideoChapters, VideoSegment } from './chapters/types/ChapterTypes';
|
|
2
4
|
declare global {
|
|
3
5
|
interface Window {
|
|
4
6
|
Hls: any;
|
|
@@ -52,6 +54,9 @@ export declare class WebPlayer extends BasePlayer {
|
|
|
52
54
|
private hasTriedButtonFallback;
|
|
53
55
|
private lastUserInteraction;
|
|
54
56
|
private showTimeTooltip;
|
|
57
|
+
private chapterManager;
|
|
58
|
+
private coreChapterManager;
|
|
59
|
+
private chapterConfig;
|
|
55
60
|
private debugLog;
|
|
56
61
|
private debugError;
|
|
57
62
|
private debugWarn;
|
|
@@ -139,6 +144,24 @@ export declare class WebPlayer extends BasePlayer {
|
|
|
139
144
|
intensity?: number;
|
|
140
145
|
}): void;
|
|
141
146
|
private applyScrollbarPreferencesFromDataset;
|
|
147
|
+
private setupChapterManager;
|
|
148
|
+
private convertToChapters;
|
|
149
|
+
private convertToChapterSegments;
|
|
150
|
+
private mapSegmentAction;
|
|
151
|
+
loadChapters(chapters: VideoChapters): Promise<void>;
|
|
152
|
+
loadChaptersFromUrl(url: string): Promise<void>;
|
|
153
|
+
getCurrentSegment(): VideoSegment | null;
|
|
154
|
+
skipToSegment(segmentId: string): void;
|
|
155
|
+
getSegments(): VideoSegment[];
|
|
156
|
+
updateChapterConfig(newConfig: Partial<ChapterConfig>): void;
|
|
157
|
+
hasChapters(): boolean;
|
|
158
|
+
getChapters(): VideoChapters | null;
|
|
159
|
+
getCoreChapters(): Chapter[];
|
|
160
|
+
getCoreSegments(): ChapterSegment[];
|
|
161
|
+
getCurrentChapterInfo(): Chapter | null;
|
|
162
|
+
seekToChapter(chapterId: string): void;
|
|
163
|
+
getNextChapter(): Chapter | null;
|
|
164
|
+
getPreviousChapter(): Chapter | null;
|
|
142
165
|
setTheme(theme: any): void;
|
|
143
166
|
private _parseRgb;
|
|
144
167
|
private _rgbToString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebPlayer.d.ts","sourceRoot":"","sources":["../src/WebPlayer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"WebPlayer.d.ts","sourceRoot":"","sources":["../src/WebPlayer.ts"],"names":[],"mappings":"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"}
|