From dfe263aa6a252ff78901a150ee676594742d709c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Tue, 14 Mar 2023 19:18:19 +0100 Subject: [PATCH] feat(Ads): Add ads config (#5085) This doesn't produce any output right now, but this allow to the forks to create custom configurations for ads, and also allow future configurations to be added. --- externs/shaka/ads.js | 9 +++++++++ externs/shaka/player.js | 14 ++++++++++++++ lib/ads/ad_manager.js | 24 ++++++++++++++++++++++++ lib/ads/client_side_ad_manager.js | 13 +++++++++++++ lib/ads/server_side_ad_manager.js | 13 +++++++++++++ lib/player.js | 3 +++ lib/util/player_configuration.js | 3 +++ test/ads/ad_manager_unit.js | 3 +++ test/test/util/fake_ad_manager.js | 3 +++ 9 files changed, 85 insertions(+) diff --git a/externs/shaka/ads.js b/externs/shaka/ads.js index ef9803c703..cf7d129887 100644 --- a/externs/shaka/ads.js +++ b/externs/shaka/ads.js @@ -64,6 +64,15 @@ shaka.extern.IAdManager = class extends EventTarget { */ setLocale(locale) {} + /** + * Called by the Player to provide an updated configuration any time it + * changes. + * Must be called at least once before init*(). + * + * @param {shaka.extern.AdsConfiguration} config + */ + configure(config) {} + release() {} onAssetUnload() {} diff --git a/externs/shaka/player.js b/externs/shaka/player.js index 5c901660c9..e432ec9c0f 100644 --- a/externs/shaka/player.js +++ b/externs/shaka/player.js @@ -1116,6 +1116,17 @@ shaka.extern.StreamingConfiguration; shaka.extern.MediaSourceConfiguration; +/** + * @typedef {Object} + * + * @description + * Ads configuration. + * + * @exportDoc + */ +shaka.extern.AdsConfiguration; + + /** * @typedef {{ * enabled: boolean, @@ -1323,6 +1334,7 @@ shaka.extern.OfflineConfiguration; /** * @typedef {{ + * ads: shaka.extern.AdsConfiguration, * autoShowText: shaka.config.AutoShowText, * drm: shaka.extern.DrmConfiguration, * manifest: shaka.extern.ManifestConfiguration, @@ -1349,6 +1361,8 @@ shaka.extern.OfflineConfiguration; * textDisplayFactory: shaka.extern.TextDisplayer.Factory * }} * + * @property {shaka.extern.AdsConfiguration} ads + * Ads configuration and settings. * @property {shaka.config.AutoShowText} autoShowText * Controls behavior of auto-showing text tracks on load(). * @property {shaka.extern.DrmConfiguration} drm diff --git a/lib/ads/ad_manager.js b/lib/ads/ad_manager.js index b0742b1ef9..39a6c808dd 100644 --- a/lib/ads/ad_manager.js +++ b/lib/ads/ad_manager.js @@ -7,6 +7,7 @@ goog.provide('shaka.ads.AdManager'); +goog.require('goog.asserts'); goog.require('shaka.Player'); goog.require('shaka.ads.AdsStats'); goog.require('shaka.ads.ClientSideAdManager'); @@ -385,6 +386,8 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget { this.stats_ = new shaka.ads.AdsStats(); /** @private {string} locale */ this.locale_ = navigator.language; + /** @private {?shaka.extern.AdsConfiguration} */ + this.config_ = null; } @@ -397,6 +400,21 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget { } + /** + * @override + * @export + */ + configure(config) { + this.config_ = config; + if (this.csAdManager_) { + this.csAdManager_.configure(this.config_); + } + if (this.ssAdManager_) { + this.csAdManager_.configure(this.config_); + } + } + + /** * @override * @export @@ -443,6 +461,9 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget { } this.dispatchEvent(event); }); + + goog.asserts.assert(this.config_, 'Config must not be null!'); + this.csAdManager_.configure(this.config_); } @@ -544,6 +565,9 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget { } this.dispatchEvent(event); }); + + goog.asserts.assert(this.config_, 'Config must not be null!'); + this.ssAdManager_.configure(this.config_); } diff --git a/lib/ads/client_side_ad_manager.js b/lib/ads/client_side_ad_manager.js index 5945cfc0aa..4380310c9c 100644 --- a/lib/ads/client_side_ad_manager.js +++ b/lib/ads/client_side_ad_manager.js @@ -33,6 +33,9 @@ shaka.ads.ClientSideAdManager = class { /** @private {HTMLMediaElement} */ this.video_ = video; + /** @private {?shaka.extern.AdsConfiguration} */ + this.config_ = null; + /** @private {ResizeObserver} */ this.resizeObserver_ = null; @@ -84,6 +87,16 @@ shaka.ads.ClientSideAdManager = class { }); } + /** + * Called by the AdManager to provide an updated configuration any time it + * changes. + * + * @param {shaka.extern.AdsConfiguration} config + */ + configure(config) { + this.config_ = config; + } + /** * @param {!google.ima.AdsRequest} imaRequest */ diff --git a/lib/ads/server_side_ad_manager.js b/lib/ads/server_side_ad_manager.js index 1cc2ce6c43..e4f182c495 100644 --- a/lib/ads/server_side_ad_manager.js +++ b/lib/ads/server_side_ad_manager.js @@ -35,6 +35,9 @@ shaka.ads.ServerSideAdManager = class { /** @private {HTMLMediaElement} */ this.video_ = video; + /** @private {?shaka.extern.AdsConfiguration} */ + this.config_ = null; + /** @private {?shaka.util.PublicPromise.} */ this.streamPromise_ = null; @@ -168,6 +171,16 @@ shaka.ads.ServerSideAdManager = class { }); } + /** + * Called by the AdManager to provide an updated configuration any time it + * changes. + * + * @param {shaka.extern.AdsConfiguration} config + */ + configure(config) { + this.config_ = config; + } + /** * @param {!google.ima.dai.api.StreamRequest} streamRequest * @param {string=} backupUrl diff --git a/lib/player.js b/lib/player.js index e0c2dd77cb..4a4a0fb201 100644 --- a/lib/player.js +++ b/lib/player.js @@ -3308,6 +3308,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.config_.playRangeStart, this.config_.playRangeEnd); } + if (this.adManager_) { + this.adManager_.configure(this.config_.ads); + } } /** diff --git a/lib/util/player_configuration.js b/lib/util/player_configuration.js index 0249c13586..8c3a282907 100644 --- a/lib/util/player_configuration.js +++ b/lib/util/player_configuration.js @@ -294,6 +294,8 @@ shaka.util.PlayerConfiguration = class { forceTransmux: false, }; + const ads = {}; + const AutoShowText = shaka.config.AutoShowText; /** @type {shaka.extern.PlayerConfiguration} */ @@ -333,6 +335,7 @@ shaka.util.PlayerConfiguration = class { textDisplayFactory: () => null, cmcd: cmcd, lcevc: lcevc, + ads: ads, }; // Add this callback so that we can reference the preferred audio language diff --git a/test/ads/ad_manager_unit.js b/test/ads/ad_manager_unit.js index 123f71da2d..939983bdb1 100644 --- a/test/ads/ad_manager_unit.js +++ b/test/ads/ad_manager_unit.js @@ -21,6 +21,9 @@ describe('Ad manager', () => { adManager = player.getAdManager(); expect(adManager instanceof shaka.ads.AdManager).toBe(true); + const config = shaka.util.PlayerConfiguration.createDefault().ads; + adManager.configure(config); + adContainer = /** @type {!HTMLElement} */ (document.createElement('div')); }); diff --git a/test/test/util/fake_ad_manager.js b/test/test/util/fake_ad_manager.js index 9564ca8ebe..752ddab9a1 100644 --- a/test/test/util/fake_ad_manager.js +++ b/test/test/util/fake_ad_manager.js @@ -22,6 +22,9 @@ shaka.test.FakeAdManager = class extends shaka.util.FakeEventTarget { /** @override */ setLocale(locale) {} + /** @override */ + configure(config) {} + /** @override */ initClientSide(adContainer, video) {}