This commit is contained in:
√(noham)²
2026-06-19 23:01:52 +02:00
parent 5fbfc4e992
commit 6644eb5ee6
3 changed files with 14 additions and 10 deletions

View File

@@ -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) {

View File

@@ -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',

View File

@@ -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 }