diff --git a/externs/shaka/player.js b/externs/shaka/player.js index ce1e764769..7923862167 100644 --- a/externs/shaka/player.js +++ b/externs/shaka/player.js @@ -1536,7 +1536,8 @@ shaka.extern.AdvancedAbrConfiguration; * useHeaders: boolean, * sessionId: string, * contentId: string, - * rtpSafetyFactor: number + * rtpSafetyFactor: number, + * includeKeys: !Array * }} * * @description @@ -1562,6 +1563,9 @@ shaka.extern.AdvancedAbrConfiguration; * @property {number} rtpSafetyFactor * RTP safety factor. * Defaults to 5. + * @property {!Array} includeKeys + * An array of keys to include in the CMCD data. If not provided, all keys + * will be included. * @exportDoc */ shaka.extern.CmcdConfiguration; diff --git a/lib/util/cmcd_manager.js b/lib/util/cmcd_manager.js index 757d67ff09..ec5619ea1d 100644 --- a/lib/util/cmcd_manager.js +++ b/lib/util/cmcd_manager.js @@ -369,15 +369,17 @@ shaka.util.CmcdManager = class { data.su = this.buffering_; } + const output = this.filterKeys_(data); + if (useHeaders) { - const headers = shaka.util.CmcdManager.toHeaders(data); + const headers = shaka.util.CmcdManager.toHeaders(output); if (!Object.keys(headers).length) { return; } Object.assign(request.headers, headers); } else { - const query = shaka.util.CmcdManager.toQuery(data); + const query = shaka.util.CmcdManager.toQuery(output); if (!query) { return; } @@ -388,6 +390,29 @@ shaka.util.CmcdManager = class { } } + /** + * Filter the CMCD data object to include only the keys specified in the + * configuration. + * + * @param {CmcdData} data + * @return {CmcdData} + * @private + */ + filterKeys_(data) { + const includeKeys = this.config_.includeKeys; + + if (!includeKeys.length) { + return data; + } + + return Object.keys(data).reduce((acc, key) => { + if (includeKeys.includes(key)) { + acc[key] = data[key]; + } + return acc; + }, {}); + } + /** * The CMCD object type. * diff --git a/lib/util/player_configuration.js b/lib/util/player_configuration.js index bcb6479448..ca0ba0389d 100644 --- a/lib/util/player_configuration.js +++ b/lib/util/player_configuration.js @@ -327,6 +327,7 @@ shaka.util.PlayerConfiguration = class { contentId: '', rtpSafetyFactor: 5, useHeaders: false, + includeKeys: [], }; const cmsd = { diff --git a/test/util/cmcd_manager_unit.js b/test/util/cmcd_manager_unit.js index 76168eea3b..c454d44d0a 100644 --- a/test/util/cmcd_manager_unit.js +++ b/test/util/cmcd_manager_unit.js @@ -129,6 +129,7 @@ describe('CmcdManager', () => { contentId: 'testing', rtpSafetyFactor: 5, useHeaders: false, + includeKeys: [], }; /** @type shaka.util.CmcdManager */ @@ -214,11 +215,25 @@ describe('CmcdManager', () => { expect(r.uris[0].includes(sessionId)).toBe(false); expect(sidRegex.test(r.uris[0])).toBe(true); }); + + it('filters keys if includeKeys is provided', () => { + config.sessionId = sid; + config.includeKeys = ['sid', 'cid']; + cmcdManager = new CmcdManager(playerInterface, config); + + const r = ObjectUtils.cloneObject(request); + cmcdManager.applyManifestData(r, manifestInfo); + + const uri = 'https://test.com/test.mpd?CMCD=cid%3D%22testing%22' + + '%2Csid%3D%222ed2d1cd-970b-48f2-bfb3-50a79e87cfa3%22'; + expect(r.uris[0]).toBe(uri); + }); }); describe('query mode', () => { beforeAll(() => { config.sessionId = sid; + config.includeKeys = []; cmcdManager = new CmcdManager(playerInterface, config); });