示例#1
0
        private async Task <bool> DoExport(IProgress <ExportProgressStatus> progress)
        {
            var exportProgressStatus = new ExportProgressStatus();
            var overallProgressSteps = _data.ActiveProfile.SequenceFiles.Count * 2d;             //There are basically 2 steps for each. Render and export.
            var overallProgressStep  = 0;

            exportProgressStatus.OverallProgressMessage = "Overall Progress";
            progress.Report(exportProgressStatus);

            await Task.Run(async() =>
            {
                foreach (var sequenceFile in _data.ActiveProfile.SequenceFiles)
                {
                    if (_cancelled)
                    {
                        break;
                    }
                    exportProgressStatus.TaskProgressMessage = string.Format("Loading {0}", Path.GetFileNameWithoutExtension(sequenceFile));;
                    progress.Report(exportProgressStatus);

                    //Load our sequence
                    var sequence = SequenceService.Instance.Load(sequenceFile);
                    exportProgressStatus.TaskProgressMessage = string.Format("Loading any media for {0}", sequence.Name);
                    progress.Report(exportProgressStatus);
                    //Load it's media
                    LoadMedia(sequence);
                    //Render it
                    RenderSequence(sequence, progress);
                    //Update over all progress with next step
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = string.Format("Exporting {0}", sequence.Name);
                    progress.Report(exportProgressStatus);

                    //Begin export step.
                    await Export(sequence, progress);

                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    progress.Report(exportProgressStatus);
                }

                await CreateUniverseFile();
                exportProgressStatus.TaskProgressMessage    = "";
                exportProgressStatus.TaskProgressValue      = 0;
                exportProgressStatus.OverallProgressMessage = "Completed";
                progress.Report(exportProgressStatus);
            });

            return(true);
        }
示例#2
0
        private void ReportProgress(ExportProgressStatus progressStatus)
        {
            switch (progressStatus.StatusType)
            {
            case ExportProgressStatus.ProgressType.Both:
                UpdateTaskProgress(progressStatus);
                UpdateOverallProgress(progressStatus);
                break;

            case ExportProgressStatus.ProgressType.Task:
                UpdateTaskProgress(progressStatus);
                break;

            case ExportProgressStatus.ProgressType.Overall:
                UpdateOverallProgress(progressStatus);
                break;
            }
        }
示例#3
0
        private bool RenderSequence(ISequence sequence, IProgress <ExportProgressStatus> progress)
        {
            double count = sequence.SequenceData.EffectData.Count();
            long   index = 1;
            var    p     = new ExportProgressStatus(ExportProgressStatus.ProgressType.Task)
            {
                TaskProgressMessage = string.Format("Rendering {0}", sequence.Name)
            };

            foreach (var effectNode in sequence.SequenceData.EffectData.Cast <IEffectNode>())
            {
                RenderEffect(effectNode);
                p.TaskProgressValue = (int)(index / count * 100);
                progress.Report(p);
                index++;
            }

            return(true);
        }
示例#4
0
 private void UpdateTaskProgress(ExportProgressStatus progressStatus)
 {
     taskProgress.Value   = progressStatus.TaskProgressValue;
     lblTaskProgress.Text = progressStatus.TaskProgressMessage;
 }
示例#5
0
 private void UpdateOverallProgress(ExportProgressStatus progressStatus)
 {
     overallProgress.Value   = progressStatus.OverallProgressValue;
     lblOverallProgress.Text = progressStatus.OverallProgressMessage;
 }
