private static IProgram CreateProgram(CloudMediaContext context, IChannel amsChannel, AMSEvent eventData) { string assetName = string.Format("{0}-{1}", amsChannel.Name, GetProgramName(eventData)); IAsset asset = GetAssetByName(context, assetName); if (asset == null) { asset = TraceOperation("Create " + assetName, () => CreateAsset(context, assetName)); } if (asset.Locators.Count == 0) { TraceOperation("Create Locator", () => CreateLocator(context, asset)); } ProgramCreationOptions options = new ProgramCreationOptions(); options.Name = GetProgramName(eventData); options.AssetId = asset.Id; options.Description = eventData.Name; options.ArchiveWindowLength = TimeSpan.FromHours(4); return(TraceOperation("Create Program {0}", () => amsChannel.Programs.Create(options), options.Name)); }
//Live protection: given channel name and program name, set up dynamic PlayReady protection for live and start the program public static void SetupLiveDynamicPlayReadyProtection(CloudMediaContext objCloudMediaContext, string channelName, string programName, string manifestFileName) { //get channel IChannel objIChannel = objCloudMediaContext.Channels.Where(c => c.Name == channelName).FirstOrDefault(); Console.WriteLine(string.Format("IChannel.IngestUrl = {0}", objIChannel.Input.Endpoints.FirstOrDefault().Url.ToString())); Console.WriteLine(string.Format("IChannel.PreviewUrl = {0}", objIChannel.Preview.Endpoints.FirstOrDefault().Url.ToString())); //create program asset IAsset objIAsset = objCloudMediaContext.Assets.Create(string.Format("{0}_Program_Asset_PR", channelName), AssetCreationOptions.None); //set up dynamic PlayReady protection for the asset exactly as VOD SetupDynamicPlayReadyProtection(objCloudMediaContext, objIAsset); //create a program using this asset ProgramCreationOptions options = new ProgramCreationOptions() { Name = programName, Description = "Dynamic PlayReady protection for live", ArchiveWindowLength = TimeSpan.FromMinutes(120.0), ManifestName = manifestFileName, //manifest file name to be duplicated (without .ism suffix) AssetId = objIAsset.Id }; IProgram objIProgram = objIChannel.Programs.Create(options); //publish the asset Program.GetStreamingOriginLocator(objIAsset.Id, Program.MediaContentType.SmoothStreaming, true); //start the program objIProgram.Start(); Console.WriteLine("Program {0} has started", programName); }
private void CreateProgram(IChannel channel, IAsset asset, int?archiveWindowMinutes) { if (!archiveWindowMinutes.HasValue) { string settingKey = Constant.AppSettingKey.MediaChannelProgramArchiveMinutes; string programArchiveMinutes = AppSetting.GetValue(settingKey); archiveWindowMinutes = int.Parse(programArchiveMinutes); } ProgramCreationOptions programOptions = new ProgramCreationOptions() { Name = asset.Name, AssetId = asset.Id, ArchiveWindowLength = new TimeSpan(0, archiveWindowMinutes.Value, 0) }; channel.Programs.Create(programOptions); }
private void CreateProgram(IChannel channel) { string assetName = channel.Name; AssetCreationOptions assetEncryption = AssetCreationOptions.None; IAsset asset = _media.Assets.Create(assetName, assetEncryption); ProgramCreationOptions creationOptions = new ProgramCreationOptions(); creationOptions.Name = channel.Name; creationOptions.AssetId = asset.Id; int archiveMinutesInt; string settingKey = Constants.AppSettingKey.MediaChannelProgramArchiveMinutes; string archiveMinutes = AppSetting.GetValue(settingKey); if (int.TryParse(archiveMinutes, out archiveMinutesInt)) { creationOptions.ArchiveWindowLength = new TimeSpan(0, archiveMinutesInt, 0); } channel.Programs.Create(creationOptions); }
public static async Task <object> Run([HttpTrigger(WebHookType = "genericJson")] HttpRequestMessage req, TraceWriter log) { log.Info($"Webhook was triggered!"); string jsonContent = await req.Content.ReadAsStringAsync(); dynamic data = JsonConvert.DeserializeObject(jsonContent); log.Info(jsonContent); if (data.channelName == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Please pass channelName in the input object" })); } if (data.programName == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Please pass programName in the input object" })); } string channelName = data.channelName; string programName = data.programName; string assetName = data.assetName; IProgram program = null; TimeSpan archiveLength = new TimeSpan(0, data.archiveWindowLength != null ? (int)data.archiveWindowLength : 5, 0); // default 5 min MediaServicesCredentials amsCredentials = new MediaServicesCredentials(); log.Info($"Using Azure Media Service Rest API Endpoint : {amsCredentials.AmsRestApiEndpoint}"); IAsset newAsset = null; try { AzureAdTokenCredentials tokenCredentials = new AzureAdTokenCredentials(amsCredentials.AmsAadTenantDomain, new AzureAdClientSymmetricKey(amsCredentials.AmsClientId, amsCredentials.AmsClientSecret), AzureEnvironments.AzureCloudEnvironment); AzureAdTokenProvider tokenProvider = new AzureAdTokenProvider(tokenCredentials); _context = new CloudMediaContext(amsCredentials.AmsRestApiEndpoint, tokenProvider); log.Info("Context object created."); var channel = _context.Channels.Where(c => c.Name == channelName).FirstOrDefault(); if (channel == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = string.Format("Channel {0} not found", channelName) })); } newAsset = _context.Assets.Create(assetName, (string)data.assetStorage, AssetCreationOptions.None); log.Info("new asset created."); if (data.alternateId != null) { newAsset.AlternateId = (string)data.alternateId; newAsset.Update(); } ProgramCreationOptions options = new ProgramCreationOptions() { Name = programName, ManifestName = data.manifestName, Description = data.description, AssetId = newAsset.Id, ArchiveWindowLength = archiveLength }; program = channel.Programs.Create(options); log.Info("new program created."); if (data.startProgram == null || (data.startProgram != null && (bool)data.startProgram)) { log.Info("starting program..."); program.Start(); log.Info("Program started."); } program = _context.Programs.Where(p => p.Id == program.Id).FirstOrDefault(); // refresh } catch (Exception ex) { string message = ex.Message + ((ex.InnerException != null) ? Environment.NewLine + MediaServicesHelper.GetErrorMessage(ex) : ""); log.Info($"ERROR: Exception {message}"); return(req.CreateResponse(HttpStatusCode.InternalServerError, new { error = message })); } log.Info("asset Id: " + newAsset.Id); log.Info("container Path: " + newAsset.Uri.Segments[1]); return(req.CreateResponse(HttpStatusCode.OK, new { containerPath = newAsset.Uri.Segments[1], assetId = newAsset.Id, manifestName = program.ManifestName, id = program.Id, state = program.State })); }