mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-10 18:21:47 +00:00
feat(adblocker): improve In-Player adblocker
This commit is contained in:
@ -52,9 +52,26 @@ export const inject = (contextBridge) => {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
(function () {
|
const chains = [
|
||||||
let cValue = 'undefined';
|
{
|
||||||
const chain = 'playerResponse.adPlacements';
|
chain: 'playerResponse.adPlacements',
|
||||||
|
cValue: 'undefined',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
chain: 'ytInitialPlayerResponse.playerAds',
|
||||||
|
cValue: 'undefined',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
chain: 'ytInitialPlayerResponse.adPlacements',
|
||||||
|
cValue: 'undefined',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
chain: 'ytInitialPlayerResponse.adSlots',
|
||||||
|
cValue: 'undefined',
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
chains.forEach(function ({ chain, cValue }) {
|
||||||
const thisScript = document.currentScript;
|
const thisScript = document.currentScript;
|
||||||
//
|
//
|
||||||
switch (cValue) {
|
switch (cValue) {
|
||||||
@ -248,203 +265,5 @@ export const inject = (contextBridge) => {
|
|||||||
|
|
||||||
//
|
//
|
||||||
trapChain(window, chain);
|
trapChain(window, chain);
|
||||||
})();
|
});
|
||||||
|
|
||||||
(function () {
|
|
||||||
let cValue = 'undefined';
|
|
||||||
const thisScript = document.currentScript;
|
|
||||||
const chain = 'ytInitialPlayerResponse.adPlacements';
|
|
||||||
//
|
|
||||||
switch (cValue) {
|
|
||||||
case 'null': {
|
|
||||||
cValue = null;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "''": {
|
|
||||||
cValue = '';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'true': {
|
|
||||||
cValue = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'false': {
|
|
||||||
cValue = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'undefined': {
|
|
||||||
cValue = undefined;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'noopFunc': {
|
|
||||||
cValue = function () {};
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'trueFunc': {
|
|
||||||
cValue = function () {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'falseFunc': {
|
|
||||||
cValue = function () {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: {
|
|
||||||
if (/^\d+$/.test(cValue)) {
|
|
||||||
cValue = Number.parseFloat(cValue);
|
|
||||||
//
|
|
||||||
if (isNaN(cValue)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Math.abs(cValue) > 0x7f_ff) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
let aborted = false;
|
|
||||||
const mustAbort = function (v) {
|
|
||||||
if (aborted) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
aborted =
|
|
||||||
v !== undefined &&
|
|
||||||
v !== null &&
|
|
||||||
cValue !== undefined &&
|
|
||||||
cValue !== null &&
|
|
||||||
typeof v !== typeof cValue;
|
|
||||||
return aborted;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Support multiple trappers for the same property:
|
|
||||||
https://github.com/uBlockOrigin/uBlock-issues/issues/156
|
|
||||||
*/
|
|
||||||
|
|
||||||
const trapProp = function (owner, prop, configurable, handler) {
|
|
||||||
if (handler.init(owner[prop]) === false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
const odesc = Object.getOwnPropertyDescriptor(owner, prop);
|
|
||||||
let previousGetter;
|
|
||||||
let previousSetter;
|
|
||||||
if (odesc instanceof Object) {
|
|
||||||
if (odesc.configurable === false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (odesc.get instanceof Function) {
|
|
||||||
previousGetter = odesc.get;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (odesc.set instanceof Function) {
|
|
||||||
previousSetter = odesc.set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
Object.defineProperty(owner, prop, {
|
|
||||||
configurable,
|
|
||||||
get() {
|
|
||||||
if (previousGetter !== undefined) {
|
|
||||||
previousGetter();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return handler.getter();
|
|
||||||
},
|
|
||||||
set(a) {
|
|
||||||
if (previousSetter !== undefined) {
|
|
||||||
previousSetter(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
handler.setter(a);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const trapChain = function (owner, chain) {
|
|
||||||
const pos = chain.indexOf('.');
|
|
||||||
if (pos === -1) {
|
|
||||||
trapProp(owner, chain, false, {
|
|
||||||
v: undefined,
|
|
||||||
getter() {
|
|
||||||
return document.currentScript === thisScript ? this.v : cValue;
|
|
||||||
},
|
|
||||||
setter(a) {
|
|
||||||
if (mustAbort(a) === false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cValue = a;
|
|
||||||
},
|
|
||||||
init(v) {
|
|
||||||
if (mustAbort(v)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
this.v = v;
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
//
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
const prop = chain.slice(0, pos);
|
|
||||||
const v = owner[prop];
|
|
||||||
//
|
|
||||||
chain = chain.slice(pos + 1);
|
|
||||||
if (v instanceof Object || (typeof v === 'object' && v !== null)) {
|
|
||||||
trapChain(v, chain);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
trapProp(owner, prop, true, {
|
|
||||||
v: undefined,
|
|
||||||
getter() {
|
|
||||||
return this.v;
|
|
||||||
},
|
|
||||||
setter(a) {
|
|
||||||
this.v = a;
|
|
||||||
if (a instanceof Object) {
|
|
||||||
trapChain(a, chain);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
init(v) {
|
|
||||||
this.v = v;
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
trapChain(window, chain);
|
|
||||||
})();
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user