/// <summary>
        /// Creates and adds a new job to the pipeline queue
        /// </summary>
        /// <param name="name">Vanity name of the file</param>
        /// <param name="fileName">Unique file name for storage</param>
        /// <param name="rotate">How much to rotate the file (in degrees)</param>
        /// <param name="makeThumbs">Whether or not to create thumbnails</param>
        /// <param name="presetId">The preset used for transcoding</param>
        /// <returns>AWS create job response</returns>
        public CreateJobResponse CreateJob(string name, string fileName, string rotate, bool makeThumbs, string presetId)
        {
            // Get the preset so we know what file type is going to be created in the output
            var preset = _transcoderClient.ReadPreset(new ReadPresetRequest()
            {
                Id = presetId
            });

            var jobOutput = new CreateJobOutput()
            {
                PresetId = presetId,
                Key      = fileName.WithoutExtension() + "." + preset.Preset.Container, // set filename of the output
                Rotate   = rotate,
                // ThumbnailPattern is what aws keys on to determine whether or not to create thumbs
                ThumbnailPattern = makeThumbs ? fileName.WithoutExtension() + "-thumb-{count}" : null
            };

            var jobRequest = new CreateJobRequest()
            {
                PipelineId   = _pipelineId,
                UserMetadata = new Dictionary <string, string>()
                {
                    { "name", name }
                },                                                                  //store the original vanity file name
                Input = new JobInput()
                {
                    Key = fileName
                },
                Output = jobOutput
            };

            return(_transcoderClient.CreateJob(jobRequest));
        }
        public IRequest Marshall(CreateJobRequest createJobRequest)
        {
            IRequest request = new DefaultRequest(createJobRequest, "AmazonElasticTranscoder");
            string   target  = "EtsCustomerService.CreateJob";

            request.Headers["X-Amz-Target"] = target;

            request.Headers["Content-Type"] = "application/x-amz-json-1.0";
            request.HttpMethod = "POST";

            string uriResourcePath = "2012-09-25/jobs";

            if (uriResourcePath.Contains("?"))
            {
                int    queryPosition = uriResourcePath.IndexOf("?", StringComparison.OrdinalIgnoreCase);
                string queryString   = uriResourcePath.Substring(queryPosition + 1);
                uriResourcePath = uriResourcePath.Substring(0, queryPosition);

                foreach (string s in queryString.Split('&', ';'))
                {
                    string[] nameValuePair = s.Split('=');
                    if (nameValuePair.Length == 2 && nameValuePair[1].Length > 0)
                    {
                        request.Parameters.Add(nameValuePair[0], nameValuePair[1]);
                    }
                    else
                    {
                        request.Parameters.Add(nameValuePair[0], null);
                    }
                }
            }

            request.ResourcePath = uriResourcePath;


            using (StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture))
            {
                JsonWriter writer = new JsonWriter(stringWriter);
                writer.WriteObjectStart();

                if (createJobRequest != null && createJobRequest.IsSetPipelineId())
                {
                    writer.WritePropertyName("PipelineId");
                    writer.Write(createJobRequest.PipelineId);
                }

                if (createJobRequest != null)
                {
                    JobInput input = createJobRequest.Input;
                    if (input != null)
                    {
                        writer.WritePropertyName("Input");
                        writer.WriteObjectStart();
                        if (input != null && input.IsSetKey())
                        {
                            writer.WritePropertyName("Key");
                            writer.Write(input.Key);
                        }
                        if (input != null && input.IsSetFrameRate())
                        {
                            writer.WritePropertyName("FrameRate");
                            writer.Write(input.FrameRate);
                        }
                        if (input != null && input.IsSetResolution())
                        {
                            writer.WritePropertyName("Resolution");
                            writer.Write(input.Resolution);
                        }
                        if (input != null && input.IsSetAspectRatio())
                        {
                            writer.WritePropertyName("AspectRatio");
                            writer.Write(input.AspectRatio);
                        }
                        if (input != null && input.IsSetInterlaced())
                        {
                            writer.WritePropertyName("Interlaced");
                            writer.Write(input.Interlaced);
                        }
                        if (input != null && input.IsSetContainer())
                        {
                            writer.WritePropertyName("Container");
                            writer.Write(input.Container);
                        }
                        writer.WriteObjectEnd();
                    }
                }

                if (createJobRequest != null)
                {
                    CreateJobOutput output = createJobRequest.Output;
                    if (output != null)
                    {
                        writer.WritePropertyName("Output");
                        writer.WriteObjectStart();
                        if (output != null && output.IsSetKey())
                        {
                            writer.WritePropertyName("Key");
                            writer.Write(output.Key);
                        }
                        if (output != null && output.IsSetThumbnailPattern())
                        {
                            writer.WritePropertyName("ThumbnailPattern");
                            writer.Write(output.ThumbnailPattern);
                        }
                        if (output != null && output.IsSetRotate())
                        {
                            writer.WritePropertyName("Rotate");
                            writer.Write(output.Rotate);
                        }
                        if (output != null && output.IsSetPresetId())
                        {
                            writer.WritePropertyName("PresetId");
                            writer.Write(output.PresetId);
                        }
                        if (output != null && output.IsSetSegmentDuration())
                        {
                            writer.WritePropertyName("SegmentDuration");
                            writer.Write(output.SegmentDuration);
                        }

                        if (output != null && output.Watermarks != null && output.Watermarks.Count > 0)
                        {
                            List <JobWatermark> watermarksList = output.Watermarks;
                            writer.WritePropertyName("Watermarks");
                            writer.WriteArrayStart();

                            foreach (JobWatermark watermarksListValue in watermarksList)
                            {
                                writer.WriteObjectStart();
                                if (watermarksListValue != null && watermarksListValue.IsSetPresetWatermarkId())
                                {
                                    writer.WritePropertyName("PresetWatermarkId");
                                    writer.Write(watermarksListValue.PresetWatermarkId);
                                }
                                if (watermarksListValue != null && watermarksListValue.IsSetInputKey())
                                {
                                    writer.WritePropertyName("InputKey");
                                    writer.Write(watermarksListValue.InputKey);
                                }
                                writer.WriteObjectEnd();
                            }
                            writer.WriteArrayEnd();
                        }

                        if (output != null)
                        {
                            JobAlbumArt albumArt = output.AlbumArt;
                            if (albumArt != null)
                            {
                                writer.WritePropertyName("AlbumArt");
                                writer.WriteObjectStart();
                                if (albumArt != null && albumArt.IsSetMergePolicy())
                                {
                                    writer.WritePropertyName("MergePolicy");
                                    writer.Write(albumArt.MergePolicy);
                                }

                                if (albumArt != null && albumArt.Artwork != null && albumArt.Artwork.Count > 0)
                                {
                                    List <Artwork> artworkList = albumArt.Artwork;
                                    writer.WritePropertyName("Artwork");
                                    writer.WriteArrayStart();

                                    foreach (Artwork artworkListValue in artworkList)
                                    {
                                        writer.WriteObjectStart();
                                        if (artworkListValue != null && artworkListValue.IsSetInputKey())
                                        {
                                            writer.WritePropertyName("InputKey");
                                            writer.Write(artworkListValue.InputKey);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetMaxWidth())
                                        {
                                            writer.WritePropertyName("MaxWidth");
                                            writer.Write(artworkListValue.MaxWidth);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetMaxHeight())
                                        {
                                            writer.WritePropertyName("MaxHeight");
                                            writer.Write(artworkListValue.MaxHeight);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetSizingPolicy())
                                        {
                                            writer.WritePropertyName("SizingPolicy");
                                            writer.Write(artworkListValue.SizingPolicy);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetPaddingPolicy())
                                        {
                                            writer.WritePropertyName("PaddingPolicy");
                                            writer.Write(artworkListValue.PaddingPolicy);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetAlbumArtFormat())
                                        {
                                            writer.WritePropertyName("AlbumArtFormat");
                                            writer.Write(artworkListValue.AlbumArtFormat);
                                        }
                                        writer.WriteObjectEnd();
                                    }
                                    writer.WriteArrayEnd();
                                }
                                writer.WriteObjectEnd();
                            }
                        }

                        if (output != null && output.Composition != null && output.Composition.Count > 0)
                        {
                            List <Clip> compositionList = output.Composition;
                            writer.WritePropertyName("Composition");
                            writer.WriteArrayStart();

                            foreach (Clip compositionListValue in compositionList)
                            {
                                writer.WriteObjectStart();

                                if (compositionListValue != null)
                                {
                                    TimeSpan timeSpan = compositionListValue.TimeSpan;
                                    if (timeSpan != null)
                                    {
                                        writer.WritePropertyName("TimeSpan");
                                        writer.WriteObjectStart();
                                        if (timeSpan != null && timeSpan.IsSetStartTime())
                                        {
                                            writer.WritePropertyName("StartTime");
                                            writer.Write(timeSpan.StartTime);
                                        }
                                        if (timeSpan != null && timeSpan.IsSetDuration())
                                        {
                                            writer.WritePropertyName("Duration");
                                            writer.Write(timeSpan.Duration);
                                        }
                                        writer.WriteObjectEnd();
                                    }
                                }
                                writer.WriteObjectEnd();
                            }
                            writer.WriteArrayEnd();
                        }
                        writer.WriteObjectEnd();
                    }
                }

                if (createJobRequest != null && createJobRequest.Outputs != null && createJobRequest.Outputs.Count > 0)
                {
                    List <CreateJobOutput> outputsList = createJobRequest.Outputs;
                    writer.WritePropertyName("Outputs");
                    writer.WriteArrayStart();

                    foreach (CreateJobOutput outputsListValue in outputsList)
                    {
                        writer.WriteObjectStart();
                        if (outputsListValue != null && outputsListValue.IsSetKey())
                        {
                            writer.WritePropertyName("Key");
                            writer.Write(outputsListValue.Key);
                        }
                        if (outputsListValue != null && outputsListValue.IsSetThumbnailPattern())
                        {
                            writer.WritePropertyName("ThumbnailPattern");
                            writer.Write(outputsListValue.ThumbnailPattern);
                        }
                        if (outputsListValue != null && outputsListValue.IsSetRotate())
                        {
                            writer.WritePropertyName("Rotate");
                            writer.Write(outputsListValue.Rotate);
                        }
                        if (outputsListValue != null && outputsListValue.IsSetPresetId())
                        {
                            writer.WritePropertyName("PresetId");
                            writer.Write(outputsListValue.PresetId);
                        }
                        if (outputsListValue != null && outputsListValue.IsSetSegmentDuration())
                        {
                            writer.WritePropertyName("SegmentDuration");
                            writer.Write(outputsListValue.SegmentDuration);
                        }

                        if (outputsListValue != null && outputsListValue.Watermarks != null && outputsListValue.Watermarks.Count > 0)
                        {
                            List <JobWatermark> watermarksList = outputsListValue.Watermarks;
                            writer.WritePropertyName("Watermarks");
                            writer.WriteArrayStart();

                            foreach (JobWatermark watermarksListValue in watermarksList)
                            {
                                writer.WriteObjectStart();
                                if (watermarksListValue != null && watermarksListValue.IsSetPresetWatermarkId())
                                {
                                    writer.WritePropertyName("PresetWatermarkId");
                                    writer.Write(watermarksListValue.PresetWatermarkId);
                                }
                                if (watermarksListValue != null && watermarksListValue.IsSetInputKey())
                                {
                                    writer.WritePropertyName("InputKey");
                                    writer.Write(watermarksListValue.InputKey);
                                }
                                writer.WriteObjectEnd();
                            }
                            writer.WriteArrayEnd();
                        }

                        if (outputsListValue != null)
                        {
                            JobAlbumArt albumArt = outputsListValue.AlbumArt;
                            if (albumArt != null)
                            {
                                writer.WritePropertyName("AlbumArt");
                                writer.WriteObjectStart();
                                if (albumArt != null && albumArt.IsSetMergePolicy())
                                {
                                    writer.WritePropertyName("MergePolicy");
                                    writer.Write(albumArt.MergePolicy);
                                }

                                if (albumArt != null && albumArt.Artwork != null && albumArt.Artwork.Count > 0)
                                {
                                    List <Artwork> artworkList = albumArt.Artwork;
                                    writer.WritePropertyName("Artwork");
                                    writer.WriteArrayStart();

                                    foreach (Artwork artworkListValue in artworkList)
                                    {
                                        writer.WriteObjectStart();
                                        if (artworkListValue != null && artworkListValue.IsSetInputKey())
                                        {
                                            writer.WritePropertyName("InputKey");
                                            writer.Write(artworkListValue.InputKey);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetMaxWidth())
                                        {
                                            writer.WritePropertyName("MaxWidth");
                                            writer.Write(artworkListValue.MaxWidth);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetMaxHeight())
                                        {
                                            writer.WritePropertyName("MaxHeight");
                                            writer.Write(artworkListValue.MaxHeight);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetSizingPolicy())
                                        {
                                            writer.WritePropertyName("SizingPolicy");
                                            writer.Write(artworkListValue.SizingPolicy);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetPaddingPolicy())
                                        {
                                            writer.WritePropertyName("PaddingPolicy");
                                            writer.Write(artworkListValue.PaddingPolicy);
                                        }
                                        if (artworkListValue != null && artworkListValue.IsSetAlbumArtFormat())
                                        {
                                            writer.WritePropertyName("AlbumArtFormat");
                                            writer.Write(artworkListValue.AlbumArtFormat);
                                        }
                                        writer.WriteObjectEnd();
                                    }
                                    writer.WriteArrayEnd();
                                }
                                writer.WriteObjectEnd();
                            }
                        }

                        if (outputsListValue != null && outputsListValue.Composition != null && outputsListValue.Composition.Count > 0)
                        {
                            List <Clip> compositionList = outputsListValue.Composition;
                            writer.WritePropertyName("Composition");
                            writer.WriteArrayStart();

                            foreach (Clip compositionListValue in compositionList)
                            {
                                writer.WriteObjectStart();

                                if (compositionListValue != null)
                                {
                                    TimeSpan timeSpan = compositionListValue.TimeSpan;
                                    if (timeSpan != null)
                                    {
                                        writer.WritePropertyName("TimeSpan");
                                        writer.WriteObjectStart();
                                        if (timeSpan != null && timeSpan.IsSetStartTime())
                                        {
                                            writer.WritePropertyName("StartTime");
                                            writer.Write(timeSpan.StartTime);
                                        }
                                        if (timeSpan != null && timeSpan.IsSetDuration())
                                        {
                                            writer.WritePropertyName("Duration");
                                            writer.Write(timeSpan.Duration);
                                        }
                                        writer.WriteObjectEnd();
                                    }
                                }
                                writer.WriteObjectEnd();
                            }
                            writer.WriteArrayEnd();
                        }
                        writer.WriteObjectEnd();
                    }
                    writer.WriteArrayEnd();
                }
                if (createJobRequest != null && createJobRequest.IsSetOutputKeyPrefix())
                {
                    writer.WritePropertyName("OutputKeyPrefix");
                    writer.Write(createJobRequest.OutputKeyPrefix);
                }

                if (createJobRequest != null && createJobRequest.Playlists != null && createJobRequest.Playlists.Count > 0)
                {
                    List <CreateJobPlaylist> playlistsList = createJobRequest.Playlists;
                    writer.WritePropertyName("Playlists");
                    writer.WriteArrayStart();

                    foreach (CreateJobPlaylist playlistsListValue in playlistsList)
                    {
                        writer.WriteObjectStart();
                        if (playlistsListValue != null && playlistsListValue.IsSetName())
                        {
                            writer.WritePropertyName("Name");
                            writer.Write(playlistsListValue.Name);
                        }
                        if (playlistsListValue != null && playlistsListValue.IsSetFormat())
                        {
                            writer.WritePropertyName("Format");
                            writer.Write(playlistsListValue.Format);
                        }

                        if (playlistsListValue != null && playlistsListValue.OutputKeys != null && playlistsListValue.OutputKeys.Count > 0)
                        {
                            List <string> outputKeysList = playlistsListValue.OutputKeys;
                            writer.WritePropertyName("OutputKeys");
                            writer.WriteArrayStart();

                            foreach (string outputKeysListValue in outputKeysList)
                            {
                                writer.Write(StringUtils.FromString(outputKeysListValue));
                            }

                            writer.WriteArrayEnd();
                        }
                        writer.WriteObjectEnd();
                    }
                    writer.WriteArrayEnd();
                }

                writer.WriteObjectEnd();

                string snippet = stringWriter.ToString();
                request.Content = System.Text.Encoding.UTF8.GetBytes(snippet);
            }


            return(request);
        }
        public IRequest Marshall(CreateJobRequest createJobRequest)
        {
            IRequest request = new DefaultRequest(createJobRequest, "AmazonElasticTranscoder");
            string   target  = "EtsCustomerService.CreateJob";

            request.Headers["X-Amz-Target"] = target;
            request.Headers["Content-Type"] = "application/x-amz-json-1.0";

            request.HttpMethod = "POST";

            string uriResourcePath = "2012-09-25/jobs";

            if (uriResourcePath.Contains("?"))
            {
                string queryString = uriResourcePath.Substring(uriResourcePath.IndexOf("?") + 1);
                uriResourcePath = uriResourcePath.Substring(0, uriResourcePath.IndexOf("?"));

                foreach (string s in queryString.Split('&', ';'))
                {
                    string[] nameValuePair = s.Split('=');
                    if (nameValuePair.Length == 2 && nameValuePair[1].Length > 0)
                    {
                        request.Parameters.Add(nameValuePair[0], nameValuePair[1]);
                    }
                    else
                    {
                        request.Parameters.Add(nameValuePair[0], null);
                    }
                }
            }

            request.ResourcePath = uriResourcePath;


            using (StringWriter stringWriter = new StringWriter())
            {
                JsonWriter writer = new JsonWriter(stringWriter);
                writer.WriteObjectStart();

                if (createJobRequest != null && createJobRequest.IsSetPipelineId())
                {
                    writer.WritePropertyName("PipelineId");
                    writer.Write(createJobRequest.PipelineId);
                }

                if (createJobRequest != null)
                {
                    JobInput input = createJobRequest.Input;
                    if (input != null)
                    {
                        writer.WritePropertyName("Input");
                        writer.WriteObjectStart();
                        if (input != null && input.IsSetKey())
                        {
                            writer.WritePropertyName("Key");
                            writer.Write(input.Key);
                        }
                        if (input != null && input.IsSetFrameRate())
                        {
                            writer.WritePropertyName("FrameRate");
                            writer.Write(input.FrameRate);
                        }
                        if (input != null && input.IsSetResolution())
                        {
                            writer.WritePropertyName("Resolution");
                            writer.Write(input.Resolution);
                        }
                        if (input != null && input.IsSetAspectRatio())
                        {
                            writer.WritePropertyName("AspectRatio");
                            writer.Write(input.AspectRatio);
                        }
                        if (input != null && input.IsSetInterlaced())
                        {
                            writer.WritePropertyName("Interlaced");
                            writer.Write(input.Interlaced);
                        }
                        if (input != null && input.IsSetContainer())
                        {
                            writer.WritePropertyName("Container");
                            writer.Write(input.Container);
                        }
                        writer.WriteObjectEnd();
                    }
                }

                if (createJobRequest != null)
                {
                    CreateJobOutput output = createJobRequest.Output;
                    if (output != null)
                    {
                        writer.WritePropertyName("Output");
                        writer.WriteObjectStart();
                        if (output != null && output.IsSetKey())
                        {
                            writer.WritePropertyName("Key");
                            writer.Write(output.Key);
                        }
                        if (output != null && output.IsSetThumbnailPattern())
                        {
                            writer.WritePropertyName("ThumbnailPattern");
                            writer.Write(output.ThumbnailPattern);
                        }
                        if (output != null && output.IsSetRotate())
                        {
                            writer.WritePropertyName("Rotate");
                            writer.Write(output.Rotate);
                        }
                        if (output != null && output.IsSetPresetId())
                        {
                            writer.WritePropertyName("PresetId");
                            writer.Write(output.PresetId);
                        }
                        if (output != null && output.IsSetSegmentDuration())
                        {
                            writer.WritePropertyName("SegmentDuration");
                            writer.Write(output.SegmentDuration);
                        }
                        writer.WriteObjectEnd();
                    }
                }

                if (createJobRequest != null && createJobRequest.Outputs != null && createJobRequest.Outputs.Count > 0)
                {
                    List <CreateJobOutput> outputsList = createJobRequest.Outputs;
                    writer.WritePropertyName("Outputs");
                    writer.WriteArrayStart();

                    foreach (CreateJobOutput outputsListValue in outputsList)
                    {
                        writer.WriteObjectStart();
                        if (outputsListValue != null && outputsListValue.IsSetKey())
                        {
                            writer.WritePropertyName("Key");
                            writer.Write(outputsListValue.Key);
                        }
                        if (outputsListValue != null && outputsListValue.IsSetThumbnailPattern())
                        {
                            writer.WritePropertyName("ThumbnailPattern");
                            writer.Write(outputsListValue.ThumbnailPattern);
                        }
                        if (outputsListValue != null && outputsListValue.IsSetRotate())
                        {
                            writer.WritePropertyName("Rotate");
                            writer.Write(outputsListValue.Rotate);
                        }
                        if (outputsListValue != null && outputsListValue.IsSetPresetId())
                        {
                            writer.WritePropertyName("PresetId");
                            writer.Write(outputsListValue.PresetId);
                        }
                        if (outputsListValue != null && outputsListValue.IsSetSegmentDuration())
                        {
                            writer.WritePropertyName("SegmentDuration");
                            writer.Write(outputsListValue.SegmentDuration);
                        }
                        writer.WriteObjectEnd();
                    }
                    writer.WriteArrayEnd();
                }
                if (createJobRequest != null && createJobRequest.IsSetOutputKeyPrefix())
                {
                    writer.WritePropertyName("OutputKeyPrefix");
                    writer.Write(createJobRequest.OutputKeyPrefix);
                }

                if (createJobRequest != null && createJobRequest.Playlists != null && createJobRequest.Playlists.Count > 0)
                {
                    List <CreateJobPlaylist> playlistsList = createJobRequest.Playlists;
                    writer.WritePropertyName("Playlists");
                    writer.WriteArrayStart();

                    foreach (CreateJobPlaylist playlistsListValue in playlistsList)
                    {
                        writer.WriteObjectStart();
                        if (playlistsListValue != null && playlistsListValue.IsSetName())
                        {
                            writer.WritePropertyName("Name");
                            writer.Write(playlistsListValue.Name);
                        }
                        if (playlistsListValue != null && playlistsListValue.IsSetFormat())
                        {
                            writer.WritePropertyName("Format");
                            writer.Write(playlistsListValue.Format);
                        }

                        if (playlistsListValue != null && playlistsListValue.OutputKeys != null && playlistsListValue.OutputKeys.Count > 0)
                        {
                            List <string> outputKeysList = playlistsListValue.OutputKeys;
                            writer.WritePropertyName("OutputKeys");
                            writer.WriteArrayStart();

                            foreach (string outputKeysListValue in outputKeysList)
                            {
                                writer.Write(StringUtils.FromString(outputKeysListValue));
                            }

                            writer.WriteArrayEnd();
                        }
                        writer.WriteObjectEnd();
                    }
                    writer.WriteArrayEnd();
                }

                writer.WriteObjectEnd();

                string snippet = stringWriter.ToString();
                request.Content = System.Text.Encoding.UTF8.GetBytes(snippet);
            }


            return(request);
        }