diff --git a/lib/utils/blob-service.js b/lib/utils/blob-service.js --- a/lib/utils/blob-service.js +++ b/lib/utils/blob-service.js @@ -61,6 +61,12 @@ }); } +function makeFarcasterBlobMediaURI(mediaID: string): string { + return makeBlobServiceEndpointURL(blobServiceConfig.httpEndpoints.GET_MEDIA, { + mediaID, + }); +} + /** * Generates random blob holder prefixed by current device ID if present */ @@ -356,6 +362,7 @@ generateBlobHolder, getBlobFetchableURL, makeBlobServiceEndpointURL, + makeFarcasterBlobMediaURI, downloadBlob, uploadBlob, assignBlobHolder, diff --git a/lib/utils/convert-farcaster-message-to-comm-messages.js b/lib/utils/convert-farcaster-message-to-comm-messages.js --- a/lib/utils/convert-farcaster-message-to-comm-messages.js +++ b/lib/utils/convert-farcaster-message-to-comm-messages.js @@ -1,13 +1,14 @@ // @flow import uuid from 'uuid'; +import { makeFarcasterBlobMediaURI } from './blob-service.js'; import type { FCUserInfos } from '../hooks/user-identities-hooks.js'; import type { FarcasterMessage } from '../shared/farcaster/farcaster-messages-types.js'; import { farcasterThreadIDFromConversationID, userIDFromFID, } from '../shared/id-utils.js'; -import type { Media } from '../types/media-types.js'; +import type { Image } from '../types/media-types.js'; import { messageTypes } from '../types/message-types-enum.js'; import type { RawMessageInfo } from '../types/message-types.js'; @@ -57,18 +58,40 @@ height: med.height, width: med.width, }, - }: Media), + }: Image), ); - return [ + + const time = parseInt(farcasterMessage.serverTimestamp, 10); + const messages: Array = [ { id: farcasterMessage.messageId, type: messageTypes.MULTIMEDIA, threadID, creatorID, - time: parseInt(farcasterMessage.serverTimestamp, 10), + time, media, }, ]; + + const captionText = media + .reduce( + (text, m) => removeMediaURIFromString(text, m.uri), + farcasterMessage.message, + ) + .trim(); + + if (captionText.length > 0) { + messages.push({ + id: farcasterMessage.messageId + '/caption', + type: messageTypes.TEXT, + threadID, + creatorID, + time, + text: captionText, + }); + } + + return messages; } if (farcasterMessage.type === 'text') { @@ -127,4 +150,21 @@ return []; } +function removeMediaURIFromString(input: string, url: string): string { + // Message contents contain original URL of what is mirrored on Blob. + // We retrieve it here to remove it from message text. + const blobMediaBasePath = makeFarcasterBlobMediaURI(''); + const urlencodedOriginal = url.replaceAll(blobMediaBasePath, ''); + const mirrorOriginalUrl = decodeURIComponent(urlencodedOriginal); + console.log({ + input, + url, + blobMediaBasePath, + urlencodedOriginal, + mirrorOriginalUrl, + }); + + return input.replaceAll(url, '').replaceAll(mirrorOriginalUrl, ''); +} + export { convertFarcasterMessageToCommMessages };