${esc(title)}
@@ -82,9 +96,11 @@ function buildCoverPageHtml(title, friends) {
`;
}
-function buildFriendPageHtml(friend, folder) {
+async function buildFriendPageHtml(friend, folder) {
const uploadsDir = path.join(storage.friendFolderPath(folder), 'uploads');
- const profileUri = friend.profileImage ? fileToDataUri(path.join(uploadsDir, friend.profileImage)) : null;
+ const profileUri = friend.profileImage
+ ? await fileToDataUri(path.join(uploadsDir, friend.profileImage), 500)
+ : null;
const steckbriefRows = Object.entries(friend.steckbrief || {})
.filter(([, v]) => v && String(v).trim())
@@ -92,8 +108,8 @@ function buildFriendPageHtml(friend, folder) {
.join('');
const blocks = [...(friend.blocks || [])].sort((a, b) => a.order - b.order);
- const blockHtml = blocks
- .map((b, i) => {
+ const blockHtmlList = await Promise.all(
+ blocks.map(async (b, i) => {
const rot = ROTATIONS[i % ROTATIONS.length];
if (b.type === 'text') {
return `
@@ -102,7 +118,7 @@ function buildFriendPageHtml(friend, folder) {
`;
}
if (b.type === 'image') {
- const uri = fileToDataUri(path.join(uploadsDir, b.filename));
+ const uri = await fileToDataUri(path.join(uploadsDir, b.filename), 700);
if (!uri) return '';
return `

@@ -110,7 +126,7 @@ function buildFriendPageHtml(friend, folder) {
`;
}
if (b.type === 'audio') {
- const coverUri = b.coverFilename ? fileToDataUri(path.join(uploadsDir, b.coverFilename)) : null;
+ const coverUri = b.coverFilename ? await fileToDataUri(path.join(uploadsDir, b.coverFilename), 500) : null;
return `
${coverUri ? `

` : ''}
🎵 Audio-Erinnerung${b.caption ? ': ' + esc(b.caption) : ''}
(im Web-Freundesbuch anhörbar)
@@ -118,7 +134,8 @@ function buildFriendPageHtml(friend, folder) {
}
return '';
})
- .join('\n');
+ );
+ const blockHtml = blockHtmlList.join('\n');
return `
@@ -137,11 +154,10 @@ function buildFriendPageHtml(friend, folder) {
`;
}
-function buildFullHtml(friends, bookTitle) {
- const coverPage = buildCoverPageHtml(bookTitle || 'Unser Freundesbuch', friends);
- const pages = friends
- .map((f) => buildFriendPageHtml(f, f.folderName))
- .join('\n');
+async function buildFullHtml(friends, bookTitle) {
+ const coverPage = await buildCoverPageHtml(bookTitle || 'Unser Freundesbuch', friends);
+ const friendPages = await Promise.all(friends.map((f) => buildFriendPageHtml(f, f.folderName)));
+ const pages = friendPages.join('\n');
return `
@@ -227,17 +243,25 @@ ${pages || '
Noch keine Freunde angelegt.
"networkidle0" kann
+ // in Docker ohne echten Netzwerkverkehr unnötig lange bzw. nie sauber auflösen.
+ await page.setContent(html, { waitUntil: 'domcontentloaded', timeout: 60000 });
+ const buffer = await page.pdf({ format: 'A4', printBackground: true, timeout: 60000 });
return buffer;
} finally {
await browser.close();