Migrate adblock plugin to adblock-rs

This commit is contained in:
TC
2020-04-11 12:30:15 +02:00
parent 4648854a04
commit 5e3b7c0db7
7 changed files with 69 additions and 90 deletions

View File

@ -30,11 +30,12 @@
"start": "electron .", "start": "electron .",
"icon": "rimraf assets/generated && electron-icon-maker --input=assets/youtube-music.png --output=assets/generated", "icon": "rimraf assets/generated && electron-icon-maker --input=assets/youtube-music.png --output=assets/generated",
"generate:package": "node utils/generate-package-json.js", "generate:package": "node utils/generate-package-json.js",
"postinstall": "yarn run generate:package YoutubeNonStop && yarn run icon && npm rebuild && node plugins/adblocker/generator.js && electron-rebuild", "postinstall": "yarn run generate:package YoutubeNonStop && yarn run icon && yarn run plugin:adblock",
"clean": "rimraf dist", "clean": "rimraf dist",
"build": "yarn run clean && build --win --mac --linux", "build": "yarn run clean && build --win --mac --linux",
"build:mac": "yarn run clean && build --mac", "build:mac": "yarn run clean && build --mac",
"build:win": "yarn run clean && build --win", "build:win": "yarn run clean && build --win",
"plugin:adblock": "node plugins/adblocker/downloader.js && electron-build-env neon build adblock-rs",
"release:linux": "yarn run clean && build --linux -p always", "release:linux": "yarn run clean && build --linux -p always",
"release:mac": "yarn run clean && build --mac -p always", "release:mac": "yarn run clean && build --mac -p always",
"release:win": "yarn run clean && build --win -p always" "release:win": "yarn run clean && build --win -p always"

View File

@ -1 +1,2 @@
detector.buffer /filter-lists/*
!/filter-lists/.keep

View File

@ -1,7 +1,6 @@
const { initialize, containsAds } = require("./contains-ads"); const { containsAds } = require("./contains-ads");
module.exports.blockWindowAds = webContents => { module.exports.blockWindowAds = webContents => {
initialize();
webContents.session.webRequest.onBeforeRequest( webContents.session.webRequest.onBeforeRequest(
["*://*./*"], ["*://*./*"],
(details, cb) => { (details, cb) => {

View File

@ -1,24 +1,32 @@
const fs = require("fs"); const fs = require("fs");
const path = require("path"); const path = require("path");
const Blocker = require("ad-block");
const client = new Blocker.AdBlockClient(); const AdBlockClient = require("adblock-rs");
const file = path.resolve(__dirname, "detector.buffer"); const is = require("electron-is");
module.exports.client = client; const sourcesFolder = path.resolve(__dirname, "filter-lists");
module.exports.initialize = () => const filterLists = fs
new Promise((resolve, reject) => { .readdirSync(sourcesFolder)
fs.readFile(file, (err, buffer) => { .filter(filename => filename.includes(".txt"))
if (err) { .map(filename =>
return reject(err); fs
} .readFileSync(path.resolve(sourcesFolder, filename), {
client.deserialize(buffer); encoding: "utf-8"
return resolve(); })
}); .split("\n")
}); );
const none = Blocker.FilterOptions.noFilterOption; const rules = [].concat(...filterLists);
const isAd = (req, base) => client.matches(req, none, base); const debug = is.dev();
const client = new AdBlockClient.Engine(rules, debug);
module.exports.containsAds = (req, base) => isAd(req, base); if (debug) {
module.exports.isAd = isAd; const serializedArrayBuffer = client.serialize(); // Serialize the engine to an ArrayBuffer
console.log(
`AdBlock engine size: ${(serializedArrayBuffer.byteLength / 1024).toFixed(
2
)} KB`
);
}
module.exports.containsAds = (req, base) => client.check(req, base || "", "");

View File

@ -0,0 +1,37 @@
// This file downloads the configured adblock lists
const fs = require("fs");
const https = require("https");
const path = require("path");
const SOURCES = [
{
name: "youtube-ads",
url:
"https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt"
}
];
function downloadAdblockLists(sources = SOURCES) {
// fetch updated versions
sources.forEach(source => {
console.log(`Downloading list "${source.name}" (${source.url})`);
https
.get(source.url, response => {
const filepath = path.resolve(
__dirname,
"filter-lists",
`${source.name}.txt`
);
const file = fs.createWriteStream(filepath);
response.pipe(file);
})
.on("error", err => {
console.log("Error: " + err.message);
});
});
}
module.exports = downloadAdblockLists;
if (require.main === module) {
downloadAdblockLists();
}

View File

View File

@ -1,67 +0,0 @@
// This file generates the detector buffer
const fs = require("fs");
const path = require("path");
const Blocker = require("ad-block");
const https = require("https");
const SOURCES = [
"https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt"
];
function parseAdblockList(client, adblockList) {
const urls = adblockList.split("\n");
const totalSize = urls.length;
console.log(
"Parsing " + totalSize + " urls (this can take a couple minutes)."
);
urls.map(line => client.parse(line));
console.log("Created buffer.");
}
function writeBuffer(client) {
const output = path.resolve(__dirname, "detector.buffer");
fs.writeFile(output, client.serialize(64), err => {
if (err) {
console.error(err);
return;
}
console.log("Wrote buffer to detector.buffer!");
});
}
function generateDetectorBuffer() {
const client = new Blocker.AdBlockClient();
let nbSourcesFetched = 0;
// fetch updated versions
SOURCES.forEach(source => {
console.log("Downloading " + source);
https
.get(source, resp => {
let data = "";
// A chunk of data has been recieved.
resp.on("data", chunk => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on("end", () => {
parseAdblockList(client, data);
nbSourcesFetched++;
if (nbSourcesFetched === SOURCES.length) {
writeBuffer(client);
}
});
})
.on("error", err => {
console.log("Error: " + err.message);
});
});
}
module.exports = generateDetectorBuffer;
if (require.main === module) {
generateDetectorBuffer();
}