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);
            }
        }
Example #4
0
        /// <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);
            }
        }
Example #5
0
        /// <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
            });
        }