@@ -239,6 +239,7 @@ let PlayerOvp = "player_ovp"
239239 @objc public var mediaSessionAttributes : [ String : Any ]
240240 @objc public var adContent : MPMediaAdContent ?
241241 @objc public var adBreak : MPMediaAdBreak ?
242+ @objc public var excludeAdBreaksFromContentTime : Bool
242243 @objc public var segment : MPMediaSegment ?
243244 @objc public var mediaEventListener : ( ( MPMediaEvent ) -> Void ) ?
244245
@@ -273,7 +274,6 @@ let PlayerOvp = "player_ovp"
273274 private( set) public var currentPlaybackStartTimestamp : Date ? //Timestamp for beginning of current playback
274275 private( set) public var storedPlaybackTime : Double = 0 //On Pause calculate playback time and clear currentPlaybackTime
275276 private var sessionSummarySent = false // Ensures we only send summary event once
276-
277277
278278 // MARK: init
279279 /// Creates a media session object. This does not start a session, you can do so by calling `logMediaSessionStart`.
@@ -284,7 +284,7 @@ let PlayerOvp = "player_ovp"
284284 /// :param: duration The playback time of the media content in milliseconds
285285 /// :param: contentType The type of the media content (e.g. video)
286286 /// :param: streamType The stream type for the media (e.g. on-demand)
287- @objc public init ( coreSDK: MParticle ? , mediaContentId: String , title: String , duration: NSNumber ? , contentType: MPMediaContentType , streamType: MPMediaStreamType ) {
287+ @objc public init ( coreSDK: MParticle ? , mediaContentId: String , title: String , duration: NSNumber ? , contentType: MPMediaContentType , streamType: MPMediaStreamType , excludeAdBreaksFromContentTime : Bool = false ) {
288288 if let coreSDK = coreSDK {
289289 self . coreSDK = coreSDK
290290 } else {
@@ -296,6 +296,7 @@ let PlayerOvp = "player_ovp"
296296 self . duration = duration
297297 self . contentType = contentType
298298 self . streamType = streamType
299+ self . excludeAdBreaksFromContentTime = excludeAdBreaksFromContentTime
299300 self . mediaSessionId = NSUUID ( ) . uuidString
300301 self . mediaSessionAttributes = [ : ]
301302 self . logMPEvents = false
@@ -318,7 +319,7 @@ let PlayerOvp = "player_ovp"
318319 /// :param: logMPEvents Set to true if you would like custom events forwarded to the mParticle SDK
319320 /// :param: logMediaEvents Set to true if you would like media events forwarded to the mParticle SDK
320321 /// :param: completeLimit Int from 1 to 100 denotes percentage of progress needed to be considered "completed"
321- @objc public init ( coreSDK: MParticle ? , mediaContentId: String , title: String , duration: NSNumber ? , contentType: MPMediaContentType , streamType: MPMediaStreamType , logMPEvents: Bool , logMediaEvents: Bool , completeLimit: Int ) {
322+ @objc public init ( coreSDK: MParticle ? , mediaContentId: String , title: String , duration: NSNumber ? , contentType: MPMediaContentType , streamType: MPMediaStreamType , excludeAdBreaksFromContentTime : Bool = false , logMPEvents: Bool , logMediaEvents: Bool , completeLimit: Int ) {
322323 if let coreSDK = coreSDK {
323324 self . coreSDK = coreSDK
324325 } else {
@@ -330,23 +331,45 @@ let PlayerOvp = "player_ovp"
330331 self . duration = duration
331332 self . contentType = contentType
332333 self . streamType = streamType
334+ self . excludeAdBreaksFromContentTime = excludeAdBreaksFromContentTime
333335 self . mediaSessionId = NSUUID ( ) . uuidString
334336 self . mediaSessionAttributes = [ : ]
335337 self . logMPEvents = logMPEvents
336338 self . logMediaEvents = logMediaEvents
337339 if ( 100 >= completeLimit && completeLimit > 0 ) {
338340 self . mediaContentCompleteLimit = completeLimit
339341 }
342+ self . excludeAdBreaksFromContentTime = excludeAdBreaksFromContentTime
340343
341344 let currentTimestamp = Date ( )
342345 self . mediaSessionStartTimestamp = currentTimestamp
343346 self . mediaSessionEndTimestamp = currentTimestamp
344347 }
345348
346- internal convenience init ( coreSDK: MParticle ? , mediaContentId: String , title: String , duration: NSNumber ? , contentType: MPMediaContentType , streamType: MPMediaStreamType , logMPEvents: Bool , logMediaEvents: Bool , completeLimit: Int , testing: Bool ) {
347- self . init ( coreSDK: coreSDK, mediaContentId: mediaContentId, title: title, duration: duration, contentType: contentType, streamType: streamType, logMPEvents: logMPEvents, logMediaEvents: logMediaEvents, completeLimit: completeLimit)
348-
349- self . sessionSummarySent = true
349+ internal convenience init (
350+ coreSDK: MParticle ? ,
351+ mediaContentId: String ,
352+ title: String ,
353+ duration: NSNumber ? ,
354+ contentType: MPMediaContentType ,
355+ streamType: MPMediaStreamType ,
356+ logMPEvents: Bool ,
357+ logMediaEvents: Bool ,
358+ completeLimit: Int ,
359+ excludeAdBreaksFromContentTime: Bool = false ,
360+ testing: Bool ) {
361+ self . init ( coreSDK: coreSDK,
362+ mediaContentId: mediaContentId,
363+ title: title,
364+ duration: duration,
365+ contentType: contentType,
366+ streamType: streamType,
367+ excludeAdBreaksFromContentTime: excludeAdBreaksFromContentTime,
368+ logMPEvents: logMPEvents,
369+ logMediaEvents: logMediaEvents,
370+ completeLimit: completeLimit)
371+
372+ self . sessionSummarySent = true
350373 }
351374
352375 deinit {
@@ -473,6 +496,8 @@ let PlayerOvp = "player_ovp"
473496 // MARK: ad break
474497 /// Logs that a sequence of one or more ads has begun
475498 @objc public func logAdBreakStart( adBreak: MPMediaAdBreak , options: Options ? = nil ) {
499+ pauseContentTimeIfAdBreakExclusionEnabled ( )
500+
476501 self . adBreak = adBreak
477502 let mediaEvent = self . makeMediaEvent ( name: . adBreakStart, options: options)
478503 mediaEvent. adBreak = self . adBreak
@@ -481,11 +506,25 @@ let PlayerOvp = "player_ovp"
481506
482507 /// Indicates that the ad break is complete
483508 @objc public func logAdBreakEnd( options: Options ? = nil ) {
509+ resumeContentTimeIfAdBreakExclusionEnabled ( )
510+
484511 let mediaEvent = self . makeMediaEvent ( name: . adBreakEnd, options: options)
485512 mediaEvent. adBreak = self . adBreak
486513 self . logEvent ( mediaEvent: mediaEvent)
487514 self . adBreak = nil
488515 }
516+
517+ // MARK: private helpers (ad break)
518+ private func pauseContentTimeIfAdBreakExclusionEnabled( ) {
519+ guard excludeAdBreaksFromContentTime, currentPlaybackStartTimestamp != nil else { return }
520+ storedPlaybackTime += Date ( ) . timeIntervalSince ( currentPlaybackStartTimestamp!)
521+ currentPlaybackStartTimestamp = nil
522+ }
523+
524+ private func resumeContentTimeIfAdBreakExclusionEnabled( ) {
525+ guard excludeAdBreaksFromContentTime, currentPlaybackStartTimestamp == nil else { return }
526+ currentPlaybackStartTimestamp = Date ( )
527+ }
489528
490529 // MARK: ad content
491530 /// Indicates a given ad creative has started playing
0 commit comments