1 const { app } = require('electron');
2 const { FiltersEngine, makeRequest } = require('@cliqz/adblocker');
3 const Axios = require('axios');
4 const fs = require('fs');
5 const path = require('path');
6 const tldts = require('tldts');
8 const lists = require('./Lists.json');
10 const Config = require('electron-store');
11 const config = new Config();
15 if (!fs.existsSync(path.join(app.getPath('userData'), 'Files'))) {
16 fs.mkdirSync(path.join(app.getPath('userData'), 'Files'));
21 const updateFilters = () => {
22 if (!fs.existsSync(path.join(app.getPath('userData'), 'Files'))) {
23 fs.mkdirSync(path.join(app.getPath('userData'), 'Files'));
26 console.log('Downloading filters...');
28 for (const key in lists) {
29 ops.push(Axios.get(lists[key]));
32 Axios.all(ops).then(res => {
35 for (const res1 of res) {
39 console.log('Parsing filters...');
41 engine = FiltersEngine.parse(data);
43 console.log('Saving output...');
45 fs.writeFile(path.resolve(path.join(app.getPath('userData'), 'Files', 'Ads.dat')), engine.serialize(), err => {
46 if (err) return console.error(err);
47 console.log('Complete.');
52 module.exports.updateFilters = updateFilters;
54 module.exports.loadFilters = async () => {
55 const filePath = path.resolve(path.join(app.getPath('userData'), 'Files', 'Ads.dat'));
57 if (fs.existsSync(filePath)) {
58 fs.readFile(path.resolve(filePath), (err, buffer) => {
59 if (err) return console.error(err);
62 engine = FiltersEngine.deserialize(buffer);
72 module.exports.hasFile = () => {
73 const filePath = path.resolve(path.join(app.getPath('userData'), 'Files', 'Ads.dat'));
75 return fs.existsSync(filePath);
78 module.exports.isEnabled = () => {
79 return engine != undefined;
82 module.exports.runAdblockService = (window, windowId, id, session) => {
83 session.webRequest.onBeforeRequest({ urls: ['<all_urls>'] }, async (details, callback) => {
84 if (engine && config.get('adBlocker')) {
85 const { match, redirect } = engine.match(makeRequest({ type: details.resourceType, url: details.url }, tldts.parse));
87 if (match || redirect) {
88 window.webContents.send(`blocked-ad-${windowId}`, { id });
91 callback({ redirectURL: redirect });
93 callback({ cancel: true });
100 callback({ cancel: false });
104 module.exports.removeAds = (url, webContents) => {
105 if (engine == undefined) return;
106 const { styles, scripts } = engine.getCosmeticsFilters({
111 webContents.insertCSS(styles);
113 for (const script of scripts) {
115 webContents.executeJavaScript(script);