]> granicus.if.org Git - handbrake/commitdiff
WinGui: Re-implement queue import/export functionality for the GUI. Note, this is...
authorsr55 <sr55.hb@outlook.com>
Fri, 7 Jun 2019 18:55:56 +0000 (19:55 +0100)
committersr55 <sr55.hb@outlook.com>
Fri, 7 Jun 2019 18:56:17 +0000 (19:56 +0100)
Format subject to change in the future. For now, this is a quick way of getting this functionality back.  #898

win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
win/CS/HandBrakeWPF/Properties/Resources.resx
win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs
win/CS/HandBrakeWPF/Services/Queue/QueueService.cs
win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
win/CS/HandBrakeWPF/Views/QueueView.xaml

index 334c77073386dcfb8a362f130e7aacff9f09f0ba..ad6f641300ffc28ac9f2b80e02ae72556aa947ec 100644 (file)
@@ -4093,7 +4093,7 @@ namespace HandBrakeWPF.Properties {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Export Queue for CLI.
+        ///   Looks up a localized string similar to Export Queue.
         /// </summary>
         public static string QueueView_Export {
             get {
@@ -4101,6 +4101,15 @@ namespace HandBrakeWPF.Properties {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Export Queue (CLI Only).
+        /// </summary>
+        public static string QueueView_ExportCLI {
+            get {
+                return ResourceManager.GetString("QueueView_ExportCLI", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Filesize: .
         /// </summary>
index e77a6371db3c1adadc6ad801e3d7c1631976ce8f..079c3a4a7eccc31e7005446af8f9c7c3d81a1c54 100644 (file)
@@ -1459,7 +1459,7 @@ This will not affect your current settings in the Subtitle tab.</value>
     <value>End Time:</value>\r
   </data>\r
   <data name="QueueView_Export" xml:space="preserve">\r
-    <value>Export Queue for CLI</value>\r
+    <value>Export Queue</value>\r
   </data>\r
   <data name="QueueView_FileSize" xml:space="preserve">\r
     <value>Filesize: </value>\r
@@ -2011,4 +2011,7 @@ Where supported, any user presets will have been imported.</value>
   <data name="OptionsView_Play" xml:space="preserve">\r
     <value>Play</value>\r
   </data>\r
+  <data name="QueueView_ExportCLI" xml:space="preserve">\r
+    <value>Export Queue (CLI Only)</value>\r
+  </data>\r
 </root>
\ No newline at end of file
index add20a27d535f5e0fc548fe0bbfeb81093106b36..18e74989d2c0fb5b8b68526c43fabd528353de88 100644 (file)
@@ -102,13 +102,14 @@ namespace HandBrakeWPF.Services.Queue.Interfaces
         void BackupQueue(string exportPath);
 
         /// <summary>
-        /// Export the Queue the standardised JSON format.
+        /// Export the windows queue in JSON format.
+        /// Note: Note compatible with CLI.
         /// </summary>
         /// <param name="exportPath">
         /// The export path.
         /// </param>
         void ExportJson(string exportPath);
-        
+
         /// <summary>
         /// Restore a JSON queue file.
         /// </summary>
@@ -117,6 +118,14 @@ namespace HandBrakeWPF.Services.Queue.Interfaces
         /// </param>
         void ImportJson(string path);
 
+        /// <summary>
+        /// Export the Queue the standardised JSON format for the CLI
+        /// </summary>
+        /// <param name="exportPath">
+        /// The export path.
+        /// </param>
+        void ExportCliJson(string exportPath);
+
         /// <summary>
         /// Checks the current queue for an existing instance of the specified destination.
         /// </summary>
index 48c29f4f4397bdd510eb9e19323dbe42e58645b1..3d8af90b3a8ccd37551f91ddf9222dc14af8832e 100644 (file)
@@ -44,29 +44,12 @@ namespace HandBrakeWPF.Services.Queue
 
     public class QueueService : Interfaces.IQueueService
     {
-        #region Constants and Fields
         private static readonly object QueueLock = new object();
         private readonly IUserSettingService userSettingService;
         private readonly ObservableCollection<QueueTask> queue = new ObservableCollection<QueueTask>();
         private readonly string queueFile;
         private bool clearCompleted;
 
-        #endregion
-
-        #region Constructors and Destructors
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="QueueService"/> class.
-        /// </summary>
-        /// <param name="encodeService">
-        /// The encode Service.
-        /// </param>
-        /// <param name="userSettingService">
-        /// The user settings service.
-        /// </param>
-        /// <exception cref="ArgumentNullException">
-        /// Services are not setup
-        /// </exception>
         public QueueService(IEncode encodeService, IUserSettingService userSettingService)
         {
             this.userSettingService = userSettingService;
@@ -76,64 +59,18 @@ namespace HandBrakeWPF.Services.Queue
             this.queueFile = string.Format("{0}{1}.json", QueueRecoveryHelper.QueueFileName, GeneralUtilities.ProcessId);
         }
 
-        #endregion
-
-        #region Delegates
-
-        /// <summary>
-        /// Queue Progress Status
-        /// </summary>
-        /// <param name="sender">
-        /// The sender.
-        /// </param>
-        /// <param name="e">
-        /// The QueueProgressEventArgs.
-        /// </param>
         public delegate void QueueProgressStatus(object sender, QueueProgressEventArgs e);
 
-        /// <summary>
-        /// The queue completed.
-        /// </summary>
-        /// <param name="sender">
-        /// The sender.
-        /// </param>
-        /// <param name="e">
-        /// The e.
-        /// </param>
         public delegate void QueueCompletedEventDelegate(object sender, QueueCompletedEventArgs e);
 
-        #endregion
-
-        #region Events
-
-        /// <summary>
-        /// Fires when the Queue has started
-        /// </summary>
         public event QueueProgressStatus JobProcessingStarted;
 
-        /// <summary>
-        /// Fires when a job is Added, Removed or Re-Ordered.
-        /// Should be used for triggering an update of the Queue Window.
-        /// </summary>
         public event EventHandler QueueChanged;
 
-        /// <summary>
-        /// Fires when the entire encode queue has completed.
-        /// </summary>
         public event QueueCompletedEventDelegate QueueCompleted;
 
-        /// <summary>
-        /// Fires when a pause to the encode queue has been requested.
-        /// </summary>
         public event EventHandler QueuePaused;
 
-        #endregion
-
-        #region Properties
-
-        /// <summary>
-        /// Gets the number of jobs in the queue;
-        /// </summary>
         public int Count
         {
             get
@@ -142,9 +79,6 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// The number of errors detected.
-        /// </summary>
         public int ErrorCount
         {
             get
@@ -153,25 +87,12 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// Gets the IEncodeService instance.
-        /// </summary>
         public IEncode EncodeService { get; private set; }
 
-        /// <summary>
-        /// Gets a value indicating whether IsProcessing.
-        /// </summary>
         public bool IsProcessing { get; private set; }
 
-        /// <summary>
-        /// Gets or sets Last Processed Job.
-        /// This is set when the job is poped of the queue by GetNextJobForProcessing();
-        /// </summary>
         public QueueTask LastProcessedJob { get; set; }
 
-        /// <summary>
-        /// Gets The current queue.
-        /// </summary>
         public ObservableCollection<QueueTask> Queue
         {
             get
@@ -180,17 +101,7 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        #endregion
-
-        #region Public Methods
 
-        /// <summary>
-        /// Add a job to the Queue. 
-        /// This method is Thread Safe.
-        /// </summary>
-        /// <param name="job">
-        /// The encode Job object.
-        /// </param>
         public void Add(QueueTask job)
         {
             lock (QueueLock)
@@ -200,12 +111,6 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// Backup any changes to the queue file
-        /// </summary>
-        /// <param name="exportPath">
-        /// If this is not null or empty, this will be used instead of the standard backup location.
-        /// </param>
         public void BackupQueue(string exportPath)
         {
             Stopwatch watch = Stopwatch.StartNew();
@@ -237,7 +142,7 @@ namespace HandBrakeWPF.Services.Queue
             Debug.WriteLine("Queue Save (ms): " + watch.ElapsedMilliseconds);
         }
 
-        public void ExportJson(string exportPath)
+        public void ExportCliJson(string exportPath)
         {
             List<QueueTask> jobs = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
             List<EncodeTask> workUnits = jobs.Select(job => job.Task).ToList();
@@ -253,38 +158,47 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
+        public void ExportJson(string exportPath)
+        {
+            List<QueueTask> jobs = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
+
+            JsonSerializerSettings settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
+
+            string json = JsonConvert.SerializeObject(jobs, Formatting.Indented, settings);
+
+            using (var strm = new StreamWriter(exportPath, false))
+            {
+                strm.Write(json);
+                strm.Close();
+                strm.Dispose();
+            }
+        }
+
         public void ImportJson(string path)
         {
             List<Task> tasks;
             using (StreamReader reader = new StreamReader(path))
             {
                 string fileContent = reader.ReadToEnd();
-                tasks = QueueFactory.GetQueue(fileContent);
+                if (string.IsNullOrEmpty(fileContent))
+                {
+                    return;
+                }
+
+                List<QueueTask> reloadedQueue = JsonConvert.DeserializeObject<List<QueueTask>>(fileContent);
 
-                if (tasks != null)
+                if (reloadedQueue == null)
                 {
-                    foreach (Task task in tasks)
-                    {
-                        // TODO flesh out.
-                        EncodeTask encodeTask = EncodeTaskImportFactory.Create(task.Job);
-                        QueueTask queueTask = new QueueTask();
-                        queueTask.Task = encodeTask;
+                    return;
+                }
 
-                        this.queue.Add(queueTask);
-                    }
+                foreach (QueueTask task in reloadedQueue)
+                {
+                    this.queue.Add(task);
                 }
             }
         }
 
-        /// <summary>
-        /// Checks the current queue for an existing instance of the specified destination.
-        /// </summary>
-        /// <param name="destination">
-        /// The destination of the encode.
-        /// </param>
-        /// <returns>
-        /// Whether or not the supplied destination is already in the queue.
-        /// </returns>
         public bool CheckForDestinationPathDuplicates(string destination)
         {
             foreach (QueueTask job in this.queue)
@@ -301,9 +215,6 @@ namespace HandBrakeWPF.Services.Queue
             return false;
         }
 
-        /// <summary>
-        /// Clear down all Queue Items
-        /// </summary>
         public void Clear()
         {
             List<QueueTask> deleteList = this.queue.ToList();
@@ -314,9 +225,6 @@ namespace HandBrakeWPF.Services.Queue
             this.InvokeQueueChanged(EventArgs.Empty);
         }
 
-        /// <summary>
-        /// Clear down the Queue´s completed items
-        /// </summary>
         public void ClearCompleted()
         {
             Execute.OnUIThread(
@@ -332,13 +240,6 @@ namespace HandBrakeWPF.Services.Queue
                 });
         }
 
-        /// <summary>
-        /// Get the first job on the queue for processing.
-        /// This also removes the job from the Queue and sets the LastProcessedJob
-        /// </summary>
-        /// <returns>
-        /// An encode Job object.
-        /// </returns>
         public QueueTask GetNextJobForProcessing()
         {
             if (this.queue.Count > 0)
@@ -349,12 +250,6 @@ namespace HandBrakeWPF.Services.Queue
             return null;
         }
 
-        /// <summary>
-        /// Moves an item down one position in the queue.
-        /// </summary>
-        /// <param name="index">
-        /// The zero-based location of the job in the queue.
-        /// </param>
         public void MoveDown(int index)
         {
             if (index < this.queue.Count - 1)
@@ -368,12 +263,6 @@ namespace HandBrakeWPF.Services.Queue
             this.InvokeQueueChanged(EventArgs.Empty);
         }
 
-        /// <summary>
-        /// Moves an item up one position in the queue.
-        /// </summary>
-        /// <param name="index">
-        /// The zero-based location of the job in the queue.
-        /// </param>
         public void MoveUp(int index)
         {
             if (index > 0)
@@ -387,13 +276,6 @@ namespace HandBrakeWPF.Services.Queue
             this.InvokeQueueChanged(EventArgs.Empty);
         }
 
-        /// <summary>
-        /// Remove a job from the Queue.
-        /// This method is Thread Safe
-        /// </summary>
-        /// <param name="job">
-        /// The job.
-        /// </param>
         public void Remove(QueueTask job)
         {
             lock (QueueLock)
@@ -403,12 +285,6 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// Reset a Queued Item from Error or Completed to Waiting
-        /// </summary>
-        /// <param name="job">
-        /// The job.
-        /// </param>
         public void ResetJobStatusToWaiting(QueueTask job)
         {
             if (job.Status != QueueItemStatus.Error && job.Status != QueueItemStatus.Completed)
@@ -420,12 +296,6 @@ namespace HandBrakeWPF.Services.Queue
             job.Status = QueueItemStatus.Waiting;
         }
 
-        /// <summary>
-        /// Restore a Queue from file or from the queue backup file.
-        /// </summary>
-        /// <param name="importPath">
-        /// The import path. String.Empty or null will result in the default file being loaded.
-        /// </param>
         public void RestoreQueue(string importPath)
         {
             string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
@@ -477,9 +347,6 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// Requests a pause of the encode queue.
-        /// </summary>
         public void Pause()
         {
             this.IsProcessing = false;
@@ -497,13 +364,6 @@ namespace HandBrakeWPF.Services.Queue
             this.Pause();
         }
 
-        /// <summary>
-        /// Starts encoding the first job in the queue and continues encoding until all jobs
-        /// have been encoded.
-        /// </summary>
-        /// <param name="isClearCompleted">
-        /// The is Clear Completed.
-        /// </param>
         public void Start(bool isClearCompleted)
         {
             if (this.IsProcessing)
@@ -540,16 +400,6 @@ namespace HandBrakeWPF.Services.Queue
             this.InvokeQueuePaused(EventArgs.Empty);
         }
 
-        #endregion
-
-        #region Methods
-
-        /// <summary>
-        /// The on queue completed.
-        /// </summary>
-        /// <param name="e">
-        /// The e.
-        /// </param>
         protected virtual void OnQueueCompleted(QueueCompletedEventArgs e)
         {
             QueueCompletedEventDelegate handler = this.QueueCompleted;
@@ -561,15 +411,6 @@ namespace HandBrakeWPF.Services.Queue
             this.IsProcessing = false;
         }
 
-        /// <summary>
-        /// After an encode is complete, move onto the next job.
-        /// </summary>
-        /// <param name="sender">
-        /// The sender.
-        /// </param>
-        /// <param name="e">
-        /// The EncodeCompletedEventArgs.
-        /// </param>
         private void EncodeServiceEncodeCompleted(object sender, EncodeCompletedEventArgs e)
         {
             this.LastProcessedJob.Status = QueueItemStatus.Completed;
@@ -601,12 +442,6 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// Invoke the JobProcessingStarted event
-        /// </summary>
-        /// <param name="e">
-        /// The QueueProgressEventArgs.
-        /// </param>
         private void InvokeJobProcessingStarted(QueueProgressEventArgs e)
         {
             QueueProgressStatus handler = this.JobProcessingStarted;
@@ -616,12 +451,6 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// Invoke the Queue Changed Event
-        /// </summary>
-        /// <param name="e">
-        /// The e.
-        /// </param>
         private void InvokeQueueChanged(EventArgs e)
         {
             try
@@ -640,12 +469,6 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// Invoke the QueuePaused event
-        /// </summary>
-        /// <param name="e">
-        /// The EventArgs.
-        /// </param>
         private void InvokeQueuePaused(EventArgs e)
         {
             this.IsProcessing = false;
@@ -657,9 +480,6 @@ namespace HandBrakeWPF.Services.Queue
             }
         }
 
-        /// <summary>
-        /// Run through all the jobs on the queue.
-        /// </summary>
         private void ProcessNextJob()
         {
             QueueTask job = this.GetNextJobForProcessing();
@@ -702,7 +522,5 @@ namespace HandBrakeWPF.Services.Queue
                 this.OnQueueCompleted(new QueueCompletedEventArgs(false));
             }
         }
-
-        #endregion
     }
 }
\ No newline at end of file
index 15602f79d347447319a65cae99163bb76139e2d5..0415a8c9540997fcdabd139b30e22087676da6a7 100644 (file)
@@ -497,10 +497,7 @@ namespace HandBrakeWPF.ViewModels
             this.queueProcessor.Start(userSettingService.GetUserSetting<bool>(UserSettingConstants.ClearCompletedFromQueue));\r
         }\r
 \r
-        /// <summary>\r
-        /// Export the Queue to a file.\r
-        /// </summary>\r
-        public void Export()\r
+        public void ExportCli()\r
         {\r
             SaveFileDialog dialog = new SaveFileDialog\r
             {\r
@@ -510,15 +507,28 @@ namespace HandBrakeWPF.ViewModels
                 AddExtension = true\r
             };\r
 \r
+            if (dialog.ShowDialog() == true)\r
+            {\r
+                this.queueProcessor.ExportCliJson(dialog.FileName);\r
+            }\r
+        }\r
+\r
+        public void Export()\r
+        {\r
+            SaveFileDialog dialog = new SaveFileDialog\r
+                                    {\r
+                                        Filter = "Json (*.json)|*.json",\r
+                                        OverwritePrompt = true,\r
+                                        DefaultExt = ".json",\r
+                                        AddExtension = true\r
+                                    };\r
+\r
             if (dialog.ShowDialog() == true)\r
             {\r
                 this.queueProcessor.ExportJson(dialog.FileName);\r
             }\r
         }\r
 \r
-        /// <summary>\r
-        /// Import a saved queue\r
-        /// </summary>\r
         public void Import()\r
         {\r
             OpenFileDialog dialog = new OpenFileDialog { Filter = "Json (*.json)|*.json", CheckFileExists = true };\r
@@ -558,7 +568,6 @@ namespace HandBrakeWPF.ViewModels
         public void OpenSourceDir()\r
         {\r
             this.OpenSourceDirectory(this.SelectedTask);\r
-\r
         }\r
 \r
         public void OpenDestDir()\r
index 8ff2831b37926d51b9b12c31e229b3788626d6c3..8ad81537ed3d46c194a9dcb4bf5b710546824f3d 100644 (file)
                     <MenuItem cal:Message.Attach="[Event Click] = [Action Clear]" Header="{x:Static Properties:Resources.QueueView_ClearAll}" />\r
                     <MenuItem cal:Message.Attach="[Event Click] = [Action RemoveSelectedJobs]" Header="{x:Static Properties:Resources.QueueView_ClearSelected}" />\r
                     <Separator />\r
-                    <!--<MenuItem cal:Message.Attach="[Event Click] = [Action Import]" Header="{x:Static Properties:Resources.QueueView_Import}" />-->\r
+                    <MenuItem cal:Message.Attach="[Event Click] = [Action Import]" Header="{x:Static Properties:Resources.QueueView_Import}" />\r
                     <MenuItem cal:Message.Attach="[Event Click] = [Action Export]" Header="{x:Static Properties:Resources.QueueView_Export}" />\r
+                    <Separator />\r
+                    <MenuItem cal:Message.Attach="[Event Click] = [Action ExportCli]" Header="{x:Static Properties:Resources.QueueView_ExportCLI}" />\r
                 </MenuItem>\r
             </Menu>\r
 \r