Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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();
        }
Ejemplo n.º 3
0
        /// <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();
                    }
                }
            }
        }
Ejemplo n.º 4
0
        /// <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();
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        /// <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();
                    }
                }
            }
        }
Ejemplo n.º 7
0
 /// <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();
         }
     }
 }
Ejemplo n.º 8
0
 /// <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();
         }
     }
 }
Ejemplo n.º 9
0
        /// <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));
            }
        }
Ejemplo n.º 10
0
        /// <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);
        }
Ejemplo n.º 11
0
 /// <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
     });
 }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        /// <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);
        }
Ejemplo n.º 15
0
        /// <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);
            }
        }
Ejemplo n.º 16
0
        /// <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);
        }
Ejemplo n.º 17
0
 /// <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);
Ejemplo n.º 18
0
 /// <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);
 }
Ejemplo n.º 19
0
 /// <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;
        }
Ejemplo n.º 22
0
        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;
        }
Ejemplo n.º 23
0
        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;
        }
Ejemplo n.º 24
0
 /// <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);
 }
Ejemplo n.º 25
0
 /// <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);