From 6644eb5ee67e83701828e689c41dc41fc2ac860d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=88=9A=28noham=29=C2=B2?= <100566912+NohamR@users.noreply.github.com> Date: Fri, 19 Jun 2026 23:01:52 +0200 Subject: [PATCH] update --- src/index.js | 9 +++++---- src/pdf.js | 6 +++--- src/pdfy.js | 9 ++++++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/index.js b/src/index.js index dbbec46..2b3f413 100644 --- a/src/index.js +++ b/src/index.js @@ -4,6 +4,7 @@ import path from 'node:path' import readline from 'node:readline/promises' import { parseArgs } from './cli.js' import { loadConfigFile, loadPreferences, readCustomCss } from './config.js' +import { getOutputFilename } from './pdf.js' import { convert, BotProtectionError } from './pdfy.js' import logger from './logger.js' @@ -20,7 +21,7 @@ async function promptForInput () { async function main () { const { url, opts } = parseArgs() - await loadConfigFile(opts.config) + const config = await loadConfigFile(opts.config) const prefsPath = opts.prefs || null const cssPath = opts.css || null @@ -44,9 +45,9 @@ async function main () { const sizeKb = (result.pdfBuffer.length / 1024).toFixed(0) logger.info(`PDF generated: "${result.title}" (${sizeKb} KB)`) - if (result.outputPath) { - logger.info(`Saved to: "${result.outputPath}"`) - } + const savePath = result.outputPath || getOutputFilename(result.title) + fs.writeFileSync(savePath, result.pdfBuffer) + logger.info(`Saved to: "${savePath}"`) return } catch (err) { if (err instanceof BotProtectionError && attempt === 0) { diff --git a/src/pdf.js b/src/pdf.js index b35ef2f..c9bb954 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -41,11 +41,11 @@ export function enhanceHtml (html, customCss) { return enhanced } -export async function generatePdf (page, html, outputPath) { - await page.setContent(html, { waitUntil: 'networkidle0' }) +export async function generatePdf (page, html, outputPath, { timeout = 30000 } = {}) { + await page.setContent(html, { waitUntil: 'networkidle0', timeout }) await page.waitForFunction( () => Array.from(document.images).every(img => img.complete), - { timeout: 15000, polling: 200 } + { timeout, polling: 200 } ).catch(() => logger.debug('Image wait timed out, continuing...')) const pdfOptions = { format: 'A4', diff --git a/src/pdfy.js b/src/pdfy.js index 9f4f992..84f9831 100644 --- a/src/pdfy.js +++ b/src/pdfy.js @@ -19,6 +19,7 @@ import { VALID_THEMES } from './cli.js' import logger from './logger.js' const EXTENSION_BASE = 'chrome-extension://' +const NAV_TIMEOUT = 30000 export { launchBrowser, VALID_THEMES } @@ -45,6 +46,8 @@ export async function convert (url, options = {}) { logger.info(`Theme: ${theme}`) + const timeout = NAV_TIMEOUT + await checkExtension() let browser = externalBrowser @@ -62,7 +65,7 @@ export async function convert (url, options = {}) { if (html) { await articlePage.setContent(html, { waitUntil: 'networkidle0' }) } else { - await articlePage.goto(url, { waitUntil: 'networkidle0', timeout: 60000 }) + await articlePage.goto(url, { waitUntil: 'networkidle0', timeout }) } const article = await extractArticle(articlePage, getReadabilityPath()) await articlePage.close() @@ -95,7 +98,7 @@ export async function convert (url, options = {}) { logger.debug(`Opening Reader View: ${readerUrl}`) const readerPage = await browser.newPage() - await readerPage.goto(readerUrl, { waitUntil: 'load', timeout: 60000 }) + await readerPage.goto(readerUrl, { waitUntil: 'load', timeout }) await waitForReaderView(readerPage) await new Promise((resolve) => setTimeout(resolve, 1000)) @@ -120,7 +123,7 @@ export async function convert (url, options = {}) { fs.mkdirSync(path.dirname(outputPath), { recursive: true }) } - const pdfBuffer = await generatePdf(pdfPage, enhancedHtml, outputPath) + const pdfBuffer = await generatePdf(pdfPage, enhancedHtml, outputPath, { timeout }) await pdfPage.close() return { title, pdfBuffer, outputPath }