Outputs clearkey in the console for videos using the ClearKey DRM
// ==UserScript==
// @name Inline ClearKey Viewer
// @namespace https://mirazmac.com/
// @version 1.0.0
// @description Outputs clearkey in the console for videos using the ClearKey DRM
// @author Miraz Mac
// @match https://*/*
// @license MIT
// @icon https://www.google.com/s2/favicons?sz=64&domain=dashif.org
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
const b64ToHex = b64 => [...atob(b64)].map(c=> c.charCodeAt(0).toString(16).padStart(2,0)).join``
function getClearkey(response) {
let obj;
try {
obj = JSON.parse(new TextDecoder().decode(response));
} catch {
return null;
}
if (!Array.isArray(obj.keys)) {
return null;
}
return obj.keys
.map(o => [o.kid, o.k])
.map(o => o.map(a => a.replace(/-/g, '+').replace(/_/g, '/') + "=="))
.map(o => `${b64ToHex(o[0])}:${b64ToHex(o[1])}`)
.join("\n");
}
const originalUpdate = MediaKeySession.prototype.update;
MediaKeySession.prototype.update = function(response) {
const result = originalUpdate.call(this, response);
try {
const keys = getClearkey(response);
if (!keys) return result;
console.log("[CLEARKEY]", keys);
document.dispatchEvent(new CustomEvent("clearkey", {
detail: keys
}));
} finally {
return result;
}
};
})();