el.xwx.moe/lib/api/archive.ts

81 lines
2.0 KiB
TypeScript
Raw Normal View History

2023-07-02 07:17:32 -05:00
import { Page, chromium, devices } from "playwright";
2023-03-25 09:17:34 -05:00
import { prisma } from "@/lib/api/db";
import createFile from "@/lib/api/storage/createFile";
2023-08-05 23:58:18 -05:00
export default async function archive(linkId: number, url: string) {
2023-07-24 09:22:24 -05:00
const browser = await chromium.launch();
2023-07-02 07:17:32 -05:00
const context = await browser.newContext(devices["Desktop Chrome"]);
const page = await context.newPage();
2023-03-28 02:31:50 -05:00
try {
2023-07-24 09:06:24 -05:00
await page.goto(url, { waitUntil: "domcontentloaded" });
2023-03-28 02:31:50 -05:00
await page.evaluate(
autoScroll,
Number(process.env.AUTOSCROLL_TIMEOUT) || 30
);
2023-03-28 02:31:50 -05:00
2023-06-28 21:24:24 -05:00
const linkExists = await prisma.link.findUnique({
2023-03-28 02:31:50 -05:00
where: {
id: linkId,
},
});
2023-03-28 02:31:50 -05:00
if (linkExists) {
2023-06-28 21:24:24 -05:00
const pdf = await page.pdf({
width: "1366px",
height: "1931px",
printBackground: true,
margin: { top: "15px", bottom: "15px" },
});
const screenshot = await page.screenshot({
fullPage: true,
});
createFile({
data: screenshot,
2023-08-05 23:58:18 -05:00
filePath: `archives/${linkExists.collectionId}/${linkId}.png`,
2023-06-28 21:24:24 -05:00
});
createFile({
data: pdf,
2023-08-05 23:58:18 -05:00
filePath: `archives/${linkExists.collectionId}/${linkId}.pdf`,
2023-06-28 21:24:24 -05:00
});
2023-03-28 02:31:50 -05:00
}
2023-07-02 12:04:12 -05:00
await browser.close();
2023-03-28 02:31:50 -05:00
} catch (err) {
console.log(err);
2023-07-02 12:04:12 -05:00
await browser.close();
2023-03-25 09:17:34 -05:00
}
}
const autoScroll = async (AUTOSCROLL_TIMEOUT: number) => {
const timeoutPromise = new Promise<void>((_, reject) => {
setTimeout(() => {
reject(
new Error(
`Auto scroll took too long (more than ${AUTOSCROLL_TIMEOUT} seconds).`
)
);
}, AUTOSCROLL_TIMEOUT * 1000);
});
2023-03-28 02:31:50 -05:00
const scrollingPromise = new Promise<void>((resolve) => {
let totalHeight = 0;
let distance = 100;
let scrollDown = setInterval(() => {
let scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if (totalHeight >= scrollHeight) {
clearInterval(scrollDown);
window.scroll(0, 0);
resolve();
}
}, 100);
2023-03-28 02:31:50 -05:00
});
await Promise.race([scrollingPromise, timeoutPromise]);
};