From e8a0bfef2b62e7d620ebb03aae20508255bca021 Mon Sep 17 00:00:00 2001 From: William Chong Date: Sat, 11 Feb 2023 01:07:24 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=A9=20Use=20class=20metadata=20image?= =?UTF-8?q?=20as=20nft=20image=20fallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/likernft/metadata.ts | 17 +++++++++++------ src/util/api/likernft/metadata.ts | 14 +++++++++++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/routes/likernft/metadata.ts b/src/routes/likernft/metadata.ts index 1f9a8c15b..d0b6c0a8e 100644 --- a/src/routes/likernft/metadata.ts +++ b/src/routes/likernft/metadata.ts @@ -92,10 +92,15 @@ router.get( } const size = Math.min(Math.max(inputSizeNum, 1), 1920); const iscnPrefix = await getISCNPrefixByClassId(classId); - const { data } = await getNFTISCNData(iscnPrefix); - if (!data) throw new ValidationError('ISCN_NOT_FOUND', 404); - const iscnId = data && data['@id'] as string; + const [{ data: ISCNData }, chainData] = await Promise.all([ + getNFTISCNData(iscnPrefix), + getNFTClassDataById(classId), + ]); + if (!chainData) throw new ValidationError('CLASS_ID_NOT_FOUND', 404); + if (!ISCNData) throw new ValidationError('ISCN_NOT_FOUND', 404); + const iscnId = ISCNData && ISCNData['@id'] as string; if (!iscnId) throw new ValidationError('ISCN_ID_NOT_FOUND', 404); + const { image: chainImage } = chainData.data.metadata; let iscnData = await iscnInfoCollection.doc(encodeURIComponent(iscnId)).get(); if (!iscnData.exists) { await axios.post( @@ -105,16 +110,16 @@ router.get( await sleep(1000); iscnData = await iscnInfoCollection.doc(encodeURIComponent(iscnId)).get(); } - let image = ''; + let iscnImage = ''; let title = 'Writing NFT'; if (iscnData.exists) { - ({ image, title = 'Writing NFT' } = iscnData.data()); + ({ image: iscnImage, title = 'Writing NFT' } = iscnData.data()); } const { image: basicImage, contentType, isDefault: isImageMissing, - } = await getBasicImage(image, title); + } = await getBasicImage(iscnImage, chainImage, title); const resizedImage = getResizedImage(size); // Disable image mask for now // const combinedImage = await getCombinedImage(); diff --git a/src/util/api/likernft/metadata.ts b/src/util/api/likernft/metadata.ts index cfb560292..044148b20 100644 --- a/src/util/api/likernft/metadata.ts +++ b/src/util/api/likernft/metadata.ts @@ -50,12 +50,20 @@ export function parseImageURLFromMetadata(image: string): string { return image.replace('ar://', 'https://arweave.net/').replace('ipfs://', 'https://ipfs.io/ipfs/') } -export async function getBasicImage(image, title) { +export async function getBasicImage(iscnImage, chainImage, title) { let imageBuffer; let contentType; let isDefault = true; - if (image) { - const imageData = (await axios.get(encodedURL(image), { responseType: 'stream' }).catch(() => ({} as any))); + if (iscnImage) { + const imageData = (await axios.get(encodedURL(iscnImage), { responseType: 'stream' }).catch(() => ({} as any))); + if (imageData && imageData.data) { + imageBuffer = imageData.data; + contentType = imageData.headers['content-type'] || 'image/png'; + isDefault = false; + } + } + if (chainImage && !imageBuffer) { + const imageData = (await axios.get(encodedURL(chainImage), { responseType: 'stream' }).catch(() => ({} as any))); if (imageData && imageData.data) { imageBuffer = imageData.data; contentType = imageData.headers['content-type'] || 'image/png';