示例#6
0
 private void ReportExportProgress(ExportProgressStatus exportProgressStatus)
 {
     exportProgressBar.Value = exportProgressStatus.TaskProgressValue;
     currentTimeLabel.Text   = string.Format("{0}%", exportProgressStatus.TaskProgressValue);
 }
        private async Task <bool> DoImport(IProgress <ExportProgressStatus> progress)
        {
            var exportProgressStatus = new ExportProgressStatus();
            //Progress steps per sequence
            //1 Extract Sequence
            //2 Load Sequence
            //3 Remap Sequence
            //4 Save Sequence to sequence folder
            //5 Add media to Module Data folder
            //6 Add Audio to Media folder

            //Progress for Element Tree is one to create and one to archive
            var stepsPerSequence     = 6d;
            var overallProgressSteps = (_data.Sequences.Count * stepsPerSequence);
            var overallProgressStep  = 0;

            exportProgressStatus.OverallProgressMessage = "Overall Progress";
            progress.Report(exportProgressStatus);

            await Task.Run(async() =>
            {
                ModelPersistenceService <ElementMap> ems = new ModelPersistenceService <ElementMap>();
                var map = await ems.LoadModelAsync(_data.MapFile);

                foreach (var sequenceFile in _data.Sequences.Where(s => s.Value).Select(x => x.Key))
                {
                    if (_cancelled)
                    {
                        break;
                    }

                    //Progress step 1 Extract Sequence
                    exportProgressStatus.TaskProgressValue   = 0;
                    exportProgressStatus.TaskProgressMessage = $"Extracting {sequenceFile} from package";;
                    progress.Report(exportProgressStatus);

                    //var n =  Path.GetFileNameWithoutExtension(Path.GetRandomFileName()) + ".tim";
                    //var sequenceTemp = Path.Combine(Path.GetTempPath(), n);
                    var sequenceDestination = Path.Combine(SequenceService.SequenceDirectory,
                                                           sequenceFile + TimedSequence.Extension);
                    if (File.Exists(sequenceDestination))
                    {
                        var overwrite = ShowSequenceExistsMessage(sequenceFile);
                        if (!overwrite)
                        {
                            var target = GetFileName();
                            if (!string.IsNullOrEmpty(target))
                            {
                                sequenceDestination = target;
                            }
                            else
                            {
                                continue;
                            }
                        }
                    }

                    ExtractSequence(_data.InputFile, sequenceFile, sequenceDestination);
                    //End step 1

                    //Progress step 2 Load Sequence
                    exportProgressStatus.TaskProgressValue = (int)(1 / stepsPerSequence * 100);
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = $"Loading {sequenceFile}";
                    progress.Report(exportProgressStatus);

                    var sequence = await LoadSequence(sequenceDestination);

                    //try to clean up any sequence migration files becasue they are not relevant anyway.
                    var escapedFile = Regex.Escape(sequenceFile + TimedSequence.Extension);
                    Regex filter    = new Regex($@"^.*{escapedFile}\.\d*$");
                    try
                    {
                        foreach (string f in Directory.EnumerateFiles(Path.GetDirectoryName(sequenceDestination), "*.*", SearchOption.TopDirectoryOnly)
                                 .Where(x => filter.IsMatch(x)))
                        {
                            File.Delete(f);
                        }
                    }
                    catch (Exception e)
                    {
                        Logging.Error(e, "An error occured trying to remove sequence migration files.");
                    }
                    //End step 2

                    //Progress step 3 Remap Sequence
                    exportProgressStatus.TaskProgressValue = (int)(2 / stepsPerSequence * 100);
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = $"Remapping {sequenceFile}";
                    progress.Report(exportProgressStatus);

                    MapSequence(sequence, map);
                    //End step 3

                    exportProgressStatus.TaskProgressValue = (int)(3 / stepsPerSequence * 100);
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = $"Saving mapped sequence {sequenceFile}";
                    progress.Report(exportProgressStatus);

                    //Progress step 4 Save Sequence to sequence folder

                    await SaveSequence(sequence, Path.Combine(SequenceService.SequenceDirectory, sequenceDestination));
                    //End step 4

                    //Progress step 5 Add media to Module Data folder
                    exportProgressStatus.TaskProgressValue = (int)(4 / stepsPerSequence * 100);
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = $"Extracting module data for {sequenceFile}";
                    progress.Report(exportProgressStatus);

                    ExtractModuleData(_data.InputFile, sequenceFile);
                    //End step 5

                    //Progress step 6 Add Audio to Media folder
                    exportProgressStatus.TaskProgressValue = (int)(5 / stepsPerSequence * 100);
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = $"Extracting media/audio for {sequenceFile}";
                    progress.Report(exportProgressStatus);

                    ExtractMedia(_data.InputFile, sequenceFile);

                    exportProgressStatus.TaskProgressValue = 100;
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    progress.Report(exportProgressStatus);
                }

                exportProgressStatus.TaskProgressMessage    = "";
                exportProgressStatus.TaskProgressValue      = 100;
                exportProgressStatus.OverallProgressValue   = 100;
                exportProgressStatus.OverallProgressMessage = "Completed";
                progress.Report(exportProgressStatus);
            });

            return(true);
        }
