11import { AtpAgent , RichText } from '@atproto/api' ;
2+ import sharp from 'sharp' ;
23import { INodeExecutionData , INodeProperties } from 'n8n-workflow' ;
34import { getLanguageOptions } from './languages' ;
45import 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+
179193export 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