mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-16 20:52:06 +00:00
Migrate adblock plugin to adblock-rs
This commit is contained in:
@ -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"
|
||||||
|
|||||||
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 => {
|
module.exports.blockWindowAds = webContents => {
|
||||||
initialize();
|
|
||||||
webContents.session.webRequest.onBeforeRequest(
|
webContents.session.webRequest.onBeforeRequest(
|
||||||
["*://*./*"],
|
["*://*./*"],
|
||||||
(details, cb) => {
|
(details, cb) => {
|
||||||
|
|||||||
@ -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 || "", "");
|
||||||
|
|||||||
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