@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.
Files changed (43) hide show
  1. package/libEs5/components/LegacyMediaAnalytics/createMediaAnalyticsTracker.js +272 -0
  2. package/libEs5/components/LegacyMediaAnalytics/createMediaHelper.js +182 -0
  3. package/libEs5/components/LegacyMediaAnalytics/index.js +48 -0
  4. package/libEs5/components/LegacyMediaAnalytics/media/constants.js +154 -0
  5. package/libEs5/components/LegacyMediaAnalytics/media/mediaKeysToXdmConverter.js +51 -0
  6. package/libEs5/components/MediaCollection/createHeartbeatEngine.js +55 -0
  7. package/libEs5/components/MediaCollection/createMediaEventManager.js +119 -0
  8. package/libEs5/components/MediaCollection/createMediaRequest.js +30 -0
  9. package/libEs5/components/MediaCollection/createMediaRequestPayload.js +29 -0
  10. package/libEs5/components/MediaCollection/createMediaSessionCacheManager.js +62 -0
  11. package/libEs5/components/MediaCollection/createUpdateMediaSessionState.js +35 -0
  12. package/libEs5/components/MediaCollection/index.js +159 -0
  13. package/libEs5/components/MediaCollection/mediaConstants/mediaEvents.js +13 -0
  14. package/libEs5/components/MediaCollection/validateMediaEventOptions.js +35 -0
  15. package/libEs5/components/MediaCollection/validateMediaSessionOptions.js +36 -0
  16. package/libEs5/constants/libraryVersion.js +1 -1
  17. package/libEs5/core/componentCreators.js +3 -1
  18. package/libEs5/core/edgeNetwork/injectSendEdgeNetworkRequest.js +1 -1
  19. package/libEs5/utils/request/createRequest.js +8 -1
  20. package/libEs5/utils/validation/createMaximumValidator.js +22 -0
  21. package/libEs5/utils/validation/index.js +5 -0
  22. package/libEs6/components/LegacyMediaAnalytics/createMediaAnalyticsTracker.js +276 -0
  23. package/libEs6/components/LegacyMediaAnalytics/createMediaHelper.js +173 -0
  24. package/libEs6/components/LegacyMediaAnalytics/index.js +45 -0
  25. package/libEs6/components/LegacyMediaAnalytics/media/constants.js +140 -0
  26. package/libEs6/components/LegacyMediaAnalytics/media/mediaKeysToXdmConverter.js +46 -0
  27. package/libEs6/components/MediaCollection/createHeartbeatEngine.js +57 -0
  28. package/libEs6/components/MediaCollection/createMediaEventManager.js +122 -0
  29. package/libEs6/components/MediaCollection/createMediaRequest.js +28 -0
  30. package/libEs6/components/MediaCollection/createMediaRequestPayload.js +26 -0
  31. package/libEs6/components/MediaCollection/createMediaSessionCacheManager.js +63 -0
  32. package/libEs6/components/MediaCollection/createUpdateMediaSessionState.js +36 -0
  33. package/libEs6/components/MediaCollection/index.js +158 -0
  34. package/libEs6/components/MediaCollection/mediaConstants/mediaEvents.js +9 -0
  35. package/libEs6/components/MediaCollection/validateMediaEventOptions.js +32 -0
  36. package/libEs6/components/MediaCollection/validateMediaSessionOptions.js +34 -0
  37. package/libEs6/constants/libraryVersion.js +1 -1
  38. package/libEs6/core/componentCreators.js +3 -1
  39. package/libEs6/core/edgeNetwork/injectSendEdgeNetworkRequest.js +1 -1
  40. package/libEs6/utils/request/createRequest.js +8 -1
  41. package/libEs6/utils/validation/createMaximumValidator.js +16 -0
  42. package/libEs6/utils/validation/index.js +5 -0
  43. 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
+ };