Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## Unreleased

### Fixed

- Conviva
- Fixed an issue where the initial metadata passed to the convivaConnector was not persistent across Conviva sessions.
- Fixed an issue where the session's assetName was not configurable by setContentInfo, which has higher precedence than source.metadata.title.

## [10.7.0] - 2025-12-18

### Changed
Expand Down
7 changes: 4 additions & 3 deletions Code/Conviva/Source/Base/ConvivaConnector.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,22 @@ public class ConvivaConnector {
public convenience init?(
configuration: ConvivaConfiguration,
player: THEOplayer,
convivaMetadata: [String: Any] = [:],
externalEventDispatcher: THEOplayerSDK.EventDispatcherProtocol? = nil
) {
guard let endPoints = ConvivaEndpoints(configuration: configuration) else { return nil }
self.init(conviva: endPoints, player: player, externalEventDispatcher: externalEventDispatcher)
self.init(conviva: endPoints, player: player, convivaMetadata: convivaMetadata, externalEventDispatcher: externalEventDispatcher)
}

init(conviva: ConvivaEndpoints, player: THEOplayer, externalEventDispatcher: THEOplayerSDK.EventDispatcherProtocol? = nil) {
init(conviva: ConvivaEndpoints, player: THEOplayer, convivaMetadata: [String: Any], externalEventDispatcher: THEOplayerSDK.EventDispatcherProtocol? = nil) {
self.endPoints = conviva

// App level handling
self.appHandler = AppHandler(endpoints: self.endPoints, storage: self.storage)
self.appEventForwarder = AppEventForwarder(handler: self.appHandler)

// Player level handling
self.playerHandler = PlayerHandler(endpoints: self.endPoints, storage: self.storage)
self.playerHandler = PlayerHandler(endpoints: self.endPoints, storage: self.storage, convivaMetadata: convivaMetadata)
self.playerEventForwarder = PlayerEventForwarder(player: player, handler: self.playerHandler)

// Ad level handling
Expand Down
8 changes: 7 additions & 1 deletion Code/Conviva/Source/Base/ConvivaStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
class ConvivaStorage {
private(set) var metrics: [String:Any] = [:]
private(set) var metadata: [String:Any] = [:]
private(set) var persistentMetadata: [String:Any] = [:]

// MARK: PERSISTENT METADATA
func storePersistentMetadata(_ map: [String:Any]) {
persistentMetadata = map
}

// MARK: METADATA
func storeMetadataEntry(key: String, value: Any) {
Expand All @@ -18,7 +24,7 @@ class ConvivaStorage {
}

func metadataEntryForKey(_ key: String) -> Any? {
return self.metadata[key]
return self.metadata[key] ?? self.persistentMetadata[key]
}

func hasMetadataEntryForKey(_ key: String) -> Bool {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,12 @@ class PlayerHandler {
private weak var storage: ConvivaStorage?
private var playerState: PlayerState = .CONVIVA_UNKNOWN

init(endpoints: ConvivaEndpoints, storage: ConvivaStorage) {
init(endpoints: ConvivaEndpoints, storage: ConvivaStorage, convivaMetadata: [String:Any]) {
self.endpoints = endpoints
self.storage = storage

// store initial metadata as persistent metadata
self.storage?.storePersistentMetadata(convivaMetadata)
}

func setContentInfo(_ contentInfo: [String: Any]) {
Expand Down Expand Up @@ -71,12 +74,12 @@ class PlayerHandler {
log("handling maybeReportPlaybackRequested")
guard !self.currentConvivaSession.started else { return }

// collect standard metadata like playerName, assetName, stramUrl, isLive, ...
// collect and send standard metadata like playerName, assetName, streamUrl, isLive, ...
self.updateMetadata()

// start session on conviva
// start session on conviva and send persistent metadata
if let storage = self.storage {
self.endpoints?.videoAnalytics.reportPlaybackRequested(storage.metadata)
self.endpoints?.videoAnalytics.reportPlaybackRequested(storage.persistentMetadata)
}

// mark conviva session as started
Expand Down Expand Up @@ -243,7 +246,7 @@ class PlayerHandler {
var metadata: [String: Any] = [
CIS_SSDK_METADATA_PLAYER_NAME: self.storage?.metadataEntryForKey(CIS_SSDK_METADATA_PLAYER_NAME) ?? Utilities.playerName,
CIS_SSDK_METADATA_STREAM_URL: url,
CIS_SSDK_METADATA_ASSET_NAME: convivaSessionSource.description.metadata?.title ?? Utilities.defaultStringValue,
CIS_SSDK_METADATA_ASSET_NAME: self.storage?.metadataEntryForKey(CIS_SSDK_METADATA_ASSET_NAME) ?? convivaSessionSource.description.metadata?.title ?? Utilities.defaultStringValue,
]

let adDescriptionMetadata: [String: Any] = collectAdDescriptionMetadata(from: convivaSessionSource.description)
Expand Down