diff --git a/CHANGELOG.md b/CHANGELOG.md index f5d00e38..ad54e398 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. + ### Added - SideloadedSubtitle diff --git a/Code/Conviva/Source/Base/ConvivaConnector.swift b/Code/Conviva/Source/Base/ConvivaConnector.swift index 3947bb8f..5b5b8d83 100644 --- a/Code/Conviva/Source/Base/ConvivaConnector.swift +++ b/Code/Conviva/Source/Base/ConvivaConnector.swift @@ -24,13 +24,14 @@ 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 @@ -38,7 +39,7 @@ public class ConvivaConnector { 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 diff --git a/Code/Conviva/Source/Base/ConvivaStorage.swift b/Code/Conviva/Source/Base/ConvivaStorage.swift index d20afce9..fd5c35b9 100644 --- a/Code/Conviva/Source/Base/ConvivaStorage.swift +++ b/Code/Conviva/Source/Base/ConvivaStorage.swift @@ -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) { @@ -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 { diff --git a/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift b/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift index 182c0cd1..8b4b7b03 100644 --- a/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift +++ b/Code/Conviva/Source/Base/Events/ConvivaHandlers/PlayerHandler.swift @@ -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]) { @@ -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 @@ -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)