Search code examples
c#azureazure-media-services

Azure Media Services Locator


I am trying to use azure media services, using c# code, for the most part using the examples I can upload an asset, publish it and then get a locator to pull it back down.

I am a bit confused how I can generate a new locator e.g. if the old one expires?

For example If I create a locator now at the time of uploading and encoding, I can get a url by defining this against the CloudMediaContext object.

_context.Locators.Create(
    LocatorType.OnDemandOrigin,
    asset,
    AccessPermissions.Read,
    TimeSpan.FromDays(30));

_context.Locators.Create(
    LocatorType.Sas,
    asset,
    AccessPermissions.Read,
    TimeSpan.FromDays(30));

After 30 days the url will expire, how can I get a new one at this time?

Many thanks for any help you can give :)


Solution

  • It looks like you're using the v2 version of the Media Services API. After a locator expires you can create a new one by first locating the asset you want to add the locator to and then creating the locator for that asset. Here's an example:

    using Microsoft.WindowsAzure.MediaServices.Client;
    using System;
    using System.Linq;
    
    namespace GenerateLocatorV2
    {
        class Program
        {
            private static CloudMediaContext _context = null;
            static void Main(string[] args)
            {
                string tenantDomain = args[0];
                string RESTendpoint = args[1];
                string assetId = args[2];
    
                // Specify your AAD tenant domain, for example "microsoft.onmicrosoft.com"
                AzureAdTokenCredentials tokenCredentials = new AzureAdTokenCredentials(tenantDomain, AzureEnvironments.AzureCloudEnvironment);
    
                AzureAdTokenProvider tokenProvider = new AzureAdTokenProvider(tokenCredentials);
    
                // Specify your REST API endpoint, for example "https://accountname.restv2.westcentralus.media.azure.net/API"
                _context = new CloudMediaContext(new Uri(RESTendpoint), tokenProvider);
    
                IAsset asset = GetAsset(assetId);
    
                // Always try to reuse access policies.  You only need to configure one per type of access (30 day, read for example). 
                var tempPolicyId = from a in _context.AccessPolicies
                                   where a.Name == "30DayRead"
                                   select a;
    
                IAccessPolicy policy = null;
    
                if (tempPolicyId.Count() < 1)
                {
                    // This will likely only run once ever to create the policy with this specific name.
                    policy = _context.AccessPolicies.Create("30DayRead",
                    TimeSpan.FromDays(30),
                    AccessPermissions.Read);
                }
                else
                {
                    // The policy exists already and has been found.
                    policy = tempPolicyId.FirstOrDefault();
                }
    
                // Create a locator to the streaming content on an origin. 
                ILocator originLocator = _context.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset,
                    policy,
                    DateTime.UtcNow.AddMinutes(-5));
            }
            private static IAsset GetAsset(string assetId)
            {
                var tempAsset = from a in _context.Assets
                                where a.Id == assetId
                                select a;
                IAsset asset = tempAsset.SingleOrDefault();
                return asset;
                // This function can be done in a single line by code like:
                // IAsset asset = _context.Assets.Where(a => a.Id == assetId).FirstOrDefault();
            }
        }
    }