public static async Task <bool> AssigningVideosToQueue(int id, string fileNames, VideoQueType type)
        {
            //int VMsAvailable = 4;
            //creating local context to avoid threading issues
            using (ApplicationDbContext context = new ApplicationDbContext())
            {
                Service    serv = context.Services.Find(id);
                VideoQueue q    = new VideoQueue();
                q.VideoId  = id;
                q.BlobPath = fileNames;


                q.CreateDate   = DateTime.Now;
                q.VideoQueType = type;
                q.VideoStatus  = VideoQueueStatus.UploadingToAzureRenderFarm;
                //Use free server located in Wahpeton to Render videos if avaliable
                //Look into purchasing a render server for the house
                //var wahpRenderQ = context.VideoQueues.Where(x => x.VMName == "WIN-8GJ4I6440BF").FirstOrDefault();
                //if (wahpRenderQ == null)
                //{
                //    q.VMName = "WIN-8GJ4I6440BF";
                //    q.VideoStatus = VideoQueueStatus.UploadingToAzureRenderFarm;
                //    context.VideoQueues.Add(q);
                //    context.SaveChanges();
                //}
                //else
                //{
                string timeStamp  = DateTime.Now.ToString("hhmm");
                string PrefixName = serv.Id + "-" + serv.FuneralHome.Name;
                PrefixName = Regex.Replace(PrefixName, "[^A-Za-z0-9-_]", "");
                var groupName = PrefixName + "-RenderGroup";
                groupName = Regex.Replace(groupName, "[^A-Za-z0-9-_]", "") + "-" + timeStamp;
                var vmName = serv.Id + "vm";
                q.VMName            = vmName;
                q.VideoStatus       = VideoQueueStatus.Created;
                q.ResourceGroupName = groupName;
                context.VideoQueues.Add(q);
                context.SaveChanges();

                VMmanager man = new VMmanager();
                man.CreateAndDeployRenderVM(serv, groupName, vmName);
                // }

                q.VideoStatus          = VideoQueueStatus.UploadingToAzureRenderFarm;
                context.Entry(q).State = EntityState.Modified;
                context.SaveChanges();

                //LOCAL RENDER CODE
                //q.VMName = "MSI";
                //q.VideoStatus = VideoQueueStatus.UploadingToAzureRenderFarm;
                //q.VideoQueType = type;
                //context.VideoQueues.Add(q);
                //context.SaveChanges();
                //Turn on azure VM


                //var StartAzureVMResult = await TurnOnAzureVM(q.AssignedVM.ToString()).ConfigureAwait(false);

                string[] videoFiles = fileNames.Split(',');

                //Upload files to Azure
                bool UploadFilesResult = true;
                if (type == VideoQueType.FullNoSlate || type == VideoQueType.FullWithSlate)
                {
                    UploadFilesResult = await UploadFilesToAzure(videoFiles, "videos-in-queue").ConfigureAwait(false);
                }

                //Signal Render Machine everything is done
                if (UploadFilesResult)
                {
                    q.VideoStatus = VideoQueueStatus.UploadedToAzureRenderFarm;
                }
                else
                {
                    q.VideoStatus          = VideoQueueStatus.Error;
                    context.Entry(q).State = EntityState.Modified;
                    Error.ReportError(ErrorSeverity.Severe, "AzureRender", "AssignVideosToQue", "105");
                }
                context.SaveChanges();
                Task.Yield();
                return(false);
            }
        }
Example #2
0
        public ActionResult Manage(Service service)
        {
            var errors = ModelState
                         .Where(x => x.Value.Errors.Count > 0)
                         .Select(x => new { x.Key, x.Value.Errors })
                         .ToArray();

            if (ModelState.IsValid)
            {
                if (service.Id == 0)
                {
                    var         loggedInUserId = User.Identity.GetUserId();
                    FuneralHome home           = db.FuneralHomes.Where(f => f.UserId == loggedInUserId).FirstOrDefault();
                    service.FuneralHome = home;
                    service             = db.Services.Add(service);
                    db.SaveChanges();
                }
                else
                {
                    //Not sure why lazy load isn't working here
                    Video vid = db.Videos.Find(service.Id);
                    if (vid != null)
                    {
                        if (service.Video != null && User.IsInRole("Admin"))
                        {
                            if (service.Video.Status != null)
                            {
                                Video serviceVid = db.Videos.Find(service.Id);
                                serviceVid.Status            = service.Video.Status;
                                serviceVid.ConvertedFilePath = service.Video.ConvertedFilePath;
                                db.Entry(serviceVid).State   = EntityState.Modified;
                                service.Video = serviceVid;
                            }
                        }
                        Service dbService = db.Services.AsNoTracking().Where(x => x.Id == service.Id).FirstOrDefault();
                        if (dbService != null)
                        {
                            //Don't allow user to change anything if we are currently rendering a video
                            var videoQs = db.VideoQueues.Where(s => s.VideoId == service.Id).FirstOrDefault();
                            if (videoQs != null)
                            {
                                ModelState.Clear();
                                ModelState.AddModelError("RenderInProgress", "Cannot save changes because the video is rendering. Please wait for video to be done rendering, refresh the page and save your changes.");
                                return(View(dbService));
                            }

                            //Detect changes, and re render video if needed
                            if (service.HasSlate != dbService.HasSlate)
                            {
                                AzureRender.CopyProductionVideoToQueContainer(dbService.Video.ConvertedFilePath);
                                VideoQueType renderType = VideoQueType.StripSlate;
                                if (service.HasSlate)
                                {
                                    renderType = VideoQueType.AddSlate;
                                }
                                AzureRender.AssigningVideosToQueue(service.Id, dbService.Video.ConvertedFilePath, renderType);
                            }
                            else if (service.FirstName != dbService.FirstName || service.LastName != dbService.LastName || service.ServiceDate != dbService.ServiceDate)
                            {
                                if (service.HasSlate == true)
                                {
                                    AzureRender.CopyProductionVideoToQueContainer(dbService.Video.ConvertedFilePath);
                                    AzureRender.AssigningVideosToQueue(service.Id, dbService.Video.ConvertedFilePath, VideoQueType.ReEditSlate);
                                }
                            }
                        }
                    }
                    db.Entry(service).State = EntityState.Modified;
                    db.SaveChanges();
                }
                if (service.IsSecured && service.ViewingUserId == null)
                {
                    SecuredServiceHelper servHelp = new SecuredServiceHelper();
                    servHelp.MakeServiceSecure(service, db);
                }
                return(RedirectToAction("Manage", new { id = service.Id }));
            }
            return(View(service));
        }