blaze/index.ts

123 lines
3.0 KiB
TypeScript
Raw Normal View History

2023-06-18 21:20:52 +00:00
import express from "express";
import { Readability, isProbablyReaderable } from "@mozilla/readability";
2023-06-18 21:20:52 +00:00
import { JSDOM } from "jsdom";
import got from "got";
2023-06-18 22:44:17 +00:00
import path from "path";
import { fileURLToPath } from "url";
2023-06-20 07:32:07 +00:00
import fetch from "node-fetch";
2023-06-19 12:11:22 +00:00
import "dotenv/config";
2023-06-18 21:20:52 +00:00
const app = express();
const port = 8888;
2023-06-18 21:20:52 +00:00
2023-06-18 22:46:43 +00:00
// @ts-ignore
2023-06-18 22:44:17 +00:00
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
app.get("/", async (req, res) => {
const searchEngine = "https://api.search.brave.com/res/v1/web/search";
let query = req.query.q as string;
2023-06-18 21:20:52 +00:00
if (!query) {
2023-06-18 22:44:17 +00:00
res.sendFile(path.join(__dirname + "/dist/index.html"));
2023-06-20 07:32:07 +00:00
return;
2023-06-18 21:20:52 +00:00
}
2023-06-20 07:32:07 +00:00
const key = process.env.CYCLIC_BRAVE_KEY;
2023-06-19 12:01:17 +00:00
if (!key) {
throw new Error("No brave key found");
}
fetch(`${searchEngine}?q=${query}`, {
2023-06-19 10:40:07 +00:00
headers: {
2023-06-20 07:32:07 +00:00
Accept: "*/*",
"Accept-Encoding": "gzip, deflate, br",
2023-06-19 12:01:17 +00:00
"X-Subscription-Token": key,
},
})
.then((page) => {
2023-06-20 07:32:07 +00:00
page.json().then((response) => {
const results: any[] = [];
const url = process.env.DEV_MODE
? "http://localhost:8888/blazed"
: "https://blaze.cyclic.app/blazed";
2023-06-19 12:01:17 +00:00
// @ts-ignore
2023-06-20 07:32:07 +00:00
response.web.results.forEach((result) => {
results.push(`
<div>
2023-06-20 07:32:07 +00:00
<a href="${url}?url=${result.url}">
<h2>${result.title}</h2>
2023-06-20 07:32:07 +00:00
</a>
2023-06-19 13:27:14 +00:00
<span>${result.meta_url.hostname}</span>
<p>${result.description}</p>
</div>
2023-06-19 12:11:22 +00:00
<hr />
`);
2023-06-20 07:32:07 +00:00
});
2023-06-19 12:11:22 +00:00
res.send(`<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
2023-06-20 07:32:07 +00:00
<title>Blaze - ${query}</title>
2023-06-19 13:27:14 +00:00
<style>
2023-06-20 07:32:07 +00:00
body {font-family:sans-serif}
2023-06-19 13:27:14 +00:00
h2 {margin-bottom:0}
2023-06-20 07:32:07 +00:00
span {font-size:.9rem}
2023-06-19 13:27:14 +00:00
</style>
2023-06-19 12:11:22 +00:00
</head>
<body>
${results.join("")}
</body>
</html>`);
2023-06-20 07:32:07 +00:00
});
2023-06-18 21:20:52 +00:00
})
.catch((err) => {
console.log(err);
});
});
2023-06-18 22:52:20 +00:00
app.get("/blazed", (req, res) => {
2023-06-20 07:32:07 +00:00
const pageToBlaze = req.query.url as string;
got(pageToBlaze)
.then((response) => {
const dom = new JSDOM(response.body);
if (!isProbablyReaderable(dom.window.document)) {
res.sendFile(path.join(__dirname + "/dist/not_blazed.html"));
return;
}
let reader = new Readability(dom.window.document);
let article = reader.parse();
if (!article) {
res.send("Something went wrong");
return;
}
res.send(article.content);
})
.catch((err) => {
console.log(err);
});
});
2023-06-19 12:55:28 +00:00
app.get("/info", (_, res) => {
res.sendFile(path.join(__dirname + "/dist/info.html"));
2023-06-20 07:32:07 +00:00
});
app.get("/ooops", (_, res) => {
res.sendFile(path.join(__dirname + "/dist/info_not_blazed.html"));
});
2023-06-19 12:55:28 +00:00
2023-06-20 07:41:34 +00:00
app.get("/favicon.svg", (_, res) => {
res.sendFile(path.join(__dirname + "/favicon.svg"));
});
2023-06-18 22:52:20 +00:00
app.listen(port, () => {
console.log(`Got request`);
});