Publicar assets desde Windows Azure Media Services .NET SDK

El último paso que debemos realizar cuando trabajamos con Microsoft Azure Media Services es la publicación de los assets finales, con el objetivo de que puedan ser consumidos por los usuarios. Desde el portal de Microsoft Azure es posible realizar esta acción a través del botón PUBLISH:

Publish content

Sin embargo, si hemos realizado la ingesta de los assets desde .NET, y hemos subido varios archivos dentro del mismo asset, veremos que si realizamos la publicación desde el portal solamente nos devolverá una de las URL de uno de los archivos (si que es cierto que podemos crear el resto de forma manual y usarlas aunque no aparezcan en el portal).

En este post me gustaría compartir el código necesario para poder realizar la publicación desde .NET, además de obtener todas las URLs de todos los archivos de un asset:

using Microsoft.WindowsAzure.MediaServices.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublishAssets
{
    class Program
    {
        static void Main(string[] args)
        {

            //0. Constants
            const string AccountName = "[YOUR_ACCOUNT_NAME]";
            const string AccountKey = "[YOUR_ACCOUNT_KEY]";
            const string StreamingAssetName = "WOW_Mists_of_Pandaria_H264_Smooth";
            const string DownloadingAssetName = "WoW_Trailers";

            //1. Install-Package windowsazure.mediaservices

            //2. Get context
            var context = new CloudMediaContext(AccountName, AccountKey);

            //3. Get Streaming Asset
            var streamingAsset = (from a in context.Assets
                                  where a.Name == StreamingAssetName
                                  select a).FirstOrDefault();

            //3.1 Get Downloading Asset
            var downloadingAsset = (from a in context.Assets
                                    where a.Name == DownloadingAssetName
                                    select a).FirstOrDefault();

            //4. Create an access policy for a streaming asset
            var streamingAccessPolicy = context.AccessPolicies.Create("Access policy for " + StreamingAssetName, TimeSpan.FromDays(10), AccessPermissions.Read);

            //4.1 Create access policy for a downloading asset
            var downloadingAccessPolicy = context.AccessPolicies.Create("Access policy for " + DownloadingAssetName, TimeSpan.FromDays(10), AccessPermissions.Read);

            //5. Create a locator for a streaming asset
            var streamingLocator = context.Locators.CreateLocator(LocatorType.OnDemandOrigin, streamingAsset, streamingAccessPolicy);

            //5.1 Create a locator for a downloading asset
            var downloadingLocator = context.Locators.CreateSasLocator(downloadingAsset, streamingAccessPolicy);

            //6 Streaming info
            Console.WriteLine("Streaming Path: {0}n", streamingLocator.Path);
            Console.WriteLine("Streaming Type: {0}n", streamingLocator.Type);
            Console.WriteLine("Streaming ExpirationDateTime: {0}n", streamingLocator.ExpirationDateTime);
            Console.WriteLine("URL asset files:n");

            foreach (var manifest in streamingAsset.AssetFiles.Where(f => f.Name.EndsWith(".ism")))
            {
                Console.WriteLine("  {0}{1}/manifestn", streamingLocator.Path, manifest.Name);
            }

            Console.WriteLine();
            Console.WriteLine();

            //6.1 Downloading info
            Console.WriteLine("Downloading Path: {0}n", downloadingLocator.Path);
            Console.WriteLine("Downloading Type: {0}n", downloadingLocator.Type);
            Console.WriteLine("Downloading ExpirationDateTime: {0}n", downloadingLocator.ExpirationDateTime);
            Console.WriteLine("URL asset files:n");

            foreach (var file in downloadingAsset.AssetFiles.Where(f => f.Name.EndsWith(".mp4")))
            {
                Console.WriteLine("  {0}/{1}{2}n", downloadingLocator.BaseUri, file.Name, downloadingLocator.ContentAccessComponent);
            }

            Console.ReadLine();
        }
    }
}

Cuando queremos exponer nuestro contenido, debemos tener en cuenta que existen varias opciones para compartirlo: streaming, como se vió en el post sobre Dynamic Packaging, descarga progresiva de MP4 o simplemente la descarga del contenido a la máquina local. Por ello, en este ejemplo he publicado dos assets, streamingAsset y downloadingAsset, con el fin de tener los dos tipos de publicación. Los pasos son prácticamente los mismos:

  1. Necesitaremos las credenciales de la cuenta y el nombre de los assets que queremos publicar.
  2. Instalamos el paquete Install-Package windowsazure.mediaservices a través de Nuget.
  3. Recuperamos el contexto de la cuenta.
  4. Recuperamos los assets. En este ejemplo se están obteniendo a través del nombre, pero se recomienda recuperar los assets a través del Id, ya que los nombres pueden repetirse.
  5. Cuando se publica un asset es necesario definir una política de acceso con la duración de la misma y el tipo de acceso que se tendrá al contenido. En este caso para ambos se da un acceso de 10 días de lectura. Cada asset puede tener hasta 5 políticas de acceso diferentes.
  6. El último paso es la creación del locator, lo cual nos ayudará a generar la URL final para el contenido. En el caso del streaming utilizaremos context.Locators.CreateLocator, donde usamos el tipo de locator OnDemandOrigin, además del asset y la política de acceso a utilizar. Para el segundo caso, la descarga del contenido, utilizamos context.Locators.CreateSasLocator pasando también el asset y la política de acceso. A partir de este momento se generarán los valores necesarios para la publicación del contenido de ambos assets (también se verá reflejado en el portal).
  7. Para visualizar el resultado, he utilizado la consola, donde muestro el path creado, el tipo de publicación y la fecha de expiración. Además, por cada uno de los ejemplos, recorro AssetFiles y monto las URL individuales. En el caso de streaming la URL se compone de [PATH][FILE_NAME].ism/Manifest y en tipo SaS [BASE_URI]/[FILE_NAME][CONTENT_ACCESS_COMPONENT]

El resultado:

Publish Assets Output

Espero que sea de utilidad.

¡Saludos!