MidnightRaver

Untitled

Feb 5th, 2023
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 7.74 KB | Source Code | 0 0
  1. // ==UserScript==
  2. // @name         EME Logger
  3. // @version      0.6
  4. // @match        *://*/*
  5. // @match        http://ss-cdn1.blim.com/
  6. // @run-at       document-start
  7. // @grant        none
  8. // ==/UserScript==
  9.  
  10. (async () => {
  11.     const indent = (s,n=4) => s.split('\n').map(l=>Array(n).fill(' ').join('')+l).join('\n');
  12.  
  13.     const b64 = {
  14.         decode: s => Uint8Array.from(atob(s), c => c.charCodeAt(0)),
  15.         encode: b => btoa(String.fromCharCode(...new Uint8Array(b)))
  16.     };
  17.  
  18.     const fnproxy = (object, func) => new Proxy(object, { apply: func });
  19.  
  20.     const proxy = (object, key, func) => Object.defineProperty(object, key, {
  21.         value: fnproxy(object[key], func)
  22.     });
  23.  
  24.     proxy(Navigator.prototype, 'requestMediaKeySystemAccess', async (_target, _this, _args) => {
  25.         const [keySystem, supportedConfigurations] = _args;
  26.         console.groupCollapsed(
  27.             `[EME] Navigator::requestMediaKeySystemAccess\n` +
  28.             `    Key System: ${keySystem}\n` +
  29.             `    Supported Configurations:\n` +
  30.             indent(JSON.stringify(supportedConfigurations, null, '    '))
  31.         );
  32.         console.trace();
  33.         console.groupEnd();
  34.         return _target.apply(_this, _args);
  35.     });
  36.  
  37.     proxy(MediaKeySystemAccess.prototype, 'createMediaKeys', async (_target, _this, _args) => {
  38.         console.groupCollapsed(
  39.             `[EME] MediaKeySystemAccess::createMediaKeys\n` +
  40.             `    Key System: ${_this.keySystem}\n` +
  41.             `    Configurations:\n` +
  42.             indent(JSON.stringify(_this.getConfiguration(), null, '    '))
  43.         );
  44.         console.trace();
  45.         console.groupEnd();
  46.         return _target.apply(_this, _args);
  47.     });
  48.  
  49.     proxy(MediaKeys.prototype, 'setServerCertificate', async (_target, _this, _args) => {
  50.         const [serverCertificate] = _args;
  51.         console.groupCollapsed(
  52.             `[EME] MediaKeys::setServerCertificate\n` +
  53.             `    Server Certificate: ${b64.encode(serverCertificate)}`
  54.         );
  55.         console.trace();
  56.         console.groupEnd();
  57.         return _target.apply(_this, _args);
  58.     });
  59.  
  60.     function messageHandler(event) {
  61.         const keySession = event.target;
  62.         const {sessionId} = keySession;
  63.         const {message, messageType} = event;
  64.         const listeners = keySession.getEventListeners('message').filter(l => l !== messageHandler);
  65.         console.groupCollapsed(
  66.             `[EME] MediaKeySession::message\n` +
  67.             `    Session ID: ${sessionId || '(not available)'}\n` +
  68.             `    Message Type: ${messageType}\n` +
  69.             `    Message: ${b64.encode(message)}` +
  70.             '\n    Listeners:', listeners
  71.         );
  72.         console.trace();
  73.         console.groupEnd();
  74.     }
  75.  
  76.     function keystatuseschangeHandler(event) {
  77.         const keySession = event.target;
  78.         const {sessionId} = keySession;
  79.         const listeners = keySession.getEventListeners('keystatuseschange').filter(l => l !== keystatuseschangeHandler);
  80.         console.groupCollapsed(
  81.             `[EME] MediaKeySession::keystatuseschange\n` +
  82.             `    Session ID: ${sessionId || '(not available)'}\n` +
  83.             Array.from(keySession.keyStatuses).map(([keyId, status]) =>
  84.                                                    `    [${status.toUpperCase()}] ${b64.encode(keyId)}`
  85.                                                   ).join('\n') +
  86.             '\n    Listeners:', listeners
  87.         );
  88.         console.trace();
  89.         console.groupEnd();
  90.     }
  91.  
  92.     proxy(MediaKeys.prototype, 'createSession', (_target, _this, _args) => {
  93.         const [sessionType] = _args;
  94.         console.groupCollapsed(
  95.             `[EME] MediaKeys::createSession\n` +
  96.             `    Session Type: ${sessionType || 'temporary (default)'}`
  97.         );
  98.         console.trace();
  99.         console.groupEnd();
  100.         const session = _target.apply(_this, _args);
  101.         session.addEventListener('message', messageHandler);
  102.         session.addEventListener('keystatuseschange', keystatuseschangeHandler);
  103.         return session;
  104.     });
  105.  
  106.     function getEventListeners(type) {
  107.         if (this == null) return [];
  108.         const store = this[Symbol.for(getEventListeners)];
  109.         if (store == null || store[type] == null) return [];
  110.         return store[type];
  111.     }
  112.  
  113.     EventTarget.prototype.getEventListeners = getEventListeners;
  114.  
  115.     proxy(EventTarget.prototype, 'addEventListener', async (_target, _this, _args) => {
  116.         if (_this != null) {
  117.             const [type, listener] = _args;
  118.             const storeKey = Symbol.for(getEventListeners);
  119.             if (!(storeKey in _this)) _this[storeKey] = {};
  120.             const store = _this[storeKey];
  121.             if (!(type in store)) store[type] = [];
  122.             const listeners = store[type];
  123.             if (listeners.indexOf(listener) < 0) {
  124.                 listeners.push(listener);
  125.             }
  126.         }
  127.         return _target.apply(_this, _args);
  128.     });
  129.  
  130.     proxy(EventTarget.prototype, 'removeEventListener', async (_target, _this, _args) => {
  131.         if (_this != null) {
  132.             const [type, listener] = _args;
  133.             const storeKey = Symbol.for(getEventListeners);
  134.             if (!(storeKey in _this)) return;
  135.             const store = _this[storeKey];
  136.             if (!(type in store)) return;
  137.             const listeners = store[type];
  138.             const index = listeners.indexOf(listener);
  139.             if (index >= 0) {
  140.                 if (listeners.length === 1) {
  141.                     delete store[type];
  142.                 } else {
  143.                     listeners.splice(index, 1);
  144.                 }
  145.             }
  146.         }
  147.         return _target.apply(_this, _args);
  148.     });
  149.  
  150.     proxy(MediaKeySession.prototype, 'generateRequest', async (_target, _this, _args) => {
  151.         const [initDataType, initData] = _args;
  152.         console.groupCollapsed(
  153.             `[EME] MediaKeySession::generateRequest\n` +
  154.             `    Session ID: ${_this.sessionId || '(not available)'}\n` +
  155.             `    Init Data Type: ${initDataType}\n` +
  156.             `    Init Data: ${b64.encode(initData)}`
  157.         );
  158.         console.trace();
  159.         console.groupEnd();
  160.         return _target.apply(_this, _args);
  161.     });
  162.  
  163.     proxy(MediaKeySession.prototype, 'load', async (_target, _this, _args) => {
  164.         const [sessionId] = _args;
  165.         console.groupCollapsed(
  166.             `[EME] MediaKeySession::load\n` +
  167.             `    Session ID: ${sessionId || '(not available)'}`
  168.         );
  169.         console.trace();
  170.         console.groupEnd();
  171.         return _target.apply(_this, _args);
  172.     });
  173.  
  174.     proxy(MediaKeySession.prototype, 'update', async (_target, _this, _args) => {
  175.         const [response] = _args;
  176.         console.groupCollapsed(
  177.             `[EME] MediaKeySession::update\n` +
  178.             `    Session ID: ${_this.sessionId || '(not available)'}\n` +
  179.             `    Response: ${b64.encode(response)}`
  180.         );
  181.         console.trace();
  182.         console.groupEnd();
  183.         return _target.apply(_this, _args);
  184.     });
  185.  
  186.     proxy(MediaKeySession.prototype, 'close', async (_target, _this, _args) => {
  187.         console.groupCollapsed(
  188.             `[EME] MediaKeySession::close\n` +
  189.             `    Session ID: ${_this.sessionId || '(not available)'}`
  190.         );
  191.         console.trace();
  192.         console.groupEnd();
  193.         return _target.apply(_this, _args);
  194.     });
  195.  
  196.     proxy(MediaKeySession.prototype, 'remove', async (_target, _this, _args) => {
  197.         console.groupCollapsed(
  198.             `[EME] MediaKeySession::remove\n` +
  199.             `    Session ID: ${_this.sessionId || '(not available)'}`
  200.         );
  201.         console.trace();
  202.         console.groupEnd();
  203.         return _target.apply(_this, _args);
  204.     });
  205. })();
Add Comment
Please, Sign In to add comment