/// <summary> /// Called when the media has opened. /// Responsible for skipping ads before the startup position. /// </summary> protected virtual void OnMediaOpened() { // remove all ads before the start position if (MediaPlayer.StartupPosition.HasValue) { HandledAds.AddRange(Advertisements.OfType <PrerollAdvertisement>().Cast <Advertisement>()); HandledAds.AddRange(Advertisements.OfType <MidrollAdvertisement>().Where(a => a.Time < MediaPlayer.StartupPosition.Value).Cast <Advertisement>()); } }
async Task PlayAdsOfType <T>(CancellationToken cancellationToken) where T : Advertisement { var adsToPlay = EligableAds.OfType <T>().Where(a => a.Source != null).ToList(); HandledAds.AddRange(adsToPlay.Cast <Advertisement>()); if (adsToPlay.Any()) { await PlayAds(adsToPlay.Cast <Advertisement>(), cancellationToken); } }
internal async Task PlayStartupAds(CancellationToken c) { if (MediaPlayer.AllowMediaStartingDeferrals) { IList <Advertisement> startupAds; if (MediaPlayer.StartupPosition.HasValue) { startupAds = EligableAds .OfType <MidrollAdvertisement>() .Where(a => a.Source != null && a.Time == MediaPlayer.StartupPosition.Value) .Cast <Advertisement>() .ToList(); } else { startupAds = EligableAds .OfType <PrerollAdvertisement>() .Where(a => a.Source != null) .Cast <Advertisement>() .ToList(); } if (startupAds.Any()) { try { using (var adCts = CancellationTokenSource.CreateLinkedTokenSource(c, cts.Token)) { HandledAds.AddRange(startupAds); await PlayAds(startupAds, adCts.Token); } } catch { /* ignore */ } } } }