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 .",
"icon": "rimraf assets/generated && electron-icon-maker --input=assets/youtube-music.png --output=assets/generated",
"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",
"build": "yarn run clean && build --win --mac --linux",
"build:mac": "yarn run clean && build --mac",
"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:mac": "yarn run clean && build --mac -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 => {
initialize();
webContents.session.webRequest.onBeforeRequest(
["*://*./*"],
(details, cb) => {

View File

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