public void UpdateStats(EncodeCompletedEventArgs e, QueueTask job) { EndTime = DateTime.Now; CompletedActivityLogPath = e.ActivityLogPath; FinalFileSizeBytes = e.FinalFilesizeInBytes; if (File.Exists(job.Task.Source)) { FileInfo file = new FileInfo(job.Task.Source); SourceFileSizeInBytes = file.Length; } EncodingSpeed = job.JobProgress.AverageFrameRate; ContentLength = this.DurationCalculation(job); SourceLength = GetSourceDuration(job); this.NotifyOfPropertyChange(() => this.EndTime); this.NotifyOfPropertyChange(() => this.CompletedActivityLogPath); this.NotifyOfPropertyChange(() => this.FileSizeDisplay); this.NotifyOfPropertyChange(() => this.EncodingSpeedDisplay); this.NotifyOfPropertyChange(() => this.ContentLength); this.NotifyOfPropertyChange(() => this.SourceLength); }
protected bool Equals(QueueTask other) { return(this.Id == other.Id); }
/// <summary> /// Encode and play a sample /// </summary> public void Play() { try { this.IsEncoding = true; if (File.Exists(this.CurrentlyPlaying)) File.Delete(this.CurrentlyPlaying); } catch (Exception) { this.IsEncoding = false; this.errorService.ShowMessageBox(Resources.StaticPreview_UnableToDeletePreview, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); } if (this.Task == null || string.IsNullOrEmpty(Task.Source)) { this.errorService.ShowMessageBox(Resources.StaticPreviewViewModel_ScanFirst, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); return; } EncodeTask encodeTask = new EncodeTask(this.Task) { PreviewEncodeDuration = this.Duration, PreviewEncodeStartAt = this.SelectedPreviewImage, PointToPointMode = PointToPointMode.Preview }; // Filename handling. if (string.IsNullOrEmpty(encodeTask.Destination)) { string filename = Path.ChangeExtension(Path.GetTempFileName(), encodeTask.OutputFormat == OutputFormat.Mkv ? "m4v" : "mkv"); encodeTask.Destination = filename; this.CurrentlyPlaying = filename; } else { string directory = Path.GetDirectoryName(encodeTask.Destination) ?? string.Empty; string filename = Path.GetFileNameWithoutExtension(encodeTask.Destination); string extension = Path.GetExtension(encodeTask.Destination); string previewFilename = string.Format("{0}_preview{1}", filename, extension); string previewFullPath = Path.Combine(directory, previewFilename); encodeTask.Destination = previewFullPath; this.CurrentlyPlaying = previewFullPath; } // Setup the encode task as a preview encode encodeTask.IsPreviewEncode = true; encodeTask.PreviewEncodeStartAt = this.SelectedPreviewImage; // TODO 0 and 1 mean the same. Need to fix this as it knocks the video out of sync with the still preview. encodeTask.PreviewEncodeDuration = this.Duration; QueueTask task = new QueueTask(encodeTask, HBConfigurationFactory.Create(), this.ScannedSource.ScanPath); ThreadPool.QueueUserWorkItem(this.CreatePreview, task); }
/// <summary> /// The equals. /// </summary> /// <param name="other"> /// The other. /// </param> /// <returns> /// The <see cref="bool"/>. /// </returns> protected bool Equals(QueueTask other) { return(Equals(this.ScannedSourcePath, other.ScannedSourcePath) && Equals(this.Task, other.Task) && this.status == other.status); }
/// <summary> /// Add the current task to the queue. /// </summary> /// <returns> /// True if added, false if error. /// </returns> public bool AddToQueue() { if (this.ScannedSource == null || string.IsNullOrEmpty(this.ScannedSource.ScanPath) || this.ScannedSource.Titles.Count == 0) { this.errorService.ShowMessageBox(Resources.Main_ScanSource, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); return false; } if (string.IsNullOrEmpty(this.CurrentTask.Destination)) { this.errorService.ShowMessageBox(Resources.Main_SetDestination, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); return false; } // Sanity check the filename if (!string.IsNullOrEmpty(this.Destination) && FileHelper.FilePathHasInvalidChars(this.Destination)) { this.errorService.ShowMessageBox(Resources.Main_InvalidDestination, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); this.NotifyOfPropertyChange(() => this.Destination); return false; } if (this.Destination == this.ScannedSource.ScanPath) { this.errorService.ShowMessageBox(Resources.Main_SourceDestinationMatchError, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); this.Destination = null; return false; } if (this.scannedSource != null && !string.IsNullOrEmpty(this.scannedSource.ScanPath) && this.Destination.ToLower() == this.scannedSource.ScanPath.ToLower()) { this.errorService.ShowMessageBox(Resources.Main_MatchingFileOverwriteWarning, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); return false; } QueueTask task = new QueueTask(new EncodeTask(this.CurrentTask), HBConfigurationFactory.Create(), this.ScannedSource.ScanPath); if (!this.queueProcessor.CheckForDestinationPathDuplicates(task.Task.Destination)) { this.queueProcessor.Add(task); } else { this.errorService.ShowMessageBox(Resources.Main_DuplicateDestinationOnQueue, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Warning); return false; } if (!this.IsEncoding) { this.ProgramStatusLabel = string.Format(Resources.Main_XEncodesPending, this.queueProcessor.Count); } return true; }
/// <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) { throw new GeneralApplicationException( "Job Error", "Unable to reset job status as it is not in an Error or Completed state", null); } job.Status = QueueItemStatus.Waiting; }
/// <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) { this.queue.Remove(job); this.InvokeQueueChanged(EventArgs.Empty); } }
/// <summary> /// Reset the job state to waiting. /// </summary> /// <param name="task"> /// The task. /// </param> public void RetryJob(QueueTask task) { task.Status = QueueItemStatus.Waiting; this.queueProcessor.BackupQueue(null); this.JobsPending = string.Format(Resources.QueueViewModel_JobsPending, this.queueProcessor.Count); }
/// <summary> /// Edit this Job /// </summary> /// <param name="task"> /// The task. /// </param> public void EditJob(QueueTask task) { MessageBoxResult result = this.errorService.ShowMessageBox( Resources.QueueViewModel_EditConfrimation, "Modify Job?", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { return; } // Remove the job if it is not already encoding. Let the user decide if they want to cancel or not. this.RemoveJob(task); // Pass a copy of the job back to the Main Screen IMainViewModel mvm = IoC.Get<IMainViewModel>(); mvm.EditQueueJob(new EncodeTask(task.Task)); }