示例#8
0
        private async Task <bool> DoExport(IProgress <ExportProgressStatus> progress)
        {
            var exportProgressStatus = new ExportProgressStatus();
            //Progress steps per sequence
            //Add sequence to zip
            //Discover media
            //Add media to zip
            //Add audio to zip

            //Progress for Element Tree is one to create and one to archive
            var overallProgressSteps = (_data.ExportSequenceFiles.Count * 4d) + 2;
            var overallProgressStep  = 0;

            var moduleDataFolder = Path.GetFileName(Path.GetFullPath(Paths.ModuleDataFilesPath).TrimEnd(Path.DirectorySeparatorChar));
            var mediaFolder      = Path.GetFileName(Path.GetFullPath(MediaService.MediaDirectory).TrimEnd(Path.DirectorySeparatorChar));

            exportProgressStatus.OverallProgressMessage = "Overall Progress";
            progress.Report(exportProgressStatus);
            bool create = true;

            if (File.Exists(_data.ExportOutputFile))
            {
                if (ShowExportArchiveExistsMessage(Path.GetFileName(_data.ExportOutputFile)))
                {
                    try
                    {
                        File.Delete(_data.ExportOutputFile);
                    }
                    catch (Exception e)
                    {
                        ShowErrorMessage($"An error occurred overwriting the existing package.\n\r {e.Message}");
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }

            await Task.Run(async() =>
            {
                foreach (var sequenceFile in _data.ExportSequenceFiles)
                {
                    if (_cancelled)
                    {
                        break;
                    }

                    var name = Path.GetFileNameWithoutExtension(sequenceFile);
                    //Progress step Add sequence to zip
                    exportProgressStatus.TaskProgressValue   = 0;
                    exportProgressStatus.TaskProgressMessage = $"Packaging {name}";;
                    progress.Report(exportProgressStatus);

                    Archive(_data.ExportOutputFile, new List <Tuple <string, string> > {
                        new Tuple <string, string>(sequenceFile, Path.Combine("Sequence", Path.GetFileName(sequenceFile)))
                    },
                            create?ZipArchiveMode.Create:ZipArchiveMode.Update);
                    create = false;

                    //Progress step Discover sequence effect media
                    exportProgressStatus.TaskProgressValue = 25;
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = $"Discovering any media for {name}";
                    progress.Report(exportProgressStatus);

                    var effectSupportingFiles = new List <Tuple <string, string> >();
                    var mediaSupportingFiles  = new List <Tuple <string, string> >();

                    try
                    {
                        var seq          = XDocument.Load(sequenceFile);
                        var fileElements = seq.Descendants().Where(x => x.Name.LocalName.Equals(@"FileName") ||
                                                                   x.Name.LocalName.Equals(@"Movie_DataPath") ||
                                                                   x.Name.LocalName.Equals(@"Picture_FileName") ||
                                                                   x.Name.LocalName.Equals(@"Glediator_FileName"));
                        foreach (var xElement in fileElements)
                        {
                            if (_cancelled)
                            {
                                break;
                            }
                            if (!string.IsNullOrEmpty(xElement.Value))
                            {
                                var effectFiles = Directory.GetFiles(Paths.ModuleDataFilesPath, xElement.Value,
                                                                     SearchOption.AllDirectories);
                                if (xElement.Name.LocalName.Equals(@"Movie_DataPath"))
                                {
                                    var nutcrackerMovieDirectories =
                                        Directory.GetDirectories(Paths.ModuleDataFilesPath, xElement.Value, SearchOption.AllDirectories);
                                    if (nutcrackerMovieDirectories.Any())
                                    {
                                        var nutcrackerMovieFiles = new List <string>();
                                        foreach (var nutcrackerMovieDirectory in nutcrackerMovieDirectories)
                                        {
                                            var movieFiles = Directory.GetFiles(nutcrackerMovieDirectory);
                                            nutcrackerMovieFiles.AddRange(movieFiles);
                                        }

                                        var temp = effectFiles.ToList();
                                        temp.AddRange(nutcrackerMovieFiles);
                                        effectFiles = temp.ToArray();
                                    }
                                }

                                var mediaFiles = Directory.GetFiles(MediaService.MediaDirectory, xElement.Value,
                                                                    SearchOption.TopDirectoryOnly);

                                if (effectFiles.Any())
                                {
                                    foreach (var file in effectFiles)
                                    {
                                        effectSupportingFiles.Add(
                                            new Tuple <string, string>(file,
                                                                       Path.Combine(Path.Combine(Constants.PackageSequenceDataFolder, name), moduleDataFolder, file.Replace(Paths.ModuleDataFilesPath, "").TrimStart(Path.DirectorySeparatorChar))));
                                    }
                                }

                                if (mediaFiles.Any())
                                {
                                    foreach (var file in mediaFiles)
                                    {
                                        mediaSupportingFiles.Add(
                                            new Tuple <string, string>(file,
                                                                       Path.Combine(Path.Combine(Constants.PackageSequenceDataFolder, name), mediaFolder, file.Replace(MediaService.MediaDirectory, "").TrimStart(Path.DirectorySeparatorChar))));
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Logging.Error(e, $"Exception occured parsing the sequence {sequenceFile} for media/audio file names");
                    }

                    //Add media to zip
                    exportProgressStatus.TaskProgressValue = 50;
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = $"Packaging effect media for {name}";
                    progress.Report(exportProgressStatus);

                    if (effectSupportingFiles.Any())
                    {
                        Archive(_data.ExportOutputFile, effectSupportingFiles);
                    }

                    //Add audio to zip
                    exportProgressStatus.TaskProgressValue = 75;
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    exportProgressStatus.TaskProgressMessage  = $"Packaging audio for {name}";
                    progress.Report(exportProgressStatus);

                    if (_data.ExportIncludeAudio && mediaSupportingFiles.Any())
                    {
                        Archive(_data.ExportOutputFile, mediaSupportingFiles);
                    }

                    exportProgressStatus.TaskProgressValue = 100;
                    overallProgressStep++;
                    exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                    progress.Report(exportProgressStatus);
                }

                if (_cancelled)
                {
                    return;
                }

                exportProgressStatus.TaskProgressValue = 0;
                overallProgressStep++;
                exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                exportProgressStatus.TaskProgressMessage  = "Creating Profile Element Map";
                progress.Report(exportProgressStatus);


                var tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
                await VixenSystem.Nodes.ExportElementNodeProxy(tempFile);
                if (_cancelled)
                {
                    return;
                }
                exportProgressStatus.TaskProgressValue = 50;
                overallProgressStep++;
                exportProgressStatus.OverallProgressValue = (int)(overallProgressStep / overallProgressSteps * 100);
                exportProgressStatus.TaskProgressMessage  = "Archiving Profile Element Map";
                progress.Report(exportProgressStatus);

                Archive(_data.ExportOutputFile, new List <Tuple <string, string> > {
                    new Tuple <string, string>(tempFile, Path.Combine("ProfileInfo", "ElementTree.v3e"))
                });

                try
                {
                    File.Delete(tempFile);
                }
                catch (Exception e)
                {
                    Logging.Error(e, "An error occured trying to delete the temp file.");
                }

                exportProgressStatus.TaskProgressMessage    = "";
                exportProgressStatus.TaskProgressValue      = 100;
                exportProgressStatus.OverallProgressValue   = 100;
                exportProgressStatus.OverallProgressMessage = "Completed";
                progress.Report(exportProgressStatus);
            });

            return(true);
        }