mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 18:41:47 +00:00
Migrate adblock plugin to adblock-rs
This commit is contained in:
@ -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"
|
||||
|
||||
3
plugins/adblocker/.gitignore
vendored
3
plugins/adblocker/.gitignore
vendored
@ -1 +1,2 @@
|
||||
detector.buffer
|
||||
/filter-lists/*
|
||||
!/filter-lists/.keep
|
||||
|
||||
@ -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) => {
|
||||
|
||||
@ -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 || "", "");
|
||||
|
||||
37
plugins/adblocker/downloader.js
Normal file
37
plugins/adblocker/downloader.js
Normal 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();
|
||||
}
|
||||
0
plugins/adblocker/filter-lists/.keep
Normal file
0
plugins/adblocker/filter-lists/.keep
Normal 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();
|
||||
}
|
||||
Reference in New Issue
Block a user