|
|
| (function() {
|
| 'use strict';
|
| const args = Array.from(arguments);
|
| const prunePaths = (args[0] || '').split(/\s+/).filter(Boolean);
|
| if (prunePaths.length === 0) return;
|
| function prune(obj, path) {
|
| if (!obj || typeof obj !== 'object') return;
|
| const parts = path.split('.');
|
| let target = obj;
|
| for (let i = 0; i < parts.length - 1; i++) {
|
| const part = parts[i];
|
| if (part.endsWith('[]')) {
|
| const key = part.slice(0, -2);
|
| if (Array.isArray(target[key])) {
|
| target[key].forEach(item => prune(item, parts.slice(i + 1).join('.')));
|
| }
|
| return;
|
| }
|
| if (!target[part]) return;
|
| target = target[part];
|
| }
|
| delete target[parts[parts.length - 1]];
|
| }
|
| function pruneAll(obj) { for (const p of prunePaths) prune(obj, p); return obj; }
|
| const jp = JSON.parse;
|
| JSON.parse = function() { return pruneAll(jp.apply(this, arguments)); };
|
| const rj = Response.prototype.json;
|
| Response.prototype.json = function() { return rj.apply(this, arguments).then(pruneAll); };
|
| })();
|
|
|
|
|
| (function() {
|
| 'use strict';
|
| const prop = arguments[0];
|
| const raw = arguments[1];
|
| if (!prop) return;
|
| let value;
|
| if (raw === 'undefined') value = undefined;
|
| else if (raw === 'false') value = false;
|
| else if (raw === 'true') value = true;
|
| else if (raw === 'null') value = null;
|
| else value = raw;
|
| const parts = prop.split('.');
|
| let obj = window;
|
| for (let i = 0; i < parts.length - 1; i++) {
|
| obj = obj[parts[i]] = obj[parts[i]] || {};
|
| }
|
| try {
|
| Object.defineProperty(obj, parts[parts.length - 1], { get: () => value, set: () => {}, configurable: true });
|
| } catch {}
|
| })();
|
|
|
|
|
| (function() {
|
| 'use strict';
|
| const needle = arguments[0] || '';
|
| const prop = arguments[1] || '';
|
| if (!needle && !prop) return;
|
| const re = new RegExp(needle);
|
| const oe = document.createElement.bind(document);
|
| document.createElement = function(tag) {
|
| const el = oe(tag);
|
| if (String(tag).toLowerCase() === 'script') {
|
| const set = el.setAttribute.bind(el);
|
| el.setAttribute = function(name, value) {
|
| if (name === 'src' && re.test(String(value))) return;
|
| return set(name, value);
|
| };
|
| }
|
| return el;
|
| };
|
| })();
|
|
|
|
|
| (function() {
|
| 'use strict';
|
| const needle = arguments[0] || '';
|
| if (!needle) return;
|
| const re = new RegExp(needle);
|
| const of = window.fetch;
|
| window.fetch = function(input, init) {
|
| const url = typeof input === 'string' ? input : input && input.url || '';
|
| if (re.test(url)) return Promise.resolve(new Response('', { status: 204 }));
|
| return of.apply(this, arguments);
|
| };
|
| })();
|
|
|
|
|
| (function() {
|
| 'use strict';
|
| const needle = arguments[0] || 'stitched-ad|advertisement|DATERANGE';
|
| const re = new RegExp(needle);
|
| const of = window.fetch;
|
| window.fetch = function(input, init) {
|
| const url = typeof input === 'string' ? input : input && input.url || '';
|
| return of.apply(this, arguments).then(resp => {
|
| if (!String(url).includes('.m3u8')) return resp;
|
| return resp.clone().text().then(text => {
|
| const out = text.split('\n').filter(line => !re.test(line)).join('\n');
|
| return new Response(out, { status: resp.status, headers: resp.headers });
|
| }).catch(() => resp);
|
| });
|
| };
|
| })();
|
|
|