Skip to content

Commit 2aa5475

Browse files
authored
Merge pull request #113 from muench-dev/bugfix/handle-large-images
fix: Handle large images by resizing before upload (#112)
2 parents e76358e + 69e2d53 commit 2aa5475

File tree

4 files changed

+296
-7242
lines changed

4 files changed

+296
-7242
lines changed

nodes/Bluesky/V2/postOperations.ts

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { AtpAgent, RichText } from '@atproto/api';
2+
import sharp from 'sharp';
23
import { INodeExecutionData, INodeProperties } from 'n8n-workflow';
34
import { getLanguageOptions } from './languages';
45
import ogs from 'open-graph-scraper';
@@ -176,6 +177,19 @@ export const postProperties: INodeProperties[] = [
176177
},
177178
];
178179

180+
async function resizeImageIfNeeded(imageBuffer: Buffer, maxWidth: number, maxSizeBytes: number): Promise<Buffer> {
181+
if (imageBuffer.length > maxSizeBytes) {
182+
try {
183+
return await sharp(imageBuffer)
184+
.resize({ width: maxWidth, withoutEnlargement: true, fit: 'inside' })
185+
.toBuffer();
186+
} catch (error: any) {
187+
console.warn(`Failed to resize image: ${error.message}. Returning original image.`);
188+
}
189+
}
190+
return imageBuffer;
191+
}
192+
179193
export async function postOperation(
180194
agent: AtpAgent,
181195
postText: string,
@@ -201,7 +215,10 @@ export async function postOperation(
201215

202216
if (websiteCard?.uri) {
203217
let thumbBlob = undefined;
218+
const imageSizeLimit = 976.56 * 1024; // 976.56KB in bytes
219+
const maxWidth = 1000;
204220
if (websiteCard.thumbnailBinary) {
221+
websiteCard.thumbnailBinary = await resizeImageIfNeeded(websiteCard.thumbnailBinary, maxWidth, imageSizeLimit);
205222
const uploadResponse = await agent.uploadBlob(websiteCard.thumbnailBinary, {
206223
encoding: 'image/png', // Adjust based on expected image type
207224
});
@@ -212,27 +229,30 @@ export async function postOperation(
212229
try {
213230
const ogsResponse = await ogs({ url: websiteCard.uri });
214231
if (ogsResponse.error) {
215-
throw new Error(`Error fetching Open Graph tags: ${ogsResponse.error}`);
216-
}
217-
if (ogsResponse.result.ogImage) {
218-
const imageDataResponse = await fetch(ogsResponse.result.ogImage[0].url);
219-
if (!imageDataResponse.ok) {
220-
}
221-
const thumbBlobArrayBuffer = await imageDataResponse.arrayBuffer();
222-
thumbBlob = Buffer.from(thumbBlobArrayBuffer);
223-
const { data } = await agent.uploadBlob(thumbBlob);
224-
thumbBlob = data.blob;
225-
}
226-
if (ogsResponse.result.ogTitle) {
227-
websiteCard.title = ogsResponse.result.ogTitle;
228-
}
229-
if (ogsResponse.result.ogDescription) {
230-
websiteCard.description = ogsResponse.result.ogDescription;
232+
console.error(`Error fetching Open Graph tags: ${ogsResponse.error}`);
231233
} else {
232-
websiteCard.description = '';
234+
if (ogsResponse.result.ogImage) {
235+
const imageUrl = ogsResponse.result.ogImage[0].url;
236+
const imageDataResponse = await fetch(imageUrl);
237+
if (imageDataResponse.ok) {
238+
const thumbBlobArrayBuffer = await imageDataResponse.arrayBuffer();
239+
let thumbBuffer = Buffer.from(thumbBlobArrayBuffer);
240+
thumbBuffer = await resizeImageIfNeeded(thumbBuffer, maxWidth, imageSizeLimit);
241+
const { data } = await agent.uploadBlob(thumbBuffer);
242+
thumbBlob = data.blob;
243+
}
244+
}
245+
if (ogsResponse.result.ogTitle) {
246+
websiteCard.title = ogsResponse.result.ogTitle;
247+
}
248+
if (ogsResponse.result.ogDescription) {
249+
websiteCard.description = ogsResponse.result.ogDescription;
250+
} else {
251+
websiteCard.description = '';
252+
}
233253
}
234254
} catch (err: any) {
235-
throw new Error(`Failed to fetch Open Graph tags for URL '${websiteCard.uri}': ${err?.message || err}`);
255+
console.error(`Failed to fetch Open Graph tags for URL '${websiteCard.uri}': ${err?.message || err}`);
236256
}
237257
}
238258

0 commit comments

Comments
 (0)