From 7672e38fa6c89db65cf66d9e9c9d29aeae652753 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 5 Jan 2026 10:34:42 +0100 Subject: [PATCH 1/5] Extract NA prop value --- adobe/ios/Connector/AdobeConnector.swift | 5 +++-- adobe/src/internal/DefaultAdobeConnectorAdapter.ts | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/adobe/ios/Connector/AdobeConnector.swift b/adobe/ios/Connector/AdobeConnector.swift index d905ccbf..51142192 100644 --- a/adobe/ios/Connector/AdobeConnector.swift +++ b/adobe/ios/Connector/AdobeConnector.swift @@ -14,6 +14,7 @@ enum ContentType: String { let CONTENT_PING_INTERVAL = 10.0 let AD_PING_INTERVAL = 1.0 +let NA = "N/A" class AdobeConnector { private weak var player: THEOplayer? @@ -361,9 +362,9 @@ class AdobeConnector { var params: [String:Any] = [:] params["analytics.reportSuite"] = self.sid params["analytics.trackingServer"] = self.trackingUrl - params["media.channel"] = "N/A" + params["media.channel"] = NA params["media.contentType"] = self.getContentType().rawValue - params["media.id"] = "N/A" + params["media.id"] = NA params["media.length"] = mediaLength params["media.playerName"] = "THEOplayer" params["visitor.marketingCloudOrgId"] = self.ecid diff --git a/adobe/src/internal/DefaultAdobeConnectorAdapter.ts b/adobe/src/internal/DefaultAdobeConnectorAdapter.ts index c53df326..c0a6c4d1 100644 --- a/adobe/src/internal/DefaultAdobeConnectorAdapter.ts +++ b/adobe/src/internal/DefaultAdobeConnectorAdapter.ts @@ -10,6 +10,7 @@ import { AdobeConnectorAdapter } from './AdobeConnectorAdapter'; const TAG = 'AdobeConnector'; const CONTENT_PING_INTERVAL = 10000; const AD_PING_INTERVAL = 1000; +const NA = 'N/A'; /** * An all-TypeScript implementation of the AdobeConnector. @@ -316,12 +317,15 @@ export class DefaultAdobeConnectorAdapter implements AdobeConnectorAdapter { 'media.name': this.player.source.metadata.title, }; } + /** + * https://experienceleague.adobe.com/en/docs/media-analytics/using/implementation/analytics-only/streaming-media-apis/mc-api-req-params + */ initialBody.params = { 'analytics.reportSuite': this.sid, 'analytics.trackingServer': this.trackingUrl, - 'media.channel': 'N/A', + 'media.channel': NA, 'media.contentType': this.getContentType(), - 'media.id': 'N/A', + 'media.id': NA, 'media.length': mediaLength, 'media.playerName': 'THEOplayer', // TODO make distinctions between platforms? 'visitor.marketingCloudOrgId': this.ecid, From 1318154b0d760bc7b8365440c1fe4182fd304a94 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 5 Jan 2026 10:36:14 +0100 Subject: [PATCH 2/5] Rename customMetadata --- .../theoplayer/reactnative/adobe/AdobeConnector.kt | 10 +++++----- adobe/src/internal/DefaultAdobeConnectorAdapter.ts | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt b/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt index 6fd12870..5f406c3a 100644 --- a/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt +++ b/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt @@ -104,7 +104,7 @@ class AdobeConnector( private var isPlayingAd = false - private var customMetadata: AdobeMetaData = AdobeMetaData() + private var currentMetadata: AdobeMetaData = AdobeMetaData() private var currentChapter: TextTrackCue? = null @@ -143,7 +143,7 @@ class AdobeConnector( private val onAdSkip: EventListener = EventListener { event -> handleAdSkip() } init { - this.customMetadata = metadata ?: AdobeMetaData() + this.currentMetadata = metadata ?: AdobeMetaData() this.customUserAgent = userAgent ?: buildUserAgent() addEventListeners() @@ -156,7 +156,7 @@ class AdobeConnector( } fun updateMetadata(metadata: AdobeMetaData) { - customMetadata.add(metadata) + currentMetadata.add(metadata) } fun setError(metadata: AdobeMetaData) { @@ -467,9 +467,9 @@ class AdobeConnector( AdobeEventTypes.SESSION_START ) ) { - body.customMetadata = customMetadata.customMetadata ?: mutableMapOf() + body.customMetadata = currentMetadata.customMetadata ?: mutableMapOf() } - body.qoeData = (body.qoeData.orEmpty() + customMetadata.qoeData.orEmpty()).toMutableMap() + body.qoeData = (body.qoeData.orEmpty() + currentMetadata.qoeData.orEmpty()).toMutableMap() return body } diff --git a/adobe/src/internal/DefaultAdobeConnectorAdapter.ts b/adobe/src/internal/DefaultAdobeConnectorAdapter.ts index c0a6c4d1..7603f6dc 100644 --- a/adobe/src/internal/DefaultAdobeConnectorAdapter.ts +++ b/adobe/src/internal/DefaultAdobeConnectorAdapter.ts @@ -48,7 +48,7 @@ export class DefaultAdobeConnectorAdapter implements AdobeConnectorAdapter { private isPlayingAd = false; - private customMetadata: AdobeMetaData = {}; + private currentMetadata: AdobeMetaData = {}; private currentChapter: TextTrackCue | undefined; @@ -72,7 +72,7 @@ export class DefaultAdobeConnectorAdapter implements AdobeConnectorAdapter { this.sid = sid; this.debug = debug; this.trackingUrl = trackingUrl; - this.customMetadata = { ...this.customMetadata, ...metadata }; + this.currentMetadata = { ...this.currentMetadata, ...metadata }; this.customUserAgent = userAgent || buildUserAgent(); this.addEventListeners(); @@ -85,7 +85,7 @@ export class DefaultAdobeConnectorAdapter implements AdobeConnectorAdapter { } updateMetadata(metadata: AdobeMetaData): void { - this.customMetadata = { ...this.customMetadata, ...metadata }; + this.currentMetadata = { ...this.currentMetadata, ...metadata }; } setError(metadata: AdobeMetaData): void { @@ -330,7 +330,7 @@ export class DefaultAdobeConnectorAdapter implements AdobeConnectorAdapter { 'media.playerName': 'THEOplayer', // TODO make distinctions between platforms? 'visitor.marketingCloudOrgId': this.ecid, ...friendlyName, - ...this.customMetadata.params, + ...this.currentMetadata.params, }; const body = this.addCustomMetadata(AdobeEventTypes.SESSION_START, initialBody); @@ -374,11 +374,11 @@ export class DefaultAdobeConnectorAdapter implements AdobeConnectorAdapter { eventType === AdobeEventTypes.AD_START || eventType === AdobeEventTypes.SESSION_START ) { - body.customMetadata = { ...this.customMetadata.customMetadata }; + body.customMetadata = { ...this.currentMetadata.customMetadata }; } // TODO check params which are fine and which need more limitations? } - body.qoeData = { ...body.qoeData, ...this.customMetadata.qoeData }; + body.qoeData = { ...body.qoeData, ...this.currentMetadata.qoeData }; return body; } From 965ee06fd9cc7bab11fc059842603d12631448ea Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 5 Jan 2026 11:22:21 +0100 Subject: [PATCH 3/5] Pass visitor.marketingCloudUserId --- .../java/com/theoplayer/reactnative/adobe/AdobeConnector.kt | 4 ++++ adobe/ios/Connector/AdobeConnector.swift | 1 + adobe/src/internal/DefaultAdobeConnectorAdapter.ts | 1 + 3 files changed, 6 insertions(+) diff --git a/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt b/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt index 5f406c3a..28e7051f 100644 --- a/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt +++ b/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt @@ -405,6 +405,9 @@ class AdobeConnector( return } val initialBody = createBaseRequest(AdobeEventTypes.SESSION_START) + /** + * https://experienceleague.adobe.com/en/docs/media-analytics/using/implementation/analytics-only/streaming-media-apis/mc-api-req-params + */ initialBody.params = mutableMapOf( "analytics.reportSuite" to sid, "analytics.trackingServer" to trackingUrl, @@ -414,6 +417,7 @@ class AdobeConnector( "media.length" to mediaLength, "media.playerName" to "THEOplayer", "visitor.marketingCloudOrgId" to this.ecid, + "visitor.marketingCloudUserId" to (currentMetadata.customMetadata?.get("visitorMID") ?: NA) ) player.source?.metadata?.get("title")?.let { initialBody.params?.put("media.name", it) diff --git a/adobe/ios/Connector/AdobeConnector.swift b/adobe/ios/Connector/AdobeConnector.swift index 51142192..63abb80b 100644 --- a/adobe/ios/Connector/AdobeConnector.swift +++ b/adobe/ios/Connector/AdobeConnector.swift @@ -368,6 +368,7 @@ class AdobeConnector { params["media.length"] = mediaLength params["media.playerName"] = "THEOplayer" params["visitor.marketingCloudOrgId"] = self.ecid + params["visitor.marketingCloudUserId"] = self.currentMetadata?.customMetadata?["visitorMID"] ?? NA if let friendlyName = player.source?.metadata?.title { params["media.name"] = friendlyName } diff --git a/adobe/src/internal/DefaultAdobeConnectorAdapter.ts b/adobe/src/internal/DefaultAdobeConnectorAdapter.ts index 7603f6dc..7fa604aa 100644 --- a/adobe/src/internal/DefaultAdobeConnectorAdapter.ts +++ b/adobe/src/internal/DefaultAdobeConnectorAdapter.ts @@ -329,6 +329,7 @@ export class DefaultAdobeConnectorAdapter implements AdobeConnectorAdapter { 'media.length': mediaLength, 'media.playerName': 'THEOplayer', // TODO make distinctions between platforms? 'visitor.marketingCloudOrgId': this.ecid, + 'visitor.marketingCloudUserId': this.currentMetadata.customMetadata?.['visitorMID'] || NA, ...friendlyName, ...this.currentMetadata.params, }; From 5d95c4862d6753c89e5fdb680b4294e3aa84eb55 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 5 Jan 2026 10:57:40 +0100 Subject: [PATCH 4/5] Add missing custom params --- .../main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt b/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt index 28e7051f..6cd18492 100644 --- a/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt +++ b/adobe/android/src/main/java/com/theoplayer/reactnative/adobe/AdobeConnector.kt @@ -422,6 +422,7 @@ class AdobeConnector( player.source?.metadata?.get("title")?.let { initialBody.params?.put("media.name", it) } + currentMetadata.params?.forEach { initialBody.params?.set(it.key, it.value) } val body = addCustomMetadata(AdobeEventTypes.SESSION_START, initialBody) From 6e44d751d56967b93c298b61623798eb4a32d582 Mon Sep 17 00:00:00 2001 From: Tom Van Laerhoven Date: Mon, 5 Jan 2026 11:42:45 +0100 Subject: [PATCH 5/5] Add changesets --- .changeset/giant-melons-leave.md | 5 +++++ .changeset/huge-groups-appear.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/giant-melons-leave.md create mode 100644 .changeset/huge-groups-appear.md diff --git a/.changeset/giant-melons-leave.md b/.changeset/giant-melons-leave.md new file mode 100644 index 00000000..9760d36a --- /dev/null +++ b/.changeset/giant-melons-leave.md @@ -0,0 +1,5 @@ +--- +'@theoplayer/react-native-analytics-adobe': patch +--- + +Fixed an issue on Android where the properties from the passed metadata was not included with the `sessions` request. diff --git a/.changeset/huge-groups-appear.md b/.changeset/huge-groups-appear.md new file mode 100644 index 00000000..6a3126df --- /dev/null +++ b/.changeset/huge-groups-appear.md @@ -0,0 +1,5 @@ +--- +'@theoplayer/react-native-analytics-adobe': patch +--- + +Fixed an issue where the required `visitor.marketingCloudUserId` property was not included with the `sessions` request.