Follow this guide to migrate from Adobe Media SDK to the latest Adobe Experience Platform Roku SDK.
Sections |
---|
Prerequisistes |
API comparison between SDKs |
Initialize SDK instance |
Start Media session |
Track Media events |
- Experience Data Model (XDM)
- Datastreams
- Getting Started with implementing Media tracking using AEP Roku SDK
- Setup schemas, datastream, dataset, Customer Journey Analytics (CJA) dashboard etc
Note
AEP Roku SDK has only two APIs for tracking media createMediaSession()
and sendMediaEvent()
.
Media SDK | AEP Roku SDK | Sample |
---|---|---|
mediaTrackSessionStart(mediaInfo,mediaContextData) |
createMediaSession(sessionStartXDM) |
SessionStart |
mediaTrackPlay() |
sendMediaEvent(playXDM) |
Play |
mediaTrackPause() |
sendMediaEvent(pauseStartXDM) |
Pause |
mediaTrackComplete() |
sendMediaEvent(sessionCompleteXDM) |
SessionComplete |
mediaTrackSessionEnd() |
sendMediaEvent(sessionEndXDM) |
SessionEnd |
Media SDK | AEP Roku SDK | Sample |
---|---|---|
mediaTrackEvent(ADBMobile().MEDIA_AD_BREAK_START, adBreakInfo, contextData) |
sendMediaEvent(adbreakStartXDM) |
AdBreakStart |
mediaTrackEvent(ADBMobile().MEDIA_AD_BREAK_COMPLETE, invalid, invalid) |
sendMediaEvent(adbreakCompleteXDM) |
AdBreakComplete |
mediaTrackEvent(ADBMobile().MEDIA_AD_START, adInfo, contextData) |
sendMediaEvent(adStartXDM) |
AdStart |
mediaTrackEvent(ADBMobile().MEDIA_AD_COMPLETE, invalid, invalid) |
sendMediaEvent(adCompleteXDM) |
AdComplete |
mediaTrackEvent(ADBMobile().MEDIA_AD_SKIP, invalid, invalid) |
sendMediaEvent(adSkipXDM) |
AdSkip |
Media SDK | AEP Roku SDK | Sample |
---|---|---|
mediaTrackEvent(ADBMobile().MEDIA_BUFFER_START, invalid, invalid) |
sendMediaEvent(bufferStartXDM) |
BufferStart |
mediaTrackEvent(ADBMobile().MEDIA_BUFFER_COMPLETE, invalid, invalid) |
sendMediaEvent(bufferCompleteXDM) |
BufferComplete |
mediaTrackEvent(ADBMobile().MEDIA_SEEK_START, invalid, invalid) |
sendMediaEvent(pauseStartXDM) |
SeekStart |
mediaTrackEvent(ADBMobile().MEDIA_SEEK_COMPLETE, invalid, invalid) |
sendMediaEvent(playXDM) |
SeekComplete |
Note
For tracking seek in AEP Roku SDK, use eventType pauseStart
with correct playhead. Media backend will detect seek based on change in playhead and timestamp values.
Media SDK | AEP Roku SDK | Sample |
---|---|---|
mediaTrackEvent(ADBMobile().MEDIA_CHAPTER_START, chapterInfo, chapterContextData) |
sendMediaEvent(chapterStartXDM) |
ChapterStart |
mediaTrackEvent(ADBMobile().MEDIA_CHAPTER_COMPLETE, invalid, invalid) |
sendMediaEvent(chapterCompleteXDM) |
ChapterComplete |
mediaTrackEvent(ADBMobile().MEDIA_CHAPTER_SKIP, invalid, invalid) |
sendMediaEvent(chapterSkipXDM) |
ChapterSkip |
Media SDK | AEP Roku SDK | Sample |
---|---|---|
mediaUpdateQoS(qosinfo) |
sendMediaEvent(bitrateChangeXDM) |
UpdateQoS |
mediaTrackEvent(ADBMobile().MEDIA_BITRATE_CHANGE) |
sendMediaEvent(bitrateChangeXDM) |
BitrateChange |
mediaTrackError(errorId, ADBMobile().ERROR_SOURCE_PLAYER) |
sendMediaEvent(errorXDM) |
Error |
Note
QoE info has to be attached to the xdmData when calling sendMediaEvent(bitrateChangeXDM)
for bitrateChange
event. QoE info can also be attached to any other event's xdm data the sendMediaEvent(eventXDM) API. Refer to the QoeDataDetails fieldgroup
Media SDK | AEP Roku SDK |
---|---|
mediaUpdatePlayhead(position) |
NA (sent with all the APIs in the xdm data) |
Media SDK | AEP Roku SDK |
---|---|
NA | sendMediaEvent(statesUpdateXDM) |
Media SDK | AEP Roku SDK |
---|---|
adb_media_init_mediainfo(title, id, length, streamType, mediaType) |
NA |
adb_media_init_adbreakinfo(title, startTime, position) |
NA |
adb_media_init_adinfo(title, id, position, duration) |
NA |
adb_media_init_chapterinfo(title, position, length, startTime) |
NA |
adb_media_init_qosinfo(bitrate, startupTime, fps, droppedFrames) |
NA |
Media SDK
' Create adbmobileTask node
m.adbmobileTask = createObject("roSGNode","adbmobileTask")
' Create SDK instance
m.adbmobile = ADBMobile().getADBMobileConnectorInstance(m.adbmobileTask)
AEP Roku SDK
' Create SDK instance
m.aepSdk = AdobeAEPSDKInit()
Note
AEP Roku SDK creates the taskNode internally.
Media SDK
' Use the helper method to create mediaInfo object
name = "mediaName"
id = "mediaId"
length = 10
streamType = ADBMobile().MEDIA_STREAM_TYPE_VOD
mediaType = ADBMobile().MEDIA_TYPE_VIDEO
mediaInfo = adb_media_init_mediainfo(name, id, length, streamType, mediaType)
' (Optional) Attach standard metadata if any
standardMetadata = {}
standardMetadata[ADBMobile().MEDIA_VideoMetadataKeySHOW] = "sample show"
mediaInfo[ADBMobile().MEDIA_STANDARD_MEDIA_METADATA] = standardMetadata
' (Optional) Create map for custom metadadata if any
mediaContextData = {}
mediaContextData["cmk1"] = "cmv1"
' Call mediaTrackSessionStart API
m.adbmobile.mediaTrackSessionStart(mediaInfo, mediaContextData)
AEP Roku SDK
Important
createMediaSession() API requires sessionDetails fieldgroup with all the required fields present in the request payload.
SessionDetails Fields (Required) |
---|
friendlyName |
name |
length |
contentType |
streamType |
channel |
playerName |
sessionDetails = {
' (Required)
"friendlyName": "mediaName",
"name": "mediaId",
"length": 10,
"contentType": "vod",
"streamType" : "video",
' (Required) Auto populated by the SDK based on Media configuration
"channel": "sampleChannel",
"playerName": "playerName,
' (Optional) Attach Standard metadata if any
"show": "sample show"
}
' (Optional) Create map for custom data if any
customMetadata = [
{
"name" : "cmk1",
"value" : "cmv1"
}
]
sessionStartXDM = {
"xdm": {
"eventType": "media.sessionStart"
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
"sessionDetails": sessionDetails,
"customMetadata": customMetadata
}
}
}
m.aepSdk.createMediaSession(sessionStartXDM)
Media SDK
m.adbmobile.mediaTrackPlay()
AEP Roku SDK
playXDM = {
"xdm": {
"eventType": "media.play",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(playXDM)
Media SDK
m.adbmobile.mediaTrackPause()
AEP Roku SDK
pauseStartXDM = {
"xdm": {
"eventType": "media.pauseStart",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
}
}
}
m.aepSdk.sendMediaEvent(pauseStartXDM)
Media SDK
m.adbmobile.mediaTrackComplete()
AEP Roku SDK
sessionCompleteXDM = {
"xdm": {
"eventType": "media.sessionComplete",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
}
}
}
m.aepSdk.sendMediaEvent(sessionCompleteXDM)
Media SDK
m.adbmobile.mediaTrackSessionEnd()
AEP Roku SDK
sessionEndXDM = {
"xdm": {
"eventType": "media.sessionEnd",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
}
}
}
m.aepSdk.sendMediaEvent(sessionEndXDM)
Media SDK
name = "adBreakName"
position = 1
startTime = 0
adBreakInfo = adb_media_init_adbreakinfo(name, position, startTime)
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_AD_BREAK_START, adBreakInfo, invalid)
AEP Roku SDK
Important
sendMediaEvent() API for event type media.adBreakStart
requires advertisingPodDetails fieldgroup with all the required fields present in the request payload.
AdvertisingPodDetails Fields (Required) |
---|
friendlyName |
index |
offset |
advertisingPodDetails = {
' (Required)
"friendlyName": "adBreakName",
"index": 1,
"offset": 0
}
adBreakStartXDM = {
"xdm": {
"eventType": "media.adBreakStart",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
"advertisingPodDetails": advertisingPodDetails
}
}
}
m.aepSdk.sendMediaEvent(adBreakStartXDM)
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_AD_BREAK_COMPLETE, invalid, invalid)
AEP Roku SDK
adBreakCompleteXDM = {
"xdm": {
"eventType": "media.adBreakComplete",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(adBreakCompleteXDM)
Media SDK
name = "adName"
position = 1
length = 10
startTime = 0
adInfo = adb_media_init_adinfo(name, position, startTime)
''' (Optional) Attach standard metadata if any
standardAdMetadata = {}
standardAdMetadata[ADBMobile().MEDIA_AdMetadataKeyCAMPAIGN_ID] = "sampleCampaignID"
adInfo[ADBMobile().MEDIA_STANDARD_AD_METADATA] = standardAdMetadata
''' (Optional) Create a map of custom metadata if any
adContextData = {}
adContextData["cmk1"] = "cmv1"
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_AD_START, adInfo, adContextData)
AEP Roku SDK
Important
sendMediaEvent() API for event type media.adStart
requires advertisingDetails fieldgroup with all the required fields present in the request payload.
AdvertisingDetails Fields (Required) |
---|
friendlyName |
name |
podPosition |
length |
playerName |
advertisingDetails = {
' (Required)
"friendlyName": "adName",
"name": "adId",
"podPosition": 1,
"length": 10,
"playerName": "samplePlayerName"
' (Optional) Attach Standard metadata if any
"campaignID": "sampleCampaignID"
}
' (Optional) Create map for custom data if any
customMetadata = [
{
"name" : "cmk1",
"value" : "cmv1"
}
]
adStartXDM = {
"xdm": {
"eventType": "media.adStart",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
"advertisingDetails": advertisingDetails,
"customMetadata": customMetadata
}
}
}
m.aepSdk.sendMediaEvent(adStartXDM)
Note
To learn more refer to the advertisingDetails XDM fieldgroup.
Media SDK
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_AD_COMPLETE, invalid, invalid)
AEP Roku SDK
adCompleteXDM = {
"xdm": {
"eventType": "media.adComplete",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(adCompleteXDM)
Media SDK
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_AD_SKIP, invalid, invalid)
AEP Roku SDK
adSkipXDM = {
"xdm": {
"eventType": "media.adSkip",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(adSkipXDM)
Media SDK
name = "chapterName"
position = 1
length = 10
startTime = 0
chapterInfo = adb_media_init_chapterinfo(name, position, length, startTime)
''' (Optional) Create a map of custom metadata if any
chapterContextData = {}
chapterContextData["cmk1"] = "cmv1"
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_CHAPTER_START, chapterInfo, chapterContextData)
AEP Roku SDK
Important
sendMediaEvent() API for event type media.chapterStart
requires chapterDetails fieldgroup with all the required fields present in the request payload.
ChapterDetails Fields (Required) |
---|
friendlyName |
index |
length |
offset |
chapterDetails = {
"friendlyName": "chapterName",
"index":1,
"length": 10,
"offset": 0
}
' (Optional) Create map for custom data if any
customMetadata = [
{
"name" : "cmk1",
"value" : "cmv1"
}
]
chapterStartXDM = {
"xdm": {
"eventType": "media.chapterStart",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
"chapterDetails": chapterDetails,
"customMetadata": customMetadata
}
}
}
m.aepSdk.sendMediaEvent(chapterStartXDM)
Note
To learn more refer to the chapterDetails XDM fieldgroup.
Media SDK
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_CHAPTER_COMPLETE, invalid, invalid)
AEP Roku SDK
chapterCompleteXDM = {
"xdm": {
"eventType": "media.chapterComplete",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(chapterCompleteXDM)
Media SDK
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_CHAPTER_SKIP, invalid, invalid)
AEP Roku SDK
chapterSkipXDM = {
"xdm": {
"eventType": "media.chapterSkip",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(chapterSkipXDM)
Media SDK
m.adbmobile.mediaTrackEvent(MEDIA_BUFFER_START, invalid, invalid)
AEP Roku SDK
bufferStartXDM = {
"xdm": {
"eventType": "media.bufferStart",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(bufferStartXDM)
Media SDK
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_BUFFER_COMPLETE, invalid, invalid)
AEP Roku SDK
bufferCompleteXDM = {
"xdm": {
"eventType": "media.bufferComplete",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(bufferCompleteXDM)
Important
Seeking is detected automatically by the backend using the playhead and timestamp value. So at the seek start, playback pauses and can be tracked as pauseStart
and when seek completes, playback resumes and can be tracked as play
.
Media SDK
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_SEEK_START, invalid, invalid)
AEP Roku SDK
seekStartXDM = {
"xdm": {
"eventType": "media.pauseStart",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(seekStartXDM)
Media SDK
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_SEEK_COMPLETE, invalid, invalid)
AEP Roku SDK
seekCompleteXDM = {
"xdm": {
"eventType": "media.play",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(seekCompleteXDM)
Media SDK
' Use the helper method to create mediaInfo object
bitrate = 200000
fps = 24
droppedFrames = 1
startupTime = 2
qosInfo = m.adbmobile.adb_media_init_qosinfo(bitrate, startupTime, fps, droppedFrames)
m.adbmobile.mediaUpdateQoS(qosInfo)
m.adbmobile.mediaTrackEvent(ADBMobile().MEDIA_BITRATE_CHANGE, invalid, invalid)
AEP Roku SDK
qoeDataDetails = {
"bitrate" : 200000,
"framesPerSecond" : 24,
"droppedFrames" : 1,
"timeToStart" : 2
}
bitrateChangeXDM = {
"xdm": {
"eventType": "media.bitrateChange",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
"qoeDataDetails": qoeDataDetails
}
}
}
m.aepSdk.sendMediaEvent(bitrateChangeXDM)
Media SDK
m.adbmobile.updateCurrentPlayhead(<CURRENT_PLAYHEAD_INTEGER_VALUE>)
AEP Roku SDK
Important
Playhead value is expected in the XDM data for all the API calls. AEP Roku SDK requires calling ping event with latest playhead value every second as a proxy for updateCurrentPlayhead API.
playheadUpdatePingXDM = {
"xdm": {
"eventType": "media.ping",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>
}
}
}
m.aepSdk.sendMediaEvent(playheadUpdatePingXDM)
Media SDK
' Use the helper method to create mediaInfo object
bitrate = 200000
fps = 24
droppedFrames = 1
startupTime = 2
qosInfo = m.adbmobile.adb_media_init_qosinfo(bitrate, startupTime, fps, droppedFrames)
m.adbmobile.mediaUpdateQoS(qosInfo)
AEP Roku SDK
Important
All the QoE field values should be of Integer
data type.
qoeDataDetails = {
"bitrate" : 200000,
"framesPerSecond" : 24,
"droppedFrames" : 1,
"timeToStart" : 2
}
bitrateChangeXDM = {
"xdm": {
"eventType": "media.bitrateChange",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
"qoeDataDetails": qoeDataDetails
}
}
}
m.aepSdk.sendMediaEvent(bitrateChangeXDM)
Note
To learn more refer to the qoeDataDetails XDM fieldgroup.
qoeDataDetails
is supported and can be attached to any event going out.
Following is the sample to send qoeDataDetails with play event:
playWithQoeXDM = {
"xdm": {
"eventType": "media.play",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
"qoeDataDetails": qoeDataDetails
}
}
}
m.aepSdk.sendMediaEvent(playWithQoeXDM)
Media SDK
m.adbmobile.mediaTrackError("errorId", "video-player-error-code")
AEP Roku SDK
errorDetails = {
"name": "errorId",
"source": "video-player-error-code"
}
errorXDM = {
"xdm": {
"eventType": "media.error",
"mediaCollection": {
"playhead": <CURRENT_PLAYHEAD_INTEGER_VALUE>,
"errorDetails": errorDetails
}
}
}
m.aepSdk.sendMediaEvent(errorXDM)
Note
To learn more refer to the errorDetails XDM fieldgroup.
Media SDK | AEP Roku SDK |
---|---|
MEDIA_STREAM_TYPE_VOD | "vod" |
MEDIA_STREAM_TYPE_LIVE | "live" |
MEDIA_STREAM_TYPE_LINEAR | "linear" |
MEDIA_STREAM_TYPE_AOD | "aod" |
MEDIA_STREAM_TYPE_AUDIOBOOK | "audiobook" |
MEDIA_STREAM_TYPE_PODCAST | "podcast" |
Media SDK | AEP Roku SDK |
---|---|
MEDIA_STREAM_TYPE_AUDIO | xdm:streamType |
MEDIA_STREAM_TYPE_VIDEO | xdm:streamType |
Media SDK | AEP Roku SDK |
---|---|
MEDIA_VideoMetadataKeyAD_LOAD | xdm:adLoad |
MEDIA_VideoMetadataKeyASSET_ID | xdm:assetID |
MEDIA_VideoMetadataKeyAUTHORIZED | xdm:authorized |
MEDIA_VideoMetadataKeyDAY_PART | xdm:dayPart |
MEDIA_VideoMetadataKeyEPISODE | xdm:episode |
MEDIA_VideoMetadataKeyFEED | xdm:feed |
MEDIA_VideoMetadataKeyFIRST_AIR_DATE | xdm:firstAirDate |
MEDIA_VideoMetadataKeyFIRST_DIGITAL_DATE | xdm:firstDigitalDate |
MEDIA_VideoMetadataKeyGENRE | xdm:genre |
MEDIA_VideoMetadataKeyMVPD | xdm:mvpd |
MEDIA_VideoMetadataKeyNETWORK | xdm:network |
MEDIA_VideoMetadataKeyORIGINATOR | xdm:originator |
MEDIA_VideoMetadataKeyRATING | xdm:rating |
MEDIA_VideoMetadataKeySEASON | xdm:season |
MEDIA_VideoMetadataKeySHOW | xdm:show |
MEDIA_VideoMetadataKeySHOW_TYPE | xdm:showType |
MEDIA_VideoMetadataKeySTREAM_FORMAT | xdm:streamFormat |
Media SDK | AEP Roku SDK |
---|---|
MEDIA_AudioMetadataKeyARTIST | xdm:artist |
MEDIA_AudioMetadataKeyAUTHOR | xdm:author |
MEDIA_AudioMetadataKeyLABEL | xdm:label |
MEDIA_AudioMetadataKeyPUBLISHER | xdm:publisher |
MEDIA_AudioMetadataKeySTATION | xdm:station |
Media SDK | AEP Roku SDK |
---|---|
MEDIA_AdMetadataKeyADVERTISER | xdm:advertiser |
MEDIA_AdMetadataKeyCAMPAIGN_ID | xdm:campaignID |
MEDIA_AdMetadataKeyCREATIVE_ID | xdm:creativeID |
MEDIA_AdMetadataKeyCREATIVE_URL | xdm:creativeURL |
MEDIA_AdMetadataKeyPLACEMENT_ID | xdm:placementID |
MEDIA_AdMetadataKeySITE_ID | xdm:siteID |