public static async Task <HttpResponseMessage> EvalJobProgress([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            dynamic BodyData = await req.Content.ReadAsAsync <object>();

            UnifiedProcessStatus myProcessStatus = BodyData.ToObject <UnifiedProcessStatus>();
            IActionsProvider     myActions       = ActionProviderFactory.GetActionProvider();

            //Check AssetStatus

            switch (myProcessStatus.AssetStatus.State)
            {
            case ExecutionStatus.Error:
                //Finished with error
                myProcessStatus.JobStatus.State      = ExecutionStatus.Error;
                myProcessStatus.JobStatus.FinishTime = DateTime.Now;
                myProcessStatus.JobStatus.Duration   = DateTime.Now.Subtract(myProcessStatus.JobStatus.StartTime);
                myActions.UpdateUnifiedProcessStatus(myProcessStatus);
                break;

            case ExecutionStatus.Running:
                //Same status for JOB
                //No Action
                myProcessStatus.JobStatus.State = ExecutionStatus.Running;

                var mmrklist = myActions.GetMMRKStatusList(myProcessStatus.AssetStatus.AssetId);

                int mmrkTotal    = mmrklist.Count();
                int mmrkFinished = mmrklist.Where(m => m.State == ExecutionStatus.Finished).Count();

                myProcessStatus.JobStatus.Details = $"Generating MMRK files {mmrkFinished} of {mmrkTotal}, last update {DateTime.Now.ToString()}";

                //var jobinfo = myActions.GetJobK8SDetail(myProcessStatus.JobStatus.JobID + "-1");
                //myProcessStatus.JobStatus.Details += Newtonsoft.Json.JsonConvert.SerializeObject(jobinfo, Newtonsoft.Json.Formatting.Indented);

                break;

            case ExecutionStatus.Finished:
                //Check EmbebedCodeList
                int nRunning = myProcessStatus.EmbebedCodesList.Where(emc => emc.State == ExecutionStatus.Running).Count();
                log.Info($"Current EMC Running {nRunning}");
                if (nRunning == 0)
                {
                    myProcessStatus.JobStatus.State      = ExecutionStatus.Finished;
                    myProcessStatus.JobStatus.FinishTime = DateTime.Now;
                    myProcessStatus.JobStatus.Duration   = DateTime.Now.Subtract(myProcessStatus.JobStatus.StartTime);
                    myProcessStatus.JobStatus.Details    = "Finished";
                }
                else
                {
                    int total = myProcessStatus.EmbebedCodesList.Count();
                    myProcessStatus.JobStatus.State   = ExecutionStatus.Running;
                    myProcessStatus.JobStatus.Details = $"Watermaerked copies {(total - nRunning)} of {total}";
                }
                myActions.UpdateUnifiedProcessStatus(myProcessStatus);
                log.Info($"Updated Manifest JOB Status {myProcessStatus.JobStatus.State.ToString()}");
                break;
            }

            return(req.CreateResponse(HttpStatusCode.OK, myProcessStatus, JsonMediaTypeFormatter.DefaultMediaType));
        }
        public static async Task <HttpResponseMessage> EvalAssetStatus([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            dynamic BodyData = await req.Content.ReadAsAsync <object>();

            UnifiedProcessStatus manifest = BodyData.ToObject <UnifiedProcessStatus>();

            IActionsProvider myActions = ActionProviderFactory.GetActionProvider(SingleWaterMarkStorageAccInstanceController);
            //1. Update EvalPreprocessorNotifications
            int nNotification = await myActions.EvalPreprocessorNotifications(manifest.JobStatus.JobID);

            //2. Eval Asset Status
            var OriginalAssetStatus = manifest.AssetStatus.State;

            manifest.AssetStatus = myActions.EvalAssetStatus(manifest.AssetStatus.AssetId);
            if (OriginalAssetStatus != manifest.AssetStatus.State)
            {
                //3. Update Manifest/ all process
                await myActions.UpdateUnifiedProcessStatus(manifest);

                //4. Log and replay
                log.Info($"[{manifest.JobStatus.JobID}] Preprocessor Notifications processed {nNotification} / Updated AssetId {manifest.AssetStatus.AssetId} Status {manifest.AssetStatus.State.ToString()} / previus status {OriginalAssetStatus}");
            }
            else
            {
                log.Info($"[{manifest.JobStatus.JobID}] Preprocessor Notifications processed {nNotification} / No Change AssetId {manifest.AssetStatus.AssetId} Status {OriginalAssetStatus}");
            }
            return(req.CreateResponse(HttpStatusCode.OK, manifest, JsonMediaTypeFormatter.DefaultMediaType));
        }
        public static async Task <HttpResponseMessage> EvalEnbebedCodes([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            IActionsProvider myActions = ActionProviderFactory.GetActionProvider();
            dynamic          BodyData  = await req.Content.ReadAsAsync <object>();

            UnifiedProcessStatus manifest = BodyData.ToObject <UnifiedProcessStatus>();
            string ParentAssetID          = manifest.AssetStatus.AssetId;
            //1. Process Embbeded Notifications
            int nNotification = await myActions.EvalPEmbeddedNotifications();

            log.Info($"Embedded Notifications processed {nNotification}");
            //2. Eval Each Watermark Render status
            List <WaterMarkedAssetInfo> UpdatedInfo = new List <WaterMarkedAssetInfo>();

            foreach (var item in manifest.EmbebedCodesList)
            {
                UpdatedInfo.Add(myActions.EvalWaterMarkedAssetInfo(ParentAssetID, item.EmbebedCodeValue));
            }
            //Replace New WaterMarkAssetInfo
            manifest.EmbebedCodesList = UpdatedInfo;
            //
            myActions.UpdateUnifiedProcessStatus(manifest);

            return(req.CreateResponse(HttpStatusCode.OK, manifest, JsonMediaTypeFormatter.DefaultMediaType));
        }
예제 #4
0
        public static async Task <HttpResponseMessage> CreateWaterMArkedAssets([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            IActionsProvider myActions = ActionProviderFactory.GetActionProvider();

            dynamic BodyData = await req.Content.ReadAsAsync <object>();

            UnifiedProcessStatus manifest = BodyData.ToObject <UnifiedProcessStatus>();
            string ParentAssetID          = manifest.AssetStatus.AssetId;

            List <WaterMarkedAssetInfo> UpdatedInfo = new List <WaterMarkedAssetInfo>();

            try
            {
                //List only Finished without AsstID
                foreach (var watermarkedInfo in manifest.EmbebedCodesList)
                {
                    if ((watermarkedInfo.State == ExecutionStatus.Finished) && (string.IsNullOrEmpty(watermarkedInfo.AssetID)))
                    {
                        //Create new asset per embbeded code
                        IAMSProvider help = AMSProviderFactory.CreateAMSProvider();
                        var          xx   = await help.CreateEmptyWatermarkedAsset(manifest.JobStatus.JobID, ParentAssetID, watermarkedInfo.EmbebedCodeValue);

                        watermarkedInfo.AssetID = xx.WMAssetId;
                        ////Inject all Renders on New asset
                        foreach (var render in myActions.GetWaterMarkedRenders(ParentAssetID, watermarkedInfo.EmbebedCodeValue))
                        {
                            string url = render.MP4URL;
                            var    r   = await help.AddWatermarkedMediaFiletoAsset(watermarkedInfo.AssetID, watermarkedInfo.EmbebedCodeValue, url);

                            if (r.Status != "MMRK File Added")
                            {
                                //Error
                                watermarkedInfo.State   = ExecutionStatus.Error;
                                watermarkedInfo.Details = $"Error adding {render.RenderName} deatils: {r.StatusMessage}";
                                //Delete Asset
                                help.DeleteAsset(watermarkedInfo.AssetID);
                                watermarkedInfo.AssetID = "";
                                //Abort
                                break;
                            }
                        }
                        //Create New Manifest and set it as primary file.
                        await help.GenerateManifest(watermarkedInfo.AssetID);
                    }
                    UpdatedInfo.Add(watermarkedInfo);
                }
                //Replace New WaterMarkAssetInfo
                manifest.EmbebedCodesList = UpdatedInfo;

                myActions.UpdateUnifiedProcessStatus(manifest);
            }
            catch (Exception X)
            {
                return(req.CreateResponse(HttpStatusCode.InternalServerError, X, JsonMediaTypeFormatter.DefaultMediaType));
            }
            return(req.CreateResponse(HttpStatusCode.OK, manifest, JsonMediaTypeFormatter.DefaultMediaType));
        }
        public static async Task <HttpResponseMessage> EvalAssetStatus([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            dynamic BodyData = await req.Content.ReadAsAsync <object>();

            UnifiedProcessStatus manifest = BodyData.ToObject <UnifiedProcessStatus>();

            IActionsProvider myActions = ActionProviderFactory.GetActionProvider();
            //1. Update EvalPreprocessorNotifications
            int nNotification = await myActions.EvalPreprocessorNotifications();

            log.Info($"Preprocessor Notifications processed {nNotification}");
            //2. Eval Asset Status
            manifest.AssetStatus = myActions.EvalAssetStatus(manifest.AssetStatus.AssetId);
            //3. Update Manifest/ all process
            myActions.UpdateUnifiedProcessStatus(manifest);
            //4. Log and replay
            log.Info($"Updated Actions AssetId {manifest.AssetStatus.AssetId} staus {manifest.AssetStatus.ToString()}");
            return(req.CreateResponse(HttpStatusCode.OK, manifest, JsonMediaTypeFormatter.DefaultMediaType));
        }
        public static async Task <HttpResponseMessage> CancelJobTimeOut([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log, ExecutionContext context)
        {
            var     watch    = System.Diagnostics.Stopwatch.StartNew();
            dynamic BodyData = await req.Content.ReadAsAsync <object>();

            IActionsProvider     myActions       = ActionProviderFactory.GetActionProvider(SingleWaterMarkStorageAccInstanceController);
            UnifiedProcessStatus myProcessStatus = BodyData.ToObject <UnifiedProcessStatus>();

            try
            {
                myProcessStatus = myActions.GetUnifiedProcessStatus(myProcessStatus.AssetStatus.AssetId, myProcessStatus.JobStatus.JobID);
                myProcessStatus.JobStatus.State      = ExecutionStatus.Finished;
                myProcessStatus.JobStatus.Details    = $"Embedder copies time out, check copies status.";
                myProcessStatus.JobStatus.FinishTime = DateTime.Now;
                myProcessStatus.JobStatus.Duration   = DateTime.Now.Subtract(myProcessStatus.JobStatus.StartTime);

                //Update all running copies like Errro time out
                foreach (var copy in myProcessStatus.EmbebedCodesList.Where(c => (c.State == ExecutionStatus.Running)))
                {
                    copy.State   = ExecutionStatus.Error;
                    copy.Details = $"Timeout error: {copy.Details}";
                }
                //Update All Finished  copies without AssetID (No ASSET copy created)
                foreach (var copy in myProcessStatus.EmbebedCodesList.Where(c => (c.State == ExecutionStatus.Finished) && (string.IsNullOrEmpty(c.AssetID))))
                {
                    copy.State   = ExecutionStatus.Error;
                    copy.Details = $"Timeout error: {copy.Details}";
                }
                await myActions.UpdateUnifiedProcessStatus(myProcessStatus);
            }
            catch (Exception X)
            {
                return(req.CreateResponse(HttpStatusCode.InternalServerError, X, JsonMediaTypeFormatter.DefaultMediaType));
            }
            watch.Stop();
            log.Info($"[Time] Method CancelJobTimeOut {watch.ElapsedMilliseconds} [ms]");
            return(req.CreateResponse(HttpStatusCode.OK, myProcessStatus, JsonMediaTypeFormatter.DefaultMediaType));
        }
예제 #7
0
        public static async Task <HttpResponseMessage> EvalEnbebedCodes([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();
            IActionsProvider myActions = ActionProviderFactory.GetActionProvider();
            dynamic          BodyData  = await req.Content.ReadAsAsync <object>();

            UnifiedProcessStatus manifest = BodyData.ToObject <UnifiedProcessStatus>();
            string ParentAssetID          = manifest.AssetStatus.AssetId;

            try
            {
                //1. Process Embbeded Notifications (From share Queue)
                int nNotification = await myActions.EvalPEmbeddedNotifications(manifest.JobStatus.JobID);

                log.Info($"Embedded Notifications processed {nNotification}");
                //2. Eval Each Watermark Render status
                List <WaterMarkedAssetInfo> UpdatedInfo = new List <WaterMarkedAssetInfo>();
                foreach (var item in manifest.EmbebedCodesList)
                {
                    //2.1 EvalWatermarkeAssetInfo
                    var watermarkedRender = myActions.EvalWaterMarkedAssetInfo(ParentAssetID, item.EmbebedCodeValue);
                    UpdatedInfo.Add(watermarkedRender);
                    //log.Info($"{watermarkedRender.AssetID} status {watermarkedRender.State.ToString()}");
                }
                //Replace New WaterMarkAssetInfo
                manifest.EmbebedCodesList = UpdatedInfo;
                //
                myActions.UpdateUnifiedProcessStatus(manifest);
            }
            catch (Exception X)
            {
                log.Error($"[{manifest.JobStatus.JobID}] Error on EvalEnbebedCodes {X.Message}");
                return(req.CreateResponse(HttpStatusCode.InternalServerError, manifest, JsonMediaTypeFormatter.DefaultMediaType));
            }
            watch.Stop();
            log.Info($"[Time] Method EvalEnbebedCodes {watch.ElapsedMilliseconds} [ms]");
            return(req.CreateResponse(HttpStatusCode.OK, manifest, JsonMediaTypeFormatter.DefaultMediaType));
        }
        public static async Task <HttpResponseMessage> EvalJobProgress([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            var     watch    = System.Diagnostics.Stopwatch.StartNew();
            dynamic BodyData = await req.Content.ReadAsAsync <object>();

            UnifiedProcessStatus myProcessStatus = BodyData.ToObject <UnifiedProcessStatus>();
            IActionsProvider     myActions       = ActionProviderFactory.GetActionProvider(SingleWaterMarkStorageAccInstanceController);
            int watingCopies = 0;

            //Check AssetStatus
            log.Info($"[{myProcessStatus.JobStatus.JobID}] Job Status: {myProcessStatus.JobStatus.State.ToString()} / Asset Status {myProcessStatus.AssetStatus.State.ToString()}");
            switch (myProcessStatus.AssetStatus.State)
            {
            case ExecutionStatus.Error:
                //Finished with error
                myProcessStatus.JobStatus.State      = ExecutionStatus.Error;
                myProcessStatus.JobStatus.FinishTime = DateTime.Now;
                myProcessStatus.JobStatus.Duration   = DateTime.Now.Subtract(myProcessStatus.JobStatus.StartTime);
                await myActions.UpdateUnifiedProcessStatus(myProcessStatus);

                break;

            case ExecutionStatus.Running:
                //Same status for JOB
                //No Action
                myProcessStatus.JobStatus.State = ExecutionStatus.Running;
                var mmrklist     = myActions.GetMMRKStatusList(myProcessStatus.AssetStatus.AssetId);
                int mmrkTotal    = mmrklist.Count();
                int mmrkFinished = mmrklist.Where(m => m.State == ExecutionStatus.Finished).Count();
                myProcessStatus.JobStatus.Details = $"Generating MMRK files {mmrkFinished} of {mmrkTotal}, last update {DateTime.Now.ToString()}";
                await myActions.UpdateUnifiedProcessStatus(myProcessStatus);

                break;

            case ExecutionStatus.Finished:
                //Check EmbebedCodeList, Count running renders plus Finished render without AssetID (not created asset yet)
                int nRunning = myProcessStatus.EmbebedCodesList.Where(emc => (emc.State == ExecutionStatus.Running) || ((emc.AssetID == "") && (emc.State == ExecutionStatus.Finished))).Count();
                //Check Errros
                int nErrors = myProcessStatus.EmbebedCodesList.Where(emc => emc.State == ExecutionStatus.Error).Count();
                //Total
                int total = myProcessStatus.EmbebedCodesList.Count();

                log.Info($"Current EMC Running {nRunning}");
                if (nRunning == 0)
                {
                    myProcessStatus.JobStatus.State      = ExecutionStatus.Finished;
                    myProcessStatus.JobStatus.FinishTime = DateTime.Now;
                    myProcessStatus.JobStatus.Duration   = DateTime.Now.Subtract(myProcessStatus.JobStatus.StartTime);
                    myProcessStatus.JobStatus.Details    = $"Process Finished. Total Watermarked copies {total}, Success {total-nErrors} & Errors {nErrors}";
                }
                else
                {
                    myProcessStatus.JobStatus.State   = ExecutionStatus.Running;
                    myProcessStatus.JobStatus.Details = $"Process Running. Total Watermark copies {total}, Success {total - nRunning - nErrors} & Errors {nErrors}";
                    watingCopies = myProcessStatus.EmbebedCodesList.Where(emc => ((emc.AssetID == "") && (emc.State == ExecutionStatus.Finished))).Count();
                }
                await myActions.UpdateUnifiedProcessStatus(myProcessStatus);

                log.Info($"Updated Manifest JOB Status {myProcessStatus.JobStatus.State.ToString()}");
                break;
            }
            //Control Signal to LogicApp, to accelearete
            var myResponse = req.CreateResponse(HttpStatusCode.OK, myProcessStatus, JsonMediaTypeFormatter.DefaultMediaType);

            myResponse.Headers.Add("watingCopies", watingCopies.ToString());

            watch.Stop();
            log.Info($"[Time] Method EvalJobProgress {watch.ElapsedMilliseconds} [ms]");
            return(myResponse);
        }
예제 #9
0
        public static async Task <HttpResponseMessage> CreateWaterMArkedAssets([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();
            IActionsProvider myActions = ActionProviderFactory.GetActionProvider();

            dynamic BodyData = await req.Content.ReadAsAsync <object>();

            UnifiedProcessStatus manifest = BodyData.ToObject <UnifiedProcessStatus>();
            string ParentAssetID          = manifest.AssetStatus.AssetId;

            try
            {
                IAMSProvider help = AMSProviderFactory.CreateAMSProvider();
                //Max number of Asset to create per iteration, to avoid Function Time out.
                int  maxAssetCreate = int.Parse(System.Configuration.ConfigurationManager.AppSettings["maxAssetCreate"] ?? "10");
                int  accAssetCreate = 0;
                bool swError        = false;
                //List only Finished without AsstID
                foreach (var watermarkedInfo in manifest.EmbebedCodesList)
                {
                    if ((watermarkedInfo.State == ExecutionStatus.Finished) && (string.IsNullOrEmpty(watermarkedInfo.AssetID) && (accAssetCreate <= maxAssetCreate)))
                    {
                        var watchAsset = System.Diagnostics.Stopwatch.StartNew();
                        //Create new asset per embbeded code
                        var xx = await help.CreateEmptyWatermarkedAsset(manifest.JobStatus.JobID, ParentAssetID, watermarkedInfo.EmbebedCodeValue);

                        watermarkedInfo.AssetID = xx.WMAssetId;
                        //log.Info($"[{manifest.JobStatus.JobID}] Watermarket created form {manifest.JobStatus.JobID} {watermarkedInfo.EmbebedCodeValue} with assett id {watermarkedInfo.AssetID}");
                        ////Inject all Renders on New asset
                        foreach (var render in myActions.GetWaterMarkedRenders(ParentAssetID, watermarkedInfo.EmbebedCodeValue))
                        {
                            string url = render.MP4URL;
                            var    r   = await help.AddWatermarkedMediaFiletoAsset(watermarkedInfo.AssetID, watermarkedInfo.EmbebedCodeValue, url);

                            if (r.Status != "MMRK File Added")
                            {
                                //Error
                                watermarkedInfo.State   = ExecutionStatus.Error;
                                watermarkedInfo.Details = $"Error adding {render.RenderName} deatils: {r.StatusMessage}";
                                //Delete Asset
                                help.DeleteAsset(watermarkedInfo.AssetID);
                                watermarkedInfo.AssetID = "";
                                log.Info($"[{manifest.JobStatus.JobID}] Asset deleted  {r.Status}");
                                //Abort
                                swError = true;
                                break;
                            }
                        }
                        //If not Error Create Manifest
                        if (!swError)
                        {
                            //Create New Manifest and set it as primary file.
                            await help.GenerateManifest(watermarkedInfo.AssetID);

                            //One Asset created
                            accAssetCreate += 1;
                        }

                        watchAsset.Stop();
                        log.Info($"[Time][{manifest.JobStatus.JobID}] Asset Creation {watchAsset.ElapsedMilliseconds} [ms] code {watermarkedInfo.EmbebedCodeValue} assetID: {watermarkedInfo.AssetID}");
                    }
                    if (watch.ElapsedMilliseconds >= 100000)
                    {
                        log.Warning($"[{manifest.JobStatus.JobID}] Asset Creation time limite achieved, break loop with {accAssetCreate-1} copies");
                        break;
                    }
                }
                myActions.UpdateUnifiedProcessStatus(manifest);
            }
            catch (Exception X)
            {
                log.Error($"{X.Message}");
                return(req.CreateResponse(HttpStatusCode.InternalServerError, X, JsonMediaTypeFormatter.DefaultMediaType));
            }
            watch.Stop();
            log.Info($"[Time] Method CreateWaterMArkedAssets {watch.ElapsedMilliseconds} [ms]");
            return(req.CreateResponse(HttpStatusCode.OK, manifest, JsonMediaTypeFormatter.DefaultMediaType));
        }