/// <summary> /// Adds the specified <paramref name="mediaObject" /> to the queue. It will be processed in a first-in, first-out /// order. If the media object is already waiting in the queue, no action is taken. /// </summary> /// <param name="mediaObject">The media object to be processed.</param> public void Add(IGalleryObject mediaObject) { lock (_sharedLock) { if (IsWaitingInQueue(mediaObject.Id)) { return; } MediaQueueDto mediaQueueDto = new MediaQueueDto { MediaQueueId = int.MinValue, FKMediaObjectId = mediaObject.Id, Status = MediaQueueItemStatus.Waiting.ToString(), StatusDetail = String.Empty, DateAdded = DateTime.Now, DateConversionStarted = null, DateConversionCompleted = null }; Factory.GetDataProvider().MediaQueue_Save(mediaQueueDto); MediaQueueItemDictionary.TryAdd(mediaQueueDto.MediaQueueId, mediaQueueDto); } }
/// <summary> /// Complete processing the current media item by updating the media queue instance and /// reseting the status of the conversion queue. /// </summary> /// <param name="settings">An instance of <see cref="MediaConversionSettings" /> containing /// settings and results used in the conversion</param> private void CompleteProcessItem(MediaConversionSettings settings) { // Update status and persist to data store MediaQueueDto mediaQueueDto = GetCurrentMediaQueueItem(); mediaQueueDto.DateConversionCompleted = DateTime.Now; if (settings.FileCreated) { mediaQueueDto.Status = MediaQueueItemStatus.Complete.ToString(); } else { mediaQueueDto.Status = MediaQueueItemStatus.Error.ToString(); string msg = String.Format(CultureInfo.CurrentCulture, "Unable to process file '{0}'.", Path.GetFileName(settings.FilePathSource)); RecordEvent(msg, settings); } Factory.GetDataProvider().MediaQueue_Save(mediaQueueDto); // Update the item in the collection. //MediaQueueItems[mediaQueueDto.MediaQueueId] = mediaQueueDto; Reset(); }
/// <summary> /// Persist the specified media queue item to the data store. The ID of the new item is assigned to /// <see cref="MediaQueueDto.MediaQueueId"/>. /// </summary> /// <param name="mediaQueue">The media queue item to persist to the data store.</param> internal static void Save(MediaQueueDto mediaQueue) { using (SqlConnection cn = SqlDataProvider.GetDbConnection()) { if (mediaQueue.MediaQueueId == int.MinValue) { using (SqlCommand cmd = GetCommandMediaQueueInsert(mediaQueue, cn)) { cn.Open(); cmd.ExecuteNonQuery(); int id = Convert.ToInt32(cmd.Parameters["@Identity"].Value, System.Globalization.NumberFormatInfo.CurrentInfo); if (mediaQueue.MediaQueueId != id) mediaQueue.MediaQueueId = id; } } else { using (SqlCommand cmd = GetCommandMediaQueueUpdate(mediaQueue, cn)) { cn.Open(); cmd.ExecuteNonQuery(); } } } }
/// <summary> /// Processes the next item in the queue. If the instance is already processing items, the /// action is cancelled. /// </summary> private void ProcessNextItemInQueue(bool useBackgroundThread) { if (Status == MediaQueueStatus.Processing) { return; } Reset(); MediaQueueDto mediaQueueDto = GetNextItemInQueue(); if (mediaQueueDto == null) { return; } // We have an item to process. Status = MediaQueueStatus.Processing; _currentMediaQueueItemId = mediaQueueDto.MediaQueueId; CancelTokenSource = new CancellationTokenSource(); if (useBackgroundThread) { Task = Task.Factory.StartNew(ProcessItem); } else { ProcessItem(); } }
public void DeleteQueueItem(int[] mediaQueueIds) { try { foreach (int mediaQueueId in mediaQueueIds) { MediaQueueDto item = MediaConversionQueue.Instance.Get(mediaQueueId); if (item == null) { continue; } IGalleryObject mo; try { mo = Factory.LoadMediaObjectInstance(item.FKMediaObjectId); } catch (InvalidMediaObjectException) { continue; } if (Utils.IsCurrentUserGalleryAdministrator(mo.GalleryId)) { MediaConversionQueue.Instance.RemoveMediaQueueItem(mediaQueueId); } } } catch (Exception ex) { AppErrorController.LogError(ex); } }
/// <summary> /// Persist the specified media queue item to the data store. The ID of the new item is assigned to /// <see cref="MediaQueueDto.MediaQueueId"/>. /// </summary> /// <param name="mediaQueue">The media queue item to persist to the data store.</param> internal static void Save(MediaQueueDto mediaQueue) { using (SqlConnection cn = SqlDataProvider.GetDbConnection()) { if (mediaQueue.MediaQueueId == int.MinValue) { using (SqlCommand cmd = GetCommandMediaQueueInsert(mediaQueue, cn)) { cn.Open(); cmd.ExecuteNonQuery(); int id = Convert.ToInt32(cmd.Parameters["@Identity"].Value, System.Globalization.NumberFormatInfo.CurrentInfo); if (mediaQueue.MediaQueueId != id) { mediaQueue.MediaQueueId = id; } } } else { using (SqlCommand cmd = GetCommandMediaQueueUpdate(mediaQueue, cn)) { cn.Open(); cmd.ExecuteNonQuery(); } } } }
/// <summary> /// Delete the media queue item from the data store. /// </summary> /// <param name="mediaQueue">The media queue item to delete from the data store.</param> internal static void Delete(MediaQueueDto mediaQueue) { using (SqlConnection cn = SqlDataProvider.GetDbConnection()) { using (SqlCommand cmd = GetCommandMediaQueueDelete(mediaQueue.MediaQueueId, cn)) { cn.Open(); cmd.ExecuteNonQuery(); } } }
/// <summary> /// Determines whether the specified media object is currently being processed by the media /// queue or is waiting in the queue. /// </summary> /// <param name="mediaObjectId">The ID of the media object.</param> /// <returns> /// Returns <c>true</c> if the media object is currently being processed by the media queue /// or is waiting in the queue; otherwise, <c>false</c>. /// </returns> public bool IsWaitingInQueueOrProcessing(int mediaObjectId) { MediaQueueDto item = GetCurrentMediaQueueItem(); if ((item != null) && item.FKMediaObjectId == mediaObjectId) { return(true); } else { return(IsWaitingInQueue(mediaObjectId)); } }
/// <summary> /// Handle the data received event. Collect the command line output and cancel if requested. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.Diagnostics.DataReceivedEventArgs"/> instance /// containing the event data.</param> private void ErrorDataReceived(object sender, DataReceivedEventArgs e) { _output.AppendLine(e.Data); MediaQueueDto item = MediaConversionQueue.Instance.GetCurrentMediaQueueItem(); if ((item != null) && (item.MediaQueueId == MediaSettings.MediaQueueId)) { item.StatusDetail = Output; // Don't save to database, as the overhead the server/DB chatter it would create is not worth it. } CancelIfRequested(sender as Process); }
/// <summary> /// Converts the <paramref name="item" /> to an instance of <see cref="MediaQueueItem" />. /// </summary> /// <param name="item">The item.</param> /// <returns>An instance of <see cref="MediaQueueItem" />.</returns> private static MediaQueueItem ToMediaQueueItem(MediaQueueDto item) { return(new MediaQueueItem { MediaQueueId = item.MediaQueueId, MediaObjectId = item.FKMediaObjectId, Status = Enum <MediaQueueItemStatus> .Parse(item.Status), StatusDetail = item.StatusDetail, ConversionType = item.ConversionType, RotationAmount = item.RotationAmount, DateAdded = item.DateAdded, DateConversionStarted = item.DateConversionStarted, DateConversionCompleted = item.DateConversionCompleted }); }
private static SqlCommand GetCommandMediaQueueUpdate(MediaQueueDto mediaQueue, SqlConnection cn) { //UPDATE [gs_MediaQueue] //SET // [FKMediaObjectId] = @FKMediaObjectId, // [Status] = @Status, // [StatusDetail] = @StatusDetail, // [DateAdded] = @DateAdded, // [DateConversionStarted] = @DateConversionStarted, // [DateConversionCompleted] = @DateConversionCompleted //WHERE MediaQueueId = @MediaQueueId SqlCommand cmd = new SqlCommand(Util.GetSqlName("gs_MediaQueueUpdate"), cn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@MediaQueueId", SqlDbType.Int).Value = mediaQueue.MediaQueueId; cmd.Parameters.Add("@FKMediaObjectId", SqlDbType.Int).Value = mediaQueue.FKMediaObjectId; cmd.Parameters.Add("@Status", SqlDbType.NVarChar, DataConstants.MediaQueueStatusLength).Value = mediaQueue.Status; cmd.Parameters.Add("StatusDetail", SqlDbType.NVarChar, DataConstants.MediaQueueStatusDetailLength).Value = mediaQueue.StatusDetail; cmd.Parameters.Add("@DateAdded", SqlDbType.DateTime).Value = mediaQueue.DateAdded; if (mediaQueue.DateConversionStarted.HasValue) { cmd.Parameters.Add("@DateConversionStarted", SqlDbType.DateTime).Value = mediaQueue.DateConversionStarted; } else { cmd.Parameters.Add("@DateConversionStarted", SqlDbType.DateTime).Value = DBNull.Value; } if (mediaQueue.DateConversionCompleted.HasValue) { cmd.Parameters.Add("@DateConversionCompleted", SqlDbType.DateTime).Value = mediaQueue.DateConversionCompleted; } else { cmd.Parameters.Add("@DateConversionCompleted", SqlDbType.DateTime).Value = DBNull.Value; } return(cmd); }
private static SqlCommand GetCommandMediaQueueInsert(MediaQueueDto mediaQueue, SqlConnection cn) { //INSERT INTO [gs_MediaQueue] // ([FKMediaObjectId],[Status],[StatusDetail],[DateAdded],[DateConversionStarted],[DateConversionCompleted]) //VALUES // (@FKMediaObjectId,@Status,@StatusDetail,@DateAdded,@DateConversionStarted,@DateConversionCompleted) SqlCommand cmd = new SqlCommand(Util.GetSqlName("gs_MediaQueueInsert"), cn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@FKMediaObjectId", SqlDbType.Int).Value = mediaQueue.FKMediaObjectId; cmd.Parameters.Add("@Status", SqlDbType.NVarChar, DataConstants.MediaQueueStatusLength).Value = mediaQueue.Status; cmd.Parameters.Add("StatusDetail", SqlDbType.NVarChar, DataConstants.MediaQueueStatusDetailLength).Value = mediaQueue.StatusDetail; cmd.Parameters.Add("@DateAdded", SqlDbType.DateTime).Value = mediaQueue.DateAdded; if (mediaQueue.DateConversionStarted.HasValue) { cmd.Parameters.Add("@DateConversionStarted", SqlDbType.DateTime).Value = mediaQueue.DateConversionStarted; } else { cmd.Parameters.Add("@DateConversionStarted", SqlDbType.DateTime).Value = DBNull.Value; } if (mediaQueue.DateConversionCompleted.HasValue) { cmd.Parameters.Add("@DateConversionCompleted", SqlDbType.DateTime).Value = mediaQueue.DateConversionCompleted; } else { cmd.Parameters.Add("@DateConversionCompleted", SqlDbType.DateTime).Value = DBNull.Value; } SqlParameter prm = new SqlParameter("@Identity", SqlDbType.Int); prm.Direction = ParameterDirection.Output; cmd.Parameters.Add(prm); return(cmd); }
/// <summary> /// Seed the output string builder with any data from a previous conversion of this /// media object and the basic settings of the conversion. /// </summary> private void InitializeOutput() { MediaQueueDto item = MediaConversionQueue.Instance.GetCurrentMediaQueueItem(); if ((item != null) && (item.MediaQueueId == MediaSettings.MediaQueueId)) { // Seed the log with the existing data; this will prevent us from losing the data // when we save the output to the media queue instance. _output.Append(item.StatusDetail); } IMediaEncoderSettings mes = MediaSettings.EncoderSetting; if (mes != null) { _output.AppendLine(String.Format("{0} => {1}; {2}", mes.SourceFileExtension, mes.DestinationFileExtension, mes.EncoderArguments)); } _output.AppendLine("Argument String:"); _output.AppendLine(MediaSettings.FFmpegArgs); }
/// <summary> /// Removes the item from the queue. If the item is currently being processed, the task /// is cancelled. /// </summary> /// <param name="mediaQueueId">The media queue ID.</param> public void RemoveMediaQueueItem(int mediaQueueId) { MediaQueueDto item; if (MediaQueueItemDictionary.TryGetValue(mediaQueueId, out item)) { MediaQueueDto currentItem = GetCurrentMediaQueueItem(); if ((currentItem != null) && (currentItem.MediaQueueId == mediaQueueId)) { CancelTokenSource.Cancel(); if (Task != null) { Task.Wait(); } } Factory.GetDataProvider().MediaQueue_Delete(item); MediaQueueItemDictionary.TryRemove(mediaQueueId, out item); } }
/// <summary> /// Begins processing the current media item, returning <c>true</c> when the action succeeds. /// Specifically, a few properties are updated and the item is persisted to the data store. /// If the item cannot be processed (may be null or has a status other than 'Waiting'), this /// function returns <c>false</c>. /// </summary> /// <returns>Returns <c>true</c> when the item has successfully started processing; otherwise /// <c>false</c>.</returns> private bool BeginProcessItem() { MediaQueueDto mediaQueueDto = GetCurrentMediaQueueItem(); if (mediaQueueDto == null) { return(false); } if (!mediaQueueDto.Status.Equals(MediaQueueItemStatus.Waiting.ToString())) { ProcessNextItemInQueue(false); return(false); } mediaQueueDto.Status = MediaQueueItemStatus.Processing.ToString(); mediaQueueDto.DateConversionStarted = DateTime.Now; Factory.GetDataProvider().MediaQueue_Save(mediaQueueDto); // Update the item in the collection. //MediaQueueItems[mediaQueueDto.MediaQueueId] = mediaQueueDto; return(true); }
/// <summary> /// Persist the specified media queue item to the data store. The ID of the new item is assigned to /// <see cref="MediaQueueDto.MediaQueueId"/>. /// </summary> /// <param name="mediaQueue">The media queue item to persist to the data store.</param> public abstract void MediaQueue_Save(MediaQueueDto mediaQueue);
/// <summary> /// Delete the media queue item from the data store. /// </summary> /// <param name="mediaQueue">The media queue item to delete from the data store.</param> public override void MediaQueue_Delete(MediaQueueDto mediaQueue) { MediaQueue.Delete(mediaQueue); }
/// <summary> /// Persist the specified media queue item to the data store. The ID of the new item is assigned to /// <see cref="MediaQueueDto.MediaQueueId"/>. /// </summary> /// <param name="mediaQueue">The media queue item to persist to the data store.</param> public override void MediaQueue_Save(MediaQueueDto mediaQueue) { MediaQueue.Save(mediaQueue); }
/// <summary> /// Delete the media queue item from the data store. /// </summary> /// <param name="mediaQueue">The media queue item to delete from the data store.</param> public override void MediaQueue_Delete(MediaQueueDto mediaQueue) { if (mediaQueue == null) throw new ArgumentNullException("mediaQueue"); using (GspContext ctx = new GspContext()) { ctx.MediaQueues.Attach(mediaQueue); ctx.MediaQueues.Remove(mediaQueue); ctx.SaveChanges(); } }
/// <summary> /// Persist the specified media queue item to the data store. The ID of the new item is assigned to /// <see cref="MediaQueueDto.MediaQueueId"/>. /// </summary> /// <param name="mediaQueue">The media queue item to persist to the data store.</param> public override void MediaQueue_Save(MediaQueueDto mediaQueue) { if (mediaQueue == null) throw new ArgumentNullException("mediaQueue"); using (GspContext ctx = new GspContext()) { if (mediaQueue.MediaQueueId == int.MinValue) { ctx.MediaQueues.Add(mediaQueue); } else { MediaQueueDto dbItem = ctx.MediaQueues.Find(mediaQueue.MediaQueueId); if (dbItem != null) { ctx.Entry(dbItem).CurrentValues.SetValues(mediaQueue); } } ctx.SaveChanges(); } // ctx.MediaQueues.Attach(mediaQueue); // ctx.Entry(mediaQueue).State = EntityState.Modified; }
private static SqlCommand GetCommandMediaQueueUpdate(MediaQueueDto mediaQueue, SqlConnection cn) { //UPDATE [gs_MediaQueue] //SET // [FKMediaObjectId] = @FKMediaObjectId, // [Status] = @Status, // [StatusDetail] = @StatusDetail, // [DateAdded] = @DateAdded, // [DateConversionStarted] = @DateConversionStarted, // [DateConversionCompleted] = @DateConversionCompleted //WHERE MediaQueueId = @MediaQueueId SqlCommand cmd = new SqlCommand(Util.GetSqlName("gs_MediaQueueUpdate"), cn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@MediaQueueId", SqlDbType.Int).Value = mediaQueue.MediaQueueId; cmd.Parameters.Add("@FKMediaObjectId", SqlDbType.Int).Value = mediaQueue.FKMediaObjectId; cmd.Parameters.Add("@Status", SqlDbType.NVarChar, DataConstants.MediaQueueStatusLength).Value = mediaQueue.Status; cmd.Parameters.Add("StatusDetail", SqlDbType.NVarChar, DataConstants.MediaQueueStatusDetailLength).Value = mediaQueue.StatusDetail; cmd.Parameters.Add("@DateAdded", SqlDbType.DateTime).Value = mediaQueue.DateAdded; if (mediaQueue.DateConversionStarted.HasValue) cmd.Parameters.Add("@DateConversionStarted", SqlDbType.DateTime).Value = mediaQueue.DateConversionStarted; else cmd.Parameters.Add("@DateConversionStarted", SqlDbType.DateTime).Value = DBNull.Value; if (mediaQueue.DateConversionCompleted.HasValue) cmd.Parameters.Add("@DateConversionCompleted", SqlDbType.DateTime).Value = mediaQueue.DateConversionCompleted; else cmd.Parameters.Add("@DateConversionCompleted", SqlDbType.DateTime).Value = DBNull.Value; return cmd; }
private static SqlCommand GetCommandMediaQueueInsert(MediaQueueDto mediaQueue, SqlConnection cn) { //INSERT INTO [gs_MediaQueue] // ([FKMediaObjectId],[Status],[StatusDetail],[DateAdded],[DateConversionStarted],[DateConversionCompleted]) //VALUES // (@FKMediaObjectId,@Status,@StatusDetail,@DateAdded,@DateConversionStarted,@DateConversionCompleted) SqlCommand cmd = new SqlCommand(Util.GetSqlName("gs_MediaQueueInsert"), cn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@FKMediaObjectId", SqlDbType.Int).Value = mediaQueue.FKMediaObjectId; cmd.Parameters.Add("@Status", SqlDbType.NVarChar, DataConstants.MediaQueueStatusLength).Value = mediaQueue.Status; cmd.Parameters.Add("StatusDetail", SqlDbType.NVarChar, DataConstants.MediaQueueStatusDetailLength).Value = mediaQueue.StatusDetail; cmd.Parameters.Add("@DateAdded", SqlDbType.DateTime).Value = mediaQueue.DateAdded; if (mediaQueue.DateConversionStarted.HasValue) cmd.Parameters.Add("@DateConversionStarted", SqlDbType.DateTime).Value = mediaQueue.DateConversionStarted; else cmd.Parameters.Add("@DateConversionStarted", SqlDbType.DateTime).Value = DBNull.Value; if (mediaQueue.DateConversionCompleted.HasValue) cmd.Parameters.Add("@DateConversionCompleted", SqlDbType.DateTime).Value = mediaQueue.DateConversionCompleted; else cmd.Parameters.Add("@DateConversionCompleted", SqlDbType.DateTime).Value = DBNull.Value; SqlParameter prm = new SqlParameter("@Identity", SqlDbType.Int); prm.Direction = ParameterDirection.Output; cmd.Parameters.Add(prm); return cmd; }
/// <summary> /// Update the status of the <paramref name="item" /> to the specified <paramref name="status" />. /// </summary> /// <param name="item">The item whose status is to be updated.</param> /// <param name="status">The status to update the item to.</param> private static void ChangeStatus(MediaQueueDto item, MediaQueueItemStatus status) { item.Status = status.ToString(); Factory.GetDataProvider().MediaQueue_Save(item); }
/// <summary> /// Delete the media queue item from the data store. /// </summary> /// <param name="mediaQueue">The media queue item to delete from the data store.</param> public abstract void MediaQueue_Delete(MediaQueueDto mediaQueue);