unified-video-framework 1.4.158 → 1.4.159

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 (67) hide show
  1. package/package.json +12 -2
  2. package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.d.ts +18 -0
  3. package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +1 -0
  4. package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.js +117 -0
  5. package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.js.map +1 -0
  6. package/packages/core/dist/analytics/core/AnalyticsProvider.d.ts +18 -0
  7. package/packages/core/dist/analytics/core/AnalyticsProvider.d.ts.map +1 -0
  8. package/packages/core/dist/analytics/core/AnalyticsProvider.js +99 -0
  9. package/packages/core/dist/analytics/core/AnalyticsProvider.js.map +1 -0
  10. package/packages/core/dist/analytics/core/DynamicAnalyticsManager.d.ts +20 -0
  11. package/packages/core/dist/analytics/core/DynamicAnalyticsManager.d.ts.map +1 -0
  12. package/packages/core/dist/analytics/core/DynamicAnalyticsManager.js +161 -0
  13. package/packages/core/dist/analytics/core/DynamicAnalyticsManager.js.map +1 -0
  14. package/packages/core/dist/analytics/core/EventBatcher.d.ts +32 -0
  15. package/packages/core/dist/analytics/core/EventBatcher.d.ts.map +1 -0
  16. package/packages/core/dist/analytics/core/EventBatcher.js +98 -0
  17. package/packages/core/dist/analytics/core/EventBatcher.js.map +1 -0
  18. package/packages/core/dist/analytics/core/PlayerAnalytics.d.ts +19 -0
  19. package/packages/core/dist/analytics/core/PlayerAnalytics.d.ts.map +1 -0
  20. package/packages/core/dist/analytics/core/PlayerAnalytics.js +80 -0
  21. package/packages/core/dist/analytics/core/PlayerAnalytics.js.map +1 -0
  22. package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.d.ts +32 -0
  23. package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.d.ts.map +1 -0
  24. package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.js +220 -0
  25. package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.js.map +1 -0
  26. package/packages/core/dist/analytics/index.d.ts +13 -0
  27. package/packages/core/dist/analytics/index.d.ts.map +1 -0
  28. package/packages/core/dist/analytics/index.js +13 -0
  29. package/packages/core/dist/analytics/index.js.map +1 -0
  30. package/packages/core/dist/analytics/types/AnalyticsTypes.d.ts +239 -0
  31. package/packages/core/dist/analytics/types/AnalyticsTypes.d.ts.map +1 -0
  32. package/packages/core/dist/analytics/types/AnalyticsTypes.js +8 -0
  33. package/packages/core/dist/analytics/types/AnalyticsTypes.js.map +1 -0
  34. package/packages/core/dist/analytics/utils/DeviceDetection.d.ts +27 -0
  35. package/packages/core/dist/analytics/utils/DeviceDetection.d.ts.map +1 -0
  36. package/packages/core/dist/analytics/utils/DeviceDetection.js +184 -0
  37. package/packages/core/dist/analytics/utils/DeviceDetection.js.map +1 -0
  38. package/packages/core/dist/chapter-manager.d.ts +39 -0
  39. package/packages/core/dist/index.d.ts +1 -0
  40. package/packages/core/dist/index.d.ts.map +1 -1
  41. package/packages/core/dist/index.js +1 -0
  42. package/packages/core/dist/index.js.map +1 -1
  43. package/packages/core/src/analytics/README.md +902 -0
  44. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.ts +156 -0
  45. package/packages/core/src/analytics/core/AnalyticsProvider.ts +169 -0
  46. package/packages/core/src/analytics/core/DynamicAnalyticsManager.ts +199 -0
  47. package/packages/core/src/analytics/core/EventBatcher.ts +160 -0
  48. package/packages/core/src/analytics/core/PlayerAnalytics.ts +147 -0
  49. package/packages/core/src/analytics/index.ts +51 -0
  50. package/packages/core/src/analytics/types/AnalyticsTypes.ts +315 -0
  51. package/packages/core/src/analytics/utils/DeviceDetection.ts +220 -0
  52. package/packages/core/src/index.ts +3 -0
  53. package/packages/ios/README.md +84 -0
  54. package/packages/web/dist/WebPlayer.d.ts +5 -0
  55. package/packages/web/dist/WebPlayer.d.ts.map +1 -1
  56. package/packages/web/dist/WebPlayer.js +255 -63
  57. package/packages/web/dist/WebPlayer.js.map +1 -1
  58. package/packages/web/dist/epg/EPGController.d.ts +78 -0
  59. package/packages/web/dist/epg/EPGController.d.ts.map +1 -0
  60. package/packages/web/dist/epg/EPGController.js +476 -0
  61. package/packages/web/dist/epg/EPGController.js.map +1 -0
  62. package/packages/web/src/WebPlayer.ts +303 -79
  63. package/src/analytics/README.md +902 -0
  64. package/src/analytics/adapters/PlayerAnalyticsAdapter.ts +572 -0
  65. package/src/analytics/core/DynamicAnalyticsManager.ts +526 -0
  66. package/src/analytics/examples/DynamicAnalyticsExample.ts +324 -0
  67. package/src/analytics/index.ts +60 -0
