private bool InternalExecute()
        {
            AddOutputMessage($"Operation {Title} started");
            StartTime       = DateTime.UtcNow;
            OperationStatus = FileOperationStatus.InProgress;
            if (!(Source is MediaBase source))
            {
                return(false);
            }
            switch (Kind)
            {
            case TFileOperationKind.None:
                return(true);

            case TFileOperationKind.Ingest:
            case TFileOperationKind.Export:
                throw new InvalidOperationException("Invalid operation kind");

            case TFileOperationKind.Copy:
                if (!File.Exists(source.FullPath) || !Directory.Exists(DestDirectory.Folder))
                {
                    return(false);
                }
                try
                {
                    lock (_destMediaLock)
                    {
                        CreateDestMediaIfNotExists();
                        if (!(Dest.FileExists() &&
                              File.GetLastWriteTimeUtc(source.FullPath).Equals(File.GetLastWriteTimeUtc(Dest.FullPath)) &&
                              File.GetCreationTimeUtc(source.FullPath).Equals(File.GetCreationTimeUtc(Dest.FullPath)) &&
                              Source.FileSize.Equals(Dest.FileSize)))
                        {
                            Dest.MediaStatus = TMediaStatus.Copying;
                            IsIndeterminate  = true;
                            if (!source.CopyMediaTo(Dest, ref Aborted))
                            {
                                return(false);
                            }
                        }
                        Dest.MediaStatus = TMediaStatus.Copied;
                        ThreadPool.QueueUserWorkItem(o => Dest.Verify());
                        AddOutputMessage($"Copy operation {Title} finished");
                        return(true);
                    }
                }
                catch (Exception e)
                {
                    AddOutputMessage($"Copy operation {Title} failed with {e.Message}");
                }
                return(false);

            case TFileOperationKind.Delete:
                try
                {
                    if (Source.Delete())
                    {
                        AddOutputMessage($"Delete operation {Title} finished");
                        return(true);
                    }
                }
                catch (Exception e)
                {
                    AddOutputMessage($"Delete operation {Title} failed with {e.Message}");
                }
                return(false);

            case TFileOperationKind.Move:
                if (!File.Exists(source.FullPath) || !Directory.Exists(DestDirectory.Folder))
                {
                    return(false);
                }
                try
                {
                    CreateDestMediaIfNotExists();
                    if (Dest.FileExists())
                    {
                        if (File.GetLastWriteTimeUtc(source.FullPath).Equals(File.GetLastWriteTimeUtc(Dest.FullPath)) &&
                            File.GetCreationTimeUtc(source.FullPath).Equals(File.GetCreationTimeUtc(Dest.FullPath)) &&
                            source.FileSize.Equals(Dest.FileSize))
                        {
                            source.Delete();
                            return(true);
                        }
                        else
                        if (!Dest.Delete())
                        {
                            AddOutputMessage("Move operation failed - destination media not deleted");
                            return(false);
                        }
                    }
                    IsIndeterminate  = true;
                    Dest.MediaStatus = TMediaStatus.Copying;
                    FileUtils.CreateDirectoryIfNotExists(Path.GetDirectoryName(Dest.FullPath));
                    File.Move(source.FullPath, Dest.FullPath);
                    File.SetCreationTimeUtc(Dest.FullPath, File.GetCreationTimeUtc(source.FullPath));
                    File.SetLastWriteTimeUtc(Dest.FullPath, File.GetLastWriteTimeUtc(source.FullPath));
                    Dest.MediaStatus = TMediaStatus.Copied;
                    ThreadPool.QueueUserWorkItem(o => Dest.Verify());
                    AddOutputMessage("Move operation finished");
                    Debug.WriteLine(this, "File operation succeed");
                    return(true);
                }
                catch (Exception e)
                {
                    AddOutputMessage($"Move operation {Title} failed with {e.Message}");
                }
                return(false);

            default:
                return(false);
            }
        }