{"id":8387,"date":"2024-09-24T07:50:11","date_gmt":"2024-09-24T07:50:11","guid":{"rendered":"https:\/\/www.vdocipher.com\/blog\/?p=8387"},"modified":"2024-09-30T10:12:56","modified_gmt":"2024-09-30T10:12:56","slug":"how-to-integrate-widevine-shaka-player-for-drm-playback","status":"publish","type":"post","link":"https:\/\/www-uat.vdocipher.com\/blog\/shaka-player\/","title":{"rendered":"How To Integrate Widevine Shaka Player For DRM playback"},"content":{"rendered":"<p>If you are looking to stream your content along with Widevine DRM, chances are that you&#8217;re bound to come across Shaka player. As an open-source JS library, the Shaka player is widely used for adaptive video streaming. You can play content based on DASH and HLS, without browser plugins, with the help of an Encrypted media extension. So, in order to help others out and make it easier for others to learn about using Shaka player for DRM playback, I wrote this article.<\/p>\n<p>So, without further ado, let&#8217;s get started.<\/p>\n<div class=\"table-of-content\">\n<div class=\"table-border\">\n<h2 style=\"font-size: 22px; padding-top: 20px;\">Table of Contents:<\/h2>\n<div id=\"table-of-content\" style=\"padding-left: 20px;\">\n<ol>\n<li><a class=\"hashSmoothScroll\" href=\"#1\">What is Widevine Shaka Player?<\/a><\/li>\n<li><a class=\"hashSmoothScroll\" href=\"#2\">What is Encrypted Media Extension (EME)<\/a><\/li>\n<li><a class=\"hashSmoothScroll\" href=\"#3\">Steps to implement Shaka Player for Widevine<\/a><\/li>\n<li><a class=\"hashSmoothScroll\" href=\"#4\">Platform, Media, Browser and DRM Support<\/a><\/li>\n<li><a class=\"hashSmoothScroll\" href=\"#5\">Steps to implement Shaka Player for FairPlay<\/a><\/li>\n<li><a class=\"hashSmoothScroll\" href=\"#6\">Shaka Player UI<\/a><\/li>\n<li><a class=\"hashSmoothScroll\" href=\"#7\">Offline Storage and Playback<\/a><\/li>\n<li><a class=\"hashSmoothScroll\" href=\"#8\">How to Integrate Widevine Player Easily with VdoCipher<\/a><\/li>\n<li><a class=\"hashSmoothScroll\" href=\"#9\">Conclusion<\/a><\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<h2 id=\"1\"><b>What is Widevine Shaka Player?<\/b><\/h2>\n<p>Shaka Player is an open-source js video player mainly used for DRM service maintained by google. Under the hood for DRM service, it actuals bind the Video Element and Widevine CDM by consuming the EME API<\/p>\n<h3>Features<\/h3>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Supports the <a href=\"https:\/\/www.vdocipher.com\/blog\/adaptive-bitrate-streaming\">Adaptive Bitrate Streaming<\/a>, which means the quality of media adapts to the bandwidth of the user.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Can also support offline storage and playback using IndexDB<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Also, provide option UI Lib for player<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Easy integration with Chromecast and also supports the Google Widevine and Apple Fairplay DRM systems<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Capable of handling live streaming, including low-latency live streaming<br \/>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Open-source<\/li>\n<li aria-level=\"1\">wide range of subtitle and closed caption formats<\/li>\n<li aria-level=\"1\">Supports a variety of media formats, including MP4, WebM<\/li>\n<\/ul>\n<h3><strong>Prerequisites<\/strong><\/h3>\n<p>You can build Shaka on Linux, Windows, or macOS. To obtain the sources and compile the library, you will need the following:<\/p>\n<ul>\n<li>Git v1.9+<\/li>\n<li>Python v2.7 or v3.5+<\/li>\n<li>Java Runtime Environment (JRE) v14+<\/li>\n<li>Node.js v14+<\/li>\n<li>A local web server, such as Apache<\/li>\n<\/ul>\n<p>NOTE: A local web server is necessary because browsers impose restrictions on applications that are run from file:\/\/\/ URLs.<\/p>\n<p>If you are compiling Shaka for export to other projects, you may want to consider using a Docker container to simplify the process.<\/p>\n<p>To quickly install these prerequisites on Ubuntu or Debian, you can run the following script:<\/p>\n<pre>curl https:\/\/raw.githubusercontent.com\/shaka-project\/shaka-player\/main\/build\/install-linux-prereqs.sh | bash<\/pre>\n<h2 id=\"2\"><b>What is Encrypted Media Extension (EME)<\/b><\/h2>\n<p>DRM playback is based on the <a href=\"https:\/\/www.vdocipher.com\/blog\/2018\/11\/encrypted-media-extensions-eme\/\">Encrypted Media Extension<\/a> Technology, which is the standard of W3C to provide DRM playback support in web browsers.<br \/>\n<br \/>\nEME can be majorly divided into two parts:<br \/>\n<b><\/b><\/p>\n<h3><b>EME API:<\/b><br \/>\n<\/h3>\n<p>These APIs are the part of the browser API as the standard of W3C to securely communicate between the Video Element and <a href=\"https:\/\/www.vdocipher.com\/blog\/widevine-drm-hollywood-video\/\">CDM<\/a> (Content Decryption Module) where actual decoding of media happens<\/p>\n<h3><b>Content Decryption Module:<\/b><\/h3>\n<p>CDM is a proprietary software\/hardware of <a href=\"https:\/\/www.vdocipher.com\/page\/drm\">DRM service<\/a> provider that can be bundled in the browser\/OS or added as hardware in the client machine, it\u2019s the main purpose is to decode the video in a secure executing environment without exposing it to the user and rendering media directly on the video element.<\/p>\n<p>Here\u2019s a brief block diagram of EME Tech in Vdophiper Player and Playback.<\/p>\n<p><a href=\"https:\/\/www.vdocipher.com\/blog\/wp-content\/uploads\/2021\/07\/blog.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-8388\" src=\"https:\/\/www.vdocipher.com\/blog\/wp-content\/uploads\/2021\/07\/blog.png\" alt=\"Shaka player implementation for DRM\" width=\"876\" height=\"324\" srcset=\"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2021\/07\/blog.png 876w, https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2021\/07\/blog-300x111.png 300w, https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2021\/07\/blog-768x284.png 768w\" sizes=\"auto, (max-width: 876px) 100vw, 876px\" \/><\/a><\/p>\n<p>Both DRM service providers, Apple <a href=\"https:\/\/www.vdocipher.com\/blog\/fairplay-drm-ios-safari-html5\/\">Fairplay DRM<\/a> and Google <a href=\"https:\/\/www.vdocipher.com\/blog\/widevine-drm-hollywood-video\/\">Widevine DRM<\/a> provide CDM in Safari and Chrome browsers respectively.<\/p>\n<p>For video playback, Apple expects developers to consume EME API and provide playback on the video element, but google Widevine goes one step ahead and also provides JS video Player name <b>Shaka Player<\/b> that provides full basic playback using EME API and Video Element.<\/p>\n<p><strong>About Vdocipher Player:<\/strong><\/p>\n<p>Vdocipher Player is a plug-n -play video player, that expects the <b>VideoID<\/b> and <b>OTP<\/b> and handles everything under the hood, like choosing the DRM service based on the user device and provide basic playback,<\/p>\n<p>Also, this player is loaded with tons of features like playlist, video analytics, captions and many more.<\/p>\n<div class=\"outer-cta\">\n<div class=\"inner-cta\">\n<p class=\"cta-emoji-line\">Explore More \u2705<\/p>\n<p class=\"cta-emoji-line\"><a class=\"cta-short-line\" href=\"https:\/\/www.vdocipher.com\/page\/features\/?utm_source=blog&amp;utm_medium=text-cta&amp;utm_campaign=features\">VdoCipher ensures Secure Video Hosting<\/a><\/p>\n<\/div>\n<div class=\"inner-cta\">\n<p style=\"font-size: 16px !important; font-weight: 400; margin: 0!important;\">VdoCipher empowers course creators, event organizers and broadcasters with expert live video streaming, ensuring smooth playback globally.<\/p>\n<\/div>\n<\/div>\n<h2 id=\"3\">Steps to implement Shaka Player for Widevine<\/h2>\n<ol>\n<li aria-level=\"1\">Setup the basic video player<\/li>\n<li aria-level=\"1\">Add the DRM configuration<\/li>\n<li aria-level=\"1\">Handle License Server Authentication &amp; delivers licenses<\/li>\n<\/ol>\n<h3><b>Setup The Basic Shaka Video Player<\/b><\/h3>\n<p>In this setup, we will add the video without DRM using shaka player lib.<\/p>\n<pre>&lt;html&gt;\r\n&lt;head&gt;\r\n&lt;!-- Shaka Player compiled library: --&gt;\r\n&lt;script src=\"dist\/shaka-player.compiled.js\"&gt;&lt;\/script&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;video\r\nid=\"video\"\r\nwidth=\"640\"\r\nposter=\"example.com\/poster.jpg\"\r\ncontrols\r\nautoplay\r\n&gt;&lt;\/video&gt;\r\n&lt;\/body&gt;\r\n&lt;script&gt;\r\n\/\/ Video Manifest URL\r\nconst manifestUri =\r\n\"https:\/\/storage.googleapis.com\/shaka-demo-assets\/angel-one\/dash.mpd\";\r\n\r\n\/\/ Install all the required Polyfill\r\nshaka.polyfill.installAll();\r\nif (shaka.Player.isBrowserSupported()){\r\nthrow new Error(\"Browser not supported !\")\r\n};\r\nconst video = document.getElementById(\"video\");\r\n\/\/Shaka Player Reference provides all methods and properties.\r\nconst player = new shaka.Player(video);\r\nplayer.addEventListener(\"error\", onErrorEvent);\r\nplayer\r\n.load(manifestUri)\r\n.then(() =&gt; console.log(\"Video Load successful\"))\r\n.catch((error) =&gt;\r\nconsole.error(\"Error code\", error.code, \"object\", error)\r\n);\r\n&lt;\/script&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3><b>Add the DRM configuration.<\/b><\/h3>\n<p>For DRM playback we need to add the DRM configuration to the player instance we created above ( in between the script tags )<\/p>\n<pre>player.configure({\r\nDRM: {\r\nservers: {\r\n'com.widevine.alpha': 'https:\/\/YOUR.AUTHENTICATION.SERVER',\r\n}\r\n}\r\n})<\/pre>\n<p>Shaka player will request https:\/\/your.authentication.server\/,to get the License Certificate,\u00a0<br \/>\nShaka Player is a key-system-agnostic, it uses EME to ask the browser what its key-system is supported, and make no assumptions. If your browser supports multiple key systems, the first supported key system in the manifest is used<b><\/b><\/p>\n<h3><b>Handling License Server Authentication<\/b><\/h3>\n<p>Your application&#8217;s license server may require some form of authentication so that it only delivers licenses to paying users,\u00a0<\/p>\n<p>but for that you need to add header\/token\/parameter with each request to identify the user, you can do so by interrupting the request for\u00a0 License Certificate, and send them the License Certificate only if it passed the authorization criteria.\u00a0<\/p>\n<p>To interrupt the License Certificate request we will use the `getNetworkEngine` Method<\/p>\n<pre>player\r\n.getNetworkingEngine()\r\n.registerRequestFilter(function (type, request) {\r\n\/\/ Only add headers to license requests:\r\nif (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {\r\n\/\/ This is the specific header name and value the server wants:\r\nrequest.headers[\"user-identify-token\"] = \"VGhpc0lzQVRlc3QK\";\r\n}\r\n});<\/pre>\n<p>In the above, we add the parameter in the request header, although there are two more options like Cookie Authentication, Parameter Authentication. To identify the right user on License Server.<\/p>\n<h2 id=\"5\">Steps to implement Shaka Player for FairPlay<\/h2>\n<p>Shaka players also support Apple FairPlay DRM, Implementing the FairPlay the follow same above three-step paradigm as implementing the <a href=\"https:\/\/www.vdocipher.com\/blog\/widevine-drm-hollywood-video\/\">Widevine<\/a>.<\/p>\n<p>First step remains the same in both, it just the DRM configuration and handling the request changes while implementing the FairPlay<\/p>\n<pre>player.configure({\r\nDRM: {\r\nservers: {\r\n\"com.apple.fps.1_0\": licenseUri,\r\n},\r\nadvanced: {\r\n\"com.apple.fps.1_0\": {\r\nserverCertificate: fairplayCert,\r\n},\r\n},\r\ninitDataTransform: function (initData) {\r\nconst skdUri = shaka.util.StringUtils.fromBytesAutoDetect(initData);\r\nconsole.log(\"skdUri : \" + skdUri);\r\nconst contentId = skdUri.substring(skdUri.indexOf(\"skd:\/\/\") + 6);\r\nconsole.log(\"contentId : \", contentId);\r\nconst cert = player.drmInfo().serverCertificate;\r\nreturn shaka.util.FairPlayUtils.initDataTransform(\r\ninitData,\r\ncontentId,\r\ncert\r\n);\r\n},\r\n},\r\n});\r\n\r\nplayer.getNetworkingEngine().registerRequestFilter(function (type, request) {\r\nif (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {\r\nconst originalPayload = new Uint8Array(request.body);\r\nconst base64Payload = shaka.util.Uint8ArrayUtils.toBase64(originalPayload);\r\nconst params = \"spc=\" + encodeURIComponent(base64Payload);\r\n\r\nrequest.body = shaka.util.StringUtils.toUTF8(params);\r\nrequest.headers[\"user-identify-token\"] = authToken; \/\/ Token to identify the user.\r\n}\r\n});\r\n\r\nplayer.getNetworkingEngine().registerResponseFilter(function (type, response) {\r\n\/\/ Alias some utilities provided by the library.\r\nif (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {\r\nconst responseText = shaka.util.StringUtils.fromUTF8(response.data).trim();\r\nresponse.data = shaka.util.Uint8ArrayUtils.fromBase64(responseText).buffer;\r\nparsingResponse(response);\r\n}\r\n});<\/pre>\n<h2 id=\"6\">Shaka Player UI<\/h2>\n<p>Shaka player also ships the UI controls for the video element, to implement UI, use the shaka-player.ui.js build and add the attribute of data-shaka-player-container of parent div of the video element. It will add the controls in that div.<\/p>\n<pre>&lt;div data-shaka-player-container&gt;\r\n&lt;video autoplay data-shaka-player id=\"video\"&gt;&lt;\/video&gt;\r\n&lt;\/div&gt;<\/pre>\n<p>And to access the Player instance and Controls instance\u00a0<\/p>\n<pre>const video = document.getElementById(\"video\");\r\nconst ui = video[\"ui\"];\r\nconst controls = ui.getControls();\r\nconst player = controls.getPlayer();\r\nplayer.addEventListener(\"error\", console.error);\r\ncontrols.addEventListener(\"error\", console.error);<\/pre>\n<p>To configure the UI of Player we can use \u00a0 UI. configure(configure)\u00a0 method.<\/p>\n<pre>const config = {\r\naddSeekBar: false,\r\ncontrolPanelElements: [\"rewind\", \"fast_forward\"],\r\nseekBarColors: {\r\nbase: \"rgba(255, 255, 255, 0.3)\",\r\nbuffered: \"rgba(255, 255, 255, 0.54)\",\r\nplayed: \"rgb(255, 255, 255)\",\r\n},\r\n};\r\nui.configure(config);<\/pre>\n<h2>Platform, Media, Browser and DRM Support<\/h2>\n<h3>Shaka Player Manifest Format Support Matrix<\/h3>\n<table dir=\"ltr\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\" data-sheets-root=\"1\" data-sheets-baot=\"1\">\n<colgroup>\n<col width=\"100\" \/>\n<col width=\"100\" \/>\n<col width=\"100\" \/>\n<col width=\"100\" \/>\n<col width=\"100\" \/><\/colgroup>\n<tbody>\n<tr>\n<td><strong>Format<\/strong><\/td>\n<td><strong>Video On-Demand<\/strong><\/td>\n<td><strong>Live<\/strong><\/td>\n<td><strong>Event<\/strong><\/td>\n<td>\n<div>\n<div><strong>In-Progress Recording<\/strong><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>DASH<\/td>\n<td>Y<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<\/tr>\n<tr>\n<td>HLS<\/td>\n<td>Y<\/td>\n<td>Y<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<\/tr>\n<tr>\n<td>MSS<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>\u2013<\/td>\n<td>\u2013<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Shaka Player DRM Support Matrix<\/h3>\n<table dir=\"ltr\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\" data-sheets-root=\"1\" data-sheets-baot=\"1\">\n<colgroup>\n<col width=\"100\" \/>\n<col width=\"100\" \/>\n<col width=\"100\" \/>\n<col width=\"100\" \/>\n<col width=\"100\" \/><\/colgroup>\n<tbody>\n<tr>\n<td><strong>Browser<\/strong><\/td>\n<td><strong>Widevine<\/strong><\/td>\n<td><strong>PlayReady<\/strong><\/td>\n<td><strong>FairPlay<\/strong><\/td>\n<td><strong>ClearKey<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Chrome<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<\/tr>\n<tr>\n<td>Firefox<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<\/tr>\n<tr>\n<td>Edge<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>\u2013<\/td>\n<\/tr>\n<tr>\n<td>Edge Chromium<\/td>\n<td>Y<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<\/tr>\n<tr>\n<td>Safari<\/td>\n<td>\u2013<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<\/tr>\n<tr>\n<td>Opera<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<\/tr>\n<tr>\n<td>Chromecast<\/td>\n<td>Y<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<\/tr>\n<tr>\n<td>Tizen TV<\/td>\n<td>Y<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<\/tr>\n<tr>\n<td>WebOS<\/td>\n<td>untested<\/td>\n<td>untested<\/td>\n<td>\u2013<\/td>\n<td>untested<\/td>\n<\/tr>\n<tr>\n<td>Hisense<\/td>\n<td>untested<\/td>\n<td>untested<\/td>\n<td>\u2013<\/td>\n<td>untested<\/td>\n<\/tr>\n<tr>\n<td>Xbox One<\/td>\n<td>\u2013<\/td>\n<td>Y<\/td>\n<td>\u2013<\/td>\n<td>\u2013<\/td>\n<\/tr>\n<tr>\n<td>Playstation 4<\/td>\n<td>\u2013<\/td>\n<td>untested<\/td>\n<td>\u2013<\/td>\n<td>untested<\/td>\n<\/tr>\n<tr>\n<td>Playstation 5<\/td>\n<td>\u2013<\/td>\n<td>untested<\/td>\n<td>\u2013<\/td>\n<td>untested<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Shaka Player Manifest and Media Support<\/h3>\n<table dir=\"ltr\" style=\"height: 1526px;\" border=\"1\" width=\"499\" cellspacing=\"0\" cellpadding=\"0\" data-sheets-root=\"1\" data-sheets-baot=\"1\">\n<colgroup>\n<col width=\"100\" \/>\n<col width=\"100\" \/><\/colgroup>\n<tbody>\n<tr>\n<td><strong>Media Type<\/strong><\/td>\n<td><strong>Support<\/strong><\/td>\n<\/tr>\n<tr>\n<td>application\/dash+xml<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/vnd.mpeg.dash.mpd<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>application\/x-mpegurl<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>application\/vnd.apple.mpegurl<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>application\/vnd.ms-sstr+xml<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>application\/x-offline-manifest<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201davc1.42E01E\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201davc3.42E01E\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201dhev1.1.6.L93.90\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201dhvc1.1.6.L93.90\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201dhev1.2.4.L153.B0\u2033; eotf=\u201dsmpte2084\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201dhvc1.2.4.L153.B0\u2033; eotf=\u201dsmpte2084\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201dvp9\u2033<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201dvp09.00.10.08\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201dav01.0.01M.08\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp4; codecs=\u201ddvh1.20.01\u2033<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>audio\/mp4; codecs=\u201dmp4a.40.2\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>audio\/mp4<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>audio\/mp4; codecs=\u201dopus\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>audio\/mp4; codecs=\u201dflac\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/webm; codecs=\u201dvp8\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/webm<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/webm; codecs=\u201dvp9\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/webm; codecs=\u201dvp09.00.10.08\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>audio\/webm; codecs=\u201dvorbis\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>audio\/webm<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>audio\/webm; codecs=\u201dopus\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp2t; codecs=\u201davc1.42E01E\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp2t<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp2t; codecs=\u201davc3.42E01E\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp2t; codecs=\u201dhvc1.1.6.L93.90\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>video\/mp2t; codecs=\u201dmp4a.40.2\u2033<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>text\/vtt<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>application\/mp4; codecs=\u201dwvtt\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>application\/mp4<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>application\/ttml+xml<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>application\/mp4; codecs=\u201dstpp\u201d<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>audio\/aac<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>audio\/mpeg<\/td>\n<td>Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"7\">Offline Storage and Playback with Shaka Player<\/h2>\n<p>Shaka player also provides the offline playback of video with <a href=\"https:\/\/www.vdocipher.com\/blog\/in\/drm-solution\">DRM solution<\/a>, it uses the index DB to store the video and Service worker to map the license request.<\/p>\n<h2 id=\"8\">How to Integrate Widevine Player Easily with VdoCipher<\/h2>\n<p>Integrating DRM for video streaming can often seem complex, especially if you are not well-versed in coding or due to the intricacies of DRM technologies like Widevine. Fortunately, VdoCipher offers a streamlined solution that simplifies this process significantly. By signing up with VdoCipher, users can bypass the technical challenges of setting up a Widevine DRM player from scratch.<\/p>\n<h3>Simplifying DRM with VdoCipher<\/h3>\n<p>VdoCipher utilizes the Shaka Player to facilitate DRM-protected video playback. This integration means that when you choose VdoCipher, you&#8217;re not just getting a video hosting service; you&#8217;re also getting a pre-configured Custom Video Player ready to deliver content protected by Widevine DRM and even Apple FairPlay DRM.<\/p>\n<p>Here\u2019s what VdoCipher provides to make your integration seamless:<\/p>\n<ul>\n<li><strong>Pre-configured DRM:<\/strong> VdoCipher comes with DRM settings already configured. This includes the necessary licenses and the integration with Widevine, ensuring that your content is protected right from the start without any additional setup.<\/li>\n<li><strong>Simple Video Embedding:<\/strong> Once you upload your video to the VdoCipher platform, embedding it on your website is as simple as copying and pasting a code snippet and even API support for automated integration. You also get integration for flutter, iOS, Android, etc.<\/li>\n<li><strong>Complete Backend Handling:<\/strong> VdoCipher manages all backend operations, including the secure delivery of license keys and the handling of DRM licenses. This means you don\u2019t have to interact with the Encrypted Media Extensions (EME) or configure the Content Decryption Module (CDM).<\/li>\n<li><strong>Enhanced Security and Compliance:<\/strong> With VdoCipher\u2019s secure video hosting, you get the benefit of industry-leading security for your DRM-protected content, dynamic watermarking, play integrity protection, hacker identification analytics, ensuring compliance with copyright regulations.<\/li>\n<\/ul>\n<h3>Getting Started with VdoCipher<\/h3>\n<p>To start using VdoCipher for your Widevine DRM-protected content, follow these simple steps:<\/p>\n<ol>\n<li><strong>Sign Up for VdoCipher:<\/strong> Visit the VdoCipher website and sign up for an account.<\/li>\n<li><strong>Upload Your Video Content:<\/strong> Once your account is set up, you can begin uploading your video content to the platform.<\/li>\n<li><strong>Embed Your Videos:<\/strong> After uploading, you will receive an embed code for each video. Simply paste this code into the HTML of your website where you want the video to appear.<\/li>\n<li><strong>Enjoy Seamless Streaming:<\/strong> With everything set up, your videos are now ready to be streamed with high-level security and without any hassle.<\/li>\n<\/ol>\n<p>By choosing VdoCipher, you can focus more on creating and managing your content rather than worrying about the technicalities of Widevine DRM and player integration.<\/p>\n<h2 id=\"9\"><strong>Conclusion<\/strong><\/h2>\n<p>I hope this article helped you on how to ensure Shaka Player implementation for DRM playback. In this article, I&#8217;ve gone through what Shaka player and EME are. Also, how you can set up the player, add DRM configuration, and more.<\/p>\n<p>At Vdocipher, we implement Shaka player for DRM playback on our own. When you use our platform, you won&#8217;t have to worry about implementing Shaka player or DRM. We take care of all of it, all you have to do is simply upload your video to our platform and embed it on your website.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you are looking to stream your content along with Widevine DRM, chances are that you&#8217;re bound to come across Shaka player. As an open-source JS library, the Shaka player is widely used for adaptive video streaming. You can play content based on DASH and HLS, without browser plugins, with the help of an Encrypted [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":16914,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[130,37,226],"tags":[],"class_list":{"0":"post-8387","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-knowledge-base","8":"category-market-technology-analysis","9":"category-video-tech","10":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.0 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How To Integrate Widevine Shaka Player For DRM playback<\/title>\n<meta name=\"description\" content=\"Shaka Player is an open-source js video player mainly used for Widevine DRM. It binds the Video Element and Widevine CDM by consuming the EME API\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How To Integrate Widevine Shaka Player For DRM playback\" \/>\n<meta property=\"og:description\" content=\"Shaka Player is an open-source js video player mainly used for Widevine DRM. It binds the Video Element and Widevine CDM by consuming the EME API\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/\" \/>\n<meta property=\"og:site_name\" content=\"VdoCipher Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/vdociphertech\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-24T07:50:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-30T10:12:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"450\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Purushottam\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@vdocipher\" \/>\n<meta name=\"twitter:site\" content=\"@vdocipher\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Purushottam\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/\"},\"author\":{\"name\":\"Purushottam\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#\/schema\/person\/93d75375ced7dc83fb3b5cccc7045cf7\"},\"headline\":\"How To Integrate Widevine Shaka Player For DRM playback\",\"datePublished\":\"2024-09-24T07:50:11+00:00\",\"dateModified\":\"2024-09-30T10:12:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/\"},\"wordCount\":1840,\"publisher\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg\",\"articleSection\":[\"Knowledge Base\",\"Market &amp; technology analysis\",\"Video Tech\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/\",\"url\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/\",\"name\":\"How To Integrate Widevine Shaka Player For DRM playback\",\"isPartOf\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg\",\"datePublished\":\"2024-09-24T07:50:11+00:00\",\"dateModified\":\"2024-09-30T10:12:56+00:00\",\"description\":\"Shaka Player is an open-source js video player mainly used for Widevine DRM. It binds the Video Element and Widevine CDM by consuming the EME API\",\"breadcrumb\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#primaryimage\",\"url\":\"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg\",\"contentUrl\":\"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg\",\"width\":1000,\"height\":450,\"caption\":\"How To Implement Shaka Player For DRM playback\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.vdocipher.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How To Integrate Widevine Shaka Player For DRM playback\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#website\",\"url\":\"https:\/\/www.vdocipher.com\/blog\/\",\"name\":\"VdoCipher Blog\",\"description\":\"Secure Video Streaming\",\"publisher\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.vdocipher.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#organization\",\"name\":\"VdoCipher\",\"url\":\"https:\/\/www.vdocipher.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.vdocipher.com\/blog\/wp-content\/uploads\/2016\/11\/VdoCipher-logo2.png\",\"contentUrl\":\"https:\/\/www.vdocipher.com\/blog\/wp-content\/uploads\/2016\/11\/VdoCipher-logo2.png\",\"width\":1625,\"height\":1925,\"caption\":\"VdoCipher\"},\"image\":{\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/vdociphertech\/\",\"https:\/\/x.com\/vdocipher\",\"https:\/\/www.linkedin.com\/company\/vdocipher\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#\/schema\/person\/93d75375ced7dc83fb3b5cccc7045cf7\",\"name\":\"Purushottam\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.vdocipher.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5ddda32ee0e5362fa00b7174fedb16fba4bf27620a1882c9aaa959841c98c994?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5ddda32ee0e5362fa00b7174fedb16fba4bf27620a1882c9aaa959841c98c994?s=96&r=g\",\"caption\":\"Purushottam\"},\"description\":\"Javascript Developer, open-source enthusiast, keep things simple and sweet.\",\"sameAs\":[\"https:\/\/www.vdocipher.com\/\"],\"url\":\"https:\/\/www-uat.vdocipher.com\/blog\/author\/purushottam\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How To Integrate Widevine Shaka Player For DRM playback","description":"Shaka Player is an open-source js video player mainly used for Widevine DRM. It binds the Video Element and Widevine CDM by consuming the EME API","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/","og_locale":"en_US","og_type":"article","og_title":"How To Integrate Widevine Shaka Player For DRM playback","og_description":"Shaka Player is an open-source js video player mainly used for Widevine DRM. It binds the Video Element and Widevine CDM by consuming the EME API","og_url":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/","og_site_name":"VdoCipher Blog","article_publisher":"https:\/\/www.facebook.com\/vdociphertech\/","article_published_time":"2024-09-24T07:50:11+00:00","article_modified_time":"2024-09-30T10:12:56+00:00","og_image":[{"width":1000,"height":450,"url":"https:\/\/www.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg","type":"image\/jpeg"}],"author":"Purushottam","twitter_card":"summary_large_image","twitter_creator":"@vdocipher","twitter_site":"@vdocipher","twitter_misc":{"Written by":"Purushottam","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#article","isPartOf":{"@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/"},"author":{"name":"Purushottam","@id":"https:\/\/www.vdocipher.com\/blog\/#\/schema\/person\/93d75375ced7dc83fb3b5cccc7045cf7"},"headline":"How To Integrate Widevine Shaka Player For DRM playback","datePublished":"2024-09-24T07:50:11+00:00","dateModified":"2024-09-30T10:12:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/"},"wordCount":1840,"publisher":{"@id":"https:\/\/www.vdocipher.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#primaryimage"},"thumbnailUrl":"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg","articleSection":["Knowledge Base","Market &amp; technology analysis","Video Tech"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/","url":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/","name":"How To Integrate Widevine Shaka Player For DRM playback","isPartOf":{"@id":"https:\/\/www.vdocipher.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#primaryimage"},"image":{"@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#primaryimage"},"thumbnailUrl":"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg","datePublished":"2024-09-24T07:50:11+00:00","dateModified":"2024-09-30T10:12:56+00:00","description":"Shaka Player is an open-source js video player mainly used for Widevine DRM. It binds the Video Element and Widevine CDM by consuming the EME API","breadcrumb":{"@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.vdocipher.com\/blog\/shaka-player\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#primaryimage","url":"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg","contentUrl":"https:\/\/www-uat.vdocipher.com\/blog\/wp-content\/uploads\/2024\/05\/Shaka-Video-Player.jpg","width":1000,"height":450,"caption":"How To Implement Shaka Player For DRM playback"},{"@type":"BreadcrumbList","@id":"https:\/\/www.vdocipher.com\/blog\/shaka-player\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.vdocipher.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How To Integrate Widevine Shaka Player For DRM playback"}]},{"@type":"WebSite","@id":"https:\/\/www.vdocipher.com\/blog\/#website","url":"https:\/\/www.vdocipher.com\/blog\/","name":"VdoCipher Blog","description":"Secure Video Streaming","publisher":{"@id":"https:\/\/www.vdocipher.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.vdocipher.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.vdocipher.com\/blog\/#organization","name":"VdoCipher","url":"https:\/\/www.vdocipher.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.vdocipher.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.vdocipher.com\/blog\/wp-content\/uploads\/2016\/11\/VdoCipher-logo2.png","contentUrl":"https:\/\/www.vdocipher.com\/blog\/wp-content\/uploads\/2016\/11\/VdoCipher-logo2.png","width":1625,"height":1925,"caption":"VdoCipher"},"image":{"@id":"https:\/\/www.vdocipher.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/vdociphertech\/","https:\/\/x.com\/vdocipher","https:\/\/www.linkedin.com\/company\/vdocipher"]},{"@type":"Person","@id":"https:\/\/www.vdocipher.com\/blog\/#\/schema\/person\/93d75375ced7dc83fb3b5cccc7045cf7","name":"Purushottam","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.vdocipher.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5ddda32ee0e5362fa00b7174fedb16fba4bf27620a1882c9aaa959841c98c994?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5ddda32ee0e5362fa00b7174fedb16fba4bf27620a1882c9aaa959841c98c994?s=96&r=g","caption":"Purushottam"},"description":"Javascript Developer, open-source enthusiast, keep things simple and sweet.","sameAs":["https:\/\/www.vdocipher.com\/"],"url":"https:\/\/www-uat.vdocipher.com\/blog\/author\/purushottam\/"}]}},"yoast":{"focuskw":"shaka player","title":"%%title%%","metadesc":"Shaka Player is an open-source js video player mainly used for Widevine DRM. It binds the Video Element and Widevine CDM by consuming the EME API","linkdex":"77","metakeywords":"","meta-robots-noindex":"","meta-robots-nofollow":"","meta-robots-adv":"","canonical":"","redirect":"","opengraph-title":"","opengraph-description":"","opengraph-image":"","twitter-title":"","twitter-description":"","twitter-image":""},"_links":{"self":[{"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/posts\/8387","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/comments?post=8387"}],"version-history":[{"count":51,"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/posts\/8387\/revisions"}],"predecessor-version":[{"id":17849,"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/posts\/8387\/revisions\/17849"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/media\/16914"}],"wp:attachment":[{"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/media?parent=8387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/categories?post=8387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www-uat.vdocipher.com\/blog\/wp-json\/wp\/v2\/tags?post=8387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}