unified-video-framework 1.4.158 → 1.4.160
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 +11 -2
- package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.d.ts +18 -0
- package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +1 -0
- package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.js +117 -0
- package/packages/core/dist/analytics/adapters/PlayerAnalyticsAdapter.js.map +1 -0
- package/packages/core/dist/analytics/core/AnalyticsProvider.d.ts +18 -0
- package/packages/core/dist/analytics/core/AnalyticsProvider.d.ts.map +1 -0
- package/packages/core/dist/analytics/core/AnalyticsProvider.js +99 -0
- package/packages/core/dist/analytics/core/AnalyticsProvider.js.map +1 -0
- package/packages/core/dist/analytics/core/DynamicAnalyticsManager.d.ts +20 -0
- package/packages/core/dist/analytics/core/DynamicAnalyticsManager.d.ts.map +1 -0
- package/packages/core/dist/analytics/core/DynamicAnalyticsManager.js +161 -0
- package/packages/core/dist/analytics/core/DynamicAnalyticsManager.js.map +1 -0
- package/packages/core/dist/analytics/core/EventBatcher.d.ts +32 -0
- package/packages/core/dist/analytics/core/EventBatcher.d.ts.map +1 -0
- package/packages/core/dist/analytics/core/EventBatcher.js +98 -0
- package/packages/core/dist/analytics/core/EventBatcher.js.map +1 -0
- package/packages/core/dist/analytics/core/PlayerAnalytics.d.ts +19 -0
- package/packages/core/dist/analytics/core/PlayerAnalytics.d.ts.map +1 -0
- package/packages/core/dist/analytics/core/PlayerAnalytics.js +80 -0
- package/packages/core/dist/analytics/core/PlayerAnalytics.js.map +1 -0
- package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.d.ts +32 -0
- package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.d.ts.map +1 -0
- package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.js +220 -0
- package/packages/core/dist/analytics/examples/DynamicAnalyticsExample.js.map +1 -0
- package/packages/core/dist/analytics/index.d.ts +13 -0
- package/packages/core/dist/analytics/index.d.ts.map +1 -0
- package/packages/core/dist/analytics/index.js +13 -0
- package/packages/core/dist/analytics/index.js.map +1 -0
- package/packages/core/dist/analytics/types/AnalyticsTypes.d.ts +239 -0
- package/packages/core/dist/analytics/types/AnalyticsTypes.d.ts.map +1 -0
- package/packages/core/dist/analytics/types/AnalyticsTypes.js +8 -0
- package/packages/core/dist/analytics/types/AnalyticsTypes.js.map +1 -0
- package/packages/core/dist/analytics/utils/DeviceDetection.d.ts +27 -0
- package/packages/core/dist/analytics/utils/DeviceDetection.d.ts.map +1 -0
- package/packages/core/dist/analytics/utils/DeviceDetection.js +184 -0
- package/packages/core/dist/analytics/utils/DeviceDetection.js.map +1 -0
- package/packages/core/dist/chapter-manager.d.ts +39 -0
- package/packages/core/dist/index.d.ts +1 -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/src/analytics/README.md +902 -0
- package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.ts +156 -0
- package/packages/core/src/analytics/core/AnalyticsProvider.ts +169 -0
- package/packages/core/src/analytics/core/DynamicAnalyticsManager.ts +199 -0
- package/packages/core/src/analytics/core/EventBatcher.ts +160 -0
- package/packages/core/src/analytics/core/PlayerAnalytics.ts +147 -0
- package/packages/core/src/analytics/index.ts +51 -0
- package/packages/core/src/analytics/types/AnalyticsTypes.ts +315 -0
- package/packages/core/src/analytics/utils/DeviceDetection.ts +220 -0
- package/packages/core/src/index.ts +3 -0
- package/packages/ios/README.md +84 -0
- package/packages/web/dist/WebPlayer.d.ts +5 -0
- package/packages/web/dist/WebPlayer.d.ts.map +1 -1
- package/packages/web/dist/WebPlayer.js +255 -63
- package/packages/web/dist/WebPlayer.js.map +1 -1
- package/packages/web/dist/epg/EPGController.d.ts +78 -0
- package/packages/web/dist/epg/EPGController.d.ts.map +1 -0
- package/packages/web/dist/epg/EPGController.js +476 -0
- package/packages/web/dist/epg/EPGController.js.map +1 -0
- package/packages/web/src/WebPlayer.ts +303 -79
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DynamicAnalyticsConfig, AnalyticsProviderType, PlayerAnalyticsConfig, VideoInfo, PlayerState } from '../types/AnalyticsTypes';
|
|
2
|
+
export declare class PlayerAnalytics {
|
|
3
|
+
private analyticsManager;
|
|
4
|
+
private currentSessionId;
|
|
5
|
+
constructor(config: DynamicAnalyticsConfig);
|
|
6
|
+
initialize(): Promise<void>;
|
|
7
|
+
startSession(videoInfo: VideoInfo, userInfo?: any): string;
|
|
8
|
+
endSession(): Promise<void>;
|
|
9
|
+
trackEvent(eventType: string, playerState?: PlayerState, customData?: any): void;
|
|
10
|
+
trackCustomEvent(eventType: string, data: any): void;
|
|
11
|
+
getSessionId(): string | null;
|
|
12
|
+
isEnabled(): boolean;
|
|
13
|
+
addProvider(name: string, type: AnalyticsProviderType, config: any): void;
|
|
14
|
+
removeProvider(name: string): Promise<void>;
|
|
15
|
+
toggleProvider(name: string, enabled: boolean): void;
|
|
16
|
+
destroy(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare function createPlayerAnalytics(baseUrl: string, apiKey: string, playerId: string, options?: Partial<PlayerAnalyticsConfig>): PlayerAnalytics;
|
|
19
|
+
//# sourceMappingURL=PlayerAnalytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlayerAnalytics.d.ts","sourceRoot":"","sources":["../../../src/analytics/core/PlayerAnalytics.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,SAAS,EACT,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,eAAe;IAC1B,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,MAAM,EAAE,sBAAsB;IAOpC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,GAAE,GAAQ,GAAG,MAAM;IAQxD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,GAAG,GAAG,IAAI;IAOhF,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAOpD,YAAY,IAAI,MAAM,GAAG,IAAI;IAO7B,SAAS,IAAI,OAAO;IAOpB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;IAOnE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAO9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B;AAKD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,OAAO,CAAC,qBAAqB,CAAM,GAC3C,eAAe,CA+BjB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { DynamicAnalyticsManager } from './DynamicAnalyticsManager';
|
|
2
|
+
import { AnalyticsProviderType } from '../types/AnalyticsTypes';
|
|
3
|
+
export class PlayerAnalytics {
|
|
4
|
+
constructor(config) {
|
|
5
|
+
this.currentSessionId = null;
|
|
6
|
+
this.analyticsManager = new DynamicAnalyticsManager(config);
|
|
7
|
+
}
|
|
8
|
+
async initialize() {
|
|
9
|
+
return this.analyticsManager.initialize();
|
|
10
|
+
}
|
|
11
|
+
startSession(videoInfo, userInfo = {}) {
|
|
12
|
+
this.currentSessionId = this.analyticsManager.startSession(videoInfo, userInfo);
|
|
13
|
+
return this.currentSessionId;
|
|
14
|
+
}
|
|
15
|
+
async endSession() {
|
|
16
|
+
if (this.currentSessionId) {
|
|
17
|
+
await this.analyticsManager.endSession();
|
|
18
|
+
this.currentSessionId = null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
trackEvent(eventType, playerState, customData) {
|
|
22
|
+
this.analyticsManager.trackEvent(eventType, playerState, customData);
|
|
23
|
+
}
|
|
24
|
+
trackCustomEvent(eventType, data) {
|
|
25
|
+
this.analyticsManager.trackCustomEvent(eventType, data);
|
|
26
|
+
}
|
|
27
|
+
getSessionId() {
|
|
28
|
+
return this.currentSessionId;
|
|
29
|
+
}
|
|
30
|
+
isEnabled() {
|
|
31
|
+
return this.analyticsManager.isEnabled();
|
|
32
|
+
}
|
|
33
|
+
addProvider(name, type, config) {
|
|
34
|
+
this.analyticsManager.addProvider(name, type, config);
|
|
35
|
+
}
|
|
36
|
+
async removeProvider(name) {
|
|
37
|
+
return this.analyticsManager.removeProvider(name);
|
|
38
|
+
}
|
|
39
|
+
toggleProvider(name, enabled) {
|
|
40
|
+
this.analyticsManager.toggleProvider(name, enabled);
|
|
41
|
+
}
|
|
42
|
+
async destroy() {
|
|
43
|
+
if (this.currentSessionId) {
|
|
44
|
+
await this.endSession();
|
|
45
|
+
}
|
|
46
|
+
return this.analyticsManager.destroy();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function createPlayerAnalytics(baseUrl, apiKey, playerId, options = {}) {
|
|
50
|
+
const config = {
|
|
51
|
+
enabled: true,
|
|
52
|
+
providers: [
|
|
53
|
+
{
|
|
54
|
+
name: 'player-analytics',
|
|
55
|
+
type: AnalyticsProviderType.PLAYER_ANALYTICS,
|
|
56
|
+
enabled: true,
|
|
57
|
+
priority: 1,
|
|
58
|
+
config: {
|
|
59
|
+
baseUrl,
|
|
60
|
+
apiKey,
|
|
61
|
+
playerId,
|
|
62
|
+
heartbeatInterval: options.heartbeatInterval || 10,
|
|
63
|
+
batchSize: options.batchSize || 10,
|
|
64
|
+
flushInterval: options.flushInterval || 30,
|
|
65
|
+
enableOfflineStorage: options.enableOfflineStorage !== false,
|
|
66
|
+
maxRetries: options.maxRetries || 3,
|
|
67
|
+
retryDelay: options.retryDelay || 1000,
|
|
68
|
+
...options
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
globalSettings: {
|
|
73
|
+
enableConsoleLogging: false,
|
|
74
|
+
enableErrorReporting: true,
|
|
75
|
+
sessionTimeout: 60
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
return new PlayerAnalytics(config);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=PlayerAnalytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlayerAnalytics.js","sourceRoot":"","sources":["../../../src/analytics/core/PlayerAnalytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DynamicAnalyticsManager, DynamicAnalyticsConfig } from '../index';
|
|
2
|
+
export declare function createBasicPlayerAnalytics(): DynamicAnalyticsManager;
|
|
3
|
+
export declare function createMultiProviderAnalytics(): DynamicAnalyticsManager;
|
|
4
|
+
export declare class VideoPlayerWithAnalytics {
|
|
5
|
+
private analyticsManager;
|
|
6
|
+
private currentVideoInfo;
|
|
7
|
+
constructor(analyticsConfig: DynamicAnalyticsConfig);
|
|
8
|
+
loadVideo(videoInfo: {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
type: 'video' | 'series' | 'episode' | 'live';
|
|
12
|
+
duration: number;
|
|
13
|
+
url: string;
|
|
14
|
+
isLive?: boolean;
|
|
15
|
+
metadata?: Record<string, any>;
|
|
16
|
+
}): void;
|
|
17
|
+
play(): void;
|
|
18
|
+
pause(): void;
|
|
19
|
+
seek(time: number): void;
|
|
20
|
+
onError(error: any): void;
|
|
21
|
+
onQualityChange(newQuality: string, previousQuality: string): void;
|
|
22
|
+
onChapterSkip(chapterId: string, chapterType: string): void;
|
|
23
|
+
destroy(): void;
|
|
24
|
+
private setupAnalyticsEvents;
|
|
25
|
+
private getPlayerState;
|
|
26
|
+
private getCurrentUserId;
|
|
27
|
+
}
|
|
28
|
+
export declare function createEnvironmentAnalytics(): DynamicAnalyticsManager;
|
|
29
|
+
declare global {
|
|
30
|
+
function gtag(...args: any[]): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=DynamicAnalyticsExample.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicAnalyticsExample.d.ts","sourceRoot":"","sources":["../../../src/analytics/examples/DynamicAnalyticsExample.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,uBAAuB,EAIvB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAGlB,wBAAgB,0BAA0B,4BA8BzC;AAGD,wBAAgB,4BAA4B,4BA2C3C;AAGD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,gBAAgB,CAAa;gBAEzB,eAAe,EAAE,sBAAsB;IAK5C,SAAS,CAAC,SAAS,EAAE;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QAC9C,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,IAAI;IAaD,IAAI,IAAI,IAAI;IAQZ,KAAK,IAAI,IAAI;IAQb,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAaxB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAUzB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAQlE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAQ3D,OAAO,IAAI,IAAI;IAMtB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,gBAAgB;CAIzB;AA8DD,wBAAgB,0BAA0B,4BAiCzC;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,SAAS,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;CACrC"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { createDynamicAnalyticsManager, createPlayerAnalyticsProviderConfig, AnalyticsProviderType } from '../index';
|
|
2
|
+
export function createBasicPlayerAnalytics() {
|
|
3
|
+
const config = {
|
|
4
|
+
enabled: true,
|
|
5
|
+
providers: [
|
|
6
|
+
{
|
|
7
|
+
name: 'flicknexs-analytics',
|
|
8
|
+
type: AnalyticsProviderType.PLAYER_ANALYTICS,
|
|
9
|
+
enabled: true,
|
|
10
|
+
priority: 1,
|
|
11
|
+
config: createPlayerAnalyticsProviderConfig('https://api.flicknexs.com', 'your-api-key-here', 'video-player-main', {
|
|
12
|
+
tenantId: 'flicknexs-tenant',
|
|
13
|
+
heartbeatInterval: 10,
|
|
14
|
+
batchSize: 10,
|
|
15
|
+
flushInterval: 30
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
globalSettings: {
|
|
20
|
+
enableConsoleLogging: true,
|
|
21
|
+
enableErrorReporting: true,
|
|
22
|
+
sessionTimeout: 60
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return createDynamicAnalyticsManager(config);
|
|
26
|
+
}
|
|
27
|
+
export function createMultiProviderAnalytics() {
|
|
28
|
+
const config = {
|
|
29
|
+
enabled: true,
|
|
30
|
+
providers: [
|
|
31
|
+
{
|
|
32
|
+
name: 'player-analytics',
|
|
33
|
+
type: AnalyticsProviderType.PLAYER_ANALYTICS,
|
|
34
|
+
enabled: true,
|
|
35
|
+
priority: 1,
|
|
36
|
+
config: createPlayerAnalyticsProviderConfig(process.env.ANALYTICS_BASE_URL || 'https://api.flicknexs.com', process.env.ANALYTICS_API_KEY || 'your-api-key', 'main-player', {
|
|
37
|
+
tenantId: process.env.TENANT_ID,
|
|
38
|
+
heartbeatInterval: 10,
|
|
39
|
+
batchSize: 10,
|
|
40
|
+
flushInterval: 30
|
|
41
|
+
})
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'google-analytics',
|
|
45
|
+
type: AnalyticsProviderType.CUSTOM,
|
|
46
|
+
enabled: true,
|
|
47
|
+
priority: 2,
|
|
48
|
+
config: {
|
|
49
|
+
factory: (config) => new CustomGoogleAnalyticsProvider(config),
|
|
50
|
+
measurementId: 'G-XXXXXXXXXX',
|
|
51
|
+
apiSecret: 'your-ga4-secret'
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
globalSettings: {
|
|
56
|
+
enableConsoleLogging: process.env.NODE_ENV !== 'production',
|
|
57
|
+
enableErrorReporting: true,
|
|
58
|
+
sessionTimeout: 90
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
return createDynamicAnalyticsManager(config);
|
|
62
|
+
}
|
|
63
|
+
export class VideoPlayerWithAnalytics {
|
|
64
|
+
constructor(analyticsConfig) {
|
|
65
|
+
this.currentVideoInfo = null;
|
|
66
|
+
this.analyticsManager = createDynamicAnalyticsManager(analyticsConfig);
|
|
67
|
+
this.setupAnalyticsEvents();
|
|
68
|
+
}
|
|
69
|
+
loadVideo(videoInfo) {
|
|
70
|
+
this.currentVideoInfo = videoInfo;
|
|
71
|
+
const sessionId = this.analyticsManager.startSession(videoInfo, {
|
|
72
|
+
userId: this.getCurrentUserId(),
|
|
73
|
+
appVersion: '1.0.0',
|
|
74
|
+
platform: 'web'
|
|
75
|
+
});
|
|
76
|
+
console.log(`Started analytics session: ${sessionId}`);
|
|
77
|
+
}
|
|
78
|
+
play() {
|
|
79
|
+
this.analyticsManager.trackEvent('play', this.getPlayerState());
|
|
80
|
+
}
|
|
81
|
+
pause() {
|
|
82
|
+
this.analyticsManager.trackEvent('pause', this.getPlayerState());
|
|
83
|
+
}
|
|
84
|
+
seek(time) {
|
|
85
|
+
const currentTime = this.getPlayerState().currentTime;
|
|
86
|
+
this.analyticsManager.trackEvent('seeking', this.getPlayerState(), {
|
|
87
|
+
seekFrom: currentTime,
|
|
88
|
+
seekTo: time
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
onError(error) {
|
|
92
|
+
this.analyticsManager.trackCustomEvent('error', {
|
|
93
|
+
errorCode: error.code,
|
|
94
|
+
errorMessage: error.message,
|
|
95
|
+
errorType: 'player_error',
|
|
96
|
+
currentTime: this.getPlayerState().currentTime
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
onQualityChange(newQuality, previousQuality) {
|
|
100
|
+
this.analyticsManager.trackCustomEvent('quality_change', {
|
|
101
|
+
newQuality,
|
|
102
|
+
previousQuality,
|
|
103
|
+
reason: 'user_selected'
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
onChapterSkip(chapterId, chapterType) {
|
|
107
|
+
this.analyticsManager.trackCustomEvent('custom_chapter_skip', {
|
|
108
|
+
chapterId,
|
|
109
|
+
chapterType,
|
|
110
|
+
skipReason: 'manual'
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
destroy() {
|
|
114
|
+
this.analyticsManager.endSession();
|
|
115
|
+
this.analyticsManager.destroy();
|
|
116
|
+
}
|
|
117
|
+
setupAnalyticsEvents() {
|
|
118
|
+
this.analyticsManager.on('sessionStart', (data) => {
|
|
119
|
+
console.log('Analytics session started:', data);
|
|
120
|
+
});
|
|
121
|
+
this.analyticsManager.on('sessionEnd', (data) => {
|
|
122
|
+
console.log('Analytics session ended:', data);
|
|
123
|
+
});
|
|
124
|
+
this.analyticsManager.on('error', (error) => {
|
|
125
|
+
console.error('Analytics error:', error);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
getPlayerState() {
|
|
129
|
+
return {
|
|
130
|
+
currentTime: 120,
|
|
131
|
+
duration: 3600,
|
|
132
|
+
volume: 0.8,
|
|
133
|
+
muted: false,
|
|
134
|
+
paused: false,
|
|
135
|
+
ended: false,
|
|
136
|
+
fullscreen: false,
|
|
137
|
+
playbackRate: 1,
|
|
138
|
+
qualityLevel: '1080p',
|
|
139
|
+
buffered: null,
|
|
140
|
+
seekable: null,
|
|
141
|
+
networkState: 2,
|
|
142
|
+
readyState: 4
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
getCurrentUserId() {
|
|
146
|
+
return 'user123';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
class CustomGoogleAnalyticsProvider {
|
|
150
|
+
constructor(config) {
|
|
151
|
+
this.sessionId = null;
|
|
152
|
+
this.config = config;
|
|
153
|
+
}
|
|
154
|
+
startSession(videoInfo, customData) {
|
|
155
|
+
this.sessionId = `ga_${Date.now()}`;
|
|
156
|
+
gtag('event', 'video_start', {
|
|
157
|
+
video_title: videoInfo.title,
|
|
158
|
+
video_id: videoInfo.id,
|
|
159
|
+
custom_parameter_1: customData?.userId
|
|
160
|
+
});
|
|
161
|
+
return this.sessionId;
|
|
162
|
+
}
|
|
163
|
+
async endSession() {
|
|
164
|
+
if (this.sessionId) {
|
|
165
|
+
gtag('event', 'video_end', {
|
|
166
|
+
session_id: this.sessionId
|
|
167
|
+
});
|
|
168
|
+
this.sessionId = null;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
trackEvent(event, playerState, videoInfo) {
|
|
172
|
+
gtag('event', `video_${event.eventType}`, {
|
|
173
|
+
video_id: event.videoId,
|
|
174
|
+
current_time: event.currentTime,
|
|
175
|
+
session_id: this.sessionId
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
trackCustomEvent(eventType, data) {
|
|
179
|
+
gtag('event', eventType, {
|
|
180
|
+
...data,
|
|
181
|
+
session_id: this.sessionId
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
async flush() {
|
|
185
|
+
}
|
|
186
|
+
getCurrentSession() {
|
|
187
|
+
return { sessionId: this.sessionId };
|
|
188
|
+
}
|
|
189
|
+
destroy() {
|
|
190
|
+
this.sessionId = null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export function createEnvironmentAnalytics() {
|
|
194
|
+
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
195
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
196
|
+
const config = {
|
|
197
|
+
enabled: !isDevelopment || process.env.ENABLE_DEV_ANALYTICS === 'true',
|
|
198
|
+
providers: [
|
|
199
|
+
{
|
|
200
|
+
name: 'player-analytics',
|
|
201
|
+
type: AnalyticsProviderType.PLAYER_ANALYTICS,
|
|
202
|
+
enabled: true,
|
|
203
|
+
priority: 1,
|
|
204
|
+
config: createPlayerAnalyticsProviderConfig(process.env.ANALYTICS_BASE_URL || 'https://api.flicknexs.com', process.env.ANALYTICS_API_KEY || '', process.env.PLAYER_ID || 'default-player', {
|
|
205
|
+
tenantId: process.env.TENANT_ID,
|
|
206
|
+
heartbeatInterval: isDevelopment ? 5 : 10,
|
|
207
|
+
batchSize: isDevelopment ? 5 : 10,
|
|
208
|
+
flushInterval: isDevelopment ? 15 : 30
|
|
209
|
+
})
|
|
210
|
+
}
|
|
211
|
+
],
|
|
212
|
+
globalSettings: {
|
|
213
|
+
enableConsoleLogging: isDevelopment,
|
|
214
|
+
enableErrorReporting: true,
|
|
215
|
+
sessionTimeout: isProduction ? 120 : 30
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
return createDynamicAnalyticsManager(config);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=DynamicAnalyticsExample.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicAnalyticsExample.js","sourceRoot":"","sources":["../../../src/analytics/examples/DynamicAnalyticsExample.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DynamicAnalyticsConfig } from './types/AnalyticsTypes';
|
|
2
|
+
import { DynamicAnalyticsManager } from './core/DynamicAnalyticsManager';
|
|
3
|
+
export { DynamicAnalyticsManager } from './core/DynamicAnalyticsManager';
|
|
4
|
+
export { PlayerAnalytics, createPlayerAnalytics } from './core/PlayerAnalytics';
|
|
5
|
+
export { EventBatcher, createEventBatcher } from './core/EventBatcher';
|
|
6
|
+
export { AnalyticsProvider, createAnalyticsProvider, getDefaultAnalyticsConfig, createPlayerAnalyticsProviderConfig, validateAnalyticsConfig, mergeAnalyticsConfigs } from './core/AnalyticsProvider';
|
|
7
|
+
export { PlayerAnalyticsAdapter } from './adapters/PlayerAnalyticsAdapter';
|
|
8
|
+
export * from './types/AnalyticsTypes';
|
|
9
|
+
export { DeviceDetection, deviceDetection } from './utils/DeviceDetection';
|
|
10
|
+
export declare function createDynamicAnalyticsManager(config: DynamicAnalyticsConfig): DynamicAnalyticsManager;
|
|
11
|
+
export { AnalyticsProviderType } from './types/AnalyticsTypes';
|
|
12
|
+
export type { DynamicAnalyticsConfig, PlayerAnalyticsConfig, AnalyticsEventData, VideoInfo, PlayerState, DeviceInfo, EngagementData, PlayerSessionInfo, AnalyticsEventType, BaseAnalyticsProvider } from './types/AnalyticsTypes';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,mCAAmC,EACnC,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAG3E,cAAc,wBAAwB,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG3E,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,sBAAsB,GAAG,uBAAuB,CAErG;AAGD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DynamicAnalyticsManager } from './core/DynamicAnalyticsManager';
|
|
2
|
+
export { DynamicAnalyticsManager } from './core/DynamicAnalyticsManager';
|
|
3
|
+
export { PlayerAnalytics, createPlayerAnalytics } from './core/PlayerAnalytics';
|
|
4
|
+
export { EventBatcher, createEventBatcher } from './core/EventBatcher';
|
|
5
|
+
export { AnalyticsProvider, createAnalyticsProvider, getDefaultAnalyticsConfig, createPlayerAnalyticsProviderConfig, validateAnalyticsConfig, mergeAnalyticsConfigs } from './core/AnalyticsProvider';
|
|
6
|
+
export { PlayerAnalyticsAdapter } from './adapters/PlayerAnalyticsAdapter';
|
|
7
|
+
export * from './types/AnalyticsTypes';
|
|
8
|
+
export { DeviceDetection, deviceDetection } from './utils/DeviceDetection';
|
|
9
|
+
export function createDynamicAnalyticsManager(config) {
|
|
10
|
+
return new DynamicAnalyticsManager(config);
|
|
11
|
+
}
|
|
12
|
+
export { AnalyticsProviderType } from './types/AnalyticsTypes';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,mCAAmC,EACnC,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAG3E,cAAc,wBAAwB,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG3E,MAAM,UAAU,6BAA6B,CAAC,MAA8B;IAC1E,OAAO,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAGD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
export interface AnalyticsConfig {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
providers: AnalyticsProviderConfig[];
|
|
4
|
+
globalSettings?: GlobalAnalyticsSettings;
|
|
5
|
+
}
|
|
6
|
+
export interface DynamicAnalyticsConfig extends AnalyticsConfig {
|
|
7
|
+
providers: DynamicProviderConfig[];
|
|
8
|
+
}
|
|
9
|
+
export interface GlobalAnalyticsSettings {
|
|
10
|
+
enableConsoleLogging?: boolean;
|
|
11
|
+
enableErrorReporting?: boolean;
|
|
12
|
+
sessionTimeout?: number;
|
|
13
|
+
defaultBatchSize?: number;
|
|
14
|
+
defaultFlushInterval?: number;
|
|
15
|
+
retryAttempts?: number;
|
|
16
|
+
retryDelay?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface AnalyticsProviderConfig {
|
|
19
|
+
name: string;
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
config: any;
|
|
22
|
+
}
|
|
23
|
+
export interface DynamicProviderConfig extends AnalyticsProviderConfig {
|
|
24
|
+
type: AnalyticsProviderType;
|
|
25
|
+
priority?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare enum AnalyticsProviderType {
|
|
28
|
+
PLAYER_ANALYTICS = "player-analytics",
|
|
29
|
+
GOOGLE_ANALYTICS = "google-analytics",
|
|
30
|
+
ADOBE_ANALYTICS = "adobe-analytics",
|
|
31
|
+
CUSTOM = "custom"
|
|
32
|
+
}
|
|
33
|
+
export interface PlayerAnalyticsConfig {
|
|
34
|
+
baseUrl: string;
|
|
35
|
+
apiKey: string;
|
|
36
|
+
playerId: string;
|
|
37
|
+
tenantId?: string;
|
|
38
|
+
heartbeatInterval?: number;
|
|
39
|
+
batchSize?: number;
|
|
40
|
+
flushInterval?: number;
|
|
41
|
+
enableOfflineStorage?: boolean;
|
|
42
|
+
maxRetries?: number;
|
|
43
|
+
retryDelay?: number;
|
|
44
|
+
}
|
|
45
|
+
export interface AnalyticsEventData {
|
|
46
|
+
eventType: string;
|
|
47
|
+
timestamp: number;
|
|
48
|
+
currentTime?: number;
|
|
49
|
+
video?: VideoInfo;
|
|
50
|
+
device?: DeviceInfo;
|
|
51
|
+
player?: PlayerState;
|
|
52
|
+
network?: NetworkInfo;
|
|
53
|
+
engagement?: EngagementData;
|
|
54
|
+
custom?: Record<string, any>;
|
|
55
|
+
metadata?: EventMetadata;
|
|
56
|
+
}
|
|
57
|
+
export interface EventMetadata {
|
|
58
|
+
sessionId: string;
|
|
59
|
+
playerId: string;
|
|
60
|
+
userId?: string;
|
|
61
|
+
customData?: Record<string, any>;
|
|
62
|
+
}
|
|
63
|
+
export interface VideoInfo {
|
|
64
|
+
id: string;
|
|
65
|
+
title?: string;
|
|
66
|
+
type: 'video' | 'audio' | 'livestream';
|
|
67
|
+
duration?: number;
|
|
68
|
+
url?: string;
|
|
69
|
+
quality?: string;
|
|
70
|
+
bitrate?: number;
|
|
71
|
+
codec?: string;
|
|
72
|
+
format?: string;
|
|
73
|
+
thumbnail?: string;
|
|
74
|
+
description?: string;
|
|
75
|
+
tags?: string[];
|
|
76
|
+
chapter?: ChapterInfo;
|
|
77
|
+
}
|
|
78
|
+
export interface ChapterInfo {
|
|
79
|
+
id: string;
|
|
80
|
+
title: string;
|
|
81
|
+
startTime: number;
|
|
82
|
+
endTime: number;
|
|
83
|
+
thumbnail?: string;
|
|
84
|
+
}
|
|
85
|
+
export interface DeviceInfo {
|
|
86
|
+
deviceType: 'mobile' | 'tablet' | 'desktop' | 'smart_tv' | 'tv';
|
|
87
|
+
os: string;
|
|
88
|
+
osVersion?: string;
|
|
89
|
+
browser?: string;
|
|
90
|
+
browserVersion?: string;
|
|
91
|
+
screen: {
|
|
92
|
+
width: number;
|
|
93
|
+
height: number;
|
|
94
|
+
orientation?: 'portrait' | 'landscape';
|
|
95
|
+
};
|
|
96
|
+
userAgent?: string;
|
|
97
|
+
language?: string;
|
|
98
|
+
timezone?: string;
|
|
99
|
+
}
|
|
100
|
+
export interface PlayerState {
|
|
101
|
+
currentTime: number;
|
|
102
|
+
duration: number;
|
|
103
|
+
volume: number;
|
|
104
|
+
muted: boolean;
|
|
105
|
+
playbackRate: number;
|
|
106
|
+
buffered?: TimeRanges | null;
|
|
107
|
+
quality?: string;
|
|
108
|
+
isFullscreen?: boolean;
|
|
109
|
+
isPip?: boolean;
|
|
110
|
+
isLive?: boolean;
|
|
111
|
+
seekableRange?: {
|
|
112
|
+
start: number;
|
|
113
|
+
end: number;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export interface NetworkInfo {
|
|
117
|
+
connectionType?: string;
|
|
118
|
+
effectiveType?: string;
|
|
119
|
+
downlink?: number;
|
|
120
|
+
rtt?: number;
|
|
121
|
+
online: boolean;
|
|
122
|
+
}
|
|
123
|
+
export interface EngagementData {
|
|
124
|
+
watchTime: number;
|
|
125
|
+
uniqueWatchTime: number;
|
|
126
|
+
completionPercentage: number;
|
|
127
|
+
seekCount: number;
|
|
128
|
+
qualityChangeCount: number;
|
|
129
|
+
fullscreenCount: number;
|
|
130
|
+
bufferingTime: number;
|
|
131
|
+
bufferingEvents: number;
|
|
132
|
+
averageBitrate?: number;
|
|
133
|
+
startupTime?: number;
|
|
134
|
+
rebufferCount: number;
|
|
135
|
+
errorCount: number;
|
|
136
|
+
interactionCount: number;
|
|
137
|
+
socialShares?: number;
|
|
138
|
+
likes?: number;
|
|
139
|
+
comments?: number;
|
|
140
|
+
}
|
|
141
|
+
export interface PlayerSessionInfo {
|
|
142
|
+
sessionId: string;
|
|
143
|
+
playerId: string;
|
|
144
|
+
startTime: number;
|
|
145
|
+
endTime?: number;
|
|
146
|
+
userId?: string;
|
|
147
|
+
userType?: string;
|
|
148
|
+
customData?: Record<string, any>;
|
|
149
|
+
initialVideo?: VideoInfo;
|
|
150
|
+
totalVideos?: number;
|
|
151
|
+
totalWatchTime?: number;
|
|
152
|
+
}
|
|
153
|
+
export type AnalyticsEventType = 'session_start' | 'session_end' | 'video_load' | 'video_start' | 'play' | 'pause' | 'resume' | 'ended' | 'seeking' | 'seeked' | 'waiting' | 'stalled' | 'canplay' | 'timeupdate' | 'heartbeat' | 'qualitychange' | 'volumechange' | 'fullscreenchange' | 'ratechange' | 'resize' | 'enterpictureinpicture' | 'leavepictureinpicture' | 'error' | 'custom';
|
|
154
|
+
export interface AnalyticsError {
|
|
155
|
+
code: string | number;
|
|
156
|
+
message: string;
|
|
157
|
+
stack?: string;
|
|
158
|
+
fatal?: boolean;
|
|
159
|
+
context?: Record<string, any>;
|
|
160
|
+
timestamp: number;
|
|
161
|
+
}
|
|
162
|
+
export interface BatchConfig {
|
|
163
|
+
maxSize: number;
|
|
164
|
+
flushInterval: number;
|
|
165
|
+
maxWaitTime: number;
|
|
166
|
+
retryAttempts: number;
|
|
167
|
+
retryDelay: number;
|
|
168
|
+
}
|
|
169
|
+
export interface AnalyticsRequest {
|
|
170
|
+
session: PlayerSessionInfo;
|
|
171
|
+
events: AnalyticsEventData[];
|
|
172
|
+
timestamp: number;
|
|
173
|
+
batchId?: string;
|
|
174
|
+
}
|
|
175
|
+
export interface AnalyticsResponse {
|
|
176
|
+
success: boolean;
|
|
177
|
+
message?: string;
|
|
178
|
+
errors?: string[];
|
|
179
|
+
batchId?: string;
|
|
180
|
+
processedCount?: number;
|
|
181
|
+
}
|
|
182
|
+
export interface ProviderFactory<T = any> {
|
|
183
|
+
(config: T): BaseAnalyticsProvider;
|
|
184
|
+
}
|
|
185
|
+
export interface CustomProviderConfig {
|
|
186
|
+
factory: ProviderFactory;
|
|
187
|
+
[key: string]: any;
|
|
188
|
+
}
|
|
189
|
+
export interface BaseAnalyticsProvider {
|
|
190
|
+
name: string;
|
|
191
|
+
enabled: boolean;
|
|
192
|
+
initialize(): Promise<void>;
|
|
193
|
+
trackEvent(event: AnalyticsEventData): Promise<void>;
|
|
194
|
+
startSession(sessionInfo: PlayerSessionInfo): Promise<string>;
|
|
195
|
+
endSession(): Promise<void>;
|
|
196
|
+
flush(): Promise<void>;
|
|
197
|
+
destroy(): Promise<void>;
|
|
198
|
+
}
|
|
199
|
+
export type DeepPartial<T> = {
|
|
200
|
+
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
201
|
+
};
|
|
202
|
+
export type EventHandler = (event: AnalyticsEventData) => void;
|
|
203
|
+
export type ErrorHandler = (error: AnalyticsError) => void;
|
|
204
|
+
export type SessionHandler = (sessionInfo: PlayerSessionInfo) => void;
|
|
205
|
+
export interface StorageItem {
|
|
206
|
+
id: string;
|
|
207
|
+
data: AnalyticsEventData;
|
|
208
|
+
timestamp: number;
|
|
209
|
+
attempts: number;
|
|
210
|
+
}
|
|
211
|
+
export interface StorageConfig {
|
|
212
|
+
maxItems: number;
|
|
213
|
+
maxAge: number;
|
|
214
|
+
storageKey: string;
|
|
215
|
+
}
|
|
216
|
+
export interface DeviceDetectionResult {
|
|
217
|
+
deviceType: DeviceInfo['deviceType'];
|
|
218
|
+
os: string;
|
|
219
|
+
osVersion?: string;
|
|
220
|
+
browser?: string;
|
|
221
|
+
browserVersion?: string;
|
|
222
|
+
screen: DeviceInfo['screen'];
|
|
223
|
+
userAgent: string;
|
|
224
|
+
isMobile: boolean;
|
|
225
|
+
isTablet: boolean;
|
|
226
|
+
isDesktop: boolean;
|
|
227
|
+
isSmartTV: boolean;
|
|
228
|
+
isTizen: boolean;
|
|
229
|
+
isWebOS: boolean;
|
|
230
|
+
isRoku: boolean;
|
|
231
|
+
}
|
|
232
|
+
export interface NetworkDetectionResult {
|
|
233
|
+
connectionType?: string;
|
|
234
|
+
effectiveType?: string;
|
|
235
|
+
downlink?: number;
|
|
236
|
+
rtt?: number;
|
|
237
|
+
online: boolean;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=AnalyticsTypes.d.ts.map
|