Media processing script example

This is an example of a Media processing script to be executed every time an asset is processed by the processing worker. It extracts the metadata properties from the context and adds them to the asset.

Use case

  1. A user uploads a new asset.
  2. When the asset is being being processed, the script outputs the file's metadata as CSV to the Metadata property on the asset.

Script

Create the following metadata processing script:

RequestResponsec#
using System.Linq;

var masterFileRelation = await Context.File.GetRelationAsync<IChildToManyParentsRelation>("MasterFile");

if (!masterFileRelation.Parents.Any() || !masterFileRelation.Parents.Contains(Context.Asset.Id.Value))
{
    return;
}

string ToCsvValue(object source)
{
    var str = source.ToString();
    if (str.Contains(","))
    {
        return "\"" + str + "\"";
    }
    return str;
}

var headers = string.Join(", ", Context.MetadataProperties.Keys.Select(ToCsvValue));
var values = string.Join(", ", Context.MetadataProperties.Values.Select(ToCsvValue));

var metadataProp = await Context.Asset.GetPropertyAsync<ICultureInsensitiveProperty>("Metadata");
metadataProp.SetValue(headers + "\n" + values);

await MClient.Entities.SaveAsync(Context.Asset);

Script explanation

  1. Include the libraries to be used in the script.

    RequestResponsec#
    using System.Linq;
  2. Get the MasterFile relation of the asset.

    RequestResponseshell
    var masterFileRelation = await Context.File.GetRelationAsync<IChildToManyParentsRelation>("MasterFile");
  3. Check if the current file is the master-file. Only this metadata is to be copied if this is the case.

    RequestResponseshell
    if (!masterFileRelation.Parents.Any() || !masterFileRelation.Parents.Contains(Context.Asset.Id.Value))
    {
        return;
    }
  4. Create a method that checks if the property already has commas and escapes them with quotation marks.

    RequestResponseshell
    string ToCsvValue(object source)
    {
        var str = source.ToString();
        if (str.Contains(","))
        {
            return "\"" + str + "\"";
        }
        return str;
    }
  5. Convert the metadata headers to csv.

    RequestResponseshell
    var headers = string.Join(", ", Context.MetadataProperties.Keys.Select(ToCsvValue));
  6. Convert the metadata values to csv.

    RequestResponseshell
    var values = string.Join(", ", Context.MetadataProperties.Values.Select(ToCsvValue));
  7. Get the metadata property field of the asset.

    RequestResponseshell
    var metadataProp = await Context.Asset.GetPropertyAsync<ICultureInsensitiveProperty>("Metadata");
  8. Store the metadata on the asset.

    RequestResponseshell
    metadataProp.SetValue(headers + "\n" + values);
  9. Save the asset.

    RequestResponseshell
    await MClient.Entities.SaveAsync(Context.Asset);

Setup

  1. Create a string property called Metadata on the M.Asset definition. Also set the content type to Multiple lines.

  2. Create, publish and enable a metadata processing script with the source code above.

Do you have some feedback for us?

If you have suggestions for improving this article,