Expand my Community achievements bar.

Migrating asset with metadata using AEM HTTP API

Avatar

Level 4

Hi,

 I am currently facing an issue with the migration of asset metadata from one aem instance to another aem instance using the App Builder. While i have successfully able to migrate the asset and their metadata from one aem instance to another. I have noticed that the metadata values are being copied to the jcr:content node instead of correct location under jcr:content/metadata. It causing, where not able to see the values of the metadata fields in the asset properties. Also just noticed that dc:title is getting copied to jcr:title under jcr:content.

 

Below is the piece of code i am using to update metadata. Please let me know how i can correct and solve the issue.

// Update the asset metadata in target AEM targetAemUrl, accessToken2, targetFolderPath, asset, metadata, logger
async function updateAssetMetadata(targetAemUrl, accessToken2, targetFolderPath, assetName, metadata, logger, retryCount = 3) {
const updateUrl = `${targetAemUrl}/api/assets/${targetFolderPath}/${assetName}`;
logger.info(`Updating metadata for asset: ${updateUrl}`);
logger.info(`Metadata: ${JSON.stringify(metadata, null, 2)}`);
const payload = {
class: 'asset',
properties: metadata
};
try {
const response = await fetch(updateUrl, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${accessToken2}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
 
if (!response.ok) {
if (response.status === 409 && retryCount > 0) {
logger.warn(`Conflict error encountered. Retrying... (${retryCount} retries left)`);
return updateAssetMetadata(targetAemUrl, accessToken2, targetFolderPath, assetName, metadata, logger, retryCount - 1);
}
throw new Error(`Error updating metadata: ${response.statusText}`);
}
const contentType = response.headers.get('content-type');
let responseBody = '';

if (contentType && contentType.includes('application/json')) {
responseBody = await response.json();
logger.info(`Response from updating metadata: ${JSON.stringify(responseBody, null, 2)}`);
} else {
responseBody = await response.text();
logger.info(`Response from updating metadata: ${responseBody}`);
}
logger.info(`Successfully updated metadata for asset: ${assetName}`);
} catch (error) {
logger.error(`Error updating asset metadata: ${error.message}`);
throw error;
}
}

Thanks in advance.

 

 

 

Regards,

Bhavani Bharanidharan

 

 

 

4 Replies

Avatar

Community Advisor

@BhavaniBharani Does the below notes in their documentation helps? 

 

https://experienceleague.adobe.com/en/docs/experience-manager-65/content/assets/extending/mac-api-as...

 

NOTE
Some properties of folder or asset are mapped to a different prefix. The jcr prefix of jcr:title, jcr:description, and jcr:language are replaced with dc prefix. Hence in the returned JSON, dc:title and dc:description contain the values of jcr:title and jcr:description, respectively.

Thanks @Saravanan_Dharmaraj . Using the AEM workflow process step we can modify the dc:title and other namespaces. But i would like to know that metadata properties are getting stored under jcr:content while migrating the assets. The actual place to store the metadata is jcr:content/metadata right. As the values are getting stored under jcr:content node, the properties values are showing in the asset properties. 

Is there any way to solve this issue?

 

 

Thanks,

Bhavani Bharanidharan

Avatar

Employee

 

HTTP API updates the metadata properties in the jcr namespace. However, the Experience Manager user interface updates the metadata properties in the dc namespace.

PUT /api/assets/myfolder/myAsset.png -H"Content-Type: application/json" -d '{"class":"asset", "properties":{"dc:title":"My Asset"}}'

 

Here , instead of just property name prefix it with "metadata/" , example :

 "properties": {
        "jcr:title": "testing",
        "metadata/sb:projectId": "444"
    }

Avatar

Level 4

Hi @digarg ,

 

Thank you for the response. I will be migrating all the asset metadata from source aem instance to target aem instance, so in the code which i have shared earlier, the payload metadata variable is having all the properties of metadata.

 

But still all the properties are migrating under jcr:content not on the jcr:content/metadata node. Because of this i am not able to see the metadata values in the asset properties.

 

 

Regards,

Bhavani Bharanidhran