@adobe/alloy 2.19.1-beta.0 → 2.20.0-alpha.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/libEs5/components/LegacyMediaAnalytics/createMediaAnalyticsTracker.js +272 -0
- package/libEs5/components/LegacyMediaAnalytics/createMediaHelper.js +182 -0
- package/libEs5/components/LegacyMediaAnalytics/index.js +48 -0
- package/libEs5/components/LegacyMediaAnalytics/media/constants.js +154 -0
- package/libEs5/components/LegacyMediaAnalytics/media/mediaKeysToXdmConverter.js +51 -0
- package/libEs5/components/MediaCollection/createHeartbeatEngine.js +55 -0
- package/libEs5/components/MediaCollection/createMediaEventManager.js +119 -0
- package/libEs5/components/MediaCollection/createMediaRequest.js +30 -0
- package/libEs5/components/MediaCollection/createMediaRequestPayload.js +29 -0
- package/libEs5/components/MediaCollection/createMediaSessionCacheManager.js +62 -0
- package/libEs5/components/MediaCollection/createUpdateMediaSessionState.js +35 -0
- package/libEs5/components/MediaCollection/index.js +159 -0
- package/libEs5/components/MediaCollection/mediaConstants/mediaEvents.js +13 -0
- package/libEs5/components/MediaCollection/validateMediaEventOptions.js +35 -0
- package/libEs5/components/MediaCollection/validateMediaSessionOptions.js +36 -0
- package/libEs5/constants/libraryVersion.js +1 -1
- package/libEs5/core/componentCreators.js +3 -1
- package/libEs5/core/edgeNetwork/injectSendEdgeNetworkRequest.js +1 -1
- package/libEs5/utils/request/createRequest.js +8 -1
- package/libEs5/utils/validation/createMaximumValidator.js +22 -0
- package/libEs5/utils/validation/index.js +5 -0
- package/libEs6/components/LegacyMediaAnalytics/createMediaAnalyticsTracker.js +276 -0
- package/libEs6/components/LegacyMediaAnalytics/createMediaHelper.js +173 -0
- package/libEs6/components/LegacyMediaAnalytics/index.js +45 -0
- package/libEs6/components/LegacyMediaAnalytics/media/constants.js +140 -0
- package/libEs6/components/LegacyMediaAnalytics/media/mediaKeysToXdmConverter.js +46 -0
- package/libEs6/components/MediaCollection/createHeartbeatEngine.js +57 -0
- package/libEs6/components/MediaCollection/createMediaEventManager.js +122 -0
- package/libEs6/components/MediaCollection/createMediaRequest.js +28 -0
- package/libEs6/components/MediaCollection/createMediaRequestPayload.js +26 -0
- package/libEs6/components/MediaCollection/createMediaSessionCacheManager.js +63 -0
- package/libEs6/components/MediaCollection/createUpdateMediaSessionState.js +36 -0
- package/libEs6/components/MediaCollection/index.js +158 -0
- package/libEs6/components/MediaCollection/mediaConstants/mediaEvents.js +9 -0
- package/libEs6/components/MediaCollection/validateMediaEventOptions.js +32 -0
- package/libEs6/components/MediaCollection/validateMediaSessionOptions.js +34 -0
- package/libEs6/constants/libraryVersion.js +1 -1
- package/libEs6/core/componentCreators.js +3 -1
- package/libEs6/core/edgeNetwork/injectSendEdgeNetworkRequest.js +1 -1
- package/libEs6/utils/request/createRequest.js +8 -1
- package/libEs6/utils/validation/createMaximumValidator.js +16 -0
- package/libEs6/utils/validation/index.js +5 -0
- package/package.json +2 -2
|
@@ -10,6 +10,7 @@ var _createDeprecatedValidator = require("./createDeprecatedValidator");
|
|
|
10
10
|
var _createLiteralValidator = require("./createLiteralValidator");
|
|
11
11
|
var _createMapOfValuesValidator = require("./createMapOfValuesValidator");
|
|
12
12
|
var _createMinimumValidator = require("./createMinimumValidator");
|
|
13
|
+
var _createMaximumValidator = require("./createMaximumValidator");
|
|
13
14
|
var _createNoUnknownFieldsValidator = require("./createNoUnknownFieldsValidator");
|
|
14
15
|
var _createNonEmptyValidator = require("./createNonEmptyValidator");
|
|
15
16
|
var _createObjectOfValidator = require("./createObjectOfValidator");
|
|
@@ -116,6 +117,9 @@ var minimumInteger = function minimumInteger(minValue) {
|
|
|
116
117
|
var minimumNumber = function minimumNumber(minValue) {
|
|
117
118
|
return (0, _utils.nullSafeChain)(this, (0, _createMinimumValidator.default)("a number", minValue));
|
|
118
119
|
};
|
|
120
|
+
var maximumNumber = function maximumNumber(maxValue) {
|
|
121
|
+
return (0, _utils.nullSafeChain)(this, (0, _createMaximumValidator.default)("a number", maxValue));
|
|
122
|
+
};
|
|
119
123
|
var integer = function integer() {
|
|
120
124
|
return (0, _utils.nullSafeChain)(this, _integerValidator.default, {
|
|
121
125
|
minimum: minimumInteger
|
|
@@ -167,6 +171,7 @@ var literal = function literal(literalValue) {
|
|
|
167
171
|
var number = function number() {
|
|
168
172
|
return (0, _utils.nullSafeChain)(this, _numberValidator.default, {
|
|
169
173
|
minimum: minimumNumber,
|
|
174
|
+
maximum: maximumNumber,
|
|
170
175
|
integer: integer,
|
|
171
176
|
unique: unique
|
|
172
177
|
});
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2023 Adobe. All rights reserved.
|
|
3
|
+
This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
|
|
7
|
+
Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import defer from "../../utils/defer";
|
|
14
|
+
import { AdMetadataKeys, AudioMetadataKeys, mediaEvent as Event, MediaObjectKey, MediaType, PlayerState, StreamType, VideoMetadataKeys } from "./media/constants";
|
|
15
|
+
import { deepAssign, isEmptyObject, isNumber } from "../../utils";
|
|
16
|
+
import { adsToXdmKeys, mediaToXdmKeys } from "./media/mediaKeysToXdmConverter";
|
|
17
|
+
import { createMediaObject, createAdBreakObject, createAdObject, createChapterObject, createStateObject, createQoEObject } from "./createMediaHelper";
|
|
18
|
+
const convertSessionDetailsMetadataToXDM = contextData => {
|
|
19
|
+
const customMetadata = [];
|
|
20
|
+
const sessionDetails = {};
|
|
21
|
+
Object.keys(contextData).forEach(key => {
|
|
22
|
+
if (mediaToXdmKeys[key]) {
|
|
23
|
+
sessionDetails[mediaToXdmKeys[key]] = contextData[key];
|
|
24
|
+
} else {
|
|
25
|
+
customMetadata.push({
|
|
26
|
+
name: key,
|
|
27
|
+
value: contextData[key]
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
sessionDetails,
|
|
33
|
+
customMetadata
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const createMediaDetailsObject = ({
|
|
37
|
+
eventType,
|
|
38
|
+
info,
|
|
39
|
+
context
|
|
40
|
+
}) => {
|
|
41
|
+
const mediaDetails = info;
|
|
42
|
+
const customMetadata = [];
|
|
43
|
+
if (context && !isEmptyObject(context)) {
|
|
44
|
+
if (eventType === Event.AdStart) {
|
|
45
|
+
Object.keys(context).forEach(key => {
|
|
46
|
+
if (adsToXdmKeys[key]) {
|
|
47
|
+
mediaDetails.advertisingDetails[mediaToXdmKeys[key]] = context[key];
|
|
48
|
+
} else {
|
|
49
|
+
customMetadata.push({
|
|
50
|
+
name: key,
|
|
51
|
+
value: context[key]
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
} else {
|
|
56
|
+
Object.keys(context).forEach(key => {
|
|
57
|
+
customMetadata.push({
|
|
58
|
+
name: key,
|
|
59
|
+
value: context[key]
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
mediaDetails.customMetadata = customMetadata;
|
|
64
|
+
}
|
|
65
|
+
return mediaDetails;
|
|
66
|
+
};
|
|
67
|
+
const createHeartbeat = ({
|
|
68
|
+
mainPingInterval,
|
|
69
|
+
playerState,
|
|
70
|
+
trackEvent
|
|
71
|
+
}) => {
|
|
72
|
+
// eslint-disable-next-line consistent-return
|
|
73
|
+
return () => {
|
|
74
|
+
const currentTime = Date.now();
|
|
75
|
+
if (Math.abs(currentTime - playerState.latestTriggeredEvent) / 1000 > mainPingInterval) {
|
|
76
|
+
return trackEvent({
|
|
77
|
+
eventType: "ping"
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
const createGetInstance = ({
|
|
83
|
+
config,
|
|
84
|
+
logger,
|
|
85
|
+
mediaEventManager
|
|
86
|
+
}) => {
|
|
87
|
+
const {
|
|
88
|
+
mainPingInterval
|
|
89
|
+
} = config.mediaCollection;
|
|
90
|
+
const trackerState = {
|
|
91
|
+
qoe: null,
|
|
92
|
+
lastPlayhead: 0,
|
|
93
|
+
latestTriggeredEvent: null
|
|
94
|
+
};
|
|
95
|
+
let ticker;
|
|
96
|
+
let deferSession = defer();
|
|
97
|
+
const updateLastTimeEventTriggered = () => {
|
|
98
|
+
trackerState.latestTriggeredEvent = Date.now();
|
|
99
|
+
};
|
|
100
|
+
const getEventType = ({
|
|
101
|
+
eventType
|
|
102
|
+
}) => {
|
|
103
|
+
if (eventType === Event.BufferComplete) {
|
|
104
|
+
return `media.${Event.Play}`;
|
|
105
|
+
}
|
|
106
|
+
return `media.${eventType}`;
|
|
107
|
+
};
|
|
108
|
+
const trackEvent = ({
|
|
109
|
+
eventType,
|
|
110
|
+
mediaDetails
|
|
111
|
+
}) => {
|
|
112
|
+
return deferSession.promise.then(sessionID => {
|
|
113
|
+
const xdm = {
|
|
114
|
+
eventType: getEventType({
|
|
115
|
+
eventType
|
|
116
|
+
}),
|
|
117
|
+
mediaCollection: {
|
|
118
|
+
sessionID,
|
|
119
|
+
playhead: trackerState.lastPlayhead
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
deepAssign(xdm.mediaCollection, mediaDetails);
|
|
123
|
+
const event = mediaEventManager.createMediaEvent({
|
|
124
|
+
options: {
|
|
125
|
+
xdm
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return mediaEventManager.trackMediaEvent({
|
|
129
|
+
event
|
|
130
|
+
}).then(() => {
|
|
131
|
+
updateLastTimeEventTriggered();
|
|
132
|
+
});
|
|
133
|
+
}).catch(error => {
|
|
134
|
+
logger.info(error);
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
const heartbeatEngine = createHeartbeat({
|
|
138
|
+
mainPingInterval,
|
|
139
|
+
deferSession,
|
|
140
|
+
playerState: trackerState,
|
|
141
|
+
trackEvent
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
trackSessionStart: (mediaObject, contextData = {}) => {
|
|
145
|
+
if (isEmptyObject(mediaObject)) {
|
|
146
|
+
deferSession.reject("invalid media object");
|
|
147
|
+
return {};
|
|
148
|
+
}
|
|
149
|
+
const mediaCollection = {
|
|
150
|
+
playhead: 0
|
|
151
|
+
};
|
|
152
|
+
const {
|
|
153
|
+
sessionDetails,
|
|
154
|
+
customMetadata
|
|
155
|
+
} = convertSessionDetailsMetadataToXDM(contextData);
|
|
156
|
+
deepAssign(mediaCollection, mediaObject, {
|
|
157
|
+
sessionDetails
|
|
158
|
+
}, {
|
|
159
|
+
customMetadata
|
|
160
|
+
});
|
|
161
|
+
const event = mediaEventManager.createMediaSession({
|
|
162
|
+
xdm: {
|
|
163
|
+
mediaCollection
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
return mediaEventManager.trackMediaSession({
|
|
167
|
+
event
|
|
168
|
+
}).then(result => {
|
|
169
|
+
updateLastTimeEventTriggered();
|
|
170
|
+
deferSession.resolve(result.sessionId);
|
|
171
|
+
ticker = setInterval(() => {
|
|
172
|
+
heartbeatEngine();
|
|
173
|
+
}, 1000);
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
trackPlay: () => {
|
|
177
|
+
return trackEvent({
|
|
178
|
+
eventType: Event.Play
|
|
179
|
+
});
|
|
180
|
+
},
|
|
181
|
+
trackPause: () => {
|
|
182
|
+
return trackEvent({
|
|
183
|
+
eventType: Event.Pause
|
|
184
|
+
});
|
|
185
|
+
},
|
|
186
|
+
trackSessionEnd: () => {
|
|
187
|
+
clearInterval(ticker);
|
|
188
|
+
return trackEvent({
|
|
189
|
+
eventType: Event.SessionEnd
|
|
190
|
+
}).then(() => {
|
|
191
|
+
deferSession = null;
|
|
192
|
+
});
|
|
193
|
+
},
|
|
194
|
+
trackComplete: () => {
|
|
195
|
+
clearInterval(ticker);
|
|
196
|
+
return trackEvent({
|
|
197
|
+
eventType: Event.SessionComplete
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
trackError: errorId => {
|
|
201
|
+
logger.info(`trackError(${errorId})`);
|
|
202
|
+
const errorDetails = {
|
|
203
|
+
name: errorId,
|
|
204
|
+
source: "player"
|
|
205
|
+
};
|
|
206
|
+
const mediaDetails = {
|
|
207
|
+
errorDetails
|
|
208
|
+
};
|
|
209
|
+
return trackEvent({
|
|
210
|
+
eventType: Event.SessionEnd,
|
|
211
|
+
mediaDetails
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
trackEvent: (eventType, info, context) => {
|
|
215
|
+
if (isEmptyObject(info)) {
|
|
216
|
+
logger.info("invalid media object");
|
|
217
|
+
return {};
|
|
218
|
+
}
|
|
219
|
+
const mediaDetails = createMediaDetailsObject({
|
|
220
|
+
eventType,
|
|
221
|
+
info,
|
|
222
|
+
context
|
|
223
|
+
});
|
|
224
|
+
return trackEvent({
|
|
225
|
+
eventType,
|
|
226
|
+
mediaDetails
|
|
227
|
+
});
|
|
228
|
+
},
|
|
229
|
+
updatePlayhead: time => {
|
|
230
|
+
if (isNumber(time)) {
|
|
231
|
+
trackerState.lastPlayhead = parseInt(time, 10);
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
updateQoEObject: qoeObject => {
|
|
235
|
+
if (!qoeObject) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
trackerState.qoe = qoeObject;
|
|
239
|
+
},
|
|
240
|
+
destroy: () => {
|
|
241
|
+
logger.info("Destroy called, destroying the tracker");
|
|
242
|
+
clearInterval(ticker);
|
|
243
|
+
deferSession = null;
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
export const createMediaAnalyticsTracker = ({
|
|
248
|
+
config,
|
|
249
|
+
logger,
|
|
250
|
+
mediaEventManager
|
|
251
|
+
}) => {
|
|
252
|
+
logger.info("Media Analytics Component was configured");
|
|
253
|
+
return {
|
|
254
|
+
getInstance: () => {
|
|
255
|
+
return createGetInstance({
|
|
256
|
+
config,
|
|
257
|
+
logger,
|
|
258
|
+
mediaEventManager
|
|
259
|
+
});
|
|
260
|
+
},
|
|
261
|
+
Event,
|
|
262
|
+
MediaType,
|
|
263
|
+
PlayerState,
|
|
264
|
+
StreamType,
|
|
265
|
+
MediaObjectKey,
|
|
266
|
+
VideoMetadataKeys,
|
|
267
|
+
AudioMetadataKeys,
|
|
268
|
+
AdMetadataKeys,
|
|
269
|
+
createMediaObject,
|
|
270
|
+
createAdBreakObject,
|
|
271
|
+
createAdObject,
|
|
272
|
+
createChapterObject,
|
|
273
|
+
createStateObject,
|
|
274
|
+
createQoEObject
|
|
275
|
+
};
|
|
276
|
+
};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2023 Adobe. All rights reserved.
|
|
3
|
+
This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
|
|
7
|
+
Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { number, objectOf, string } from "../../utils/validation";
|
|
14
|
+
export const createMediaObject = (friendlyName, name, length, contentType, streamType) => {
|
|
15
|
+
const mediaObject = {
|
|
16
|
+
friendlyName,
|
|
17
|
+
name,
|
|
18
|
+
length,
|
|
19
|
+
streamType,
|
|
20
|
+
contentType
|
|
21
|
+
};
|
|
22
|
+
const validate = objectOf({
|
|
23
|
+
friendlyName: string().nonEmpty(),
|
|
24
|
+
name: string().nonEmpty(),
|
|
25
|
+
length: number().required(),
|
|
26
|
+
streamType: string().nonEmpty(),
|
|
27
|
+
contentType: string().nonEmpty()
|
|
28
|
+
});
|
|
29
|
+
try {
|
|
30
|
+
const result = validate(mediaObject);
|
|
31
|
+
const sessionDetails = {
|
|
32
|
+
name: result.name,
|
|
33
|
+
friendlyName: result.friendlyName,
|
|
34
|
+
length: result.length,
|
|
35
|
+
streamType: result.streamType,
|
|
36
|
+
contentType: result.contentType
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
sessionDetails
|
|
40
|
+
};
|
|
41
|
+
} catch (error) {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
export const createAdBreakObject = (name, position, startTime) => {
|
|
46
|
+
const adBreakObject = {
|
|
47
|
+
friendlyName: name,
|
|
48
|
+
offset: position,
|
|
49
|
+
index: startTime
|
|
50
|
+
};
|
|
51
|
+
const validator = objectOf({
|
|
52
|
+
friendlyName: string().nonEmpty(),
|
|
53
|
+
offset: number(),
|
|
54
|
+
index: number()
|
|
55
|
+
});
|
|
56
|
+
try {
|
|
57
|
+
const result = validator(adBreakObject);
|
|
58
|
+
const advertisingPodDetails = {
|
|
59
|
+
friendlyName: result.friendlyName,
|
|
60
|
+
offset: result.offset,
|
|
61
|
+
index: result.index
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
advertisingPodDetails
|
|
65
|
+
};
|
|
66
|
+
} catch (error) {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
export const createAdObject = (name, id, position, length) => {
|
|
71
|
+
const adObject = {
|
|
72
|
+
friendlyName: name,
|
|
73
|
+
name: id,
|
|
74
|
+
podPosition: position,
|
|
75
|
+
length
|
|
76
|
+
};
|
|
77
|
+
const validator = objectOf({
|
|
78
|
+
friendlyName: string().nonEmpty(),
|
|
79
|
+
name: string().nonEmpty(),
|
|
80
|
+
podPosition: number(),
|
|
81
|
+
length: number()
|
|
82
|
+
});
|
|
83
|
+
try {
|
|
84
|
+
const result = validator(adObject);
|
|
85
|
+
const advertisingDetails = {
|
|
86
|
+
friendlyName: result.friendlyName,
|
|
87
|
+
name: result.name,
|
|
88
|
+
podPosition: result.podPosition,
|
|
89
|
+
length: result.length
|
|
90
|
+
};
|
|
91
|
+
return {
|
|
92
|
+
advertisingDetails
|
|
93
|
+
};
|
|
94
|
+
} catch (error) {
|
|
95
|
+
return {};
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
export const createChapterObject = (name, position, length, startTime) => {
|
|
99
|
+
const chapterDetailsObject = {
|
|
100
|
+
friendlyName: name,
|
|
101
|
+
offset: position,
|
|
102
|
+
length,
|
|
103
|
+
index: startTime
|
|
104
|
+
};
|
|
105
|
+
const validator = objectOf({
|
|
106
|
+
friendlyName: string().nonEmpty(),
|
|
107
|
+
offset: number(),
|
|
108
|
+
length: number(),
|
|
109
|
+
index: number()
|
|
110
|
+
});
|
|
111
|
+
try {
|
|
112
|
+
const result = validator(chapterDetailsObject);
|
|
113
|
+
const chapterDetails = {
|
|
114
|
+
friendlyName: result.friendlyName,
|
|
115
|
+
offset: result.offset,
|
|
116
|
+
index: result.index,
|
|
117
|
+
length: result.length
|
|
118
|
+
};
|
|
119
|
+
return {
|
|
120
|
+
chapterDetails
|
|
121
|
+
};
|
|
122
|
+
} catch (error) {
|
|
123
|
+
return {};
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
export const createStateObject = stateName => {
|
|
127
|
+
const STATE_NAME_REGEX = new RegExp("^[a-zA-Z0-9_\\.]{1,64}$");
|
|
128
|
+
const state = {
|
|
129
|
+
state: stateName
|
|
130
|
+
};
|
|
131
|
+
const validator = objectOf({
|
|
132
|
+
state: string().regexp(STATE_NAME_REGEX)
|
|
133
|
+
});
|
|
134
|
+
try {
|
|
135
|
+
const result = validator(state);
|
|
136
|
+
const stateDetails = {
|
|
137
|
+
name: result.name
|
|
138
|
+
};
|
|
139
|
+
return {
|
|
140
|
+
stateDetails
|
|
141
|
+
};
|
|
142
|
+
} catch (error) {
|
|
143
|
+
return {};
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
export const createQoEObject = (bitrate, droppedFrames, fps, startupTime) => {
|
|
147
|
+
const qoeObject = {
|
|
148
|
+
bitrate,
|
|
149
|
+
droppedFrames,
|
|
150
|
+
fps,
|
|
151
|
+
startupTime
|
|
152
|
+
};
|
|
153
|
+
const validator = objectOf({
|
|
154
|
+
bitrate: number(),
|
|
155
|
+
droppedFrames: number(),
|
|
156
|
+
fps: number(),
|
|
157
|
+
startupTime: number()
|
|
158
|
+
});
|
|
159
|
+
try {
|
|
160
|
+
const result = validator(qoeObject);
|
|
161
|
+
const qoeDetails = {
|
|
162
|
+
bitrate: result.bitrate,
|
|
163
|
+
droppedFrames: result.droppedFrames,
|
|
164
|
+
fps: result.fps,
|
|
165
|
+
startupTime: result.startupTime
|
|
166
|
+
};
|
|
167
|
+
return {
|
|
168
|
+
qoeDetails
|
|
169
|
+
};
|
|
170
|
+
} catch (error) {
|
|
171
|
+
return {};
|
|
172
|
+
}
|
|
173
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2023 Adobe. All rights reserved.
|
|
3
|
+
This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
|
|
7
|
+
Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
/* eslint-disable import/no-restricted-paths */
|
|
13
|
+
|
|
14
|
+
import { createMediaAnalyticsTracker } from "./createMediaAnalyticsTracker";
|
|
15
|
+
import createMediaEventManager from "../MediaCollection/createMediaEventManager";
|
|
16
|
+
const createLegacyMediaAnalytics = ({
|
|
17
|
+
eventManager,
|
|
18
|
+
sendEdgeNetworkRequest,
|
|
19
|
+
config,
|
|
20
|
+
logger,
|
|
21
|
+
consent
|
|
22
|
+
}) => {
|
|
23
|
+
const mediaEventManager = createMediaEventManager({
|
|
24
|
+
sendEdgeNetworkRequest,
|
|
25
|
+
config,
|
|
26
|
+
logger,
|
|
27
|
+
consent,
|
|
28
|
+
eventManager
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
commands: {
|
|
32
|
+
getMediaAnalyticsTracker: {
|
|
33
|
+
run: () => {
|
|
34
|
+
return createMediaAnalyticsTracker({
|
|
35
|
+
config,
|
|
36
|
+
logger,
|
|
37
|
+
mediaEventManager
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
createLegacyMediaAnalytics.namespace = "Legacy Media Analytics";
|
|
45
|
+
export default createLegacyMediaAnalytics;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2023 Adobe. All rights reserved.
|
|
3
|
+
This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
|
|
7
|
+
Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export const MediaType = {
|
|
14
|
+
Video: "video",
|
|
15
|
+
Audio: "audio"
|
|
16
|
+
};
|
|
17
|
+
export const StreamType = {
|
|
18
|
+
VOD: "vod",
|
|
19
|
+
Live: "live",
|
|
20
|
+
Linear: "linear",
|
|
21
|
+
Podcast: "podcast",
|
|
22
|
+
Audiobook: "audiobook",
|
|
23
|
+
AOD: "aod"
|
|
24
|
+
};
|
|
25
|
+
export const PlayerState = {
|
|
26
|
+
FullScreen: "fullScreen",
|
|
27
|
+
ClosedCaption: "closedCaptioning",
|
|
28
|
+
Mute: "mute",
|
|
29
|
+
PictureInPicture: "pictureInPicture",
|
|
30
|
+
InFocus: "inFocus"
|
|
31
|
+
};
|
|
32
|
+
export const Event = {
|
|
33
|
+
/**
|
|
34
|
+
* Constant defining event type for AdBreak start
|
|
35
|
+
*/
|
|
36
|
+
AdBreakStart: "adBreakStart",
|
|
37
|
+
/**
|
|
38
|
+
* Constant defining event type for AdBreak complete
|
|
39
|
+
*/
|
|
40
|
+
AdBreakComplete: "adBreakComplete",
|
|
41
|
+
/**
|
|
42
|
+
* Constant defining event type for Ad start
|
|
43
|
+
*/
|
|
44
|
+
AdStart: "adStart",
|
|
45
|
+
/**
|
|
46
|
+
* Constant defining event type for Ad complete
|
|
47
|
+
*/
|
|
48
|
+
AdComplete: "adComplete",
|
|
49
|
+
/**
|
|
50
|
+
* Constant defining event type for Ad skip
|
|
51
|
+
*/
|
|
52
|
+
AdSkip: "adSkip",
|
|
53
|
+
/**
|
|
54
|
+
* Constant defining event type for Chapter start
|
|
55
|
+
*/
|
|
56
|
+
ChapterStart: "chapterStart",
|
|
57
|
+
/**
|
|
58
|
+
* Constant defining event type for Chapter complete
|
|
59
|
+
*/
|
|
60
|
+
ChapterComplete: "chapterComplete",
|
|
61
|
+
/**
|
|
62
|
+
* Constant defining event type for Chapter skip
|
|
63
|
+
*/
|
|
64
|
+
ChapterSkip: "chapterSkip",
|
|
65
|
+
/**
|
|
66
|
+
* Constant defining event type for Seek start
|
|
67
|
+
*/
|
|
68
|
+
SeekStart: "seekStart",
|
|
69
|
+
/**
|
|
70
|
+
* Constant defining event type for Seek complete
|
|
71
|
+
*/
|
|
72
|
+
SeekComplete: "seekComplete",
|
|
73
|
+
/**
|
|
74
|
+
* Constant defining event type for Buffer start
|
|
75
|
+
*/
|
|
76
|
+
BufferStart: "bufferStart",
|
|
77
|
+
/**
|
|
78
|
+
* Constant defining event type for Buffer complete
|
|
79
|
+
*/
|
|
80
|
+
BufferComplete: "bufferComplete",
|
|
81
|
+
/**
|
|
82
|
+
* Constant defining event type for change in Bitrate
|
|
83
|
+
*/
|
|
84
|
+
BitrateChange: "bitrateChange",
|
|
85
|
+
/**
|
|
86
|
+
* Constant defining event type for Custom State Start
|
|
87
|
+
*/
|
|
88
|
+
StateStart: "stateStart",
|
|
89
|
+
/**
|
|
90
|
+
* Constant defining event type for Custom State End
|
|
91
|
+
*/
|
|
92
|
+
StateEnd: "stateEnd"
|
|
93
|
+
};
|
|
94
|
+
export const mediaEvent = {
|
|
95
|
+
SessionStart: "sessionStart",
|
|
96
|
+
SessionEnd: "sessionEnd",
|
|
97
|
+
SessionComplete: "sessionComplete",
|
|
98
|
+
Play: "play",
|
|
99
|
+
Pause: "pauseStart",
|
|
100
|
+
...Event
|
|
101
|
+
};
|
|
102
|
+
export const MediaObjectKey = {
|
|
103
|
+
MediaResumed: "media.resumed",
|
|
104
|
+
GranularAdTracking: "media.granularadtracking"
|
|
105
|
+
};
|
|
106
|
+
export const VideoMetadataKeys = {
|
|
107
|
+
Show: "a.media.show",
|
|
108
|
+
Season: "a.media.season",
|
|
109
|
+
Episode: "a.media.episode",
|
|
110
|
+
AssetId: "a.media.asset",
|
|
111
|
+
Genre: "a.media.genre",
|
|
112
|
+
FirstAirDate: "a.media.airDate",
|
|
113
|
+
FirstDigitalDate: "a.media.digitalDate",
|
|
114
|
+
Rating: "a.media.rating",
|
|
115
|
+
Originator: "a.media.originator",
|
|
116
|
+
Network: "a.media.network",
|
|
117
|
+
ShowType: "a.media.type",
|
|
118
|
+
AdLoad: "a.media.adLoad",
|
|
119
|
+
MVPD: "a.media.pass.mvpd",
|
|
120
|
+
Authorized: "a.media.pass.auth",
|
|
121
|
+
DayPart: "a.media.dayPart",
|
|
122
|
+
Feed: "a.media.feed",
|
|
123
|
+
StreamFormat: "a.media.format"
|
|
124
|
+
};
|
|
125
|
+
export const AudioMetadataKeys = {
|
|
126
|
+
Artist: "a.media.artist",
|
|
127
|
+
Album: "a.media.album",
|
|
128
|
+
Label: "a.media.label",
|
|
129
|
+
Author: "a.media.author",
|
|
130
|
+
Station: "a.media.station",
|
|
131
|
+
Publisher: "a.media.publisher"
|
|
132
|
+
};
|
|
133
|
+
export const AdMetadataKeys = {
|
|
134
|
+
Advertiser: "a.media.ad.advertiser",
|
|
135
|
+
CampaignId: "a.media.ad.campaign",
|
|
136
|
+
CreativeId: "a.media.ad.creative",
|
|
137
|
+
PlacementId: "a.media.ad.placement",
|
|
138
|
+
SiteId: "a.media.ad.site",
|
|
139
|
+
CreativeUrl: "a.media.ad.creativeURL"
|
|
140
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2023 Adobe. All rights reserved.
|
|
3
|
+
This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
|
|
7
|
+
Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export const mediaToXdmKeys = {
|
|
14
|
+
"a.media.show": "show",
|
|
15
|
+
"a.media.season": "season",
|
|
16
|
+
"a.media.episode": "episode",
|
|
17
|
+
"a.media.asset": "assetID",
|
|
18
|
+
"a.media.genre": "genre",
|
|
19
|
+
"a.media.airDate": "firstAirDate",
|
|
20
|
+
"a.media.digitalDate": "firstDigitalDate",
|
|
21
|
+
"a.media.rating": "rating",
|
|
22
|
+
"a.media.originator": "originator",
|
|
23
|
+
"a.media.network": "network",
|
|
24
|
+
"a.media.type": "showType",
|
|
25
|
+
"a.media.adLoad": "adLoad",
|
|
26
|
+
"a.media.pass.mvpd": "mvpd",
|
|
27
|
+
"a.media.pass.auth": "authorized",
|
|
28
|
+
"a.media.dayPart": "dayPart",
|
|
29
|
+
"a.media.feed": "feed",
|
|
30
|
+
"a.media.format": "streamFormat",
|
|
31
|
+
"a.media.artist": "artist",
|
|
32
|
+
"a.media.album": "album",
|
|
33
|
+
"a.media.label": "label",
|
|
34
|
+
"a.media.author": "author",
|
|
35
|
+
"a.media.station": "station",
|
|
36
|
+
"a.media.publisher": "publisher",
|
|
37
|
+
"media.resumed": "hasResume"
|
|
38
|
+
};
|
|
39
|
+
export const adsToXdmKeys = {
|
|
40
|
+
"a.media.ad.advertiser": "advertiser",
|
|
41
|
+
"a.media.ad.campaign": "campaignID",
|
|
42
|
+
"a.media.ad.creative": "creativeID",
|
|
43
|
+
"a.media.ad.placement": "placementID",
|
|
44
|
+
"a.media.ad.site": "siteID",
|
|
45
|
+
"a.media.ad.creativeURL": "creativeURL"
|
|
46
|
+
};
|