@@ -0,0 +1,147 @@
1
+ /**
2
+ * PlayerAnalytics - Main Analytics Class
3
+ * Simplified analytics interface for easy integration
4
+ */
5
+
6
+ import { DynamicAnalyticsManager } from './DynamicAnalyticsManager';
7
+ import {
8
+ DynamicAnalyticsConfig,
9
+ AnalyticsProviderType,
10
+ PlayerAnalyticsConfig,
11
+ VideoInfo,
12
+ PlayerState
13
+ } from '../types/AnalyticsTypes';
14
+
15
+ export class PlayerAnalytics {
16
+ private analyticsManager: DynamicAnalyticsManager;
17
+ private currentSessionId: string | null = null;
18
+
19
+ constructor(config: DynamicAnalyticsConfig) {
20
+ this.analyticsManager = new DynamicAnalyticsManager(config);
21
+ }
22
+
23
+ /**
24
+ * Initialize analytics
25
+ */
26
+ async initialize(): Promise<void> {
27
+ return this.analyticsManager.initialize();
28
+ }
29
+
30
+ /**
31
+ * Start a new analytics session
32
+ */
33
+ startSession(videoInfo: VideoInfo, userInfo: any = {}): string {
34
+ this.currentSessionId = this.analyticsManager.startSession(videoInfo, userInfo);
35
+ return this.currentSessionId;
36
+ }
37
+
38
+ /**
39
+ * End the current analytics session
40
+ */
41
+ async endSession(): Promise<void> {
42
+ if (this.currentSessionId) {
43
+ await this.analyticsManager.endSession();
44
+ this.currentSessionId = null;
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Track a player event
50
+ */
51
+ trackEvent(eventType: string, playerState?: PlayerState, customData?: any): void {
52
+ this.analyticsManager.trackEvent(eventType, playerState, customData);
53
+ }
54
+
55
+ /**
56
+ * Track a custom event
57
+ */
58
+ trackCustomEvent(eventType: string, data: any): void {
59
+ this.analyticsManager.trackCustomEvent(eventType, data);
60
+ }
61
+
62
+ /**
63
+ * Get current session ID
64
+ */
65
+ getSessionId(): string | null {
66
+ return this.currentSessionId;
67
+ }
68
+
69
+ /**
70
+ * Check if analytics is enabled
71
+ */
72
+ isEnabled(): boolean {
73
+ return this.analyticsManager.isEnabled();
74
+ }
75
+
76
+ /**
77
+ * Add a provider at runtime
78
+ */
79
+ addProvider(name: string, type: AnalyticsProviderType, config: any): void {
80
+ this.analyticsManager.addProvider(name, type, config);
81
+ }
82
+
83
+ /**
84
+ * Remove a provider
85
+ */
86
+ async removeProvider(name: string): Promise<void> {
87
+ return this.analyticsManager.removeProvider(name);
88
+ }
89
+
90
+ /**
91
+ * Toggle a provider
92
+ */
93
+ toggleProvider(name: string, enabled: boolean): void {
94
+ this.analyticsManager.toggleProvider(name, enabled);
95
+ }
96
+
97
+ /**
98
+ * Destroy analytics and cleanup
99
+ */
100
+ async destroy(): Promise<void> {
101
+ if (this.currentSessionId) {
102
+ await this.endSession();
103
+ }
104
+ return this.analyticsManager.destroy();
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Helper function to create a basic PlayerAnalytics instance
110
+ */
111
+ export function createPlayerAnalytics(
112
+ baseUrl: string,
113
+ apiKey: string,
114
+ playerId: string,
115
+ options: Partial<PlayerAnalyticsConfig> = {}
116
+ ): PlayerAnalytics {
117
+ const config: DynamicAnalyticsConfig = {
118
+ enabled: true,
119
+ providers: [
120
+ {
121
+ name: 'player-analytics',
122
+ type: AnalyticsProviderType.PLAYER_ANALYTICS,
123
+ enabled: true,
124
+ priority: 1,
125
+ config: {
126
+ baseUrl,
127
+ apiKey,
128
+ playerId,
129
+ heartbeatInterval: options.heartbeatInterval || 10,
130
+ batchSize: options.batchSize || 10,
131
+ flushInterval: options.flushInterval || 30,
132
+ enableOfflineStorage: options.enableOfflineStorage !== false,
133
+ maxRetries: options.maxRetries || 3,
134
+ retryDelay: options.retryDelay || 1000,
135
+ ...options
136
+ }
137
+ }
138
+ ],
139
+ globalSettings: {
140
+ enableConsoleLogging: false,
141
+ enableErrorReporting: true,
142
+ sessionTimeout: 60
143
+ }
144
+ };
145
+
146
+ return new PlayerAnalytics(config);
147
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Video Player Analytics - Main module exports
3
+ * Comprehensive analytics tracking for video players with dynamic provider support
4
+ */
5
+
6
+ import { DynamicAnalyticsConfig } from './types/AnalyticsTypes';
7
+ import { DynamicAnalyticsManager } from './core/DynamicAnalyticsManager';
8
+
9
+ // Main analytics manager
10
+ export { DynamicAnalyticsManager } from './core/DynamicAnalyticsManager';
11
+
12
+ // Core classes
13
+ export { PlayerAnalytics, createPlayerAnalytics } from './core/PlayerAnalytics';
14
+ export { EventBatcher, createEventBatcher } from './core/EventBatcher';
15
+ export {
16
+ AnalyticsProvider,
17
+ createAnalyticsProvider,
18
+ getDefaultAnalyticsConfig,
19
+ createPlayerAnalyticsProviderConfig,
20
+ validateAnalyticsConfig,
21
+ mergeAnalyticsConfigs
22
+ } from './core/AnalyticsProvider';
23
+
24
+ // Analytics Adapters
25
+ export { PlayerAnalyticsAdapter } from './adapters/PlayerAnalyticsAdapter';
26
+
27
+ // All types
28
+ export * from './types/AnalyticsTypes';
29
+
30
+ // Utilities
31
+ export { DeviceDetection, deviceDetection } from './utils/DeviceDetection';
32
+
33
+ // Factory function for easy setup
34
+ export function createDynamicAnalyticsManager(config: DynamicAnalyticsConfig): DynamicAnalyticsManager {
35
+ return new DynamicAnalyticsManager(config);
36
+ }
37
+
38
+ // Re-export commonly used types and enums for convenience
39
+ export { AnalyticsProviderType } from './types/AnalyticsTypes';
40
+ export type {
41
+ DynamicAnalyticsConfig,
42
+ PlayerAnalyticsConfig,
43
+ AnalyticsEventData,
44
+ VideoInfo,
45
+ PlayerState,
46
+ DeviceInfo,
47
+ EngagementData,
48
+ PlayerSessionInfo,
49
+ AnalyticsEventType,
50
+ BaseAnalyticsProvider
51
+ } from './types/AnalyticsTypes';
@@ -0,0 +1,315 @@
1
+ /**
2
+ * Analytics Types and Interfaces
3
+ * Core type definitions for the analytics system
4
+ */
5
+
6
+ // Base Analytics Configuration
7
+ export interface AnalyticsConfig {
8
+ enabled: boolean;
9
+ providers: AnalyticsProviderConfig[];
10
+ globalSettings?: GlobalAnalyticsSettings;
11
+ }
12
+
13
+ export interface DynamicAnalyticsConfig extends AnalyticsConfig {
14
+ providers: DynamicProviderConfig[];
15
+ }
16
+
17
+ export interface GlobalAnalyticsSettings {
18
+ enableConsoleLogging?: boolean;
19
+ enableErrorReporting?: boolean;
20
+ sessionTimeout?: number; // in minutes
21
+ defaultBatchSize?: number;
22
+ defaultFlushInterval?: number; // in seconds
23
+ retryAttempts?: number;
24
+ retryDelay?: number; // in milliseconds
25
+ }
26
+
27
+ // Provider Configuration
28
+ export interface AnalyticsProviderConfig {
29
+ name: string;
30
+ enabled: boolean;
31
+ config: any;
32
+ }
33
+
34
+ export interface DynamicProviderConfig extends AnalyticsProviderConfig {
35
+ type: AnalyticsProviderType;
36
+ priority?: number;
37
+ }
38
+
39
+ export enum AnalyticsProviderType {
40
+ PLAYER_ANALYTICS = 'player-analytics',
41
+ GOOGLE_ANALYTICS = 'google-analytics',
42
+ ADOBE_ANALYTICS = 'adobe-analytics',
43
+ CUSTOM = 'custom'
44
+ }
45
+
46
+ // Player Analytics Specific Configuration
47
+ export interface PlayerAnalyticsConfig {
48
+ baseUrl: string;
49
+ apiKey: string;
50
+ playerId: string;
51
+ tenantId?: string;
52
+ heartbeatInterval?: number; // in seconds
53
+ batchSize?: number;
54
+ flushInterval?: number; // in seconds
55
+ enableOfflineStorage?: boolean;
56
+ maxRetries?: number;
57
+ retryDelay?: number; // in milliseconds
58
+ }
59
+
60
+ // Event Data Structures
61
+ export interface AnalyticsEventData {
62
+ eventType: string;
63
+ timestamp: number;
64
+ currentTime?: number;
65
+ video?: VideoInfo;
66
+ device?: DeviceInfo;
67
+ player?: PlayerState;
68
+ network?: NetworkInfo;
69
+ engagement?: EngagementData;
70
+ custom?: Record<string, any>;
71
+ metadata?: EventMetadata;
72
+ }
73
+
74
+ export interface EventMetadata {
75
+ sessionId: string;
76
+ playerId: string;
77
+ userId?: string;
78
+ customData?: Record<string, any>;
79
+ }
80
+
81
+ // Video Information
82
+ export interface VideoInfo {
83
+ id: string;
84
+ title?: string;
85
+ type: 'video' | 'audio' | 'livestream';
86
+ duration?: number; // in seconds
87
+ url?: string;
88
+ quality?: string;
89
+ bitrate?: number;
90
+ codec?: string;
91
+ format?: string;
92
+ thumbnail?: string;
93
+ description?: string;
94
+ tags?: string[];
95
+ chapter?: ChapterInfo;
96
+ }
97
+
98
+ export interface ChapterInfo {
99
+ id: string;
100
+ title: string;
101
+ startTime: number;
102
+ endTime: number;
103
+ thumbnail?: string;
104
+ }
105
+
106
+ // Device Information
107
+ export interface DeviceInfo {
108
+ deviceType: 'mobile' | 'tablet' | 'desktop' | 'smart_tv' | 'tv';
109
+ os: string;
110
+ osVersion?: string;
111
+ browser?: string;
112
+ browserVersion?: string;
113
+ screen: {
114
+ width: number;
115
+ height: number;
116
+ orientation?: 'portrait' | 'landscape';
117
+ };
118
+ userAgent?: string;
119
+ language?: string;
120
+ timezone?: string;
121
+ }
122
+
123
+ // Player State
124
+ export interface PlayerState {
125
+ currentTime: number;
126
+ duration: number;
127
+ volume: number;
128
+ muted: boolean;
129
+ playbackRate: number;
130
+ buffered?: TimeRanges | null;
131
+ quality?: string;
132
+ isFullscreen?: boolean;
133
+ isPip?: boolean; // Picture-in-Picture
134
+ isLive?: boolean;
135
+ seekableRange?: {
136
+ start: number;
137
+ end: number;
138
+ };
139
+ }
140
+
141
+ // Network Information
142
+ export interface NetworkInfo {
143
+ connectionType?: string;
144
+ effectiveType?: string;
145
+ downlink?: number; // Mbps
146
+ rtt?: number; // milliseconds
147
+ online: boolean;
148
+ }
149
+
150
+ // Engagement Metrics
151
+ export interface EngagementData {
152
+ watchTime: number; // Total watch time in seconds
153
+ uniqueWatchTime: number; // Unique content watched (no replays)
154
+ completionPercentage: number; // 0-100
155
+ seekCount: number;
156
+ qualityChangeCount: number;
157
+ fullscreenCount: number;
158
+ bufferingTime: number; // Total buffering time in seconds
159
+ bufferingEvents: number; // Number of buffering events
160
+ averageBitrate?: number;
161
+ startupTime?: number; // Time to first frame
162
+ rebufferCount: number;
163
+ errorCount: number;
164
+ interactionCount: number; // User interactions (play/pause/seek)
165
+ socialShares?: number;
166
+ likes?: number;
167
+ comments?: number;
168
+ }
169
+
170
+ // Session Information
171
+ export interface PlayerSessionInfo {
172
+ sessionId: string;
173
+ playerId: string;
174
+ startTime: number;
175
+ endTime?: number;
176
+ userId?: string;
177
+ userType?: string;
178
+ customData?: Record<string, any>;
179
+ initialVideo?: VideoInfo;
180
+ totalVideos?: number;
181
+ totalWatchTime?: number;
182
+ }
183
+
184
+ // Event Types
185
+ export type AnalyticsEventType =
186
+ | 'session_start'
187
+ | 'session_end'
188
+ | 'video_load'
189
+ | 'video_start'
190
+ | 'play'
191
+ | 'pause'
192
+ | 'resume'
193
+ | 'ended'
194
+ | 'seeking'
195
+ | 'seeked'
196
+ | 'waiting'
197
+ | 'stalled'
198
+ | 'canplay'
199
+ | 'timeupdate'
200
+ | 'heartbeat'
201
+ | 'qualitychange'
202
+ | 'volumechange'
203
+ | 'fullscreenchange'
204
+ | 'ratechange'
205
+ | 'resize'
206
+ | 'enterpictureinpicture'
207
+ | 'leavepictureinpicture'
208
+ | 'error'
209
+ | 'custom';
210
+
211
+ // Error Information
212
+ export interface AnalyticsError {
213
+ code: string | number;
214
+ message: string;
215
+ stack?: string;
216
+ fatal?: boolean;
217
+ context?: Record<string, any>;
218
+ timestamp: number;
219
+ }
220
+
221
+ // Batch Configuration
222
+ export interface BatchConfig {
223
+ maxSize: number;
224
+ flushInterval: number; // in milliseconds
225
+ maxWaitTime: number; // in milliseconds
226
+ retryAttempts: number;
227
+ retryDelay: number; // in milliseconds
228
+ }
229
+
230
+ // API Request/Response Types
231
+ export interface AnalyticsRequest {
232
+ session: PlayerSessionInfo;
233
+ events: AnalyticsEventData[];
234
+ timestamp: number;
235
+ batchId?: string;
236
+ }
237
+
238
+ export interface AnalyticsResponse {
239
+ success: boolean;
240
+ message?: string;
241
+ errors?: string[];
242
+ batchId?: string;
243
+ processedCount?: number;
244
+ }
245
+
246
+ // Provider Factory Types
247
+ export interface ProviderFactory<T = any> {
248
+ (config: T): BaseAnalyticsProvider;
249
+ }
250
+
251
+ export interface CustomProviderConfig {
252
+ factory: ProviderFactory;
253
+ [key: string]: any;
254
+ }
255
+
256
+ // Base Provider Interface
257
+ export interface BaseAnalyticsProvider {
258
+ name: string;
259
+ enabled: boolean;
260
+ initialize(): Promise<void>;
261
+ trackEvent(event: AnalyticsEventData): Promise<void>;
262
+ startSession(sessionInfo: PlayerSessionInfo): Promise<string>;
263
+ endSession(): Promise<void>;
264
+ flush(): Promise<void>;
265
+ destroy(): Promise<void>;
266
+ }
267
+
268
+ // Utility Types
269
+ export type DeepPartial<T> = {
270
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
271
+ };
272
+
273
+ export type EventHandler = (event: AnalyticsEventData) => void;
274
+ export type ErrorHandler = (error: AnalyticsError) => void;
275
+ export type SessionHandler = (sessionInfo: PlayerSessionInfo) => void;
276
+
277
+ // Storage Types
278
+ export interface StorageItem {
279
+ id: string;
280
+ data: AnalyticsEventData;
281
+ timestamp: number;
282
+ attempts: number;
283
+ }
284
+
285
+ export interface StorageConfig {
286
+ maxItems: number;
287
+ maxAge: number; // in milliseconds
288
+ storageKey: string;
289
+ }
290
+
291
+ // Device Detection Types
292
+ export interface DeviceDetectionResult {
293
+ deviceType: DeviceInfo['deviceType'];
294
+ os: string;
295
+ osVersion?: string;
296
+ browser?: string;
297
+ browserVersion?: string;
298
+ screen: DeviceInfo['screen'];
299
+ userAgent: string;
300
+ isMobile: boolean;
301
+ isTablet: boolean;
302
+ isDesktop: boolean;
303
+ isSmartTV: boolean;
304
+ isTizen: boolean;
305
+ isWebOS: boolean;
306
+ isRoku: boolean;
307
+ }
308
+
309
+ export interface NetworkDetectionResult {
310
+ connectionType?: string;
311
+ effectiveType?: string;
312
+ downlink?: number;
313
+ rtt?: number;
314
+ online: boolean;
315
+ }