diff options
9 files changed, 241 insertions, 40 deletions
diff --git a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj index 55e73cb6f..b0db06436 100644 --- a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj +++ b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj @@ -239,6 +239,7 @@ <Compile Include="Services\Presets\Interfaces\IPresetService.cs" />
<Compile Include="Services\Interfaces\IUserSettingService.cs" />
<Compile Include="Services\Presets\PresetService.cs" />
+ <Compile Include="Services\Queue\Model\QueueStats.cs" />
<Compile Include="Services\Queue\Model\QueueTaskContainer.cs" />
<Compile Include="Services\Queue\QueueProcessor.cs" />
<Compile Include="Services\Queue\Model\QueueItemStatus.cs" />
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs index faa05611f..84c370a37 100644 --- a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs +++ b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace HandBrakeWPF.Properties { // class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Resources {
@@ -1439,6 +1439,51 @@ namespace HandBrakeWPF.Properties { }
/// <summary>
+ /// Looks up a localized string similar to HandBrake is already encoding a file..
+ /// </summary>
+ public static string Queue_AlreadyEncoding {
+ get {
+ return ResourceManager.GetString("Queue_AlreadyEncoding", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to Please stop the current encode. If the problem persists, please restart HandBrake..
+ /// </summary>
+ public static string Queue_AlreadyEncodingSolution {
+ get {
+ return ResourceManager.GetString("Queue_AlreadyEncodingSolution", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to Unable to reset job status as it is not in an Error or Completed state.
+ /// </summary>
+ public static string Queue_UnableToResetJob {
+ get {
+ return ResourceManager.GetString("Queue_UnableToResetJob", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to Unable to restore queue file..
+ /// </summary>
+ public static string Queue_UnableToRestoreFile {
+ get {
+ return ResourceManager.GetString("Queue_UnableToRestoreFile", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to The file may be corrupted or from an older incompatible version of HandBrake.
+ /// </summary>
+ public static string Queue_UnableToRestoreFileExtended {
+ get {
+ return ResourceManager.GetString("Queue_UnableToRestoreFileExtended", resourceCulture);
+ }
+ }
+
+ /// <summary>
/// Looks up a localized string similar to WARNING: You do not have automatic file naming turned on. Please enable this in options..
/// </summary>
public static string QueueSelection_AutoNameWarning {
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.resx b/win/CS/HandBrakeWPF/Properties/Resources.resx index 61b5b139d..23b422da2 100644 --- a/win/CS/HandBrakeWPF/Properties/Resources.resx +++ b/win/CS/HandBrakeWPF/Properties/Resources.resx @@ -849,4 +849,19 @@ Remaining Time: {4}</value> <data name="Main_LowDiskspace" xml:space="preserve">
<value>Your destination directory is low on diskspace. Please free up some disk space on your destination drive. Alternatively you can change the level at which this alert triggers in Options. </value>
</data>
+ <data name="Queue_UnableToResetJob" xml:space="preserve">
+ <value>Unable to reset job status as it is not in an Error or Completed state</value>
+ </data>
+ <data name="Queue_UnableToRestoreFile" xml:space="preserve">
+ <value>Unable to restore queue file.</value>
+ </data>
+ <data name="Queue_UnableToRestoreFileExtended" xml:space="preserve">
+ <value>The file may be corrupted or from an older incompatible version of HandBrake</value>
+ </data>
+ <data name="Queue_AlreadyEncoding" xml:space="preserve">
+ <value>HandBrake is already encoding a file.</value>
+ </data>
+ <data name="Queue_AlreadyEncodingSolution" xml:space="preserve">
+ <value>Please stop the current encode. If the problem persists, please restart HandBrake.</value>
+ </data>
</root>
\ No newline at end of file diff --git a/win/CS/HandBrakeWPF/Services/Encode/EncodeBase.cs b/win/CS/HandBrakeWPF/Services/Encode/EncodeBase.cs index 8f7dee945..b822b976d 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/EncodeBase.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/EncodeBase.cs @@ -131,7 +131,7 @@ namespace HandBrakeWPF.Services.Encode /// <param name="configuration"> /// The configuration. /// </param> - public void ProcessLogs(string destination, bool isPreview, HBConfiguration configuration) + public string ProcessLogs(string destination, bool isPreview, HBConfiguration configuration) { try { @@ -162,11 +162,15 @@ namespace HandBrakeWPF.Services.Encode { this.WriteFile(logContent, Path.Combine(configuration.SaveLogCopyDirectory, encodeLogFile)); } + + return encodeLogFile; } catch (Exception exc) { Debug.WriteLine(exc); // This exception doesn't warrent user interaction, but it should be logged } + + return null; } /// <summary> diff --git a/win/CS/HandBrakeWPF/Services/Encode/EventArgs/EncodeCompletedEventArgs.cs b/win/CS/HandBrakeWPF/Services/Encode/EventArgs/EncodeCompletedEventArgs.cs index ea334705d..1f2fe3bb0 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/EventArgs/EncodeCompletedEventArgs.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/EventArgs/EncodeCompletedEventArgs.cs @@ -10,12 +10,10 @@ namespace HandBrakeWPF.Services.Encode.EventArgs { using System; - using System.Runtime.Serialization; /// <summary> /// Encode Progress Event Args /// </summary> - [DataContract] public class EncodeCompletedEventArgs : EventArgs { /// <summary> @@ -33,36 +31,50 @@ namespace HandBrakeWPF.Services.Encode.EventArgs /// <param name="filename"> /// The filename. /// </param> - public EncodeCompletedEventArgs(bool sucessful, Exception exception, string errorInformation, string filename) + /// <param name="logPath"> + /// The path and filename of the log for this encode. + /// </param> + /// <param name="finalSizeInBytes"> + /// The final size of the file in bytes. + /// </param> + public EncodeCompletedEventArgs(bool sucessful, Exception exception, string errorInformation, string filename, string logPath, long finalSizeInBytes) { this.Successful = sucessful; this.Exception = exception; this.ErrorInformation = errorInformation; this.FileName = filename; + this.ActivityLogPath = logPath; + this.FinalFilesizeInBytes = finalSizeInBytes; } /// <summary> /// Gets or sets the file name. /// </summary> - [DataMember] - public string FileName { get; set; } + public string FileName { get; private set; } /// <summary> /// Gets or sets a value indicating whether Successful. /// </summary> - [DataMember] - public bool Successful { get; set; } + public bool Successful { get; private set; } /// <summary> /// Gets or sets Exception. /// </summary> - [DataMember] - public Exception Exception { get; set; } + public Exception Exception { get; private set; } /// <summary> /// Gets or sets ErrorInformation. /// </summary> - [DataMember] - public string ErrorInformation { get; set; } + public string ErrorInformation { get; private set; } + + /// <summary> + /// + /// </summary> + public string ActivityLogPath { get; private set; } + + /// <summary> + /// Final filesize in bytes + /// </summary> + public long FinalFilesizeInBytes { get; private set; } } } diff --git a/win/CS/HandBrakeWPF/Services/Encode/LibEncode.cs b/win/CS/HandBrakeWPF/Services/Encode/LibEncode.cs index 2ad5f0688..f8bd78fb7 100644 --- a/win/CS/HandBrakeWPF/Services/Encode/LibEncode.cs +++ b/win/CS/HandBrakeWPF/Services/Encode/LibEncode.cs @@ -11,6 +11,7 @@ namespace HandBrakeWPF.Services.Encode { using System; using System.Diagnostics; + using System.IO; using HandBrake.ApplicationServices.Interop; using HandBrake.ApplicationServices.Interop.EventArgs; @@ -21,15 +22,16 @@ namespace HandBrakeWPF.Services.Encode using HandBrake.ApplicationServices.Services.Logging.Model; using HandBrakeWPF.Exceptions; + using HandBrakeWPF.Properties; using HandBrakeWPF.Services.Encode.Factories; - using EncodeTask = HandBrakeWPF.Services.Encode.Model.EncodeTask; - using IEncode = HandBrakeWPF.Services.Encode.Interfaces.IEncode; + using EncodeTask = Model.EncodeTask; + using IEncode = Interfaces.IEncode; /// <summary> /// LibHB Implementation of IEncode /// </summary> - public class LibEncode : HandBrakeWPF.Services.Encode.EncodeBase, IEncode + public class LibEncode : EncodeBase, IEncode { #region Private Variables @@ -63,7 +65,7 @@ namespace HandBrakeWPF.Services.Encode // Sanity Checking and Setup if (this.IsEncoding) { - throw new GeneralApplicationException("HandBrake is already encoding a file.", "Please stop the current encode. If the problem persists, please restart HandBrake.", null); + throw new GeneralApplicationException(Resources.Queue_AlreadyEncoding, Resources.Queue_AlreadyEncodingSolution, null); } // Setup @@ -99,7 +101,7 @@ namespace HandBrakeWPF.Services.Encode this.IsEncoding = false; this.ServiceLogMessage("Failed to start encoding ..." + Environment.NewLine + exc); - this.InvokeEncodeCompleted(new EventArgs.EncodeCompletedEventArgs(false, exc, "Unable to start encoding", task.Source)); + this.InvokeEncodeCompleted(new EventArgs.EncodeCompletedEventArgs(false, exc, "Unable to start encoding", task.Source, null, 0)); } } @@ -203,14 +205,36 @@ namespace HandBrakeWPF.Services.Encode this.ServiceLogMessage("Encode Completed ..."); // Handling Log Data - this.ProcessLogs(this.currentTask.Destination, this.isPreviewInstance, this.currentConfiguration); + string hbLog = this.ProcessLogs(this.currentTask.Destination, this.isPreviewInstance, this.currentConfiguration); + long filesize = this.GetFilesize(this.currentTask.Destination); // Raise the Encode Completed EVent. this.InvokeEncodeCompleted( e.Error - ? new EventArgs.EncodeCompletedEventArgs(false, null, string.Empty, this.currentTask.Destination) - : new EventArgs.EncodeCompletedEventArgs(true, null, string.Empty, this.currentTask.Destination)); + ? new EventArgs.EncodeCompletedEventArgs(false, null, string.Empty, this.currentTask.Destination, hbLog, filesize) + : new EventArgs.EncodeCompletedEventArgs(true, null, string.Empty, this.currentTask.Destination, hbLog, filesize)); } + + private long GetFilesize(string destination) + { + try + { + if (!string.IsNullOrEmpty(destination) && File.Exists(destination)) + { + return new FileInfo(destination).Length; + } + + return 0; + } + catch (Exception e) + { + this.ServiceLogMessage("Unable to get final filesize ..." + Environment.NewLine + e); + Debug.WriteLine(e); + } + + return 0; + } + #endregion } } diff --git a/win/CS/HandBrakeWPF/Services/Queue/Model/QueueStats.cs b/win/CS/HandBrakeWPF/Services/Queue/Model/QueueStats.cs new file mode 100644 index 000000000..857feb924 --- /dev/null +++ b/win/CS/HandBrakeWPF/Services/Queue/Model/QueueStats.cs @@ -0,0 +1,100 @@ +// -------------------------------------------------------------------------------------------------------------------- +// <copyright file="QueueStats.cs" company="HandBrake Project (http://handbrake.fr)"> +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// </copyright> +// <summary> +// A file to record stats about a queue task. +// </summary> +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrakeWPF.Services.Queue.Model +{ + using System; + + using Caliburn.Micro; + + public class QueueStats : PropertyChangedBase + { + private DateTime startTime; + + private DateTime endTime; + + private long? finalFileSize; + + public QueueStats() + { + } + + public DateTime StartTime + { + get + { + return this.startTime; + } + set + { + if (value.Equals(this.startTime)) return; + this.startTime = value; + this.NotifyOfPropertyChange(() => this.StartTime); + this.NotifyOfPropertyChange(() => this.Duration); + } + } + + public DateTime EndTime + { + get + { + return this.endTime; + } + set + { + if (value.Equals(this.endTime)) return; + this.endTime = value; + this.NotifyOfPropertyChange(() => this.EndTime); + this.NotifyOfPropertyChange(() => this.Duration); + } + } + + public TimeSpan Duration + { + get + { + // TODO, take into account Paused Duration. Requires some refactoring first. + return this.EndTime - this.StartTime; + } + } + + /// <summary> + /// Final filesize in Bytes + /// </summary> + public long? FinalFileSize + { + get + { + return this.finalFileSize; + } + set + { + if (value == this.finalFileSize) return; + this.finalFileSize = value; + this.NotifyOfPropertyChange(() => this.FinalFileSize); + this.NotifyOfPropertyChange(() => this.FinalFileSizeInMegaBytes); + } + } + + public long? FinalFileSizeInMegaBytes + { + get + { + if (this.finalFileSize.HasValue) + { + return this.finalFileSize / 1024 / 1024; + } + + return 0; + } + } + + public string CompletedActivityLogPath { get; set; } + } +} diff --git a/win/CS/HandBrakeWPF/Services/Queue/Model/QueueTask.cs b/win/CS/HandBrakeWPF/Services/Queue/Model/QueueTask.cs index be3a8a4b9..334842d31 100644 --- a/win/CS/HandBrakeWPF/Services/Queue/Model/QueueTask.cs +++ b/win/CS/HandBrakeWPF/Services/Queue/Model/QueueTask.cs @@ -35,6 +35,7 @@ namespace HandBrakeWPF.Services.Queue.Model this.Status = QueueItemStatus.Waiting;
id = id + 1;
this.Id = string.Format("{0}.{1}", GeneralUtilities.ProcessId, id);
+ this.Statistics = new QueueStats();
}
/// <summary>
@@ -58,6 +59,8 @@ namespace HandBrakeWPF.Services.Queue.Model id = id + 1;
this.Id = string.Format("{0}.{1}", GeneralUtilities.ProcessId, id);
+
+ this.Statistics = new QueueStats();
}
public string Id { get; }
@@ -94,6 +97,8 @@ namespace HandBrakeWPF.Services.Queue.Model /// </summary>
public HBConfiguration Configuration { get; set; }
+ public QueueStats Statistics { get; set; }
+
#endregion
protected bool Equals(QueueTask other)
diff --git a/win/CS/HandBrakeWPF/Services/Queue/QueueProcessor.cs b/win/CS/HandBrakeWPF/Services/Queue/QueueProcessor.cs index 2292d18a2..c7aee8131 100644 --- a/win/CS/HandBrakeWPF/Services/Queue/QueueProcessor.cs +++ b/win/CS/HandBrakeWPF/Services/Queue/QueueProcessor.cs @@ -48,7 +48,6 @@ namespace HandBrakeWPF.Services.Queue /// </summary>
private static readonly object QueueLock = new object();
private readonly IUserSettingService userSettingService;
- private readonly IErrorService errorService;
private readonly BindingList<QueueTask> queue = new BindingList<QueueTask>();
private readonly string queueFile;
private bool clearCompleted;
@@ -72,10 +71,9 @@ namespace HandBrakeWPF.Services.Queue /// <exception cref="ArgumentNullException">
/// Services are not setup
/// </exception>
- public QueueProcessor(IEncode encodeService, IUserSettingService userSettingService, IErrorService errorService)
+ public QueueProcessor(IEncode encodeService, IUserSettingService userSettingService)
{
this.userSettingService = userSettingService;
- this.errorService = errorService;
this.EncodeService = encodeService;
// If this is the first instance, just use the main queue file, otherwise add the instance id to the filename.
@@ -318,19 +316,9 @@ namespace HandBrakeWPF.Services.Queue {
if (this.queue.Count > 0)
{
- QueueTask job = this.queue.FirstOrDefault(q => q.Status == QueueItemStatus.Waiting);
- if (job != null)
- {
- job.Status = QueueItemStatus.InProgress;
- this.LastProcessedJob = job;
- this.InvokeQueueChanged(EventArgs.Empty);
- }
-
- this.BackupQueue(string.Empty);
- return job;
+ return this.queue.FirstOrDefault(q => q.Status == QueueItemStatus.Waiting);
}
- this.BackupQueue(string.Empty);
return null;
}
@@ -399,7 +387,7 @@ namespace HandBrakeWPF.Services.Queue if (job.Status != QueueItemStatus.Error && job.Status != QueueItemStatus.Completed)
{
throw new GeneralApplicationException(
- "Job Error", "Unable to reset job status as it is not in an Error or Completed state", null);
+ Resources.Error, Resources.Queue_UnableToResetJob, null);
}
job.Status = QueueItemStatus.Waiting;
@@ -437,10 +425,7 @@ namespace HandBrakeWPF.Services.Queue }
catch (Exception exc)
{
- throw new GeneralApplicationException(
- "Unable to restore queue file.",
- "The file may be corrupted or from an older incompatible version of HandBrake",
- exc);
+ throw new GeneralApplicationException(Resources.Queue_UnableToRestoreFile, Resources.Queue_UnableToRestoreFileExtended, exc);
}
if (list != null)
@@ -544,6 +529,9 @@ namespace HandBrakeWPF.Services.Queue private void EncodeServiceEncodeCompleted(object sender, EncodeCompletedEventArgs e)
{
this.LastProcessedJob.Status = QueueItemStatus.Completed;
+ this.LastProcessedJob.Statistics.EndTime = DateTime.Now;
+ this.LastProcessedJob.Statistics.CompletedActivityLogPath = e.ActivityLogPath;
+ this.LastProcessedJob.Statistics.FinalFileSize = e.FinalFilesizeInBytes;
// Clear the completed item of the queue if the setting is set.
if (this.clearCompleted)
@@ -638,10 +626,15 @@ namespace HandBrakeWPF.Services.Queue LogService.GetLogger().LogMessage(Resources.PauseOnLowDiskspace, LogMessageType.ScanOrEncode, LogLevel.Info);
job.Status = QueueItemStatus.Waiting;
this.Pause();
+ this.BackupQueue(string.Empty);
return; // Don't start the next job.
}
+ job.Status = QueueItemStatus.InProgress;
+ job.Statistics.StartTime = DateTime.Now;
+ this.LastProcessedJob = job;
this.IsProcessing = true;
+ this.InvokeQueueChanged(EventArgs.Empty);
this.InvokeJobProcessingStarted(new QueueProgressEventArgs(job));
this.EncodeService.Start(job.Task, job.Configuration);
}
@@ -653,6 +646,8 @@ namespace HandBrakeWPF.Services.Queue // Fire the event to tell connected services.
this.OnQueueCompleted(new QueueCompletedEventArgs(false));
}
+
+ this.BackupQueue(string.Empty);
}
#endregion
|