private void CreateAdvertisement(VmapAdBreak adBreak) { Advertisement ad = null; switch (adBreak.TimeOffset) { case "start": ad = new PrerollAdvertisement(); break; case "end": ad = new PostrollAdvertisement(); break; default: var offset = FlexibleOffset.Parse(adBreak.TimeOffset); if (offset != null) { var midroll = new MidrollAdvertisement(); if (!offset.IsAbsolute) { midroll.TimePercentage = offset.RelativeOffset; } else { midroll.Time = offset.AbsoluteOffset; } ad = midroll; } break; } if (ad != null) { ad.Source = GetAdSource(adBreak.AdSource); if (ad.Source != null) { Advertisements.Add(ad); adBreaks.Add(ad, adBreak); } } }
/// <inheritdoc /> protected override async Task PlayAdAsync(Advertisement ad, CancellationToken cancellationToken) { if (adBreaks.ContainsKey(ad)) // app could have manually added ads besides those in vmap { VmapAdBreak adBreak = adBreaks[ad]; try { TrackEvent(adBreak.TrackingEvents.Where(te => te.EventType == VmapTrackingEventType.BreakStart)); await base.PlayAdAsync(ad, cancellationToken); TrackEvent(adBreak.TrackingEvents.Where(te => te.EventType == VmapTrackingEventType.BreakEnd)); } catch { TrackEvent(adBreak.TrackingEvents.Where(te => te.EventType == VmapTrackingEventType.Error)); } } else { await base.PlayAdAsync(ad, cancellationToken); } }