public override void HandleExecute(ChainRequest request) { //1. Step Setup myRequest = (ButlerProcessRequest)request; _MediaServicesContext = new CloudMediaContext(myRequest.MediaAccountName, myRequest.MediaAccountKey); myEncodigSupport = new EncoderSupport(_MediaServicesContext); myBlobManager = BlobManagerFactory.CreateBlobManager(myRequest.ProcessConfigConn); IjsonKeyValue dotControlData = myBlobManager.GetDotControlData(myRequest.ButlerRequest.ControlFileUri); IjsonKeyValue processData = new jsonKeyValue(myBlobManager.GetButlerConfigurationValue(ProcessConfigKeys.DefualtPartitionKey, myRequest.ProcessTypeId + ".config")); IjsonKeyValue allPorcessData = myBlobManager.GetProcessConfig(myRequest.ButlerRequest.ControlFileUri, myRequest.ProcessTypeId); //2. Get Current Asset IAsset asset = (from m in _MediaServicesContext.Assets select m).Where(m => m.Id == myRequest.AssetId).FirstOrDefault(); //3. JOB parameters string OutputAssetsName = asset.Name + "_mbGridEncode"; string JobName = string.Format("GridEncodeStep_{1}_{0}", myRequest.ProcessInstanceId, asset.Name); string MediaProcessorName = myEncodigSupport.GetMediaProcessorName(allPorcessData, DotControlConfigKeys.GridEncodeStepMediaProcessorName, "Media Encoder Standard"); string[] encodeConfigurations = myEncodigSupport.GetLoadEncodignProfiles(dotControlData, processData, DotControlConfigKeys.GridEncodeStepEncodeConfigList, myRequest.ButlerRequest.MezzanineFiles, myRequest.ProcessConfigConn, this.StepConfiguration); //4. Execute JOB and Wait IJob currentJob = myEncodigSupport.ExecuteGridJob(OutputAssetsName, JobName, MediaProcessorName, encodeConfigurations, "Grid Task", asset.Id, MyEncodigSupport_OnJobError, MyEncodigSupport_JobUpdate); //9. Update AssetID myRequest.AssetId = currentJob.OutputMediaAssets.FirstOrDefault().Id; }
public override void HandleExecute(ChainRequest request) { myRequest = (ButlerProcessRequest)request; blobManager = BlobManagerFactory.CreateBlobManager(myRequest.ProcessConfigConn); IjsonKeyValue stepConfig = new jsonKeyValue(StepConfiguration); //Lead External Step from DLL try { blobManager.parkingNewBinaries(); myCustomStepExecution = buildCustomStep(stepConfig.Read("AssemblyName"), stepConfig.Read("TypeName")); } catch (Exception X) { sendError("MediaButlerCustomStep Loading error : " + X.Message); } //Transform ButlerProcessRequest to ICustomRequest myCustomRequest = buildRequest(myRequest); //Execute sync try { myCustomStepExecution.execute(myCustomRequest); //UPdate myRequest myRequest.AssetId = myCustomRequest.AssetId; } catch (Exception X) { sendError("MediaButlerCustomStep Execute error " + X.Message); } //Update status UpdateProcessStatus(myRequest, "Finish Custome Execution"); }
/// <summary> /// Check if keep or delete Status on Table /// Base on Configuration /// </summary> /// <param name="request"></param> protected void FinishProccessStatus(ChainRequest request) { string jsonData = Configuration.MBFConfiguration.GetConfigurationValue("roleconfig", "MediaButler.Workflow.ButlerWorkFlowManagerWorkerRole", request.ProcessConfigConn); IjsonKeyValue x = new jsonKeyValue(jsonData); if ((string.IsNullOrEmpty(x.Read(Configuration.MBFConfiguration.keepStatusProcess))) || (x.Read(Configuration.MBFConfiguration.keepStatusProcess) == "0")) { //Delete track, process finish ProcessSnapShot mysh = new ProcessSnapShot(request.ProcessTypeId, request.ProcessInstanceId); mysh.ETag = "*"; CloudStorageAccount storageAccount = CloudStorageAccount.Parse(request.ProcessConfigConn); CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); CloudTable table = tableClient.GetTableReference(Configuration.MBFConfiguration.ButlerWorkflowStatus); TableOperation insertOperation = TableOperation.Delete(mysh); table.Execute(insertOperation); } }
/// <summary> /// Set MP4 as primary file /// </summary> private void setPrimaryFile() { string myPrimaryFile = null; IAssetFile mp4 = null; if (!string.IsNullOrEmpty(myRequest.ButlerRequest.ControlFileUri)) { // IButlerStorageManager resource = BlobManagerFactory.CreateBlobManager(myRequest.ProcessConfigConn); string jsonControl = resource.ReadTextBlob(new Uri(myRequest.ButlerRequest.ControlFileUri)); if (!string.IsNullOrEmpty(jsonControl)) { IjsonKeyValue myControl = new jsonKeyValue(jsonControl); myPrimaryFile = myControl.Read(DotControlConfigKeys.IngestMultiMezzamineFilesPrimaryFile); } } IEncoderSupport myEncodigSupport = new EncoderSupport(MediaContext); if (!string.IsNullOrEmpty(myPrimaryFile)) { mp4 = currentAsset.AssetFiles.Where(f => f.Name.ToLower() == myPrimaryFile.ToLower()).FirstOrDefault(); } if (mp4 == null) { mp4 = currentAsset.AssetFiles.Where(f => f.Name.ToLower().EndsWith(".mp4")).FirstOrDefault(); } if (mp4 != null) { myEncodigSupport.SetPrimaryFile(currentAsset, mp4); } else { Trace.TraceWarning("{0} setPrimaryFile {2} processId {1}, has not MP4 file", this.GetType().FullName, myRequest.ProcessInstanceId, myRequest.ProcessTypeId); } }
/// <summary> /// Load Encoding profile definition for /// </summary> /// <returns></returns> private string[] getEncodeInformation() { //default Xml Profile string xmlEncodeProfile = null; string encodeProfileName = null;// //First priority Process instance level === .Control as part of the package if (!string.IsNullOrEmpty(myRequest.ButlerRequest.ControlFileUri)) { string jsonData = myStorageManager.ReadTextBlob(new Uri(myRequest.ButlerRequest.ControlFileUri)); IjsonKeyValue x = new jsonKeyValue(jsonData); try { encodeProfileName = x.Read(DotControlConfigKeys.StandardEncodigProfileName).ToLower(); } catch (Exception) { string txtTrace = string.Format("[{0}] process Type {1} instance {2} Control has not encodigProfile definition ", this.GetType().FullName, myRequest.ProcessTypeId, myRequest.ProcessInstanceId); Trace.TraceWarning(txtTrace); } if (!string.IsNullOrEmpty(encodeProfileName)) { try { //Encodig Profile has info string xmlURL = myRequest.ButlerRequest.MezzanineFiles.Where(u => u.ToLower().EndsWith(encodeProfileName)).FirstOrDefault(); if (string.IsNullOrEmpty(xmlURL)) { //Not custom encodig profile on input package ==> Preset xmlEncodeProfile = myEncodigSupport.LoadEncodeProfile(encodeProfileName, myRequest.ProcessConfigConn); } else { //xmlEncodeProfile = myStorageManager.ReadTextBlob(xmlURL); Uri xmlURI = new Uri(xmlURL); string container = xmlURI.Segments[1].Substring(0, xmlURI.Segments[1].Length - 1); CloudStorageAccount storageAccount = CloudStorageAccount.Parse(myRequest.ProcessConfigConn); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer containerX = blobClient.GetContainerReference(container); CloudBlockBlob blockBlob = containerX.GetBlockBlobReference(xmlURI.Segments[2] + xmlURI.Segments[3] + xmlURI.Segments[4]); if (blockBlob.Exists()) { //Trace.TraceInformation("[{0}] process Type {1} instance {2} Encoder Profile {3} from Blob Storage", this.GetType().FullName, myRequest.ProcessTypeId, myRequest.ProcessInstanceId, profileInfo); using (var memoryStream = new MemoryStream()) { blockBlob.DownloadToStream(memoryStream); memoryStream.Position = 0; StreamReader sr = new StreamReader(memoryStream, System.Text.Encoding.ASCII); xmlEncodeProfile = sr.ReadToEnd(); } } } } catch (Exception) { xmlEncodeProfile = null; string txt = string.Format("StandarEncodeStep try to read XMl profile from control but it is {0} ", DateTime.Now.ToString()); Trace.TraceWarning(txt); } } } //Second option is Process Level === Configuration if (xmlEncodeProfile == null) { if (!string.IsNullOrEmpty(this.StepConfiguration)) { encodeProfileName = this.StepConfiguration; } else { encodeProfileName = "H264 Multiple Bitrate 1080p.json"; } // xmlEncodeProfile = LoadEncodeProfile(encodeProfileName); xmlEncodeProfile = myEncodigSupport.LoadEncodeProfile(encodeProfileName, myRequest.ProcessConfigConn); } return(new string[2] { xmlEncodeProfile, encodeProfileName }); }