diff --git a/package.json b/package.json index cc8ea467..0b178859 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "access": "public" }, "devDependencies": { - "@playkit-js/playkit-js": "^0.37.0", + "@playkit-js/playkit-js": "^0.44.0", "babel-cli": "^6.18.0", "babel-core": "^6.18.2", "babel-eslint": "^7.1.1", @@ -77,7 +77,7 @@ "webpack-dev-server": "latest" }, "peerDependencies": { - "@playkit-js/playkit-js": "^0.37.0", + "@playkit-js/playkit-js": "^0.44.0", "shaka-player": "https://github.com/kaltura/shaka-player.git#v2.3.3-k-3" }, "keywords": [ diff --git a/src/dash-adapter.js b/src/dash-adapter.js index 5302efef..e7f10995 100644 --- a/src/dash-adapter.js +++ b/src/dash-adapter.js @@ -227,18 +227,28 @@ export default class DashAdapter extends BaseMediaSourceAdapter { /** * Checks if dash adapter can play a given drm data. * @param {Array} drmData - The drm data to check. + * @param {PKDrmConfigObject} drmConfig - The drm config. * @returns {boolean} - Whether the dash adapter can play a specific drm data. * @static */ - static canPlayDrm(drmData: Array): boolean { + static canPlayDrm(drmData: Array, drmConfig: PKDrmConfigObject): boolean { let canPlayDrm = false; for (let drmProtocol of DashAdapter._drmProtocols) { - if (drmProtocol.canPlayDrm(drmData)) { + if (drmProtocol.isConfigured(drmData, drmConfig)) { DashAdapter._drmProtocol = drmProtocol; canPlayDrm = true; break; } } + if (!canPlayDrm) { + for (let drmProtocol of DashAdapter._drmProtocols) { + if (drmProtocol.canPlayDrm(drmData)) { + DashAdapter._drmProtocol = drmProtocol; + canPlayDrm = true; + break; + } + } + } DashAdapter._logger.debug('canPlayDrm result is ' + canPlayDrm.toString(), drmData); return canPlayDrm; } diff --git a/src/drm/playready.js b/src/drm/playready.js index 0d189f5b..f24068ad 100644 --- a/src/drm/playready.js +++ b/src/drm/playready.js @@ -7,12 +7,22 @@ const DrmScheme = BaseDrmProtocol.DrmScheme; export default class PlayReady extends BaseDrmProtocol { static _logger = BaseDrmProtocol.getLogger('PlayReady'); + /** + * PLAYREADY is the configure key system. + * @param {Array} drmData - The drm data. + * @param {PKDrmConfigObject} drmConfig - The drm config. + * @return {boolean} - Whether PLAYREADY is the configure key system. + */ + static isConfigured(drmData: Array, drmConfig: PKDrmConfigObject): boolean { + return DrmScheme.PLAYREADY === drmConfig.keySystem && !!drmData.find(drmEntry => drmEntry.scheme === drmConfig.keySystem); + } + /** * PlayReady playback supports in case 2 conditions are met: * 1. The environment supports PlayReady playback. * 2. The drm data of the source object contains entry with PlayReady scheme. * @param {Array} drmData - The drm data to check. - * @return {boolean} - Whether FairPlay can be play on the current environment. + * @return {boolean} - Whether PlayReady can be play on the current environment. */ static canPlayDrm(drmData: Array): boolean { PlayReady._logger.debug('Can play DRM scheme of: ' + DrmScheme.PLAYREADY); diff --git a/src/drm/widevine.js b/src/drm/widevine.js index 551b142f..4e0cc358 100644 --- a/src/drm/widevine.js +++ b/src/drm/widevine.js @@ -7,12 +7,22 @@ const DrmScheme = BaseDrmProtocol.DrmScheme; export default class Widevine extends BaseDrmProtocol { static _logger = BaseDrmProtocol.getLogger('Widevine'); + /** + * Widevine is the configure key system. + * @param {Array} drmData - The drm data. + * @param {PKDrmConfigObject} drmConfig - The drm config. + * @return {boolean} - Whether Widevine is the configure key system. + */ + static isConfigured(drmData: Array, drmConfig: PKDrmConfigObject): boolean { + return DrmScheme.WIDEVINE === drmConfig.keySystem && !!drmData.find(drmEntry => drmEntry.scheme === drmConfig.keySystem); + } + /** * Widevine playback supports in case 2 conditions are met: * 1. The environment supports Widevine playback. * 2. The drm data of the source object contains entry with Widevine scheme. * @param {Array} drmData - The drm data to check. - * @return {boolean} - Whether FairPlay can be play on the current environment. + * @return {boolean} - Whether Widevine can be play on the current environment. */ static canPlayDrm(drmData: Array): boolean { Widevine._logger.debug('Can play DRM scheme of: ' + DrmScheme.WIDEVINE); diff --git a/test/src/dash-adapter.spec.js b/test/src/dash-adapter.spec.js index a8adb53d..eb364978 100644 --- a/test/src/dash-adapter.spec.js +++ b/test/src/dash-adapter.spec.js @@ -82,24 +82,48 @@ describe('DashAdapter: canPlayDrm', () => { it('should return true since widevine can play drm', function() { sandbox.stub(Widevine, 'canPlayDrm').value(() => true); + sandbox.stub(Widevine, 'isConfigured').value(() => false); sandbox.stub(PlayReady, 'canPlayDrm').value(() => false); + sandbox.stub(PlayReady, 'isConfigured').value(() => false); DashAdapter.canPlayDrm().should.be.true; DashAdapter._drmProtocol.should.equal(Widevine); }); it('should return true since playready can play drm', function() { sandbox.stub(Widevine, 'canPlayDrm').value(() => false); + sandbox.stub(Widevine, 'isConfigured').value(() => false); sandbox.stub(PlayReady, 'canPlayDrm').value(() => true); + sandbox.stub(PlayReady, 'isConfigured').value(() => false); DashAdapter.canPlayDrm().should.be.true; DashAdapter._drmProtocol.should.equal(PlayReady); }); it('should return false since no drm can be played', function() { sandbox.stub(Widevine, 'canPlayDrm').value(() => false); + sandbox.stub(Widevine, 'isConfigured').value(() => false); sandbox.stub(PlayReady, 'canPlayDrm').value(() => false); + sandbox.stub(PlayReady, 'isConfigured').value(() => false); DashAdapter.canPlayDrm().should.be.false; (DashAdapter._drmProtocol === null).should.be.true; }); + + it('should return true even playready can be played since widevine configured', function() { + sandbox.stub(Widevine, 'isConfigured').value(() => true); + sandbox.stub(Widevine, 'canPlayDrm').value(() => false); + sandbox.stub(PlayReady, 'isConfigured').value(() => false); + sandbox.stub(PlayReady, 'canPlayDrm').value(() => true); + DashAdapter.canPlayDrm().should.be.true; + DashAdapter._drmProtocol.should.equal(Widevine); + }); + + it('should return true even widevine can be played since playready configured', function() { + sandbox.stub(Widevine, 'isConfigured').value(() => false); + sandbox.stub(Widevine, 'canPlayDrm').value(() => true); + sandbox.stub(PlayReady, 'isConfigured').value(() => true); + sandbox.stub(PlayReady, 'canPlayDrm').value(() => false); + DashAdapter.canPlayDrm().should.be.true; + DashAdapter._drmProtocol.should.equal(PlayReady); + }); }); describe('DashAdapter: canPlayType', () => { diff --git a/test/src/drm/playready.spec.js b/test/src/drm/playready.spec.js index e0486a06..39bb02d1 100644 --- a/test/src/drm/playready.spec.js +++ b/test/src/drm/playready.spec.js @@ -14,6 +14,20 @@ function isValidEnvForPlayReady() { } describe('PlayReady', function() { + describe('isConfigured', function() { + it('should return true for playready data if configured', function() { + PlayReady.isConfigured(prDrmData, {keySystem: DrmScheme.PLAYREADY}).should.be.true; + }); + + it('should return false for playready data if not configured', function() { + PlayReady.isConfigured(prDrmData, {keySystem: DrmScheme.WIDEVINE}).should.be.false; + }); + + it('should return false for non-playready data even configured', function() { + PlayReady.isConfigured(wwDrmData, {keySystem: DrmScheme.PLAYREADY}).should.be.false; + }); + }); + describe('canPlayDrm', function() { it('should return true for playready data on valid playready env and false otherwise', function() { if (isValidEnvForPlayReady()) { diff --git a/test/src/drm/widevine.spec.js b/test/src/drm/widevine.spec.js index 24f9bd3b..37d8993d 100644 --- a/test/src/drm/widevine.spec.js +++ b/test/src/drm/widevine.spec.js @@ -14,6 +14,20 @@ function isValidEnvForWidevine() { } describe('Widevine', function() { + describe('isConfigured', function() { + it('should return true for widevine data if configured', function() { + Widevine.isConfigured(wwDrmData, {keySystem: DrmScheme.WIDEVINE}).should.be.true; + }); + + it('should return false for widevine data if not configured', function() { + Widevine.isConfigured(wwDrmData, {keySystem: DrmScheme.PLAYREADY}).should.be.false; + }); + + it('should return false for non-widevine data even configured', function() { + Widevine.isConfigured(prDrmData, {keySystem: DrmScheme.WIDEVINE}).should.be.false; + }); + }); + describe('canPlayDrm', function() { it('should return true for widevine data on valid widevine env and false otherwise', function() { if (isValidEnvForWidevine()) { diff --git a/yarn.lock b/yarn.lock index fa4a2078..17af3883 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,9 +2,9 @@ # yarn lockfile v1 -"@playkit-js/playkit-js@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@playkit-js/playkit-js/-/playkit-js-0.37.0.tgz#2249594fc04becd4c9bc0a6d171077a0b5d40823" +"@playkit-js/playkit-js@^0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@playkit-js/playkit-js/-/playkit-js-0.44.0.tgz#ef0aa375c85d630e32b32d93a290676eaa4e4768" dependencies: js-logger "^1.3.0" ua-parser-js "^0.7.13"