diff --git a/AUTHORS b/AUTHORS index 1bd129c129..480615eeba 100644 --- a/AUTHORS +++ b/AUTHORS @@ -37,3 +37,4 @@ Sanborn Hilland TalkTalk Plc <*@talktalkplc.com> Toshihiro Suzuki uStudio Inc. <*@ustudio.com> +Verizon Digital Media Services <*@verizondigitalmedia.com> diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 75db7a0b2a..c3d355cb3b 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -34,6 +34,7 @@ Jason Palmer Jesper Haug Karsrud Joey Parrish Johan Sundström +John Bowers Jonas Birmé Jono Ward Jozef Chúťka diff --git a/demo/assets.js b/demo/assets.js index 6c70c066c4..a9b11f2cdd 100644 --- a/demo/assets.js +++ b/demo/assets.js @@ -36,7 +36,8 @@ shakaAssets.Encoder = { NIMBLE_STREAMER: 'Nimble Streamer', AZURE_MEDIA_SERVICES: 'Azure Media Services', MP4BOX: 'MP4Box', - APPLE: 'Apple' + APPLE: 'Apple', + UPLYNK: 'Verizon Digital Media Services' }; @@ -51,7 +52,8 @@ shakaAssets.Source = { BITCODIN: 'Bitcodin', NIMBLE_STREAMER: 'Nimble Streamer', AZURE_MEDIA_SERVICES: 'Azure Media Services', - GPAC: 'GPAC' + GPAC: 'GPAC', + UPLYNK: 'Verizon Digital Media Services' }; @@ -74,6 +76,7 @@ shakaAssets.Feature = { PSSH: 'embedded PSSH', MULTIKEY: 'multiple keys', MULTIPERIOD: 'multiple Periods', + ENCRYPTED_WITH_CLEAR: 'mixing encrypted and unencrypted periods', TRICK_MODE: 'special trick mode track', SUBTITLES: 'subtitles', @@ -223,6 +226,49 @@ shakaAssets.YouTubeResponseFilter = function(type, response) { }; +/** + * A response filter for VDMS Uplynk manifest responses, + * this allows us to get the license prefix that is necessary + * to later generate a proper license response. + * @param {shaka.net.NetworkingEngine.RequestType} type + * @param {shakaExtern.Response} response + * The uplynk_prefix attribute is set on the shakaAssets object + * and is later referenced in the UplynkRequestFilter. + */ +shakaAssets.UplynkResponseFilter = function(type, response) { + if (type == shaka.net.NetworkingEngine.RequestType.MANIFEST) { + // Parse a custom header that contains a value needed to build a proper + // license server URL + shakaAssets.uplynk_prefix = response.headers['x-uplynk-prefix']; + } +}; + + +/** + * A license request filter for VDMS Uplynk license requests. + * @param {shaka.net.NetworkingEngine.RequestType} type + * @param {shakaExtern.Request} request + * The uplynk_prefix variable is retrieved from the shakaAssets + * object, and requires that the uplynk manifest response filter + * also be set. + */ +shakaAssets.UplynkRequestFilter = function(type, request) { + if (type == shaka.net.NetworkingEngine.RequestType.LICENSE || + type == shaka.net.NetworkingEngine.RequestType.MANIFEST) { + request.allowCrossSiteCredentials = true; + } + + if (type == shaka.net.NetworkingEngine.RequestType.LICENSE) { + // Modify the license request URL based on our cookie + if (request.uris[0].indexOf('wv') !== -1) { + request.uris[0] = shakaAssets.uplynk_prefix.concat('/wv'); + } else if (request.uris[0].indexOf('ck') !== -1) { + request.uris[0] = shakaAssets.uplynk_prefix.concat('/ck'); + } + } +}; + + /** * @param {!Node} node * @return {Array.} @@ -1097,6 +1143,60 @@ shakaAssets.testAssets = [ shakaAssets.Feature.MP4, shakaAssets.Feature.SEGMENT_TEMPLATE_DURATION ] + }, + // }}} + + // Verizon Digital Media Services (VDMS) assets {{{ + { + name: 'Big Buck Bunny', + manifestUri: 'https://content.uplynk.com/224ac8717e714b68831997ab6cea4015.mpd', // gjslint: disable=110 + + encoder: shakaAssets.Encoder.UPLYNK, + source: shakaAssets.Source.UPLYNK, + drm: [ + shakaAssets.KeySystem.WIDEVINE, + shakaAssets.KeySystem.CLEAR_KEY + ], + features: [ + shakaAssets.Feature.MP4, + shakaAssets.Feature.SEGMENT_LIST_DURATION, + shakaAssets.Feature.PSSH, + shakaAssets.Feature.HIGH_DEFINITION + ], + licenseServers: { + 'com.widevine.alpha': 'https://content.uplynk.com/wv', + 'org.w3.clearkey': 'https://content.uplynk.com/ck' + }, + requestFilter: shakaAssets.UplynkRequestFilter, + responseFilter: shakaAssets.UplynkResponseFilter + }, + { + name: 'Sintel - (multiperiod-mix of encrypted and unencrypted)', + //Unencrypted periods interspersed with protected periods + //Requires Chrome 58 + manifestUri: 'https://content.uplynk.com/1eb40d8e64234f5c9879db7045c3d48c.mpd?ad=cleardash&rays=cdefg', // gjslint: disable=110 + + encoder: shakaAssets.Encoder.UPLYNK, + source: shakaAssets.Source.UPLYNK, + drm: [ + shakaAssets.KeySystem.WIDEVINE, + shakaAssets.KeySystem.CLEAR_KEY + ], + features: [ + shakaAssets.Feature.MP4, + shakaAssets.Feature.MULTIPLE_LANGUAGES, + shakaAssets.Feature.SEGMENT_LIST_DURATION, + shakaAssets.Feature.PSSH, + shakaAssets.Feature.HIGH_DEFINITION, + shakaAssets.Feature.MULTIPERIOD, + shakaAssets.Feature.ENCRYPTED_WITH_CLEAR + ], + licenseServers: { + 'com.widevine.alpha': 'https://content.uplynk.com/wv', + 'org.w3.clearkey': 'https://content.uplynk.com/ck' + }, + requestFilter: shakaAssets.UplynkRequestFilter, + responseFilter: shakaAssets.UplynkResponseFilter } // }}} ];