{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Network.AWS.ElasticTranscoder.Types.Product
-- Copyright   : (c) 2013-2015 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
module Network.AWS.ElasticTranscoder.Types.Product where

import           Network.AWS.ElasticTranscoder.Types.Sum
import           Network.AWS.Prelude

-- | The file to be used as album art. There can be multiple artworks
-- associated with an audio file, to a maximum of 20.
--
-- To remove artwork or leave the artwork empty, you can either set
-- 'Artwork' to null, or set the 'Merge Policy' to \"Replace\" and use an
-- empty 'Artwork' array.
--
-- To pass through existing artwork unchanged, set the 'Merge Policy' to
-- \"Prepend\", \"Append\", or \"Fallback\", and use an empty 'Artwork'
-- array.
--
-- /See:/ 'artwork' smart constructor.
data Artwork = Artwork'
    { _aSizingPolicy   :: !(Maybe Text)
    , _aAlbumArtFormat :: !(Maybe Text)
    , _aMaxHeight      :: !(Maybe Text)
    , _aInputKey       :: !(Maybe Text)
    , _aPaddingPolicy  :: !(Maybe Text)
    , _aEncryption     :: !(Maybe Encryption)
    , _aMaxWidth       :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Artwork' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'aSizingPolicy'
--
-- * 'aAlbumArtFormat'
--
-- * 'aMaxHeight'
--
-- * 'aInputKey'
--
-- * 'aPaddingPolicy'
--
-- * 'aEncryption'
--
-- * 'aMaxWidth'
artwork
    :: Artwork
artwork =
    Artwork'
    { _aSizingPolicy = Nothing
    , _aAlbumArtFormat = Nothing
    , _aMaxHeight = Nothing
    , _aInputKey = Nothing
    , _aPaddingPolicy = Nothing
    , _aEncryption = Nothing
    , _aMaxWidth = Nothing
    }

-- | Specify one of the following values to control scaling of the output
-- album art:
--
-- -   'Fit:' Elastic Transcoder scales the output art so it matches the
--     value that you specified in either 'MaxWidth' or 'MaxHeight' without
--     exceeding the other value.
-- -   'Fill:' Elastic Transcoder scales the output art so it matches the
--     value that you specified in either 'MaxWidth' or 'MaxHeight' and
--     matches or exceeds the other value. Elastic Transcoder centers the
--     output art and then crops it in the dimension (if any) that exceeds
--     the maximum value.
-- -   'Stretch:' Elastic Transcoder stretches the output art to match the
--     values that you specified for 'MaxWidth' and 'MaxHeight'. If the
--     relative proportions of the input art and the output art are
--     different, the output art will be distorted.
-- -   'Keep:' Elastic Transcoder does not scale the output art. If either
--     dimension of the input art exceeds the values that you specified for
--     'MaxWidth' and 'MaxHeight', Elastic Transcoder crops the output art.
-- -   'ShrinkToFit:' Elastic Transcoder scales the output art down so that
--     its dimensions match the values that you specified for at least one
--     of 'MaxWidth' and 'MaxHeight' without exceeding either value. If you
--     specify this option, Elastic Transcoder does not scale the art up.
-- -   'ShrinkToFill' Elastic Transcoder scales the output art down so that
--     its dimensions match the values that you specified for at least one
--     of 'MaxWidth' and 'MaxHeight' without dropping below either value.
--     If you specify this option, Elastic Transcoder does not scale the
--     art up.
aSizingPolicy :: Lens' Artwork (Maybe Text)
aSizingPolicy = lens _aSizingPolicy (\ s a -> s{_aSizingPolicy = a});

-- | The format of album art, if any. Valid formats are '.jpg' and '.png'.
aAlbumArtFormat :: Lens' Artwork (Maybe Text)
aAlbumArtFormat = lens _aAlbumArtFormat (\ s a -> s{_aAlbumArtFormat = a});

-- | The maximum height of the output album art in pixels. If you specify
-- 'auto', Elastic Transcoder uses 600 as the default value. If you specify
-- a numeric value, enter an even integer between 32 and 3072, inclusive.
aMaxHeight :: Lens' Artwork (Maybe Text)
aMaxHeight = lens _aMaxHeight (\ s a -> s{_aMaxHeight = a});

-- | The name of the file to be used as album art. To determine which Amazon
-- S3 bucket contains the specified file, Elastic Transcoder checks the
-- pipeline specified by 'PipelineId'; the 'InputBucket' object in that
-- pipeline identifies the bucket.
--
-- If the file name includes a prefix, for example, 'cooking\/pie.jpg',
-- include the prefix in the key. If the file isn\'t in the specified
-- bucket, Elastic Transcoder returns an error.
aInputKey :: Lens' Artwork (Maybe Text)
aInputKey = lens _aInputKey (\ s a -> s{_aInputKey = a});

-- | When you set 'PaddingPolicy' to 'Pad', Elastic Transcoder may add white
-- bars to the top and bottom and\/or left and right sides of the output
-- album art to make the total size of the output art match the values that
-- you specified for 'MaxWidth' and 'MaxHeight'.
aPaddingPolicy :: Lens' Artwork (Maybe Text)
aPaddingPolicy = lens _aPaddingPolicy (\ s a -> s{_aPaddingPolicy = a});

-- | The encryption settings, if any, that you want Elastic Transcoder to
-- apply to your artwork.
aEncryption :: Lens' Artwork (Maybe Encryption)
aEncryption = lens _aEncryption (\ s a -> s{_aEncryption = a});

-- | The maximum width of the output album art in pixels. If you specify
-- 'auto', Elastic Transcoder uses 600 as the default value. If you specify
-- a numeric value, enter an even integer between 32 and 4096, inclusive.
aMaxWidth :: Lens' Artwork (Maybe Text)
aMaxWidth = lens _aMaxWidth (\ s a -> s{_aMaxWidth = a});

instance FromJSON Artwork where
        parseJSON
          = withObject "Artwork"
              (\ x ->
                 Artwork' <$>
                   (x .:? "SizingPolicy") <*> (x .:? "AlbumArtFormat")
                     <*> (x .:? "MaxHeight")
                     <*> (x .:? "InputKey")
                     <*> (x .:? "PaddingPolicy")
                     <*> (x .:? "Encryption")
                     <*> (x .:? "MaxWidth"))

instance ToJSON Artwork where
        toJSON Artwork'{..}
          = object
              (catMaybes
                 [("SizingPolicy" .=) <$> _aSizingPolicy,
                  ("AlbumArtFormat" .=) <$> _aAlbumArtFormat,
                  ("MaxHeight" .=) <$> _aMaxHeight,
                  ("InputKey" .=) <$> _aInputKey,
                  ("PaddingPolicy" .=) <$> _aPaddingPolicy,
                  ("Encryption" .=) <$> _aEncryption,
                  ("MaxWidth" .=) <$> _aMaxWidth])

-- | Options associated with your audio codec.
--
-- /See:/ 'audioCodecOptions' smart constructor.
data AudioCodecOptions = AudioCodecOptions'
    { _acoSigned   :: !(Maybe Text)
    , _acoBitDepth :: !(Maybe Text)
    , _acoProfile  :: !(Maybe Text)
    , _acoBitOrder :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'AudioCodecOptions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'acoSigned'
--
-- * 'acoBitDepth'
--
-- * 'acoProfile'
--
-- * 'acoBitOrder'
audioCodecOptions
    :: AudioCodecOptions
audioCodecOptions =
    AudioCodecOptions'
    { _acoSigned = Nothing
    , _acoBitDepth = Nothing
    , _acoProfile = Nothing
    , _acoBitOrder = Nothing
    }

-- | You can only choose whether an audio sample is signed when you specify
-- 'pcm' for the value of Audio:Codec.
--
-- Whether audio samples are represented with negative and positive numbers
-- (signed) or only positive numbers (unsigned).
--
-- The supported value is 'Signed'.
acoSigned :: Lens' AudioCodecOptions (Maybe Text)
acoSigned = lens _acoSigned (\ s a -> s{_acoSigned = a});

-- | You can only choose an audio bit depth when you specify 'flac' or 'pcm'
-- for the value of Audio:Codec.
--
-- The bit depth of a sample is how many bits of information are included
-- in the audio samples. The higher the bit depth, the better the audio,
-- but the larger the file.
--
-- Valid values are '16' and '24'.
--
-- The most common bit depth is '24'.
acoBitDepth :: Lens' AudioCodecOptions (Maybe Text)
acoBitDepth = lens _acoBitDepth (\ s a -> s{_acoBitDepth = a});

-- | You can only choose an audio profile when you specify AAC for the value
-- of Audio:Codec.
--
-- Specify the AAC profile for the output file. Elastic Transcoder supports
-- the following profiles:
--
-- -   'auto': If you specify 'auto', Elastic Transcoder will select the
--     profile based on the bit rate selected for the output file.
-- -   'AAC-LC': The most common AAC profile. Use for bit rates larger than
--     64 kbps.
-- -   'HE-AAC': Not supported on some older players and devices. Use for
--     bit rates between 40 and 80 kbps.
-- -   'HE-AACv2': Not supported on some players and devices. Use for bit
--     rates less than 48 kbps.
--
-- All outputs in a 'Smooth' playlist must have the same value for
-- 'Profile'.
--
-- If you created any presets before AAC profiles were added, Elastic
-- Transcoder automatically updated your presets to use AAC-LC. You can
-- change the value as required.
acoProfile :: Lens' AudioCodecOptions (Maybe Text)
acoProfile = lens _acoProfile (\ s a -> s{_acoProfile = a});

-- | You can only choose an audio bit order when you specify 'pcm' for the
-- value of Audio:Codec.
--
-- The order the bits of a PCM sample are stored in.
--
-- The supported value is 'LittleEndian'.
acoBitOrder :: Lens' AudioCodecOptions (Maybe Text)
acoBitOrder = lens _acoBitOrder (\ s a -> s{_acoBitOrder = a});

instance FromJSON AudioCodecOptions where
        parseJSON
          = withObject "AudioCodecOptions"
              (\ x ->
                 AudioCodecOptions' <$>
                   (x .:? "Signed") <*> (x .:? "BitDepth") <*>
                     (x .:? "Profile")
                     <*> (x .:? "BitOrder"))

instance ToJSON AudioCodecOptions where
        toJSON AudioCodecOptions'{..}
          = object
              (catMaybes
                 [("Signed" .=) <$> _acoSigned,
                  ("BitDepth" .=) <$> _acoBitDepth,
                  ("Profile" .=) <$> _acoProfile,
                  ("BitOrder" .=) <$> _acoBitOrder])

-- | Parameters required for transcoding audio.
--
-- /See:/ 'audioParameters' smart constructor.
data AudioParameters = AudioParameters'
    { _apChannels         :: !(Maybe Text)
    , _apCodec            :: !(Maybe Text)
    , _apAudioPackingMode :: !(Maybe Text)
    , _apSampleRate       :: !(Maybe Text)
    , _apBitRate          :: !(Maybe Text)
    , _apCodecOptions     :: !(Maybe AudioCodecOptions)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'AudioParameters' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'apChannels'
--
-- * 'apCodec'
--
-- * 'apAudioPackingMode'
--
-- * 'apSampleRate'
--
-- * 'apBitRate'
--
-- * 'apCodecOptions'
audioParameters
    :: AudioParameters
audioParameters =
    AudioParameters'
    { _apChannels = Nothing
    , _apCodec = Nothing
    , _apAudioPackingMode = Nothing
    , _apSampleRate = Nothing
    , _apBitRate = Nothing
    , _apCodecOptions = Nothing
    }

-- | The number of audio channels in the output file. The following values
-- are valid:
--
-- 'auto', '0', '1', '2'
--
-- One channel carries the information played by a single speaker. For
-- example, a stereo track with two channels sends one channel to the left
-- speaker, and the other channel to the right speaker. The output channels
-- are organized into tracks. If you want Elastic Transcoder to
-- automatically detect the number of audio channels in the input file and
-- use that value for the output file, select 'auto'.
--
-- The output of a specific channel value and inputs are as follows:
--
-- -   'auto' __channel specified, with any input:__ Pass through up to
--     eight input channels.
-- -   '0' __channels specified, with any input:__ Audio omitted from the
--     output.
-- -   '1' __channel specified, with at least one input channel:__ Mono
--     sound.
-- -   '2' __channels specified, with any input:__ Two identical mono
--     channels or stereo. For more information about tracks, see
--     'Audio:AudioPackingMode.'
--
-- For more information about how Elastic Transcoder organizes channels and
-- tracks, see 'Audio:AudioPackingMode'.
apChannels :: Lens' AudioParameters (Maybe Text)
apChannels = lens _apChannels (\ s a -> s{_apChannels = a});

-- | The audio codec for the output file. Valid values include 'aac', 'flac',
-- 'mp2', 'mp3', 'pcm', and 'vorbis'.
apCodec :: Lens' AudioParameters (Maybe Text)
apCodec = lens _apCodec (\ s a -> s{_apCodec = a});

-- | The method of organizing audio channels and tracks. Use 'Audio:Channels'
-- to specify the number of channels in your output, and
-- 'Audio:AudioPackingMode' to specify the number of tracks and their
-- relation to the channels. If you do not specify an
-- 'Audio:AudioPackingMode', Elastic Transcoder uses 'SingleTrack'.
--
-- The following values are valid:
--
-- 'SingleTrack', 'OneChannelPerTrack', and
-- 'OneChannelPerTrackWithMosTo8Tracks'
--
-- When you specify 'SingleTrack', Elastic Transcoder creates a single
-- track for your output. The track can have up to eight channels. Use
-- 'SingleTrack' for all non-'mxf' containers.
--
-- The outputs of 'SingleTrack' for a specific channel value and inputs are
-- as follows:
--
-- -   '0' __channels with any input:__ Audio omitted from the output
-- -   '1, 2, or auto ' __channels with no audio input:__ Audio omitted
--     from the output
-- -   '1 ' __channel with any input with audio:__ One track with one
--     channel, downmixed if necessary
-- -   '2 ' __channels with one track with one channel:__ One track with
--     two identical channels
-- -   '2 or auto ' __channels with two tracks with one channel each:__ One
--     track with two channels
-- -   '2 or auto ' __channels with one track with two channels:__ One
--     track with two channels
-- -   '2 ' __channels with one track with multiple channels:__ One track
--     with two channels
-- -   'auto ' __channels with one track with one channel:__ One track with
--     one channel
-- -   'auto ' __channels with one track with multiple channels:__ One
--     track with multiple channels
--
-- When you specify 'OneChannelPerTrack', Elastic Transcoder creates a new
-- track for every channel in your output. Your output can have up to eight
-- single-channel tracks.
--
-- The outputs of 'OneChannelPerTrack' for a specific channel value and
-- inputs are as follows:
--
-- -   '0 ' __channels with any input:__ Audio omitted from the output
-- -   '1, 2, or auto ' __channels with no audio input:__ Audio omitted
--     from the output
-- -   '1 ' __channel with any input with audio:__ One track with one
--     channel, downmixed if necessary
-- -   '2 ' __channels with one track with one channel:__ Two tracks with
--     one identical channel each
-- -   '2 or auto ' __channels with two tracks with one channel each:__ Two
--     tracks with one channel each
-- -   '2 or auto ' __channels with one track with two channels:__ Two
--     tracks with one channel each
-- -   '2 ' __channels with one track with multiple channels:__ Two tracks
--     with one channel each
-- -   'auto ' __channels with one track with one channel:__ One track with
--     one channel
-- -   'auto ' __channels with one track with multiple channels:__ Up to
--     eight tracks with one channel each
--
-- When you specify 'OneChannelPerTrackWithMosTo8Tracks', Elastic
-- Transcoder creates eight single-channel tracks for your output. All
-- tracks that do not contain audio data from an input channel are MOS, or
-- Mit Out Sound, tracks.
--
-- The outputs of 'OneChannelPerTrackWithMosTo8Tracks' for a specific
-- channel value and inputs are as follows:
--
-- -   '0 ' __channels with any input:__ Audio omitted from the output
-- -   '1, 2, or auto ' __channels with no audio input:__ Audio omitted
--     from the output
-- -   '1 ' __channel with any input with audio:__ One track with one
--     channel, downmixed if necessary, plus six MOS tracks
-- -   '2 ' __channels with one track with one channel:__ Two tracks with
--     one identical channel each, plus six MOS tracks
-- -   '2 or auto ' __channels with two tracks with one channel each:__ Two
--     tracks with one channel each, plus six MOS tracks
-- -   '2 or auto ' __channels with one track with two channels:__ Two
--     tracks with one channel each, plus six MOS tracks
-- -   '2 ' __channels with one track with multiple channels:__ Two tracks
--     with one channel each, plus six MOS tracks
-- -   'auto ' __channels with one track with one channel:__ One track with
--     one channel, plus seven MOS tracks
-- -   'auto ' __channels with one track with multiple channels:__ Up to
--     eight tracks with one channel each, plus MOS tracks until there are
--     eight tracks in all
apAudioPackingMode :: Lens' AudioParameters (Maybe Text)
apAudioPackingMode = lens _apAudioPackingMode (\ s a -> s{_apAudioPackingMode = a});

-- | The sample rate of the audio stream in the output file, in Hertz. Valid
-- values include:
--
-- 'auto', '22050', '32000', '44100', '48000', '96000'
--
-- If you specify 'auto', Elastic Transcoder automatically detects the
-- sample rate.
apSampleRate :: Lens' AudioParameters (Maybe Text)
apSampleRate = lens _apSampleRate (\ s a -> s{_apSampleRate = a});

-- | The bit rate of the audio stream in the output file, in
-- kilobits\/second. Enter an integer between 64 and 320, inclusive.
apBitRate :: Lens' AudioParameters (Maybe Text)
apBitRate = lens _apBitRate (\ s a -> s{_apBitRate = a});

-- | If you specified 'AAC' for 'Audio:Codec', this is the 'AAC' compression
-- profile to use. Valid values include:
--
-- 'auto', 'AAC-LC', 'HE-AAC', 'HE-AACv2'
--
-- If you specify 'auto', Elastic Transcoder chooses a profile based on the
-- bit rate of the output file.
apCodecOptions :: Lens' AudioParameters (Maybe AudioCodecOptions)
apCodecOptions = lens _apCodecOptions (\ s a -> s{_apCodecOptions = a});

instance FromJSON AudioParameters where
        parseJSON
          = withObject "AudioParameters"
              (\ x ->
                 AudioParameters' <$>
                   (x .:? "Channels") <*> (x .:? "Codec") <*>
                     (x .:? "AudioPackingMode")
                     <*> (x .:? "SampleRate")
                     <*> (x .:? "BitRate")
                     <*> (x .:? "CodecOptions"))

instance ToJSON AudioParameters where
        toJSON AudioParameters'{..}
          = object
              (catMaybes
                 [("Channels" .=) <$> _apChannels,
                  ("Codec" .=) <$> _apCodec,
                  ("AudioPackingMode" .=) <$> _apAudioPackingMode,
                  ("SampleRate" .=) <$> _apSampleRate,
                  ("BitRate" .=) <$> _apBitRate,
                  ("CodecOptions" .=) <$> _apCodecOptions])

-- | The file format of the output captions. If you leave this value blank,
-- Elastic Transcoder returns an error.
--
-- /See:/ 'captionFormat' smart constructor.
data CaptionFormat = CaptionFormat'
    { _cfPattern    :: !(Maybe Text)
    , _cfFormat     :: !(Maybe Text)
    , _cfEncryption :: !(Maybe Encryption)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CaptionFormat' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cfPattern'
--
-- * 'cfFormat'
--
-- * 'cfEncryption'
captionFormat
    :: CaptionFormat
captionFormat =
    CaptionFormat'
    { _cfPattern = Nothing
    , _cfFormat = Nothing
    , _cfEncryption = Nothing
    }

-- | The prefix for caption filenames, in the form
-- /description/-'{language}', where:
--
-- -   /description/ is a description of the video.
-- -   '{language}' is a literal value that Elastic Transcoder replaces
--     with the two- or three-letter code for the language of the caption
--     in the output file names.
--
-- If you don\'t include '{language}' in the file name pattern, Elastic
-- Transcoder automatically appends \"'{language}'\" to the value that you
-- specify for the description. In addition, Elastic Transcoder
-- automatically appends the count to the end of the segment files.
--
-- For example, suppose you\'re transcoding into srt format. When you enter
-- \"Sydney-{language}-sunrise\", and the language of the captions is
-- English (en), the name of the first caption file will be
-- Sydney-en-sunrise00000.srt.
cfPattern :: Lens' CaptionFormat (Maybe Text)
cfPattern = lens _cfPattern (\ s a -> s{_cfPattern = a});

-- | The format you specify determines whether Elastic Transcoder generates
-- an embedded or sidecar caption for this output.
--
-- -   __Valid Embedded Caption Formats:__
--
--     -   __for FLAC__: None
--
--     -   __For MP3__: None
--
--     -   __For MP4__: mov-text
--
--     -   __For MPEG-TS__: None
--
--     -   __For ogg__: None
--
--     -   __For webm__: None
--
-- -   __Valid Sidecar Caption Formats:__ Elastic Transcoder supports dfxp
--     (first div element only), scc, srt, and webvtt. If you want ttml or
--     smpte-tt compatible captions, specify dfxp as your output format.
--
--     -   __For FMP4__: dfxp
--
--     -   __Non-FMP4 outputs__: All sidecar types
--
--     'fmp4' captions have an extension of '.ismt'
--
cfFormat :: Lens' CaptionFormat (Maybe Text)
cfFormat = lens _cfFormat (\ s a -> s{_cfFormat = a});

-- | The encryption settings, if any, that you want Elastic Transcoder to
-- apply to your caption formats.
cfEncryption :: Lens' CaptionFormat (Maybe Encryption)
cfEncryption = lens _cfEncryption (\ s a -> s{_cfEncryption = a});

instance FromJSON CaptionFormat where
        parseJSON
          = withObject "CaptionFormat"
              (\ x ->
                 CaptionFormat' <$>
                   (x .:? "Pattern") <*> (x .:? "Format") <*>
                     (x .:? "Encryption"))

instance ToJSON CaptionFormat where
        toJSON CaptionFormat'{..}
          = object
              (catMaybes
                 [("Pattern" .=) <$> _cfPattern,
                  ("Format" .=) <$> _cfFormat,
                  ("Encryption" .=) <$> _cfEncryption])

-- | A source file for the input sidecar captions used during the transcoding
-- process.
--
-- /See:/ 'captionSource' smart constructor.
data CaptionSource = CaptionSource'
    { _csTimeOffset :: !(Maybe Text)
    , _csEncryption :: !(Maybe Encryption)
    , _csKey        :: !(Maybe Text)
    , _csLanguage   :: !(Maybe Text)
    , _csLabel      :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CaptionSource' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'csTimeOffset'
--
-- * 'csEncryption'
--
-- * 'csKey'
--
-- * 'csLanguage'
--
-- * 'csLabel'
captionSource
    :: CaptionSource
captionSource =
    CaptionSource'
    { _csTimeOffset = Nothing
    , _csEncryption = Nothing
    , _csKey = Nothing
    , _csLanguage = Nothing
    , _csLabel = Nothing
    }

-- | For clip generation or captions that do not start at the same time as
-- the associated video file, the 'TimeOffset' tells Elastic Transcoder how
-- much of the video to encode before including captions.
--
-- Specify the TimeOffset in the form [+-]SS.sss or [+-]HH:mm:SS.ss.
csTimeOffset :: Lens' CaptionSource (Maybe Text)
csTimeOffset = lens _csTimeOffset (\ s a -> s{_csTimeOffset = a});

-- | The encryption settings, if any, that you want Elastic Transcoder to
-- apply to your caption sources.
csEncryption :: Lens' CaptionSource (Maybe Encryption)
csEncryption = lens _csEncryption (\ s a -> s{_csEncryption = a});

-- | The name of the sidecar caption file that you want Elastic Transcoder to
-- include in the output file.
csKey :: Lens' CaptionSource (Maybe Text)
csKey = lens _csKey (\ s a -> s{_csKey = a});

-- | A string that specifies the language of the caption. Specify this as one
-- of:
--
-- -   2-character ISO 639-1 code
--
-- -   3-character ISO 639-2 code
--
-- For more information on ISO language codes and language names, see the
-- List of ISO 639-1 codes.
csLanguage :: Lens' CaptionSource (Maybe Text)
csLanguage = lens _csLanguage (\ s a -> s{_csLanguage = a});

-- | The label of the caption shown in the player when choosing a language.
-- We recommend that you put the caption language name here, in the
-- language of the captions.
csLabel :: Lens' CaptionSource (Maybe Text)
csLabel = lens _csLabel (\ s a -> s{_csLabel = a});

instance FromJSON CaptionSource where
        parseJSON
          = withObject "CaptionSource"
              (\ x ->
                 CaptionSource' <$>
                   (x .:? "TimeOffset") <*> (x .:? "Encryption") <*>
                     (x .:? "Key")
                     <*> (x .:? "Language")
                     <*> (x .:? "Label"))

instance ToJSON CaptionSource where
        toJSON CaptionSource'{..}
          = object
              (catMaybes
                 [("TimeOffset" .=) <$> _csTimeOffset,
                  ("Encryption" .=) <$> _csEncryption,
                  ("Key" .=) <$> _csKey,
                  ("Language" .=) <$> _csLanguage,
                  ("Label" .=) <$> _csLabel])

-- | The captions to be created, if any.
--
-- /See:/ 'captions' smart constructor.
data Captions = Captions'
    { _cMergePolicy    :: !(Maybe Text)
    , _cCaptionSources :: !(Maybe [CaptionSource])
    , _cCaptionFormats :: !(Maybe [CaptionFormat])
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Captions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cMergePolicy'
--
-- * 'cCaptionSources'
--
-- * 'cCaptionFormats'
captions
    :: Captions
captions =
    Captions'
    { _cMergePolicy = Nothing
    , _cCaptionSources = Nothing
    , _cCaptionFormats = Nothing
    }

-- | A policy that determines how Elastic Transcoder handles the existence of
-- multiple captions.
--
-- -   __MergeOverride:__ Elastic Transcoder transcodes both embedded and
--     sidecar captions into outputs. If captions for a language are
--     embedded in the input file and also appear in a sidecar file,
--     Elastic Transcoder uses the sidecar captions and ignores the
--     embedded captions for that language.
--
-- -   __MergeRetain:__ Elastic Transcoder transcodes both embedded and
--     sidecar captions into outputs. If captions for a language are
--     embedded in the input file and also appear in a sidecar file,
--     Elastic Transcoder uses the embedded captions and ignores the
--     sidecar captions for that language. If 'CaptionSources' is empty,
--     Elastic Transcoder omits all sidecar captions from the output files.
--
-- -   __Override:__ Elastic Transcoder transcodes only the sidecar
--     captions that you specify in 'CaptionSources'.
--
-- 'MergePolicy' cannot be null.
cMergePolicy :: Lens' Captions (Maybe Text)
cMergePolicy = lens _cMergePolicy (\ s a -> s{_cMergePolicy = a});

-- | Source files for the input sidecar captions used during the transcoding
-- process. To omit all sidecar captions, leave 'CaptionSources' blank.
cCaptionSources :: Lens' Captions [CaptionSource]
cCaptionSources = lens _cCaptionSources (\ s a -> s{_cCaptionSources = a}) . _Default . _Coerce;

-- | The array of file formats for the output captions. If you leave this
-- value blank, Elastic Transcoder returns an error.
cCaptionFormats :: Lens' Captions [CaptionFormat]
cCaptionFormats = lens _cCaptionFormats (\ s a -> s{_cCaptionFormats = a}) . _Default . _Coerce;

instance FromJSON Captions where
        parseJSON
          = withObject "Captions"
              (\ x ->
                 Captions' <$>
                   (x .:? "MergePolicy") <*>
                     (x .:? "CaptionSources" .!= mempty)
                     <*> (x .:? "CaptionFormats" .!= mempty))

instance ToJSON Captions where
        toJSON Captions'{..}
          = object
              (catMaybes
                 [("MergePolicy" .=) <$> _cMergePolicy,
                  ("CaptionSources" .=) <$> _cCaptionSources,
                  ("CaptionFormats" .=) <$> _cCaptionFormats])

-- | Settings for one clip in a composition. All jobs in a playlist must have
-- the same clip settings.
--
-- /See:/ 'clip' smart constructor.
newtype Clip = Clip'
    { _cTimeSpan :: Maybe TimeSpan
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Clip' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cTimeSpan'
clip
    :: Clip
clip =
    Clip'
    { _cTimeSpan = Nothing
    }

-- | Settings that determine when a clip begins and how long it lasts.
cTimeSpan :: Lens' Clip (Maybe TimeSpan)
cTimeSpan = lens _cTimeSpan (\ s a -> s{_cTimeSpan = a});

instance FromJSON Clip where
        parseJSON
          = withObject "Clip"
              (\ x -> Clip' <$> (x .:? "TimeSpan"))

instance ToJSON Clip where
        toJSON Clip'{..}
          = object (catMaybes [("TimeSpan" .=) <$> _cTimeSpan])

-- | The 'CreateJobOutput' structure.
--
-- /See:/ 'createJobOutput' smart constructor.
data CreateJobOutput = CreateJobOutput'
    { _cjoThumbnailPattern    :: !(Maybe Text)
    , _cjoCaptions            :: !(Maybe Captions)
    , _cjoPresetId            :: !(Maybe Text)
    , _cjoComposition         :: !(Maybe [Clip])
    , _cjoAlbumArt            :: !(Maybe JobAlbumArt)
    , _cjoWatermarks          :: !(Maybe [JobWatermark])
    , _cjoEncryption          :: !(Maybe Encryption)
    , _cjoKey                 :: !(Maybe Text)
    , _cjoSegmentDuration     :: !(Maybe Text)
    , _cjoThumbnailEncryption :: !(Maybe Encryption)
    , _cjoRotate              :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateJobOutput' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cjoThumbnailPattern'
--
-- * 'cjoCaptions'
--
-- * 'cjoPresetId'
--
-- * 'cjoComposition'
--
-- * 'cjoAlbumArt'
--
-- * 'cjoWatermarks'
--
-- * 'cjoEncryption'
--
-- * 'cjoKey'
--
-- * 'cjoSegmentDuration'
--
-- * 'cjoThumbnailEncryption'
--
-- * 'cjoRotate'
createJobOutput
    :: CreateJobOutput
createJobOutput =
    CreateJobOutput'
    { _cjoThumbnailPattern = Nothing
    , _cjoCaptions = Nothing
    , _cjoPresetId = Nothing
    , _cjoComposition = Nothing
    , _cjoAlbumArt = Nothing
    , _cjoWatermarks = Nothing
    , _cjoEncryption = Nothing
    , _cjoKey = Nothing
    , _cjoSegmentDuration = Nothing
    , _cjoThumbnailEncryption = Nothing
    , _cjoRotate = Nothing
    }

-- | Whether you want Elastic Transcoder to create thumbnails for your videos
-- and, if so, how you want Elastic Transcoder to name the files.
--
-- If you don\'t want Elastic Transcoder to create thumbnails, specify
-- \"\".
--
-- If you do want Elastic Transcoder to create thumbnails, specify the
-- information that you want to include in the file name for each
-- thumbnail. You can specify the following values in any sequence:
--
-- -   __'{count}' (Required)__: If you want to create thumbnails, you must
--     include '{count}' in the 'ThumbnailPattern' object. Wherever you
--     specify '{count}', Elastic Transcoder adds a five-digit sequence
--     number (beginning with __00001__) to thumbnail file names. The
--     number indicates where a given thumbnail appears in the sequence of
--     thumbnails for a transcoded file.
--
--     If you specify a literal value and\/or '{resolution}' but you omit
--     '{count}', Elastic Transcoder returns a validation error and does
--     not create the job.
--
-- -   __Literal values (Optional)__: You can specify literal values
--     anywhere in the 'ThumbnailPattern' object. For example, you can
--     include them as a file name prefix or as a delimiter between
--     '{resolution}' and '{count}'.
--
-- -   __'{resolution}' (Optional)__: If you want Elastic Transcoder to
--     include the resolution in the file name, include '{resolution}' in
--     the 'ThumbnailPattern' object.
--
-- When creating thumbnails, Elastic Transcoder automatically saves the
-- files in the format (.jpg or .png) that appears in the preset that you
-- specified in the 'PresetID' value of 'CreateJobOutput'. Elastic
-- Transcoder also appends the applicable file name extension.
cjoThumbnailPattern :: Lens' CreateJobOutput (Maybe Text)
cjoThumbnailPattern = lens _cjoThumbnailPattern (\ s a -> s{_cjoThumbnailPattern = a});

-- | You can configure Elastic Transcoder to transcode captions, or
-- subtitles, from one format to another. All captions must be in UTF-8.
-- Elastic Transcoder supports two types of captions:
--
-- -   __Embedded:__ Embedded captions are included in the same file as the
--     audio and video. Elastic Transcoder supports only one embedded
--     caption per language, to a maximum of 300 embedded captions per
--     file.
--
--     Valid input values include: 'CEA-608 (EIA-608', first non-empty
--     channel only), 'CEA-708 (EIA-708', first non-empty channel only),
--     and 'mov-text'
--
--     Valid outputs include: 'mov-text'
--
--     Elastic Transcoder supports a maximum of one embedded format per
--     output.
--
-- -   __Sidecar:__ Sidecar captions are kept in a separate metadata file
--     from the audio and video data. Sidecar captions require a player
--     that is capable of understanding the relationship between the video
--     file and the sidecar file. Elastic Transcoder supports only one
--     sidecar caption per language, to a maximum of 20 sidecar captions
--     per file.
--
--     Valid input values include: 'dfxp' (first div element only),
--     'ebu-tt', 'scc', 'smpt', 'srt', 'ttml' (first div element only), and
--     'webvtt'
--
--     Valid outputs include: 'dfxp' (first div element only), 'scc',
--     'srt', and 'webvtt'.
--
-- If you want ttml or smpte-tt compatible captions, specify dfxp as your
-- output format.
--
-- Elastic Transcoder does not support OCR (Optical Character Recognition),
-- does not accept pictures as a valid input for captions, and is not
-- available for audio-only transcoding. Elastic Transcoder does not
-- preserve text formatting (for example, italics) during the transcoding
-- process.
--
-- To remove captions or leave the captions empty, set 'Captions' to null.
-- To pass through existing captions unchanged, set the 'MergePolicy' to
-- 'MergeRetain', and pass in a null 'CaptionSources' array.
--
-- For more information on embedded files, see the Subtitles Wikipedia
-- page.
--
-- For more information on sidecar files, see the Extensible Metadata
-- Platform and Sidecar file Wikipedia pages.
cjoCaptions :: Lens' CreateJobOutput (Maybe Captions)
cjoCaptions = lens _cjoCaptions (\ s a -> s{_cjoCaptions = a});

-- | The 'Id' of the preset to use for this job. The preset determines the
-- audio, video, and thumbnail settings that Elastic Transcoder uses for
-- transcoding.
cjoPresetId :: Lens' CreateJobOutput (Maybe Text)
cjoPresetId = lens _cjoPresetId (\ s a -> s{_cjoPresetId = a});

-- | You can create an output file that contains an excerpt from the input
-- file. This excerpt, called a clip, can come from the beginning, middle,
-- or end of the file. The Composition object contains settings for the
-- clips that make up an output file. For the current release, you can only
-- specify settings for a single clip per output file. The Composition
-- object cannot be null.
cjoComposition :: Lens' CreateJobOutput [Clip]
cjoComposition = lens _cjoComposition (\ s a -> s{_cjoComposition = a}) . _Default . _Coerce;

-- | Information about the album art that you want Elastic Transcoder to add
-- to the file during transcoding. You can specify up to twenty album
-- artworks for each output. Settings for each artwork must be defined in
-- the job for the current output.
cjoAlbumArt :: Lens' CreateJobOutput (Maybe JobAlbumArt)
cjoAlbumArt = lens _cjoAlbumArt (\ s a -> s{_cjoAlbumArt = a});

-- | Information about the watermarks that you want Elastic Transcoder to add
-- to the video during transcoding. You can specify up to four watermarks
-- for each output. Settings for each watermark must be defined in the
-- preset for the current output.
cjoWatermarks :: Lens' CreateJobOutput [JobWatermark]
cjoWatermarks = lens _cjoWatermarks (\ s a -> s{_cjoWatermarks = a}) . _Default . _Coerce;

-- | You can specify encryption settings for any output files that you want
-- to use for a transcoding job. This includes the output file and any
-- watermarks, thumbnails, album art, or captions that you want to use. You
-- must specify encryption settings for each file individually.
cjoEncryption :: Lens' CreateJobOutput (Maybe Encryption)
cjoEncryption = lens _cjoEncryption (\ s a -> s{_cjoEncryption = a});

-- | The name to assign to the transcoded file. Elastic Transcoder saves the
-- file in the Amazon S3 bucket specified by the 'OutputBucket' object in
-- the pipeline that is specified by the pipeline ID. If a file with the
-- specified name already exists in the output bucket, the job fails.
cjoKey :: Lens' CreateJobOutput (Maybe Text)
cjoKey = lens _cjoKey (\ s a -> s{_cjoKey = a});

-- | (Outputs in Fragmented MP4 or MPEG-TS format only.
--
-- If you specify a preset in 'PresetId' for which the value of 'Container'
-- is 'fmp4' (Fragmented MP4) or 'ts' (MPEG-TS), 'SegmentDuration' is the
-- target maximum duration of each segment in seconds. For 'HLSv3' format
-- playlists, each media segment is stored in a separate '.ts' file. For
-- 'HLSv4' and 'Smooth' playlists, all media segments for an output are
-- stored in a single file. Each segment is approximately the length of the
-- 'SegmentDuration', though individual segments might be shorter or
-- longer.
--
-- The range of valid values is 1 to 60 seconds. If the duration of the
-- video is not evenly divisible by 'SegmentDuration', the duration of the
-- last segment is the remainder of total length\/SegmentDuration.
--
-- Elastic Transcoder creates an output-specific playlist for each output
-- 'HLS' output that you specify in OutputKeys. To add an output to the
-- master playlist for this job, include it in the 'OutputKeys' of the
-- associated playlist.
cjoSegmentDuration :: Lens' CreateJobOutput (Maybe Text)
cjoSegmentDuration = lens _cjoSegmentDuration (\ s a -> s{_cjoSegmentDuration = a});

-- | The encryption settings, if any, that you want Elastic Transcoder to
-- apply to your thumbnail.
cjoThumbnailEncryption :: Lens' CreateJobOutput (Maybe Encryption)
cjoThumbnailEncryption = lens _cjoThumbnailEncryption (\ s a -> s{_cjoThumbnailEncryption = a});

-- | The number of degrees clockwise by which you want Elastic Transcoder to
-- rotate the output relative to the input. Enter one of the following
-- values: 'auto', '0', '90', '180', '270'. The value 'auto' generally
-- works only if the file that you\'re transcoding contains rotation
-- metadata.
cjoRotate :: Lens' CreateJobOutput (Maybe Text)
cjoRotate = lens _cjoRotate (\ s a -> s{_cjoRotate = a});

instance ToJSON CreateJobOutput where
        toJSON CreateJobOutput'{..}
          = object
              (catMaybes
                 [("ThumbnailPattern" .=) <$> _cjoThumbnailPattern,
                  ("Captions" .=) <$> _cjoCaptions,
                  ("PresetId" .=) <$> _cjoPresetId,
                  ("Composition" .=) <$> _cjoComposition,
                  ("AlbumArt" .=) <$> _cjoAlbumArt,
                  ("Watermarks" .=) <$> _cjoWatermarks,
                  ("Encryption" .=) <$> _cjoEncryption,
                  ("Key" .=) <$> _cjoKey,
                  ("SegmentDuration" .=) <$> _cjoSegmentDuration,
                  ("ThumbnailEncryption" .=) <$>
                    _cjoThumbnailEncryption,
                  ("Rotate" .=) <$> _cjoRotate])

-- | Information about the master playlist.
--
-- /See:/ 'createJobPlaylist' smart constructor.
data CreateJobPlaylist = CreateJobPlaylist'
    { _cjpPlayReadyDrm         :: !(Maybe PlayReadyDrm)
    , _cjpFormat               :: !(Maybe Text)
    , _cjpOutputKeys           :: !(Maybe [Text])
    , _cjpName                 :: !(Maybe Text)
    , _cjpHlsContentProtection :: !(Maybe HlsContentProtection)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateJobPlaylist' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cjpPlayReadyDrm'
--
-- * 'cjpFormat'
--
-- * 'cjpOutputKeys'
--
-- * 'cjpName'
--
-- * 'cjpHlsContentProtection'
createJobPlaylist
    :: CreateJobPlaylist
createJobPlaylist =
    CreateJobPlaylist'
    { _cjpPlayReadyDrm = Nothing
    , _cjpFormat = Nothing
    , _cjpOutputKeys = Nothing
    , _cjpName = Nothing
    , _cjpHlsContentProtection = Nothing
    }

-- | The DRM settings, if any, that you want Elastic Transcoder to apply to
-- the output files associated with this playlist.
cjpPlayReadyDrm :: Lens' CreateJobPlaylist (Maybe PlayReadyDrm)
cjpPlayReadyDrm = lens _cjpPlayReadyDrm (\ s a -> s{_cjpPlayReadyDrm = a});

-- | The format of the output playlist. Valid formats include 'HLSv3',
-- 'HLSv4', and 'Smooth'.
cjpFormat :: Lens' CreateJobPlaylist (Maybe Text)
cjpFormat = lens _cjpFormat (\ s a -> s{_cjpFormat = a});

-- | For each output in this job that you want to include in a master
-- playlist, the value of the 'Outputs:Key' object.
--
-- -   If your output is not 'HLS' or does not have a segment duration set,
--     the name of the output file is a concatenation of 'OutputKeyPrefix'
--     and 'Outputs:Key':
--
--     OutputKeyPrefix'Outputs:Key'
--
-- -   If your output is 'HLSv3' and has a segment duration set, or is not
--     included in a playlist, Elastic Transcoder creates an output
--     playlist file with a file extension of '.m3u8', and a series of
--     '.ts' files that include a five-digit sequential counter beginning
--     with 00000:
--
--     OutputKeyPrefix'Outputs:Key'.m3u8
--
--     OutputKeyPrefix'Outputs:Key'00000.ts
--
-- -   If your output is 'HLSv4', has a segment duration set, and is
--     included in an 'HLSv4' playlist, Elastic Transcoder creates an
--     output playlist file with a file extension of '_v4.m3u8'. If the
--     output is video, Elastic Transcoder also creates an output file with
--     an extension of '_iframe.m3u8':
--
--     OutputKeyPrefix'Outputs:Key'_v4.m3u8
--
--     OutputKeyPrefix'Outputs:Key'_iframe.m3u8
--
--     OutputKeyPrefix'Outputs:Key'.ts
--
-- Elastic Transcoder automatically appends the relevant file extension to
-- the file name. If you include a file extension in Output Key, the file
-- name will have two extensions.
--
-- If you include more than one output in a playlist, any segment duration
-- settings, clip settings, or caption settings must be the same for all
-- outputs in the playlist. For 'Smooth' playlists, the 'Audio:Profile',
-- 'Video:Profile', and 'Video:FrameRate' to 'Video:KeyframesMaxDist' ratio
-- must be the same for all outputs.
cjpOutputKeys :: Lens' CreateJobPlaylist [Text]
cjpOutputKeys = lens _cjpOutputKeys (\ s a -> s{_cjpOutputKeys = a}) . _Default . _Coerce;

-- | The name that you want Elastic Transcoder to assign to the master
-- playlist, for example, nyc-vacation.m3u8. If the name includes a '\/'
-- character, the section of the name before the last '\/' must be
-- identical for all 'Name' objects. If you create more than one master
-- playlist, the values of all 'Name' objects must be unique.
--
-- __Note:__ Elastic Transcoder automatically appends the relevant file
-- extension to the file name ('.m3u8' for 'HLSv3' and 'HLSv4' playlists,
-- and '.ism' and '.ismc' for 'Smooth' playlists). If you include a file
-- extension in 'Name', the file name will have two extensions.
cjpName :: Lens' CreateJobPlaylist (Maybe Text)
cjpName = lens _cjpName (\ s a -> s{_cjpName = a});

-- | The HLS content protection settings, if any, that you want Elastic
-- Transcoder to apply to the output files associated with this playlist.
cjpHlsContentProtection :: Lens' CreateJobPlaylist (Maybe HlsContentProtection)
cjpHlsContentProtection = lens _cjpHlsContentProtection (\ s a -> s{_cjpHlsContentProtection = a});

instance ToJSON CreateJobPlaylist where
        toJSON CreateJobPlaylist'{..}
          = object
              (catMaybes
                 [("PlayReadyDrm" .=) <$> _cjpPlayReadyDrm,
                  ("Format" .=) <$> _cjpFormat,
                  ("OutputKeys" .=) <$> _cjpOutputKeys,
                  ("Name" .=) <$> _cjpName,
                  ("HlsContentProtection" .=) <$>
                    _cjpHlsContentProtection])

-- | The detected properties of the input file. Elastic Transcoder identifies
-- these values from the input file.
--
-- /See:/ 'detectedProperties' smart constructor.
data DetectedProperties = DetectedProperties'
    { _dpHeight         :: !(Maybe Int)
    , _dpFrameRate      :: !(Maybe Text)
    , _dpFileSize       :: !(Maybe Integer)
    , _dpWidth          :: !(Maybe Int)
    , _dpDurationMillis :: !(Maybe Integer)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DetectedProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dpHeight'
--
-- * 'dpFrameRate'
--
-- * 'dpFileSize'
--
-- * 'dpWidth'
--
-- * 'dpDurationMillis'
detectedProperties
    :: DetectedProperties
detectedProperties =
    DetectedProperties'
    { _dpHeight = Nothing
    , _dpFrameRate = Nothing
    , _dpFileSize = Nothing
    , _dpWidth = Nothing
    , _dpDurationMillis = Nothing
    }

-- | The detected height of the input file, in pixels.
dpHeight :: Lens' DetectedProperties (Maybe Int)
dpHeight = lens _dpHeight (\ s a -> s{_dpHeight = a});

-- | The detected frame rate of the input file, in frames per second.
dpFrameRate :: Lens' DetectedProperties (Maybe Text)
dpFrameRate = lens _dpFrameRate (\ s a -> s{_dpFrameRate = a});

-- | The detected file size of the input file, in bytes.
dpFileSize :: Lens' DetectedProperties (Maybe Integer)
dpFileSize = lens _dpFileSize (\ s a -> s{_dpFileSize = a});

-- | The detected width of the input file, in pixels.
dpWidth :: Lens' DetectedProperties (Maybe Int)
dpWidth = lens _dpWidth (\ s a -> s{_dpWidth = a});

-- | The detected duration of the input file, in milliseconds.
dpDurationMillis :: Lens' DetectedProperties (Maybe Integer)
dpDurationMillis = lens _dpDurationMillis (\ s a -> s{_dpDurationMillis = a});

instance FromJSON DetectedProperties where
        parseJSON
          = withObject "DetectedProperties"
              (\ x ->
                 DetectedProperties' <$>
                   (x .:? "Height") <*> (x .:? "FrameRate") <*>
                     (x .:? "FileSize")
                     <*> (x .:? "Width")
                     <*> (x .:? "DurationMillis"))

instance ToJSON DetectedProperties where
        toJSON DetectedProperties'{..}
          = object
              (catMaybes
                 [("Height" .=) <$> _dpHeight,
                  ("FrameRate" .=) <$> _dpFrameRate,
                  ("FileSize" .=) <$> _dpFileSize,
                  ("Width" .=) <$> _dpWidth,
                  ("DurationMillis" .=) <$> _dpDurationMillis])

-- | The encryption settings, if any, that are used for decrypting your input
-- files or encrypting your output files. If your input file is encrypted,
-- you must specify the mode that Elastic Transcoder will use to decrypt
-- your file, otherwise you must specify the mode you want Elastic
-- Transcoder to use to encrypt your output files.
--
-- /See:/ 'encryption' smart constructor.
data Encryption = Encryption'
    { _eMode                 :: !(Maybe Text)
    , _eKeyMD5               :: !(Maybe Text)
    , _eKey                  :: !(Maybe Text)
    , _eInitializationVector :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Encryption' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eMode'
--
-- * 'eKeyMD5'
--
-- * 'eKey'
--
-- * 'eInitializationVector'
encryption
    :: Encryption
encryption =
    Encryption'
    { _eMode = Nothing
    , _eKeyMD5 = Nothing
    , _eKey = Nothing
    , _eInitializationVector = Nothing
    }

-- | The specific server-side encryption mode that you want Elastic
-- Transcoder to use when decrypting your input files or encrypting your
-- output files. Elastic Transcoder supports the following options:
--
-- -   __S3:__ Amazon S3 creates and manages the keys used for encrypting
--     your files.
--
-- -   __S3-AWS-KMS:__ Amazon S3 calls the Amazon Key Management Service,
--     which creates and manages the keys that are used for encrypting your
--     files. If you specify 'S3-AWS-KMS' and you don\'t want to use the
--     default key, you must add the AWS-KMS key that you want to use to
--     your pipeline.
--
-- -   __AES-CBC-PKCS7:__ A padded cipher-block mode of operation
--     originally used for HLS files.
--
-- -   __AES-CTR:__ AES Counter Mode.
--
-- -   __AES-GCM:__ AES Galois Counter Mode, a mode of operation that is an
--     authenticated encryption format, meaning that a file, key, or
--     initialization vector that has been tampered with will fail the
--     decryption process.
--
-- For all three AES options, you must provide the following settings,
-- which must be base64-encoded:
--
-- -   __Key__
--
-- -   __Key MD5__
--
-- -   __Initialization Vector__
--
-- For the AES modes, your private encryption keys and your unencrypted
-- data are never stored by AWS; therefore, it is important that you safely
-- manage your encryption keys. If you lose them, you won\'t be able to
-- unencrypt your data.
eMode :: Lens' Encryption (Maybe Text)
eMode = lens _eMode (\ s a -> s{_eMode = a});

-- | The MD5 digest of the key that you used to encrypt your input file, or
-- that you want Elastic Transcoder to use to encrypt your output file.
-- Elastic Transcoder uses the key digest as a checksum to make sure your
-- key was not corrupted in transit. The key MD5 must be base64-encoded,
-- and it must be exactly 16 bytes long before being base64-encoded.
eKeyMD5 :: Lens' Encryption (Maybe Text)
eKeyMD5 = lens _eKeyMD5 (\ s a -> s{_eKeyMD5 = a});

-- | The data encryption key that you want Elastic Transcoder to use to
-- encrypt your output file, or that was used to encrypt your input file.
-- The key must be base64-encoded and it must be one of the following bit
-- lengths before being base64-encoded:
--
-- '128', '192', or '256'.
--
-- The key must also be encrypted by using the Amazon Key Management
-- Service.
eKey :: Lens' Encryption (Maybe Text)
eKey = lens _eKey (\ s a -> s{_eKey = a});

-- | The series of random bits created by a random bit generator, unique for
-- every encryption operation, that you used to encrypt your input files or
-- that you want Elastic Transcoder to use to encrypt your output files.
-- The initialization vector must be base64-encoded, and it must be exactly
-- 16 bytes long before being base64-encoded.
eInitializationVector :: Lens' Encryption (Maybe Text)
eInitializationVector = lens _eInitializationVector (\ s a -> s{_eInitializationVector = a});

instance FromJSON Encryption where
        parseJSON
          = withObject "Encryption"
              (\ x ->
                 Encryption' <$>
                   (x .:? "Mode") <*> (x .:? "KeyMd5") <*> (x .:? "Key")
                     <*> (x .:? "InitializationVector"))

instance ToJSON Encryption where
        toJSON Encryption'{..}
          = object
              (catMaybes
                 [("Mode" .=) <$> _eMode, ("KeyMd5" .=) <$> _eKeyMD5,
                  ("Key" .=) <$> _eKey,
                  ("InitializationVector" .=) <$>
                    _eInitializationVector])

-- | The HLS content protection settings, if any, that you want Elastic
-- Transcoder to apply to your output files.
--
-- /See:/ 'hlsContentProtection' smart constructor.
data HlsContentProtection = HlsContentProtection'
    { _hcpKeyMD5                :: !(Maybe Text)
    , _hcpKeyStoragePolicy      :: !(Maybe Text)
    , _hcpKey                   :: !(Maybe Text)
    , _hcpMethod                :: !(Maybe Text)
    , _hcpInitializationVector  :: !(Maybe Text)
    , _hcpLicenseAcquisitionURL :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'HlsContentProtection' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'hcpKeyMD5'
--
-- * 'hcpKeyStoragePolicy'
--
-- * 'hcpKey'
--
-- * 'hcpMethod'
--
-- * 'hcpInitializationVector'
--
-- * 'hcpLicenseAcquisitionURL'
hlsContentProtection
    :: HlsContentProtection
hlsContentProtection =
    HlsContentProtection'
    { _hcpKeyMD5 = Nothing
    , _hcpKeyStoragePolicy = Nothing
    , _hcpKey = Nothing
    , _hcpMethod = Nothing
    , _hcpInitializationVector = Nothing
    , _hcpLicenseAcquisitionURL = Nothing
    }

-- | If Elastic Transcoder is generating your key for you, you must leave
-- this field blank.
--
-- The MD5 digest of the key that you want Elastic Transcoder to use to
-- encrypt your output file, and that you want Elastic Transcoder to use as
-- a checksum to make sure your key was not corrupted in transit. The key
-- MD5 must be base64-encoded, and it must be exactly 16 bytes before being
-- base64- encoded.
hcpKeyMD5 :: Lens' HlsContentProtection (Maybe Text)
hcpKeyMD5 = lens _hcpKeyMD5 (\ s a -> s{_hcpKeyMD5 = a});

-- | Specify whether you want Elastic Transcoder to write your HLS license
-- key to an Amazon S3 bucket. If you choose 'WithVariantPlaylists',
-- 'LicenseAcquisitionUrl' must be left blank and Elastic Transcoder writes
-- your data key into the same bucket as the associated playlist.
hcpKeyStoragePolicy :: Lens' HlsContentProtection (Maybe Text)
hcpKeyStoragePolicy = lens _hcpKeyStoragePolicy (\ s a -> s{_hcpKeyStoragePolicy = a});

-- | If you want Elastic Transcoder to generate a key for you, leave this
-- field blank.
--
-- If you choose to supply your own key, you must encrypt the key by using
-- AWS KMS. The key must be base64-encoded, and it must be one of the
-- following bit lengths before being base64-encoded:
--
-- '128', '192', or '256'.
hcpKey :: Lens' HlsContentProtection (Maybe Text)
hcpKey = lens _hcpKey (\ s a -> s{_hcpKey = a});

-- | The content protection method for your output. The only valid value is:
-- 'aes-128'.
--
-- This value will be written into the method attribute of the 'EXT-X-KEY'
-- metadata tag in the output playlist.
hcpMethod :: Lens' HlsContentProtection (Maybe Text)
hcpMethod = lens _hcpMethod (\ s a -> s{_hcpMethod = a});

-- | If Elastic Transcoder is generating your key for you, you must leave
-- this field blank.
--
-- The series of random bits created by a random bit generator, unique for
-- every encryption operation, that you want Elastic Transcoder to use to
-- encrypt your output files. The initialization vector must be
-- base64-encoded, and it must be exactly 16 bytes before being
-- base64-encoded.
hcpInitializationVector :: Lens' HlsContentProtection (Maybe Text)
hcpInitializationVector = lens _hcpInitializationVector (\ s a -> s{_hcpInitializationVector = a});

-- | The location of the license key required to decrypt your HLS playlist.
-- The URL must be an absolute path, and is referenced in the URI attribute
-- of the EXT-X-KEY metadata tag in the playlist file.
hcpLicenseAcquisitionURL :: Lens' HlsContentProtection (Maybe Text)
hcpLicenseAcquisitionURL = lens _hcpLicenseAcquisitionURL (\ s a -> s{_hcpLicenseAcquisitionURL = a});

instance FromJSON HlsContentProtection where
        parseJSON
          = withObject "HlsContentProtection"
              (\ x ->
                 HlsContentProtection' <$>
                   (x .:? "KeyMd5") <*> (x .:? "KeyStoragePolicy") <*>
                     (x .:? "Key")
                     <*> (x .:? "Method")
                     <*> (x .:? "InitializationVector")
                     <*> (x .:? "LicenseAcquisitionUrl"))

instance ToJSON HlsContentProtection where
        toJSON HlsContentProtection'{..}
          = object
              (catMaybes
                 [("KeyMd5" .=) <$> _hcpKeyMD5,
                  ("KeyStoragePolicy" .=) <$> _hcpKeyStoragePolicy,
                  ("Key" .=) <$> _hcpKey, ("Method" .=) <$> _hcpMethod,
                  ("InitializationVector" .=) <$>
                    _hcpInitializationVector,
                  ("LicenseAcquisitionUrl" .=) <$>
                    _hcpLicenseAcquisitionURL])

-- | A section of the response body that provides information about the job
-- that is created.
--
-- /See:/ 'job'' smart constructor.
data Job' = Job''
    { _jStatus          :: !(Maybe Text)
    , _jPipelineId      :: !(Maybe Text)
    , _jARN             :: !(Maybe Text)
    , _jInput           :: !(Maybe JobInput)
    , _jUserMetadata    :: !(Maybe (Map Text Text))
    , _jOutputs         :: !(Maybe [JobOutput])
    , _jOutput          :: !(Maybe JobOutput)
    , _jId              :: !(Maybe Text)
    , _jPlaylists       :: !(Maybe [Playlist])
    , _jOutputKeyPrefix :: !(Maybe Text)
    , _jTiming          :: !(Maybe Timing)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Job'' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jStatus'
--
-- * 'jPipelineId'
--
-- * 'jARN'
--
-- * 'jInput'
--
-- * 'jUserMetadata'
--
-- * 'jOutputs'
--
-- * 'jOutput'
--
-- * 'jId'
--
-- * 'jPlaylists'
--
-- * 'jOutputKeyPrefix'
--
-- * 'jTiming'
job'
    :: Job'
job' =
    Job''
    { _jStatus = Nothing
    , _jPipelineId = Nothing
    , _jARN = Nothing
    , _jInput = Nothing
    , _jUserMetadata = Nothing
    , _jOutputs = Nothing
    , _jOutput = Nothing
    , _jId = Nothing
    , _jPlaylists = Nothing
    , _jOutputKeyPrefix = Nothing
    , _jTiming = Nothing
    }

-- | The status of the job: 'Submitted', 'Progressing', 'Complete',
-- 'Canceled', or 'Error'.
jStatus :: Lens' Job' (Maybe Text)
jStatus = lens _jStatus (\ s a -> s{_jStatus = a});

-- | The 'Id' of the pipeline that you want Elastic Transcoder to use for
-- transcoding. The pipeline determines several settings, including the
-- Amazon S3 bucket from which Elastic Transcoder gets the files to
-- transcode and the bucket into which Elastic Transcoder puts the
-- transcoded files.
jPipelineId :: Lens' Job' (Maybe Text)
jPipelineId = lens _jPipelineId (\ s a -> s{_jPipelineId = a});

-- | The Amazon Resource Name (ARN) for the job.
jARN :: Lens' Job' (Maybe Text)
jARN = lens _jARN (\ s a -> s{_jARN = a});

-- | A section of the request or response body that provides information
-- about the file that is being transcoded.
jInput :: Lens' Job' (Maybe JobInput)
jInput = lens _jInput (\ s a -> s{_jInput = a});

-- | User-defined metadata that you want to associate with an Elastic
-- Transcoder job. You specify metadata in 'key\/value' pairs, and you can
-- add up to 10 'key\/value' pairs per job. Elastic Transcoder does not
-- guarantee that 'key\/value' pairs will be returned in the same order in
-- which you specify them.
--
-- Metadata 'keys' and 'values' must use characters from the following
-- list:
--
-- -   '0-9'
--
-- -   'A-Z' and 'a-z'
--
-- -   'Space'
--
-- -   The following symbols: '_.:\/=+-%\''
--
jUserMetadata :: Lens' Job' (HashMap Text Text)
jUserMetadata = lens _jUserMetadata (\ s a -> s{_jUserMetadata = a}) . _Default . _Map;

-- | Information about the output files. We recommend that you use the
-- 'Outputs' syntax for all jobs, even when you want Elastic Transcoder to
-- transcode a file into only one format. Do not use both the 'Outputs' and
-- 'Output' syntaxes in the same request. You can create a maximum of 30
-- outputs per job.
--
-- If you specify more than one output for a job, Elastic Transcoder
-- creates the files for each output in the order in which you specify them
-- in the job.
jOutputs :: Lens' Job' [JobOutput]
jOutputs = lens _jOutputs (\ s a -> s{_jOutputs = a}) . _Default . _Coerce;

-- | If you specified one output for a job, information about that output. If
-- you specified multiple outputs for a job, the Output object lists
-- information about the first output. This duplicates the information that
-- is listed for the first output in the Outputs object.
--
-- Outputs recommended instead.
--
-- A section of the request or response body that provides information
-- about the transcoded (target) file.
jOutput :: Lens' Job' (Maybe JobOutput)
jOutput = lens _jOutput (\ s a -> s{_jOutput = a});

-- | The identifier that Elastic Transcoder assigned to the job. You use this
-- value to get settings for the job or to delete the job.
jId :: Lens' Job' (Maybe Text)
jId = lens _jId (\ s a -> s{_jId = a});

-- | Outputs in Fragmented MP4 or MPEG-TS format only.
--
-- If you specify a preset in 'PresetId' for which the value of 'Container'
-- is fmp4 (Fragmented MP4) or ts (MPEG-TS), 'Playlists' contains
-- information about the master playlists that you want Elastic Transcoder
-- to create.
--
-- The maximum number of master playlists in a job is 30.
jPlaylists :: Lens' Job' [Playlist]
jPlaylists = lens _jPlaylists (\ s a -> s{_jPlaylists = a}) . _Default . _Coerce;

-- | The value, if any, that you want Elastic Transcoder to prepend to the
-- names of all files that this job creates, including output files,
-- thumbnails, and playlists. We recommend that you add a \/ or some other
-- delimiter to the end of the 'OutputKeyPrefix'.
jOutputKeyPrefix :: Lens' Job' (Maybe Text)
jOutputKeyPrefix = lens _jOutputKeyPrefix (\ s a -> s{_jOutputKeyPrefix = a});

-- | Details about the timing of a job.
jTiming :: Lens' Job' (Maybe Timing)
jTiming = lens _jTiming (\ s a -> s{_jTiming = a});

instance FromJSON Job' where
        parseJSON
          = withObject "Job'"
              (\ x ->
                 Job'' <$>
                   (x .:? "Status") <*> (x .:? "PipelineId") <*>
                     (x .:? "Arn")
                     <*> (x .:? "Input")
                     <*> (x .:? "UserMetadata" .!= mempty)
                     <*> (x .:? "Outputs" .!= mempty)
                     <*> (x .:? "Output")
                     <*> (x .:? "Id")
                     <*> (x .:? "Playlists" .!= mempty)
                     <*> (x .:? "OutputKeyPrefix")
                     <*> (x .:? "Timing"))

-- | The .jpg or .png file associated with an audio file.
--
-- /See:/ 'jobAlbumArt' smart constructor.
data JobAlbumArt = JobAlbumArt'
    { _jaaMergePolicy :: !(Maybe Text)
    , _jaaArtwork     :: !(Maybe [Artwork])
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobAlbumArt' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jaaMergePolicy'
--
-- * 'jaaArtwork'
jobAlbumArt
    :: JobAlbumArt
jobAlbumArt =
    JobAlbumArt'
    { _jaaMergePolicy = Nothing
    , _jaaArtwork = Nothing
    }

-- | A policy that determines how Elastic Transcoder will handle the
-- existence of multiple album artwork files.
--
-- -   'Replace:' The specified album art will replace any existing album
--     art.
-- -   'Prepend:' The specified album art will be placed in front of any
--     existing album art.
-- -   'Append:' The specified album art will be placed after any existing
--     album art.
-- -   'Fallback:' If the original input file contains artwork, Elastic
--     Transcoder will use that artwork for the output. If the original
--     input does not contain artwork, Elastic Transcoder will use the
--     specified album art file.
jaaMergePolicy :: Lens' JobAlbumArt (Maybe Text)
jaaMergePolicy = lens _jaaMergePolicy (\ s a -> s{_jaaMergePolicy = a});

-- | The file to be used as album art. There can be multiple artworks
-- associated with an audio file, to a maximum of 20. Valid formats are
-- '.jpg' and '.png'
jaaArtwork :: Lens' JobAlbumArt [Artwork]
jaaArtwork = lens _jaaArtwork (\ s a -> s{_jaaArtwork = a}) . _Default . _Coerce;

instance FromJSON JobAlbumArt where
        parseJSON
          = withObject "JobAlbumArt"
              (\ x ->
                 JobAlbumArt' <$>
                   (x .:? "MergePolicy") <*>
                     (x .:? "Artwork" .!= mempty))

instance ToJSON JobAlbumArt where
        toJSON JobAlbumArt'{..}
          = object
              (catMaybes
                 [("MergePolicy" .=) <$> _jaaMergePolicy,
                  ("Artwork" .=) <$> _jaaArtwork])

-- | Information about the file that you\'re transcoding.
--
-- /See:/ 'jobInput' smart constructor.
data JobInput = JobInput'
    { _jiFrameRate          :: !(Maybe Text)
    , _jiResolution         :: !(Maybe Text)
    , _jiAspectRatio        :: !(Maybe Text)
    , _jiEncryption         :: !(Maybe Encryption)
    , _jiKey                :: !(Maybe Text)
    , _jiDetectedProperties :: !(Maybe DetectedProperties)
    , _jiContainer          :: !(Maybe Text)
    , _jiInterlaced         :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobInput' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jiFrameRate'
--
-- * 'jiResolution'
--
-- * 'jiAspectRatio'
--
-- * 'jiEncryption'
--
-- * 'jiKey'
--
-- * 'jiDetectedProperties'
--
-- * 'jiContainer'
--
-- * 'jiInterlaced'
jobInput
    :: JobInput
jobInput =
    JobInput'
    { _jiFrameRate = Nothing
    , _jiResolution = Nothing
    , _jiAspectRatio = Nothing
    , _jiEncryption = Nothing
    , _jiKey = Nothing
    , _jiDetectedProperties = Nothing
    , _jiContainer = Nothing
    , _jiInterlaced = Nothing
    }

-- | The frame rate of the input file. If you want Elastic Transcoder to
-- automatically detect the frame rate of the input file, specify 'auto'.
-- If you want to specify the frame rate for the input file, enter one of
-- the following values:
--
-- '10', '15', '23.97', '24', '25', '29.97', '30', '60'
--
-- If you specify a value other than 'auto', Elastic Transcoder disables
-- automatic detection of the frame rate.
jiFrameRate :: Lens' JobInput (Maybe Text)
jiFrameRate = lens _jiFrameRate (\ s a -> s{_jiFrameRate = a});

-- | This value must be 'auto', which causes Elastic Transcoder to
-- automatically detect the resolution of the input file.
jiResolution :: Lens' JobInput (Maybe Text)
jiResolution = lens _jiResolution (\ s a -> s{_jiResolution = a});

-- | The aspect ratio of the input file. If you want Elastic Transcoder to
-- automatically detect the aspect ratio of the input file, specify 'auto'.
-- If you want to specify the aspect ratio for the output file, enter one
-- of the following values:
--
-- '1:1', '4:3', '3:2', '16:9'
--
-- If you specify a value other than 'auto', Elastic Transcoder disables
-- automatic detection of the aspect ratio.
jiAspectRatio :: Lens' JobInput (Maybe Text)
jiAspectRatio = lens _jiAspectRatio (\ s a -> s{_jiAspectRatio = a});

-- | The encryption settings, if any, that are used for decrypting your input
-- files. If your input file is encrypted, you must specify the mode that
-- Elastic Transcoder will use to decrypt your file.
jiEncryption :: Lens' JobInput (Maybe Encryption)
jiEncryption = lens _jiEncryption (\ s a -> s{_jiEncryption = a});

-- | The name of the file to transcode. Elsewhere in the body of the JSON
-- block is the the ID of the pipeline to use for processing the job. The
-- 'InputBucket' object in that pipeline tells Elastic Transcoder which
-- Amazon S3 bucket to get the file from.
--
-- If the file name includes a prefix, such as 'cooking\/lasagna.mpg',
-- include the prefix in the key. If the file isn\'t in the specified
-- bucket, Elastic Transcoder returns an error.
jiKey :: Lens' JobInput (Maybe Text)
jiKey = lens _jiKey (\ s a -> s{_jiKey = a});

-- | The detected properties of the input file.
jiDetectedProperties :: Lens' JobInput (Maybe DetectedProperties)
jiDetectedProperties = lens _jiDetectedProperties (\ s a -> s{_jiDetectedProperties = a});

-- | The container type for the input file. If you want Elastic Transcoder to
-- automatically detect the container type of the input file, specify
-- 'auto'. If you want to specify the container type for the input file,
-- enter one of the following values:
--
-- '3gp', 'aac', 'asf', 'avi', 'divx', 'flv', 'm4a', 'mkv', 'mov', 'mp3',
-- 'mp4', 'mpeg', 'mpeg-ps', 'mpeg-ts', 'mxf', 'ogg', 'vob', 'wav', 'webm'
jiContainer :: Lens' JobInput (Maybe Text)
jiContainer = lens _jiContainer (\ s a -> s{_jiContainer = a});

-- | Whether the input file is interlaced. If you want Elastic Transcoder to
-- automatically detect whether the input file is interlaced, specify
-- 'auto'. If you want to specify whether the input file is interlaced,
-- enter one of the following values:
--
-- 'true', 'false'
--
-- If you specify a value other than 'auto', Elastic Transcoder disables
-- automatic detection of interlacing.
jiInterlaced :: Lens' JobInput (Maybe Text)
jiInterlaced = lens _jiInterlaced (\ s a -> s{_jiInterlaced = a});

instance FromJSON JobInput where
        parseJSON
          = withObject "JobInput"
              (\ x ->
                 JobInput' <$>
                   (x .:? "FrameRate") <*> (x .:? "Resolution") <*>
                     (x .:? "AspectRatio")
                     <*> (x .:? "Encryption")
                     <*> (x .:? "Key")
                     <*> (x .:? "DetectedProperties")
                     <*> (x .:? "Container")
                     <*> (x .:? "Interlaced"))

instance ToJSON JobInput where
        toJSON JobInput'{..}
          = object
              (catMaybes
                 [("FrameRate" .=) <$> _jiFrameRate,
                  ("Resolution" .=) <$> _jiResolution,
                  ("AspectRatio" .=) <$> _jiAspectRatio,
                  ("Encryption" .=) <$> _jiEncryption,
                  ("Key" .=) <$> _jiKey,
                  ("DetectedProperties" .=) <$> _jiDetectedProperties,
                  ("Container" .=) <$> _jiContainer,
                  ("Interlaced" .=) <$> _jiInterlaced])

-- | Outputs recommended instead.
-- If you specified one output for a job, information about that output. If
-- you specified multiple outputs for a job, the 'Output' object lists
-- information about the first output. This duplicates the information that
-- is listed for the first output in the 'Outputs' object.
--
-- /See:/ 'jobOutput' smart constructor.
data JobOutput = JobOutput'
    { _joAppliedColorSpaceConversion :: !(Maybe Text)
    , _joThumbnailPattern            :: !(Maybe Text)
    , _joStatus                      :: !(Maybe Text)
    , _joHeight                      :: !(Maybe Int)
    , _joFrameRate                   :: !(Maybe Text)
    , _joCaptions                    :: !(Maybe Captions)
    , _joPresetId                    :: !(Maybe Text)
    , _joComposition                 :: !(Maybe [Clip])
    , _joAlbumArt                    :: !(Maybe JobAlbumArt)
    , _joFileSize                    :: !(Maybe Integer)
    , _joWatermarks                  :: !(Maybe [JobWatermark])
    , _joWidth                       :: !(Maybe Int)
    , _joEncryption                  :: !(Maybe Encryption)
    , _joKey                         :: !(Maybe Text)
    , _joStatusDetail                :: !(Maybe Text)
    , _joId                          :: !(Maybe Text)
    , _joSegmentDuration             :: !(Maybe Text)
    , _joDurationMillis              :: !(Maybe Integer)
    , _joThumbnailEncryption         :: !(Maybe Encryption)
    , _joDuration                    :: !(Maybe Integer)
    , _joRotate                      :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobOutput' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'joAppliedColorSpaceConversion'
--
-- * 'joThumbnailPattern'
--
-- * 'joStatus'
--
-- * 'joHeight'
--
-- * 'joFrameRate'
--
-- * 'joCaptions'
--
-- * 'joPresetId'
--
-- * 'joComposition'
--
-- * 'joAlbumArt'
--
-- * 'joFileSize'
--
-- * 'joWatermarks'
--
-- * 'joWidth'
--
-- * 'joEncryption'
--
-- * 'joKey'
--
-- * 'joStatusDetail'
--
-- * 'joId'
--
-- * 'joSegmentDuration'
--
-- * 'joDurationMillis'
--
-- * 'joThumbnailEncryption'
--
-- * 'joDuration'
--
-- * 'joRotate'
jobOutput
    :: JobOutput
jobOutput =
    JobOutput'
    { _joAppliedColorSpaceConversion = Nothing
    , _joThumbnailPattern = Nothing
    , _joStatus = Nothing
    , _joHeight = Nothing
    , _joFrameRate = Nothing
    , _joCaptions = Nothing
    , _joPresetId = Nothing
    , _joComposition = Nothing
    , _joAlbumArt = Nothing
    , _joFileSize = Nothing
    , _joWatermarks = Nothing
    , _joWidth = Nothing
    , _joEncryption = Nothing
    , _joKey = Nothing
    , _joStatusDetail = Nothing
    , _joId = Nothing
    , _joSegmentDuration = Nothing
    , _joDurationMillis = Nothing
    , _joThumbnailEncryption = Nothing
    , _joDuration = Nothing
    , _joRotate = Nothing
    }

-- | If Elastic Transcoder used a preset with a 'ColorSpaceConversionMode' to
-- transcode the output file, the 'AppliedColorSpaceConversion' parameter
-- shows the conversion used. If no 'ColorSpaceConversionMode' was defined
-- in the preset, this parameter will not be included in the job response.
joAppliedColorSpaceConversion :: Lens' JobOutput (Maybe Text)
joAppliedColorSpaceConversion = lens _joAppliedColorSpaceConversion (\ s a -> s{_joAppliedColorSpaceConversion = a});

-- | Whether you want Elastic Transcoder to create thumbnails for your videos
-- and, if so, how you want Elastic Transcoder to name the files.
--
-- If you don\'t want Elastic Transcoder to create thumbnails, specify
-- \"\".
--
-- If you do want Elastic Transcoder to create thumbnails, specify the
-- information that you want to include in the file name for each
-- thumbnail. You can specify the following values in any sequence:
--
-- -   __'{count}' (Required)__: If you want to create thumbnails, you must
--     include '{count}' in the 'ThumbnailPattern' object. Wherever you
--     specify '{count}', Elastic Transcoder adds a five-digit sequence
--     number (beginning with __00001__) to thumbnail file names. The
--     number indicates where a given thumbnail appears in the sequence of
--     thumbnails for a transcoded file.
--
--     If you specify a literal value and\/or '{resolution}' but you omit
--     '{count}', Elastic Transcoder returns a validation error and does
--     not create the job.
--
-- -   __Literal values (Optional)__: You can specify literal values
--     anywhere in the 'ThumbnailPattern' object. For example, you can
--     include them as a file name prefix or as a delimiter between
--     '{resolution}' and '{count}'.
--
-- -   __'{resolution}' (Optional)__: If you want Elastic Transcoder to
--     include the resolution in the file name, include '{resolution}' in
--     the 'ThumbnailPattern' object.
--
-- When creating thumbnails, Elastic Transcoder automatically saves the
-- files in the format (.jpg or .png) that appears in the preset that you
-- specified in the 'PresetID' value of 'CreateJobOutput'. Elastic
-- Transcoder also appends the applicable file name extension.
joThumbnailPattern :: Lens' JobOutput (Maybe Text)
joThumbnailPattern = lens _joThumbnailPattern (\ s a -> s{_joThumbnailPattern = a});

-- | The status of one output in a job. If you specified only one output for
-- the job, 'Outputs:Status' is always the same as 'Job:Status'. If you
-- specified more than one output:
--
-- -   'Job:Status' and 'Outputs:Status' for all of the outputs is
--     Submitted until Elastic Transcoder starts to process the first
--     output.
-- -   When Elastic Transcoder starts to process the first output,
--     'Outputs:Status' for that output and 'Job:Status' both change to
--     Progressing. For each output, the value of 'Outputs:Status' remains
--     Submitted until Elastic Transcoder starts to process the output.
-- -   Job:Status remains Progressing until all of the outputs reach a
--     terminal status, either Complete or Error.
-- -   When all of the outputs reach a terminal status, 'Job:Status'
--     changes to Complete only if 'Outputs:Status' for all of the outputs
--     is 'Complete'. If 'Outputs:Status' for one or more outputs is
--     'Error', the terminal status for 'Job:Status' is also 'Error'.
--
-- The value of 'Status' is one of the following: 'Submitted',
-- 'Progressing', 'Complete', 'Canceled', or 'Error'.
joStatus :: Lens' JobOutput (Maybe Text)
joStatus = lens _joStatus (\ s a -> s{_joStatus = a});

-- | Height of the output file, in pixels.
joHeight :: Lens' JobOutput (Maybe Int)
joHeight = lens _joHeight (\ s a -> s{_joHeight = a});

-- | Frame rate of the output file, in frames per second.
joFrameRate :: Lens' JobOutput (Maybe Text)
joFrameRate = lens _joFrameRate (\ s a -> s{_joFrameRate = a});

-- | You can configure Elastic Transcoder to transcode captions, or
-- subtitles, from one format to another. All captions must be in UTF-8.
-- Elastic Transcoder supports two types of captions:
--
-- -   __Embedded:__ Embedded captions are included in the same file as the
--     audio and video. Elastic Transcoder supports only one embedded
--     caption per language, to a maximum of 300 embedded captions per
--     file.
--
--     Valid input values include: 'CEA-608 (EIA-608', first non-empty
--     channel only), 'CEA-708 (EIA-708', first non-empty channel only),
--     and 'mov-text'
--
--     Valid outputs include: 'mov-text'
--
--     Elastic Transcoder supports a maximum of one embedded format per
--     output.
--
-- -   __Sidecar:__ Sidecar captions are kept in a separate metadata file
--     from the audio and video data. Sidecar captions require a player
--     that is capable of understanding the relationship between the video
--     file and the sidecar file. Elastic Transcoder supports only one
--     sidecar caption per language, to a maximum of 20 sidecar captions
--     per file.
--
--     Valid input values include: 'dfxp' (first div element only),
--     'ebu-tt', 'scc', 'smpt', 'srt', 'ttml' (first div element only), and
--     'webvtt'
--
--     Valid outputs include: 'dfxp' (first div element only), 'scc',
--     'srt', and 'webvtt'.
--
-- If you want ttml or smpte-tt compatible captions, specify dfxp as your
-- output format.
--
-- Elastic Transcoder does not support OCR (Optical Character Recognition),
-- does not accept pictures as a valid input for captions, and is not
-- available for audio-only transcoding. Elastic Transcoder does not
-- preserve text formatting (for example, italics) during the transcoding
-- process.
--
-- To remove captions or leave the captions empty, set 'Captions' to null.
-- To pass through existing captions unchanged, set the 'MergePolicy' to
-- 'MergeRetain', and pass in a null 'CaptionSources' array.
--
-- For more information on embedded files, see the Subtitles Wikipedia
-- page.
--
-- For more information on sidecar files, see the Extensible Metadata
-- Platform and Sidecar file Wikipedia pages.
joCaptions :: Lens' JobOutput (Maybe Captions)
joCaptions = lens _joCaptions (\ s a -> s{_joCaptions = a});

-- | The value of the 'Id' object for the preset that you want to use for
-- this job. The preset determines the audio, video, and thumbnail settings
-- that Elastic Transcoder uses for transcoding. To use a preset that you
-- created, specify the preset ID that Elastic Transcoder returned in the
-- response when you created the preset. You can also use the Elastic
-- Transcoder system presets, which you can get with 'ListPresets'.
joPresetId :: Lens' JobOutput (Maybe Text)
joPresetId = lens _joPresetId (\ s a -> s{_joPresetId = a});

-- | You can create an output file that contains an excerpt from the input
-- file. This excerpt, called a clip, can come from the beginning, middle,
-- or end of the file. The Composition object contains settings for the
-- clips that make up an output file. For the current release, you can only
-- specify settings for a single clip per output file. The Composition
-- object cannot be null.
joComposition :: Lens' JobOutput [Clip]
joComposition = lens _joComposition (\ s a -> s{_joComposition = a}) . _Default . _Coerce;

-- | The album art to be associated with the output file, if any.
joAlbumArt :: Lens' JobOutput (Maybe JobAlbumArt)
joAlbumArt = lens _joAlbumArt (\ s a -> s{_joAlbumArt = a});

-- | File size of the output file, in bytes.
joFileSize :: Lens' JobOutput (Maybe Integer)
joFileSize = lens _joFileSize (\ s a -> s{_joFileSize = a});

-- | Information about the watermarks that you want Elastic Transcoder to add
-- to the video during transcoding. You can specify up to four watermarks
-- for each output. Settings for each watermark must be defined in the
-- preset that you specify in 'Preset' for the current output.
--
-- Watermarks are added to the output video in the sequence in which you
-- list them in the job output—the first watermark in the list is added to
-- the output video first, the second watermark in the list is added next,
-- and so on. As a result, if the settings in a preset cause Elastic
-- Transcoder to place all watermarks in the same location, the second
-- watermark that you add will cover the first one, the third one will
-- cover the second, and the fourth one will cover the third.
joWatermarks :: Lens' JobOutput [JobWatermark]
joWatermarks = lens _joWatermarks (\ s a -> s{_joWatermarks = a}) . _Default . _Coerce;

-- | Specifies the width of the output file in pixels.
joWidth :: Lens' JobOutput (Maybe Int)
joWidth = lens _joWidth (\ s a -> s{_joWidth = a});

-- | The encryption settings, if any, that you want Elastic Transcoder to
-- apply to your output files. If you choose to use encryption, you must
-- specify a mode to use. If you choose not to use encryption, Elastic
-- Transcoder will write an unencrypted file to your Amazon S3 bucket.
joEncryption :: Lens' JobOutput (Maybe Encryption)
joEncryption = lens _joEncryption (\ s a -> s{_joEncryption = a});

-- | The name to assign to the transcoded file. Elastic Transcoder saves the
-- file in the Amazon S3 bucket specified by the 'OutputBucket' object in
-- the pipeline that is specified by the pipeline ID.
joKey :: Lens' JobOutput (Maybe Text)
joKey = lens _joKey (\ s a -> s{_joKey = a});

-- | Information that further explains 'Status'.
joStatusDetail :: Lens' JobOutput (Maybe Text)
joStatusDetail = lens _joStatusDetail (\ s a -> s{_joStatusDetail = a});

-- | A sequential counter, starting with 1, that identifies an output among
-- the outputs from the current job. In the Output syntax, this value is
-- always 1.
joId :: Lens' JobOutput (Maybe Text)
joId = lens _joId (\ s a -> s{_joId = a});

-- | (Outputs in Fragmented MP4 or MPEG-TS format only.
--
-- If you specify a preset in 'PresetId' for which the value of 'Container'
-- is 'fmp4' (Fragmented MP4) or 'ts' (MPEG-TS), 'SegmentDuration' is the
-- target maximum duration of each segment in seconds. For 'HLSv3' format
-- playlists, each media segment is stored in a separate '.ts' file. For
-- 'HLSv4' and 'Smooth' playlists, all media segments for an output are
-- stored in a single file. Each segment is approximately the length of the
-- 'SegmentDuration', though individual segments might be shorter or
-- longer.
--
-- The range of valid values is 1 to 60 seconds. If the duration of the
-- video is not evenly divisible by 'SegmentDuration', the duration of the
-- last segment is the remainder of total length\/SegmentDuration.
--
-- Elastic Transcoder creates an output-specific playlist for each output
-- 'HLS' output that you specify in OutputKeys. To add an output to the
-- master playlist for this job, include it in the 'OutputKeys' of the
-- associated playlist.
joSegmentDuration :: Lens' JobOutput (Maybe Text)
joSegmentDuration = lens _joSegmentDuration (\ s a -> s{_joSegmentDuration = a});

-- | Duration of the output file, in milliseconds.
joDurationMillis :: Lens' JobOutput (Maybe Integer)
joDurationMillis = lens _joDurationMillis (\ s a -> s{_joDurationMillis = a});

-- | The encryption settings, if any, that you want Elastic Transcoder to
-- apply to your thumbnail.
joThumbnailEncryption :: Lens' JobOutput (Maybe Encryption)
joThumbnailEncryption = lens _joThumbnailEncryption (\ s a -> s{_joThumbnailEncryption = a});

-- | Duration of the output file, in seconds.
joDuration :: Lens' JobOutput (Maybe Integer)
joDuration = lens _joDuration (\ s a -> s{_joDuration = a});

-- | The number of degrees clockwise by which you want Elastic Transcoder to
-- rotate the output relative to the input. Enter one of the following
-- values:
--
-- 'auto', '0', '90', '180', '270'
--
-- The value 'auto' generally works only if the file that you\'re
-- transcoding contains rotation metadata.
joRotate :: Lens' JobOutput (Maybe Text)
joRotate = lens _joRotate (\ s a -> s{_joRotate = a});

instance FromJSON JobOutput where
        parseJSON
          = withObject "JobOutput"
              (\ x ->
                 JobOutput' <$>
                   (x .:? "AppliedColorSpaceConversion") <*>
                     (x .:? "ThumbnailPattern")
                     <*> (x .:? "Status")
                     <*> (x .:? "Height")
                     <*> (x .:? "FrameRate")
                     <*> (x .:? "Captions")
                     <*> (x .:? "PresetId")
                     <*> (x .:? "Composition" .!= mempty)
                     <*> (x .:? "AlbumArt")
                     <*> (x .:? "FileSize")
                     <*> (x .:? "Watermarks" .!= mempty)
                     <*> (x .:? "Width")
                     <*> (x .:? "Encryption")
                     <*> (x .:? "Key")
                     <*> (x .:? "StatusDetail")
                     <*> (x .:? "Id")
                     <*> (x .:? "SegmentDuration")
                     <*> (x .:? "DurationMillis")
                     <*> (x .:? "ThumbnailEncryption")
                     <*> (x .:? "Duration")
                     <*> (x .:? "Rotate"))

-- | Watermarks can be in .png or .jpg format. If you want to display a
-- watermark that is not rectangular, use the .png format, which supports
-- transparency.
--
-- /See:/ 'jobWatermark' smart constructor.
data JobWatermark = JobWatermark'
    { _jwPresetWatermarkId :: !(Maybe Text)
    , _jwInputKey          :: !(Maybe Text)
    , _jwEncryption        :: !(Maybe Encryption)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobWatermark' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jwPresetWatermarkId'
--
-- * 'jwInputKey'
--
-- * 'jwEncryption'
jobWatermark
    :: JobWatermark
jobWatermark =
    JobWatermark'
    { _jwPresetWatermarkId = Nothing
    , _jwInputKey = Nothing
    , _jwEncryption = Nothing
    }

-- | The ID of the watermark settings that Elastic Transcoder uses to add
-- watermarks to the video during transcoding. The settings are in the
-- preset specified by Preset for the current output. In that preset, the
-- value of Watermarks Id tells Elastic Transcoder which settings to use.
jwPresetWatermarkId :: Lens' JobWatermark (Maybe Text)
jwPresetWatermarkId = lens _jwPresetWatermarkId (\ s a -> s{_jwPresetWatermarkId = a});

-- | The name of the .png or .jpg file that you want to use for the
-- watermark. To determine which Amazon S3 bucket contains the specified
-- file, Elastic Transcoder checks the pipeline specified by 'Pipeline';
-- the 'Input Bucket' object in that pipeline identifies the bucket.
--
-- If the file name includes a prefix, for example, __logos\/128x64.png__,
-- include the prefix in the key. If the file isn\'t in the specified
-- bucket, Elastic Transcoder returns an error.
jwInputKey :: Lens' JobWatermark (Maybe Text)
jwInputKey = lens _jwInputKey (\ s a -> s{_jwInputKey = a});

-- | The encryption settings, if any, that you want Elastic Transcoder to
-- apply to your watermarks.
jwEncryption :: Lens' JobWatermark (Maybe Encryption)
jwEncryption = lens _jwEncryption (\ s a -> s{_jwEncryption = a});

instance FromJSON JobWatermark where
        parseJSON
          = withObject "JobWatermark"
              (\ x ->
                 JobWatermark' <$>
                   (x .:? "PresetWatermarkId") <*> (x .:? "InputKey")
                     <*> (x .:? "Encryption"))

instance ToJSON JobWatermark where
        toJSON JobWatermark'{..}
          = object
              (catMaybes
                 [("PresetWatermarkId" .=) <$> _jwPresetWatermarkId,
                  ("InputKey" .=) <$> _jwInputKey,
                  ("Encryption" .=) <$> _jwEncryption])

-- | The Amazon Simple Notification Service (Amazon SNS) topic or topics to
-- notify in order to report job status.
--
-- To receive notifications, you must also subscribe to the new topic in
-- the Amazon SNS console.
--
-- /See:/ 'notifications' smart constructor.
data Notifications = Notifications'
    { _nError       :: !(Maybe Text)
    , _nWarning     :: !(Maybe Text)
    , _nProgressing :: !(Maybe Text)
    , _nCompleted   :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Notifications' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'nError'
--
-- * 'nWarning'
--
-- * 'nProgressing'
--
-- * 'nCompleted'
notifications
    :: Notifications
notifications =
    Notifications'
    { _nError = Nothing
    , _nWarning = Nothing
    , _nProgressing = Nothing
    , _nCompleted = Nothing
    }

-- | The Amazon SNS topic that you want to notify when Elastic Transcoder
-- encounters an error condition.
nError :: Lens' Notifications (Maybe Text)
nError = lens _nError (\ s a -> s{_nError = a});

-- | The Amazon SNS topic that you want to notify when Elastic Transcoder
-- encounters a warning condition.
nWarning :: Lens' Notifications (Maybe Text)
nWarning = lens _nWarning (\ s a -> s{_nWarning = a});

-- | The Amazon Simple Notification Service (Amazon SNS) topic that you want
-- to notify when Elastic Transcoder has started to process the job.
nProgressing :: Lens' Notifications (Maybe Text)
nProgressing = lens _nProgressing (\ s a -> s{_nProgressing = a});

-- | The Amazon SNS topic that you want to notify when Elastic Transcoder has
-- finished processing the job.
nCompleted :: Lens' Notifications (Maybe Text)
nCompleted = lens _nCompleted (\ s a -> s{_nCompleted = a});

instance FromJSON Notifications where
        parseJSON
          = withObject "Notifications"
              (\ x ->
                 Notifications' <$>
                   (x .:? "Error") <*> (x .:? "Warning") <*>
                     (x .:? "Progressing")
                     <*> (x .:? "Completed"))

instance ToJSON Notifications where
        toJSON Notifications'{..}
          = object
              (catMaybes
                 [("Error" .=) <$> _nError,
                  ("Warning" .=) <$> _nWarning,
                  ("Progressing" .=) <$> _nProgressing,
                  ("Completed" .=) <$> _nCompleted])

-- | The 'Permission' structure.
--
-- /See:/ 'permission' smart constructor.
data Permission = Permission'
    { _pAccess      :: !(Maybe [Text])
    , _pGranteeType :: !(Maybe Text)
    , _pGrantee     :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Permission' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pAccess'
--
-- * 'pGranteeType'
--
-- * 'pGrantee'
permission
    :: Permission
permission =
    Permission'
    { _pAccess = Nothing
    , _pGranteeType = Nothing
    , _pGrantee = Nothing
    }

-- | The permission that you want to give to the AWS user that is listed in
-- Grantee. Valid values include:
--
-- -   'READ': The grantee can read the thumbnails and metadata for
--     thumbnails that Elastic Transcoder adds to the Amazon S3 bucket.
-- -   'READ_ACP': The grantee can read the object ACL for thumbnails that
--     Elastic Transcoder adds to the Amazon S3 bucket.
-- -   'WRITE_ACP': The grantee can write the ACL for the thumbnails that
--     Elastic Transcoder adds to the Amazon S3 bucket.
-- -   'FULL_CONTROL': The grantee has READ, READ_ACP, and WRITE_ACP
--     permissions for the thumbnails that Elastic Transcoder adds to the
--     Amazon S3 bucket.
pAccess :: Lens' Permission [Text]
pAccess = lens _pAccess (\ s a -> s{_pAccess = a}) . _Default . _Coerce;

-- | The type of value that appears in the Grantee object:
--
-- -   'Canonical': Either the canonical user ID for an AWS account or an
--     origin access identity for an Amazon CloudFront distribution.
--     A canonical user ID is not the same as an AWS account number.
-- -   'Email': The registered email address of an AWS account.
-- -   'Group': One of the following predefined Amazon S3 groups:
--     'AllUsers', 'AuthenticatedUsers', or 'LogDelivery'.
pGranteeType :: Lens' Permission (Maybe Text)
pGranteeType = lens _pGranteeType (\ s a -> s{_pGranteeType = a});

-- | The AWS user or group that you want to have access to transcoded files
-- and playlists. To identify the user or group, you can specify the
-- canonical user ID for an AWS account, an origin access identity for a
-- CloudFront distribution, the registered email address of an AWS account,
-- or a predefined Amazon S3 group.
pGrantee :: Lens' Permission (Maybe Text)
pGrantee = lens _pGrantee (\ s a -> s{_pGrantee = a});

instance FromJSON Permission where
        parseJSON
          = withObject "Permission"
              (\ x ->
                 Permission' <$>
                   (x .:? "Access" .!= mempty) <*> (x .:? "GranteeType")
                     <*> (x .:? "Grantee"))

instance ToJSON Permission where
        toJSON Permission'{..}
          = object
              (catMaybes
                 [("Access" .=) <$> _pAccess,
                  ("GranteeType" .=) <$> _pGranteeType,
                  ("Grantee" .=) <$> _pGrantee])

-- | The pipeline (queue) that is used to manage jobs.
--
-- /See:/ 'pipeline' smart constructor.
data Pipeline = Pipeline'
    { _pipStatus          :: !(Maybe Text)
    , _pipARN             :: !(Maybe Text)
    , _pipInputBucket     :: !(Maybe Text)
    , _pipContentConfig   :: !(Maybe PipelineOutputConfig)
    , _pipOutputBucket    :: !(Maybe Text)
    , _pipRole            :: !(Maybe Text)
    , _pipName            :: !(Maybe Text)
    , _pipAWSKMSKeyARN    :: !(Maybe Text)
    , _pipId              :: !(Maybe Text)
    , _pipNotifications   :: !(Maybe Notifications)
    , _pipThumbnailConfig :: !(Maybe PipelineOutputConfig)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Pipeline' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pipStatus'
--
-- * 'pipARN'
--
-- * 'pipInputBucket'
--
-- * 'pipContentConfig'
--
-- * 'pipOutputBucket'
--
-- * 'pipRole'
--
-- * 'pipName'
--
-- * 'pipAWSKMSKeyARN'
--
-- * 'pipId'
--
-- * 'pipNotifications'
--
-- * 'pipThumbnailConfig'
pipeline
    :: Pipeline
pipeline =
    Pipeline'
    { _pipStatus = Nothing
    , _pipARN = Nothing
    , _pipInputBucket = Nothing
    , _pipContentConfig = Nothing
    , _pipOutputBucket = Nothing
    , _pipRole = Nothing
    , _pipName = Nothing
    , _pipAWSKMSKeyARN = Nothing
    , _pipId = Nothing
    , _pipNotifications = Nothing
    , _pipThumbnailConfig = Nothing
    }

-- | The current status of the pipeline:
--
-- -   'Active': The pipeline is processing jobs.
-- -   'Paused': The pipeline is not currently processing jobs.
pipStatus :: Lens' Pipeline (Maybe Text)
pipStatus = lens _pipStatus (\ s a -> s{_pipStatus = a});

-- | The Amazon Resource Name (ARN) for the pipeline.
pipARN :: Lens' Pipeline (Maybe Text)
pipARN = lens _pipARN (\ s a -> s{_pipARN = a});

-- | The Amazon S3 bucket from which Elastic Transcoder gets media files for
-- transcoding and the graphics files, if any, that you want to use for
-- watermarks.
pipInputBucket :: Lens' Pipeline (Maybe Text)
pipInputBucket = lens _pipInputBucket (\ s a -> s{_pipInputBucket = a});

-- | Information about the Amazon S3 bucket in which you want Elastic
-- Transcoder to save transcoded files and playlists. Either you specify
-- both 'ContentConfig' and 'ThumbnailConfig', or you specify
-- 'OutputBucket'.
--
-- -   __Bucket__: The Amazon S3 bucket in which you want Elastic
--     Transcoder to save transcoded files and playlists.
-- -   __Permissions__: A list of the users and\/or predefined Amazon S3
--     groups you want to have access to transcoded files and playlists,
--     and the type of access that you want them to have.
--     -   GranteeType: The type of value that appears in the 'Grantee'
--         object:
--         -   'Canonical': Either the canonical user ID for an AWS account
--             or an origin access identity for an Amazon CloudFront
--             distribution.
--         -   'Email': The registered email address of an AWS account.
--         -   'Group': One of the following predefined Amazon S3 groups:
--             'AllUsers', 'AuthenticatedUsers', or 'LogDelivery'.
--     -   'Grantee': The AWS user or group that you want to have access to
--         transcoded files and playlists.
--     -   'Access': The permission that you want to give to the AWS user
--         that is listed in 'Grantee'. Valid values include:
--         -   'READ': The grantee can read the objects and metadata for
--             objects that Elastic Transcoder adds to the Amazon S3
--             bucket.
--         -   'READ_ACP': The grantee can read the object ACL for objects
--             that Elastic Transcoder adds to the Amazon S3 bucket.
--         -   'WRITE_ACP': The grantee can write the ACL for the objects
--             that Elastic Transcoder adds to the Amazon S3 bucket.
--         -   'FULL_CONTROL': The grantee has 'READ', 'READ_ACP', and
--             'WRITE_ACP' permissions for the objects that Elastic
--             Transcoder adds to the Amazon S3 bucket.
-- -   __StorageClass__: The Amazon S3 storage class, Standard or
--     ReducedRedundancy, that you want Elastic Transcoder to assign to the
--     video files and playlists that it stores in your Amazon S3 bucket.
pipContentConfig :: Lens' Pipeline (Maybe PipelineOutputConfig)
pipContentConfig = lens _pipContentConfig (\ s a -> s{_pipContentConfig = a});

-- | The Amazon S3 bucket in which you want Elastic Transcoder to save
-- transcoded files, thumbnails, and playlists. Either you specify this
-- value, or you specify both 'ContentConfig' and 'ThumbnailConfig'.
pipOutputBucket :: Lens' Pipeline (Maybe Text)
pipOutputBucket = lens _pipOutputBucket (\ s a -> s{_pipOutputBucket = a});

-- | The IAM Amazon Resource Name (ARN) for the role that Elastic Transcoder
-- uses to transcode jobs for this pipeline.
pipRole :: Lens' Pipeline (Maybe Text)
pipRole = lens _pipRole (\ s a -> s{_pipRole = a});

-- | The name of the pipeline. We recommend that the name be unique within
-- the AWS account, but uniqueness is not enforced.
--
-- Constraints: Maximum 40 characters
pipName :: Lens' Pipeline (Maybe Text)
pipName = lens _pipName (\ s a -> s{_pipName = a});

-- | The AWS Key Management Service (AWS KMS) key that you want to use with
-- this pipeline.
--
-- If you use either 'S3' or 'S3-AWS-KMS' as your 'Encryption:Mode', you
-- don\'t need to provide a key with your job because a default key, known
-- as an AWS-KMS key, is created for you automatically. You need to provide
-- an AWS-KMS key only if you want to use a non-default AWS-KMS key, or if
-- you are using an 'Encryption:Mode' of 'AES-PKCS7', 'AES-CTR', or
-- 'AES-GCM'.
pipAWSKMSKeyARN :: Lens' Pipeline (Maybe Text)
pipAWSKMSKeyARN = lens _pipAWSKMSKeyARN (\ s a -> s{_pipAWSKMSKeyARN = a});

-- | The identifier for the pipeline. You use this value to identify the
-- pipeline in which you want to perform a variety of operations, such as
-- creating a job or a preset.
pipId :: Lens' Pipeline (Maybe Text)
pipId = lens _pipId (\ s a -> s{_pipId = a});

-- | The Amazon Simple Notification Service (Amazon SNS) topic that you want
-- to notify to report job status.
--
-- To receive notifications, you must also subscribe to the new topic in
-- the Amazon SNS console.
--
-- -   __Progressing__ (optional): The Amazon Simple Notification Service
--     (Amazon SNS) topic that you want to notify when Elastic Transcoder
--     has started to process the job.
-- -   __Completed__ (optional): The Amazon SNS topic that you want to
--     notify when Elastic Transcoder has finished processing the job.
-- -   __Warning__ (optional): The Amazon SNS topic that you want to notify
--     when Elastic Transcoder encounters a warning condition.
-- -   __Error__ (optional): The Amazon SNS topic that you want to notify
--     when Elastic Transcoder encounters an error condition.
pipNotifications :: Lens' Pipeline (Maybe Notifications)
pipNotifications = lens _pipNotifications (\ s a -> s{_pipNotifications = a});

-- | Information about the Amazon S3 bucket in which you want Elastic
-- Transcoder to save thumbnail files. Either you specify both
-- 'ContentConfig' and 'ThumbnailConfig', or you specify 'OutputBucket'.
--
-- -   'Bucket': The Amazon S3 bucket in which you want Elastic Transcoder
--     to save thumbnail files.
-- -   'Permissions': A list of the users and\/or predefined Amazon S3
--     groups you want to have access to thumbnail files, and the type of
--     access that you want them to have.
--     -   GranteeType: The type of value that appears in the Grantee
--         object:
--         -   'Canonical': Either the canonical user ID for an AWS account
--             or an origin access identity for an Amazon CloudFront
--             distribution.
--             A canonical user ID is not the same as an AWS account
--             number.
--         -   'Email': The registered email address of an AWS account.
--         -   'Group': One of the following predefined Amazon S3 groups:
--             'AllUsers', 'AuthenticatedUsers', or 'LogDelivery'.
--     -   'Grantee': The AWS user or group that you want to have access to
--         thumbnail files.
--     -   Access: The permission that you want to give to the AWS user
--         that is listed in Grantee. Valid values include:
--         -   'READ': The grantee can read the thumbnails and metadata for
--             thumbnails that Elastic Transcoder adds to the Amazon S3
--             bucket.
--         -   'READ_ACP': The grantee can read the object ACL for
--             thumbnails that Elastic Transcoder adds to the Amazon S3
--             bucket.
--         -   'WRITE_ACP': The grantee can write the ACL for the
--             thumbnails that Elastic Transcoder adds to the Amazon S3
--             bucket.
--         -   'FULL_CONTROL': The grantee has READ, READ_ACP, and
--             WRITE_ACP permissions for the thumbnails that Elastic
--             Transcoder adds to the Amazon S3 bucket.
-- -   'StorageClass': The Amazon S3 storage class, 'Standard' or
--     'ReducedRedundancy', that you want Elastic Transcoder to assign to
--     the thumbnails that it stores in your Amazon S3 bucket.
pipThumbnailConfig :: Lens' Pipeline (Maybe PipelineOutputConfig)
pipThumbnailConfig = lens _pipThumbnailConfig (\ s a -> s{_pipThumbnailConfig = a});

instance FromJSON Pipeline where
        parseJSON
          = withObject "Pipeline"
              (\ x ->
                 Pipeline' <$>
                   (x .:? "Status") <*> (x .:? "Arn") <*>
                     (x .:? "InputBucket")
                     <*> (x .:? "ContentConfig")
                     <*> (x .:? "OutputBucket")
                     <*> (x .:? "Role")
                     <*> (x .:? "Name")
                     <*> (x .:? "AwsKmsKeyArn")
                     <*> (x .:? "Id")
                     <*> (x .:? "Notifications")
                     <*> (x .:? "ThumbnailConfig"))

-- | The 'PipelineOutputConfig' structure.
--
-- /See:/ 'pipelineOutputConfig' smart constructor.
data PipelineOutputConfig = PipelineOutputConfig'
    { _pocBucket       :: !(Maybe Text)
    , _pocStorageClass :: !(Maybe Text)
    , _pocPermissions  :: !(Maybe [Permission])
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'PipelineOutputConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pocBucket'
--
-- * 'pocStorageClass'
--
-- * 'pocPermissions'
pipelineOutputConfig
    :: PipelineOutputConfig
pipelineOutputConfig =
    PipelineOutputConfig'
    { _pocBucket = Nothing
    , _pocStorageClass = Nothing
    , _pocPermissions = Nothing
    }

-- | The Amazon S3 bucket in which you want Elastic Transcoder to save the
-- transcoded files. Specify this value when all of the following are true:
--
-- -   You want to save transcoded files, thumbnails (if any), and
--     playlists (if any) together in one bucket.
-- -   You do not want to specify the users or groups who have access to
--     the transcoded files, thumbnails, and playlists.
-- -   You do not want to specify the permissions that Elastic Transcoder
--     grants to the files.
-- -   You want to associate the transcoded files and thumbnails with the
--     Amazon S3 Standard storage class.
--
-- If you want to save transcoded files and playlists in one bucket and
-- thumbnails in another bucket, specify which users can access the
-- transcoded files or the permissions the users have, or change the Amazon
-- S3 storage class, omit OutputBucket and specify values for
-- 'ContentConfig' and 'ThumbnailConfig' instead.
pocBucket :: Lens' PipelineOutputConfig (Maybe Text)
pocBucket = lens _pocBucket (\ s a -> s{_pocBucket = a});

-- | The Amazon S3 storage class, 'Standard' or 'ReducedRedundancy', that you
-- want Elastic Transcoder to assign to the video files and playlists that
-- it stores in your Amazon S3 bucket.
pocStorageClass :: Lens' PipelineOutputConfig (Maybe Text)
pocStorageClass = lens _pocStorageClass (\ s a -> s{_pocStorageClass = a});

-- | Optional. The 'Permissions' object specifies which users and\/or
-- predefined Amazon S3 groups you want to have access to transcoded files
-- and playlists, and the type of access you want them to have. You can
-- grant permissions to a maximum of 30 users and\/or predefined Amazon S3
-- groups.
--
-- If you include 'Permissions', Elastic Transcoder grants only the
-- permissions that you specify. It does not grant full permissions to the
-- owner of the role specified by 'Role'. If you want that user to have
-- full control, you must explicitly grant full control to the user.
--
-- If you omit 'Permissions', Elastic Transcoder grants full control over
-- the transcoded files and playlists to the owner of the role specified by
-- 'Role', and grants no other permissions to any other user or group.
pocPermissions :: Lens' PipelineOutputConfig [Permission]
pocPermissions = lens _pocPermissions (\ s a -> s{_pocPermissions = a}) . _Default . _Coerce;

instance FromJSON PipelineOutputConfig where
        parseJSON
          = withObject "PipelineOutputConfig"
              (\ x ->
                 PipelineOutputConfig' <$>
                   (x .:? "Bucket") <*> (x .:? "StorageClass") <*>
                     (x .:? "Permissions" .!= mempty))

instance ToJSON PipelineOutputConfig where
        toJSON PipelineOutputConfig'{..}
          = object
              (catMaybes
                 [("Bucket" .=) <$> _pocBucket,
                  ("StorageClass" .=) <$> _pocStorageClass,
                  ("Permissions" .=) <$> _pocPermissions])

-- | The PlayReady DRM settings, if any, that you want Elastic Transcoder to
-- apply to the output files associated with this playlist.
--
-- PlayReady DRM encrypts your media files using 'AES-CTR' encryption.
--
-- If you use DRM for an 'HLSv3' playlist, your outputs must have a master
-- playlist.
--
-- /See:/ 'playReadyDrm' smart constructor.
data PlayReadyDrm = PlayReadyDrm'
    { _prdKeyId                 :: !(Maybe Text)
    , _prdFormat                :: !(Maybe Text)
    , _prdKeyMD5                :: !(Maybe Text)
    , _prdKey                   :: !(Maybe Text)
    , _prdInitializationVector  :: !(Maybe Text)
    , _prdLicenseAcquisitionURL :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'PlayReadyDrm' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'prdKeyId'
--
-- * 'prdFormat'
--
-- * 'prdKeyMD5'
--
-- * 'prdKey'
--
-- * 'prdInitializationVector'
--
-- * 'prdLicenseAcquisitionURL'
playReadyDrm
    :: PlayReadyDrm
playReadyDrm =
    PlayReadyDrm'
    { _prdKeyId = Nothing
    , _prdFormat = Nothing
    , _prdKeyMD5 = Nothing
    , _prdKey = Nothing
    , _prdInitializationVector = Nothing
    , _prdLicenseAcquisitionURL = Nothing
    }

-- | The ID for your DRM key, so that your DRM license provider knows which
-- key to provide.
--
-- The key ID must be provided in big endian, and Elastic Transcoder will
-- convert it to little endian before inserting it into the PlayReady DRM
-- headers. If you are unsure whether your license server provides your key
-- ID in big or little endian, check with your DRM provider.
prdKeyId :: Lens' PlayReadyDrm (Maybe Text)
prdKeyId = lens _prdKeyId (\ s a -> s{_prdKeyId = a});

-- | The type of DRM, if any, that you want Elastic Transcoder to apply to
-- the output files associated with this playlist.
prdFormat :: Lens' PlayReadyDrm (Maybe Text)
prdFormat = lens _prdFormat (\ s a -> s{_prdFormat = a});

-- | The MD5 digest of the key used for DRM on your file, and that you want
-- Elastic Transcoder to use as a checksum to make sure your key was not
-- corrupted in transit. The key MD5 must be base64-encoded, and it must be
-- exactly 16 bytes before being base64-encoded.
prdKeyMD5 :: Lens' PlayReadyDrm (Maybe Text)
prdKeyMD5 = lens _prdKeyMD5 (\ s a -> s{_prdKeyMD5 = a});

-- | The DRM key for your file, provided by your DRM license provider. The
-- key must be base64-encoded, and it must be one of the following bit
-- lengths before being base64-encoded:
--
-- '128', '192', or '256'.
--
-- The key must also be encrypted by using AWS KMS.
prdKey :: Lens' PlayReadyDrm (Maybe Text)
prdKey = lens _prdKey (\ s a -> s{_prdKey = a});

-- | The series of random bits created by a random bit generator, unique for
-- every encryption operation, that you want Elastic Transcoder to use to
-- encrypt your files. The initialization vector must be base64-encoded,
-- and it must be exactly 8 bytes long before being base64-encoded. If no
-- initialization vector is provided, Elastic Transcoder generates one for
-- you.
prdInitializationVector :: Lens' PlayReadyDrm (Maybe Text)
prdInitializationVector = lens _prdInitializationVector (\ s a -> s{_prdInitializationVector = a});

-- | The location of the license key required to play DRM content. The URL
-- must be an absolute path, and is referenced by the PlayReady header. The
-- PlayReady header is referenced in the protection header of the client
-- manifest for Smooth Streaming outputs, and in the EXT-X-DXDRM and
-- EXT-XDXDRMINFO metadata tags for HLS playlist outputs. An example URL
-- looks like this:
-- https:\/\/www.example.com\/exampleKey\/
prdLicenseAcquisitionURL :: Lens' PlayReadyDrm (Maybe Text)
prdLicenseAcquisitionURL = lens _prdLicenseAcquisitionURL (\ s a -> s{_prdLicenseAcquisitionURL = a});

instance FromJSON PlayReadyDrm where
        parseJSON
          = withObject "PlayReadyDrm"
              (\ x ->
                 PlayReadyDrm' <$>
                   (x .:? "KeyId") <*> (x .:? "Format") <*>
                     (x .:? "KeyMd5")
                     <*> (x .:? "Key")
                     <*> (x .:? "InitializationVector")
                     <*> (x .:? "LicenseAcquisitionUrl"))

instance ToJSON PlayReadyDrm where
        toJSON PlayReadyDrm'{..}
          = object
              (catMaybes
                 [("KeyId" .=) <$> _prdKeyId,
                  ("Format" .=) <$> _prdFormat,
                  ("KeyMd5" .=) <$> _prdKeyMD5, ("Key" .=) <$> _prdKey,
                  ("InitializationVector" .=) <$>
                    _prdInitializationVector,
                  ("LicenseAcquisitionUrl" .=) <$>
                    _prdLicenseAcquisitionURL])

-- | Use Only for Fragmented MP4 or MPEG-TS Outputs. If you specify a preset
-- for which the value of Container is 'fmp4' (Fragmented MP4) or 'ts'
-- (MPEG-TS), Playlists contains information about the master playlists
-- that you want Elastic Transcoder to create. We recommend that you create
-- only one master playlist per output format. The maximum number of master
-- playlists in a job is 30.
--
-- /See:/ 'playlist' smart constructor.
data Playlist = Playlist'
    { _pStatus               :: !(Maybe Text)
    , _pPlayReadyDrm         :: !(Maybe PlayReadyDrm)
    , _pFormat               :: !(Maybe Text)
    , _pOutputKeys           :: !(Maybe [Text])
    , _pName                 :: !(Maybe Text)
    , _pStatusDetail         :: !(Maybe Text)
    , _pHlsContentProtection :: !(Maybe HlsContentProtection)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Playlist' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pStatus'
--
-- * 'pPlayReadyDrm'
--
-- * 'pFormat'
--
-- * 'pOutputKeys'
--
-- * 'pName'
--
-- * 'pStatusDetail'
--
-- * 'pHlsContentProtection'
playlist
    :: Playlist
playlist =
    Playlist'
    { _pStatus = Nothing
    , _pPlayReadyDrm = Nothing
    , _pFormat = Nothing
    , _pOutputKeys = Nothing
    , _pName = Nothing
    , _pStatusDetail = Nothing
    , _pHlsContentProtection = Nothing
    }

-- | The status of the job with which the playlist is associated.
pStatus :: Lens' Playlist (Maybe Text)
pStatus = lens _pStatus (\ s a -> s{_pStatus = a});

-- | The DRM settings, if any, that you want Elastic Transcoder to apply to
-- the output files associated with this playlist.
pPlayReadyDrm :: Lens' Playlist (Maybe PlayReadyDrm)
pPlayReadyDrm = lens _pPlayReadyDrm (\ s a -> s{_pPlayReadyDrm = a});

-- | The format of the output playlist. Valid formats include 'HLSv3',
-- 'HLSv4', and 'Smooth'.
pFormat :: Lens' Playlist (Maybe Text)
pFormat = lens _pFormat (\ s a -> s{_pFormat = a});

-- | For each output in this job that you want to include in a master
-- playlist, the value of the Outputs:Key object.
--
-- -   If your output is not 'HLS' or does not have a segment duration set,
--     the name of the output file is a concatenation of 'OutputKeyPrefix'
--     and 'Outputs:Key':
--
--     OutputKeyPrefix'Outputs:Key'
--
-- -   If your output is 'HLSv3' and has a segment duration set, or is not
--     included in a playlist, Elastic Transcoder creates an output
--     playlist file with a file extension of '.m3u8', and a series of
--     '.ts' files that include a five-digit sequential counter beginning
--     with 00000:
--
--     OutputKeyPrefix'Outputs:Key'.m3u8
--
--     OutputKeyPrefix'Outputs:Key'00000.ts
--
-- -   If your output is 'HLSv4', has a segment duration set, and is
--     included in an 'HLSv4' playlist, Elastic Transcoder creates an
--     output playlist file with a file extension of '_v4.m3u8'. If the
--     output is video, Elastic Transcoder also creates an output file with
--     an extension of '_iframe.m3u8':
--
--     OutputKeyPrefix'Outputs:Key'_v4.m3u8
--
--     OutputKeyPrefix'Outputs:Key'_iframe.m3u8
--
--     OutputKeyPrefix'Outputs:Key'.ts
--
-- Elastic Transcoder automatically appends the relevant file extension to
-- the file name. If you include a file extension in Output Key, the file
-- name will have two extensions.
--
-- If you include more than one output in a playlist, any segment duration
-- settings, clip settings, or caption settings must be the same for all
-- outputs in the playlist. For 'Smooth' playlists, the 'Audio:Profile',
-- 'Video:Profile', and 'Video:FrameRate' to 'Video:KeyframesMaxDist' ratio
-- must be the same for all outputs.
pOutputKeys :: Lens' Playlist [Text]
pOutputKeys = lens _pOutputKeys (\ s a -> s{_pOutputKeys = a}) . _Default . _Coerce;

-- | The name that you want Elastic Transcoder to assign to the master
-- playlist, for example, nyc-vacation.m3u8. If the name includes a '\/'
-- character, the section of the name before the last '\/' must be
-- identical for all 'Name' objects. If you create more than one master
-- playlist, the values of all 'Name' objects must be unique.
--
-- __Note__: Elastic Transcoder automatically appends the relevant file
-- extension to the file name ('.m3u8' for 'HLSv3' and 'HLSv4' playlists,
-- and '.ism' and '.ismc' for 'Smooth' playlists). If you include a file
-- extension in 'Name', the file name will have two extensions.
pName :: Lens' Playlist (Maybe Text)
pName = lens _pName (\ s a -> s{_pName = a});

-- | Information that further explains the status.
pStatusDetail :: Lens' Playlist (Maybe Text)
pStatusDetail = lens _pStatusDetail (\ s a -> s{_pStatusDetail = a});

-- | The HLS content protection settings, if any, that you want Elastic
-- Transcoder to apply to the output files associated with this playlist.
pHlsContentProtection :: Lens' Playlist (Maybe HlsContentProtection)
pHlsContentProtection = lens _pHlsContentProtection (\ s a -> s{_pHlsContentProtection = a});

instance FromJSON Playlist where
        parseJSON
          = withObject "Playlist"
              (\ x ->
                 Playlist' <$>
                   (x .:? "Status") <*> (x .:? "PlayReadyDrm") <*>
                     (x .:? "Format")
                     <*> (x .:? "OutputKeys" .!= mempty)
                     <*> (x .:? "Name")
                     <*> (x .:? "StatusDetail")
                     <*> (x .:? "HlsContentProtection"))

-- | Presets are templates that contain most of the settings for transcoding
-- media files from one format to another. Elastic Transcoder includes some
-- default presets for common formats, for example, several iPod and iPhone
-- versions. You can also create your own presets for formats that aren\'t
-- included among the default presets. You specify which preset you want to
-- use when you create a job.
--
-- /See:/ 'preset' smart constructor.
data Preset = Preset'
    { _preARN         :: !(Maybe Text)
    , _preVideo       :: !(Maybe VideoParameters)
    , _preThumbnails  :: !(Maybe Thumbnails)
    , _preName        :: !(Maybe Text)
    , _preContainer   :: !(Maybe Text)
    , _preId          :: !(Maybe Text)
    , _preType        :: !(Maybe Text)
    , _preDescription :: !(Maybe Text)
    , _preAudio       :: !(Maybe AudioParameters)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Preset' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'preARN'
--
-- * 'preVideo'
--
-- * 'preThumbnails'
--
-- * 'preName'
--
-- * 'preContainer'
--
-- * 'preId'
--
-- * 'preType'
--
-- * 'preDescription'
--
-- * 'preAudio'
preset
    :: Preset
preset =
    Preset'
    { _preARN = Nothing
    , _preVideo = Nothing
    , _preThumbnails = Nothing
    , _preName = Nothing
    , _preContainer = Nothing
    , _preId = Nothing
    , _preType = Nothing
    , _preDescription = Nothing
    , _preAudio = Nothing
    }

-- | The Amazon Resource Name (ARN) for the preset.
preARN :: Lens' Preset (Maybe Text)
preARN = lens _preARN (\ s a -> s{_preARN = a});

-- | A section of the response body that provides information about the video
-- preset values.
preVideo :: Lens' Preset (Maybe VideoParameters)
preVideo = lens _preVideo (\ s a -> s{_preVideo = a});

-- | A section of the response body that provides information about the
-- thumbnail preset values, if any.
preThumbnails :: Lens' Preset (Maybe Thumbnails)
preThumbnails = lens _preThumbnails (\ s a -> s{_preThumbnails = a});

-- | The name of the preset.
preName :: Lens' Preset (Maybe Text)
preName = lens _preName (\ s a -> s{_preName = a});

-- | The container type for the output file. Valid values include 'flac',
-- 'flv', 'fmp4', 'gif', 'mp3', 'mp4', 'mpg', 'mxf', 'oga', 'ogg', 'ts',
-- and 'webm'.
preContainer :: Lens' Preset (Maybe Text)
preContainer = lens _preContainer (\ s a -> s{_preContainer = a});

-- | Identifier for the new preset. You use this value to get settings for
-- the preset or to delete it.
preId :: Lens' Preset (Maybe Text)
preId = lens _preId (\ s a -> s{_preId = a});

-- | Whether the preset is a default preset provided by Elastic Transcoder
-- ('System') or a preset that you have defined ('Custom').
preType :: Lens' Preset (Maybe Text)
preType = lens _preType (\ s a -> s{_preType = a});

-- | A description of the preset.
preDescription :: Lens' Preset (Maybe Text)
preDescription = lens _preDescription (\ s a -> s{_preDescription = a});

-- | A section of the response body that provides information about the audio
-- preset values.
preAudio :: Lens' Preset (Maybe AudioParameters)
preAudio = lens _preAudio (\ s a -> s{_preAudio = a});

instance FromJSON Preset where
        parseJSON
          = withObject "Preset"
              (\ x ->
                 Preset' <$>
                   (x .:? "Arn") <*> (x .:? "Video") <*>
                     (x .:? "Thumbnails")
                     <*> (x .:? "Name")
                     <*> (x .:? "Container")
                     <*> (x .:? "Id")
                     <*> (x .:? "Type")
                     <*> (x .:? "Description")
                     <*> (x .:? "Audio"))

-- | Settings for the size, location, and opacity of graphics that you want
-- Elastic Transcoder to overlay over videos that are transcoded using this
-- preset. You can specify settings for up to four watermarks. Watermarks
-- appear in the specified size and location, and with the specified
-- opacity for the duration of the transcoded video.
--
-- Watermarks can be in .png or .jpg format. If you want to display a
-- watermark that is not rectangular, use the .png format, which supports
-- transparency.
--
-- When you create a job that uses this preset, you specify the .png or
-- .jpg graphics that you want Elastic Transcoder to include in the
-- transcoded videos. You can specify fewer graphics in the job than you
-- specify watermark settings in the preset, which allows you to use the
-- same preset for up to four watermarks that have different dimensions.
--
-- /See:/ 'presetWatermark' smart constructor.
data PresetWatermark = PresetWatermark'
    { _pwVerticalAlign    :: !(Maybe Text)
    , _pwSizingPolicy     :: !(Maybe Text)
    , _pwHorizontalOffset :: !(Maybe Text)
    , _pwMaxHeight        :: !(Maybe Text)
    , _pwOpacity          :: !(Maybe Text)
    , _pwVerticalOffset   :: !(Maybe Text)
    , _pwMaxWidth         :: !(Maybe Text)
    , _pwId               :: !(Maybe Text)
    , _pwHorizontalAlign  :: !(Maybe Text)
    , _pwTarget           :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'PresetWatermark' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pwVerticalAlign'
--
-- * 'pwSizingPolicy'
--
-- * 'pwHorizontalOffset'
--
-- * 'pwMaxHeight'
--
-- * 'pwOpacity'
--
-- * 'pwVerticalOffset'
--
-- * 'pwMaxWidth'
--
-- * 'pwId'
--
-- * 'pwHorizontalAlign'
--
-- * 'pwTarget'
presetWatermark
    :: PresetWatermark
presetWatermark =
    PresetWatermark'
    { _pwVerticalAlign = Nothing
    , _pwSizingPolicy = Nothing
    , _pwHorizontalOffset = Nothing
    , _pwMaxHeight = Nothing
    , _pwOpacity = Nothing
    , _pwVerticalOffset = Nothing
    , _pwMaxWidth = Nothing
    , _pwId = Nothing
    , _pwHorizontalAlign = Nothing
    , _pwTarget = Nothing
    }

-- | The vertical position of the watermark unless you specify a non-zero
-- value for 'VerticalOffset':
--
-- -   __Top__: The top edge of the watermark is aligned with the top
--     border of the video.
-- -   __Bottom__: The bottom edge of the watermark is aligned with the
--     bottom border of the video.
-- -   __Center__: The watermark is centered between the top and bottom
--     borders.
pwVerticalAlign :: Lens' PresetWatermark (Maybe Text)
pwVerticalAlign = lens _pwVerticalAlign (\ s a -> s{_pwVerticalAlign = a});

-- | A value that controls scaling of the watermark:
--
-- -   __Fit__: Elastic Transcoder scales the watermark so it matches the
--     value that you specified in either 'MaxWidth' or 'MaxHeight' without
--     exceeding the other value.
-- -   __Stretch__: Elastic Transcoder stretches the watermark to match the
--     values that you specified for 'MaxWidth' and 'MaxHeight'. If the
--     relative proportions of the watermark and the values of 'MaxWidth'
--     and 'MaxHeight' are different, the watermark will be distorted.
-- -   __ShrinkToFit__: Elastic Transcoder scales the watermark down so
--     that its dimensions match the values that you specified for at least
--     one of 'MaxWidth' and 'MaxHeight' without exceeding either value. If
--     you specify this option, Elastic Transcoder does not scale the
--     watermark up.
pwSizingPolicy :: Lens' PresetWatermark (Maybe Text)
pwSizingPolicy = lens _pwSizingPolicy (\ s a -> s{_pwSizingPolicy = a});

-- | The amount by which you want the horizontal position of the watermark to
-- be offset from the position specified by HorizontalAlign:
--
-- -   number of pixels (px): The minimum value is 0 pixels, and the
--     maximum value is the value of MaxWidth.
-- -   integer percentage (%): The range of valid values is 0 to 100.
--
-- For example, if you specify Left for 'HorizontalAlign' and 5px for
-- 'HorizontalOffset', the left side of the watermark appears 5 pixels from
-- the left border of the output video.
--
-- 'HorizontalOffset' is only valid when the value of 'HorizontalAlign' is
-- 'Left' or 'Right'. If you specify an offset that causes the watermark to
-- extend beyond the left or right border and Elastic Transcoder has not
-- added black bars, the watermark is cropped. If Elastic Transcoder has
-- added black bars, the watermark extends into the black bars. If the
-- watermark extends beyond the black bars, it is cropped.
--
-- Use the value of 'Target' to specify whether you want to include the
-- black bars that are added by Elastic Transcoder, if any, in the offset
-- calculation.
pwHorizontalOffset :: Lens' PresetWatermark (Maybe Text)
pwHorizontalOffset = lens _pwHorizontalOffset (\ s a -> s{_pwHorizontalOffset = a});

-- | The maximum height of the watermark in one of the following formats:
--
-- -   number of pixels (px): The minimum value is 16 pixels, and the
--     maximum value is the value of 'MaxHeight'.
-- -   integer percentage (%): The range of valid values is 0 to 100. Use
--     the value of 'Target' to specify whether you want Elastic Transcoder
--     to include the black bars that are added by Elastic Transcoder, if
--     any, in the calculation.
--
-- If you specify the value in pixels, it must be less than or equal to the
-- value of 'MaxHeight'.
pwMaxHeight :: Lens' PresetWatermark (Maybe Text)
pwMaxHeight = lens _pwMaxHeight (\ s a -> s{_pwMaxHeight = a});

-- | A percentage that indicates how much you want a watermark to obscure the
-- video in the location where it appears. Valid values are 0 (the
-- watermark is invisible) to 100 (the watermark completely obscures the
-- video in the specified location). The datatype of 'Opacity' is float.
--
-- Elastic Transcoder supports transparent .png graphics. If you use a
-- transparent .png, the transparent portion of the video appears as if you
-- had specified a value of 0 for 'Opacity'. The .jpg file format doesn\'t
-- support transparency.
pwOpacity :: Lens' PresetWatermark (Maybe Text)
pwOpacity = lens _pwOpacity (\ s a -> s{_pwOpacity = a});

-- | 'VerticalOffset'
--
-- The amount by which you want the vertical position of the watermark to
-- be offset from the position specified by VerticalAlign:
--
-- -   number of pixels (px): The minimum value is 0 pixels, and the
--     maximum value is the value of 'MaxHeight'.
-- -   integer percentage (%): The range of valid values is 0 to 100.
--
-- For example, if you specify 'Top' for 'VerticalAlign' and '5px' for
-- 'VerticalOffset', the top of the watermark appears 5 pixels from the top
-- border of the output video.
--
-- 'VerticalOffset' is only valid when the value of VerticalAlign is Top or
-- Bottom.
--
-- If you specify an offset that causes the watermark to extend beyond the
-- top or bottom border and Elastic Transcoder has not added black bars,
-- the watermark is cropped. If Elastic Transcoder has added black bars,
-- the watermark extends into the black bars. If the watermark extends
-- beyond the black bars, it is cropped.
--
-- Use the value of 'Target' to specify whether you want Elastic Transcoder
-- to include the black bars that are added by Elastic Transcoder, if any,
-- in the offset calculation.
pwVerticalOffset :: Lens' PresetWatermark (Maybe Text)
pwVerticalOffset = lens _pwVerticalOffset (\ s a -> s{_pwVerticalOffset = a});

-- | The maximum width of the watermark in one of the following formats:
--
-- -   number of pixels (px): The minimum value is 16 pixels, and the
--     maximum value is the value of 'MaxWidth'.
-- -   integer percentage (%): The range of valid values is 0 to 100. Use
--     the value of 'Target' to specify whether you want Elastic Transcoder
--     to include the black bars that are added by Elastic Transcoder, if
--     any, in the calculation.
pwMaxWidth :: Lens' PresetWatermark (Maybe Text)
pwMaxWidth = lens _pwMaxWidth (\ s a -> s{_pwMaxWidth = a});

-- | A unique identifier for the settings for one watermark. The value of
-- 'Id' can be up to 40 characters long.
pwId :: Lens' PresetWatermark (Maybe Text)
pwId = lens _pwId (\ s a -> s{_pwId = a});

-- | The horizontal position of the watermark unless you specify a non-zero
-- value for 'HorizontalOffset':
--
-- -   __Left__: The left edge of the watermark is aligned with the left
--     border of the video.
-- -   __Right__: The right edge of the watermark is aligned with the right
--     border of the video.
-- -   __Center__: The watermark is centered between the left and right
--     borders.
pwHorizontalAlign :: Lens' PresetWatermark (Maybe Text)
pwHorizontalAlign = lens _pwHorizontalAlign (\ s a -> s{_pwHorizontalAlign = a});

-- | A value that determines how Elastic Transcoder interprets values that
-- you specified for 'HorizontalOffset', 'VerticalOffset', 'MaxWidth', and
-- 'MaxHeight':
--
-- -   __Content__: 'HorizontalOffset' and 'VerticalOffset' values are
--     calculated based on the borders of the video excluding black bars
--     added by Elastic Transcoder, if any. In addition, 'MaxWidth' and
--     'MaxHeight', if specified as a percentage, are calculated based on
--     the borders of the video excluding black bars added by Elastic
--     Transcoder, if any.
-- -   __Frame__: 'HorizontalOffset' and 'VerticalOffset' values are
--     calculated based on the borders of the video including black bars
--     added by Elastic Transcoder, if any.
pwTarget :: Lens' PresetWatermark (Maybe Text)
pwTarget = lens _pwTarget (\ s a -> s{_pwTarget = a});

instance FromJSON PresetWatermark where
        parseJSON
          = withObject "PresetWatermark"
              (\ x ->
                 PresetWatermark' <$>
                   (x .:? "VerticalAlign") <*> (x .:? "SizingPolicy")
                     <*> (x .:? "HorizontalOffset")
                     <*> (x .:? "MaxHeight")
                     <*> (x .:? "Opacity")
                     <*> (x .:? "VerticalOffset")
                     <*> (x .:? "MaxWidth")
                     <*> (x .:? "Id")
                     <*> (x .:? "HorizontalAlign")
                     <*> (x .:? "Target"))

instance ToJSON PresetWatermark where
        toJSON PresetWatermark'{..}
          = object
              (catMaybes
                 [("VerticalAlign" .=) <$> _pwVerticalAlign,
                  ("SizingPolicy" .=) <$> _pwSizingPolicy,
                  ("HorizontalOffset" .=) <$> _pwHorizontalOffset,
                  ("MaxHeight" .=) <$> _pwMaxHeight,
                  ("Opacity" .=) <$> _pwOpacity,
                  ("VerticalOffset" .=) <$> _pwVerticalOffset,
                  ("MaxWidth" .=) <$> _pwMaxWidth, ("Id" .=) <$> _pwId,
                  ("HorizontalAlign" .=) <$> _pwHorizontalAlign,
                  ("Target" .=) <$> _pwTarget])

-- | Thumbnails for videos.
--
-- /See:/ 'thumbnails' smart constructor.
data Thumbnails = Thumbnails'
    { _tSizingPolicy  :: !(Maybe Text)
    , _tFormat        :: !(Maybe Text)
    , _tMaxHeight     :: !(Maybe Text)
    , _tResolution    :: !(Maybe Text)
    , _tAspectRatio   :: !(Maybe Text)
    , _tPaddingPolicy :: !(Maybe Text)
    , _tInterval      :: !(Maybe Text)
    , _tMaxWidth      :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Thumbnails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tSizingPolicy'
--
-- * 'tFormat'
--
-- * 'tMaxHeight'
--
-- * 'tResolution'
--
-- * 'tAspectRatio'
--
-- * 'tPaddingPolicy'
--
-- * 'tInterval'
--
-- * 'tMaxWidth'
thumbnails
    :: Thumbnails
thumbnails =
    Thumbnails'
    { _tSizingPolicy = Nothing
    , _tFormat = Nothing
    , _tMaxHeight = Nothing
    , _tResolution = Nothing
    , _tAspectRatio = Nothing
    , _tPaddingPolicy = Nothing
    , _tInterval = Nothing
    , _tMaxWidth = Nothing
    }

-- | Specify one of the following values to control scaling of thumbnails:
--
-- -   'Fit': Elastic Transcoder scales thumbnails so they match the value
--     that you specified in thumbnail MaxWidth or MaxHeight settings
--     without exceeding the other value.
-- -   'Fill': Elastic Transcoder scales thumbnails so they match the value
--     that you specified in thumbnail 'MaxWidth' or 'MaxHeight' settings
--     and matches or exceeds the other value. Elastic Transcoder centers
--     the image in thumbnails and then crops in the dimension (if any)
--     that exceeds the maximum value.
-- -   'Stretch': Elastic Transcoder stretches thumbnails to match the
--     values that you specified for thumbnail 'MaxWidth' and 'MaxHeight'
--     settings. If the relative proportions of the input video and
--     thumbnails are different, the thumbnails will be distorted.
-- -   'Keep': Elastic Transcoder does not scale thumbnails. If either
--     dimension of the input video exceeds the values that you specified
--     for thumbnail 'MaxWidth' and 'MaxHeight' settings, Elastic
--     Transcoder crops the thumbnails.
-- -   'ShrinkToFit': Elastic Transcoder scales thumbnails down so that
--     their dimensions match the values that you specified for at least
--     one of thumbnail 'MaxWidth' and 'MaxHeight' without exceeding either
--     value. If you specify this option, Elastic Transcoder does not scale
--     thumbnails up.
-- -   'ShrinkToFill': Elastic Transcoder scales thumbnails down so that
--     their dimensions match the values that you specified for at least
--     one of 'MaxWidth' and 'MaxHeight' without dropping below either
--     value. If you specify this option, Elastic Transcoder does not scale
--     thumbnails up.
tSizingPolicy :: Lens' Thumbnails (Maybe Text)
tSizingPolicy = lens _tSizingPolicy (\ s a -> s{_tSizingPolicy = a});

-- | The format of thumbnails, if any. Valid values are 'jpg' and 'png'.
--
-- You specify whether you want Elastic Transcoder to create thumbnails
-- when you create a job.
tFormat :: Lens' Thumbnails (Maybe Text)
tFormat = lens _tFormat (\ s a -> s{_tFormat = a});

-- | The maximum height of thumbnails in pixels. If you specify auto, Elastic
-- Transcoder uses 1080 (Full HD) as the default value. If you specify a
-- numeric value, enter an even integer between 32 and 3072.
tMaxHeight :: Lens' Thumbnails (Maybe Text)
tMaxHeight = lens _tMaxHeight (\ s a -> s{_tMaxHeight = a});

-- | To better control resolution and aspect ratio of thumbnails, we
-- recommend that you use the values 'MaxWidth', 'MaxHeight',
-- 'SizingPolicy', and 'PaddingPolicy' instead of 'Resolution' and
-- 'AspectRatio'. The two groups of settings are mutually exclusive. Do not
-- use them together.
--
-- The width and height of thumbnail files in pixels. Specify a value in
-- the format 'width' x 'height' where both values are even integers. The
-- values cannot exceed the width and height that you specified in the
-- 'Video:Resolution' object.
tResolution :: Lens' Thumbnails (Maybe Text)
tResolution = lens _tResolution (\ s a -> s{_tResolution = a});

-- | To better control resolution and aspect ratio of thumbnails, we
-- recommend that you use the values 'MaxWidth', 'MaxHeight',
-- 'SizingPolicy', and 'PaddingPolicy' instead of 'Resolution' and
-- 'AspectRatio'. The two groups of settings are mutually exclusive. Do not
-- use them together.
--
-- The aspect ratio of thumbnails. Valid values include:
--
-- 'auto', '1:1', '4:3', '3:2', '16:9'
--
-- If you specify 'auto', Elastic Transcoder tries to preserve the aspect
-- ratio of the video in the output file.
tAspectRatio :: Lens' Thumbnails (Maybe Text)
tAspectRatio = lens _tAspectRatio (\ s a -> s{_tAspectRatio = a});

-- | When you set 'PaddingPolicy' to 'Pad', Elastic Transcoder may add black
-- bars to the top and bottom and\/or left and right sides of thumbnails to
-- make the total size of the thumbnails match the values that you
-- specified for thumbnail 'MaxWidth' and 'MaxHeight' settings.
tPaddingPolicy :: Lens' Thumbnails (Maybe Text)
tPaddingPolicy = lens _tPaddingPolicy (\ s a -> s{_tPaddingPolicy = a});

-- | The approximate number of seconds between thumbnails. Specify an integer
-- value.
tInterval :: Lens' Thumbnails (Maybe Text)
tInterval = lens _tInterval (\ s a -> s{_tInterval = a});

-- | The maximum width of thumbnails in pixels. If you specify auto, Elastic
-- Transcoder uses 1920 (Full HD) as the default value. If you specify a
-- numeric value, enter an even integer between 32 and 4096.
tMaxWidth :: Lens' Thumbnails (Maybe Text)
tMaxWidth = lens _tMaxWidth (\ s a -> s{_tMaxWidth = a});

instance FromJSON Thumbnails where
        parseJSON
          = withObject "Thumbnails"
              (\ x ->
                 Thumbnails' <$>
                   (x .:? "SizingPolicy") <*> (x .:? "Format") <*>
                     (x .:? "MaxHeight")
                     <*> (x .:? "Resolution")
                     <*> (x .:? "AspectRatio")
                     <*> (x .:? "PaddingPolicy")
                     <*> (x .:? "Interval")
                     <*> (x .:? "MaxWidth"))

instance ToJSON Thumbnails where
        toJSON Thumbnails'{..}
          = object
              (catMaybes
                 [("SizingPolicy" .=) <$> _tSizingPolicy,
                  ("Format" .=) <$> _tFormat,
                  ("MaxHeight" .=) <$> _tMaxHeight,
                  ("Resolution" .=) <$> _tResolution,
                  ("AspectRatio" .=) <$> _tAspectRatio,
                  ("PaddingPolicy" .=) <$> _tPaddingPolicy,
                  ("Interval" .=) <$> _tInterval,
                  ("MaxWidth" .=) <$> _tMaxWidth])

-- | Settings that determine when a clip begins and how long it lasts.
--
-- /See:/ 'timeSpan' smart constructor.
data TimeSpan = TimeSpan'
    { _tsStartTime :: !(Maybe Text)
    , _tsDuration  :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'TimeSpan' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tsStartTime'
--
-- * 'tsDuration'
timeSpan
    :: TimeSpan
timeSpan =
    TimeSpan'
    { _tsStartTime = Nothing
    , _tsDuration = Nothing
    }

-- | The place in the input file where you want a clip to start. The format
-- can be either HH:mm:ss.SSS (maximum value: 23:59:59.999; SSS is
-- thousandths of a second) or sssss.SSS (maximum value: 86399.999). If you
-- don\'t specify a value, Elastic Transcoder starts at the beginning of
-- the input file.
tsStartTime :: Lens' TimeSpan (Maybe Text)
tsStartTime = lens _tsStartTime (\ s a -> s{_tsStartTime = a});

-- | The duration of the clip. The format can be either HH:mm:ss.SSS (maximum
-- value: 23:59:59.999; SSS is thousandths of a second) or sssss.SSS
-- (maximum value: 86399.999). If you don\'t specify a value, Elastic
-- Transcoder creates an output file from StartTime to the end of the file.
--
-- If you specify a value longer than the duration of the input file,
-- Elastic Transcoder transcodes the file and returns a warning message.
tsDuration :: Lens' TimeSpan (Maybe Text)
tsDuration = lens _tsDuration (\ s a -> s{_tsDuration = a});

instance FromJSON TimeSpan where
        parseJSON
          = withObject "TimeSpan"
              (\ x ->
                 TimeSpan' <$>
                   (x .:? "StartTime") <*> (x .:? "Duration"))

instance ToJSON TimeSpan where
        toJSON TimeSpan'{..}
          = object
              (catMaybes
                 [("StartTime" .=) <$> _tsStartTime,
                  ("Duration" .=) <$> _tsDuration])

-- | Details about the timing of a job.
--
-- /See:/ 'timing' smart constructor.
data Timing = Timing'
    { _tSubmitTimeMillis :: !(Maybe Integer)
    , _tFinishTimeMillis :: !(Maybe Integer)
    , _tStartTimeMillis  :: !(Maybe Integer)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Timing' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tSubmitTimeMillis'
--
-- * 'tFinishTimeMillis'
--
-- * 'tStartTimeMillis'
timing
    :: Timing
timing =
    Timing'
    { _tSubmitTimeMillis = Nothing
    , _tFinishTimeMillis = Nothing
    , _tStartTimeMillis = Nothing
    }

-- | The time the job was submitted to Elastic Transcoder, in epoch
-- milliseconds.
tSubmitTimeMillis :: Lens' Timing (Maybe Integer)
tSubmitTimeMillis = lens _tSubmitTimeMillis (\ s a -> s{_tSubmitTimeMillis = a});

-- | The time the job finished transcoding, in epoch milliseconds.
tFinishTimeMillis :: Lens' Timing (Maybe Integer)
tFinishTimeMillis = lens _tFinishTimeMillis (\ s a -> s{_tFinishTimeMillis = a});

-- | The time the job began transcoding, in epoch milliseconds.
tStartTimeMillis :: Lens' Timing (Maybe Integer)
tStartTimeMillis = lens _tStartTimeMillis (\ s a -> s{_tStartTimeMillis = a});

instance FromJSON Timing where
        parseJSON
          = withObject "Timing"
              (\ x ->
                 Timing' <$>
                   (x .:? "SubmitTimeMillis") <*>
                     (x .:? "FinishTimeMillis")
                     <*> (x .:? "StartTimeMillis"))

-- | The 'VideoParameters' structure.
--
-- /See:/ 'videoParameters' smart constructor.
data VideoParameters = VideoParameters'
    { _vpKeyframesMaxDist   :: !(Maybe Text)
    , _vpFrameRate          :: !(Maybe Text)
    , _vpSizingPolicy       :: !(Maybe Text)
    , _vpMaxFrameRate       :: !(Maybe Text)
    , _vpMaxHeight          :: !(Maybe Text)
    , _vpWatermarks         :: !(Maybe [PresetWatermark])
    , _vpDisplayAspectRatio :: !(Maybe Text)
    , _vpResolution         :: !(Maybe Text)
    , _vpCodec              :: !(Maybe Text)
    , _vpAspectRatio        :: !(Maybe Text)
    , _vpPaddingPolicy      :: !(Maybe Text)
    , _vpMaxWidth           :: !(Maybe Text)
    , _vpBitRate            :: !(Maybe Text)
    , _vpFixedGOP           :: !(Maybe Text)
    , _vpCodecOptions       :: !(Maybe (Map Text Text))
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'VideoParameters' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'vpKeyframesMaxDist'
--
-- * 'vpFrameRate'
--
-- * 'vpSizingPolicy'
--
-- * 'vpMaxFrameRate'
--
-- * 'vpMaxHeight'
--
-- * 'vpWatermarks'
--
-- * 'vpDisplayAspectRatio'
--
-- * 'vpResolution'
--
-- * 'vpCodec'
--
-- * 'vpAspectRatio'
--
-- * 'vpPaddingPolicy'
--
-- * 'vpMaxWidth'
--
-- * 'vpBitRate'
--
-- * 'vpFixedGOP'
--
-- * 'vpCodecOptions'
videoParameters
    :: VideoParameters
videoParameters =
    VideoParameters'
    { _vpKeyframesMaxDist = Nothing
    , _vpFrameRate = Nothing
    , _vpSizingPolicy = Nothing
    , _vpMaxFrameRate = Nothing
    , _vpMaxHeight = Nothing
    , _vpWatermarks = Nothing
    , _vpDisplayAspectRatio = Nothing
    , _vpResolution = Nothing
    , _vpCodec = Nothing
    , _vpAspectRatio = Nothing
    , _vpPaddingPolicy = Nothing
    , _vpMaxWidth = Nothing
    , _vpBitRate = Nothing
    , _vpFixedGOP = Nothing
    , _vpCodecOptions = Nothing
    }

-- | Applicable only when the value of Video:Codec is one of 'H.264',
-- 'MPEG2', or 'VP8'.
--
-- The maximum number of frames between key frames. Key frames are fully
-- encoded frames; the frames between key frames are encoded based, in
-- part, on the content of the key frames. The value is an integer
-- formatted as a string; valid values are between 1 (every frame is a key
-- frame) and 100000, inclusive. A higher value results in higher
-- compression but may also discernibly decrease video quality.
--
-- For 'Smooth' outputs, the 'FrameRate' must have a constant ratio to the
-- 'KeyframesMaxDist'. This allows 'Smooth' playlists to switch between
-- different quality levels while the file is being played.
--
-- For example, an input file can have a 'FrameRate' of 30 with a
-- 'KeyframesMaxDist' of 90. The output file then needs to have a ratio of
-- 1:3. Valid outputs would have 'FrameRate' of 30, 25, and 10, and
-- 'KeyframesMaxDist' of 90, 75, and 30, respectively.
--
-- Alternately, this can be achieved by setting 'FrameRate' to auto and
-- having the same values for 'MaxFrameRate' and 'KeyframesMaxDist'.
vpKeyframesMaxDist :: Lens' VideoParameters (Maybe Text)
vpKeyframesMaxDist = lens _vpKeyframesMaxDist (\ s a -> s{_vpKeyframesMaxDist = a});

-- | The frames per second for the video stream in the output file. Valid
-- values include:
--
-- 'auto', '10', '15', '23.97', '24', '25', '29.97', '30', '60'
--
-- If you specify 'auto', Elastic Transcoder uses the detected frame rate
-- of the input source. If you specify a frame rate, we recommend that you
-- perform the following calculation:
--
-- 'Frame rate = maximum recommended decoding speed in luma samples\/second \/ (width in pixels * height in pixels)'
--
-- where:
--
-- -   /width in pixels/ and /height in pixels/ represent the Resolution of
--     the output video.
-- -   /maximum recommended decoding speed in Luma samples\/second/ is less
--     than or equal to the maximum value listed in the following table,
--     based on the value that you specified for Level.
--
-- The maximum recommended decoding speed in Luma samples\/second for each
-- level is described in the following list (/Level - Decoding speed/):
--
-- -   1 - 380160
-- -   1b - 380160
-- -   1.1 - 76800
-- -   1.2 - 1536000
-- -   1.3 - 3041280
-- -   2 - 3041280
-- -   2.1 - 5068800
-- -   2.2 - 5184000
-- -   3 - 10368000
-- -   3.1 - 27648000
-- -   3.2 - 55296000
-- -   4 - 62914560
-- -   4.1 - 62914560
vpFrameRate :: Lens' VideoParameters (Maybe Text)
vpFrameRate = lens _vpFrameRate (\ s a -> s{_vpFrameRate = a});

-- | Specify one of the following values to control scaling of the output
-- video:
--
-- -   'Fit': Elastic Transcoder scales the output video so it matches the
--     value that you specified in either 'MaxWidth' or 'MaxHeight' without
--     exceeding the other value.
-- -   'Fill': Elastic Transcoder scales the output video so it matches the
--     value that you specified in either 'MaxWidth' or 'MaxHeight' and
--     matches or exceeds the other value. Elastic Transcoder centers the
--     output video and then crops it in the dimension (if any) that
--     exceeds the maximum value.
-- -   'Stretch': Elastic Transcoder stretches the output video to match
--     the values that you specified for 'MaxWidth' and 'MaxHeight'. If the
--     relative proportions of the input video and the output video are
--     different, the output video will be distorted.
-- -   'Keep': Elastic Transcoder does not scale the output video. If
--     either dimension of the input video exceeds the values that you
--     specified for 'MaxWidth' and 'MaxHeight', Elastic Transcoder crops
--     the output video.
-- -   'ShrinkToFit': Elastic Transcoder scales the output video down so
--     that its dimensions match the values that you specified for at least
--     one of 'MaxWidth' and 'MaxHeight' without exceeding either value. If
--     you specify this option, Elastic Transcoder does not scale the video
--     up.
-- -   'ShrinkToFill': Elastic Transcoder scales the output video down so
--     that its dimensions match the values that you specified for at least
--     one of 'MaxWidth' and 'MaxHeight' without dropping below either
--     value. If you specify this option, Elastic Transcoder does not scale
--     the video up.
vpSizingPolicy :: Lens' VideoParameters (Maybe Text)
vpSizingPolicy = lens _vpSizingPolicy (\ s a -> s{_vpSizingPolicy = a});

-- | If you specify 'auto' for 'FrameRate', Elastic Transcoder uses the frame
-- rate of the input video for the frame rate of the output video. Specify
-- the maximum frame rate that you want Elastic Transcoder to use when the
-- frame rate of the input video is greater than the desired maximum frame
-- rate of the output video. Valid values include: '10', '15', '23.97',
-- '24', '25', '29.97', '30', '60'.
vpMaxFrameRate :: Lens' VideoParameters (Maybe Text)
vpMaxFrameRate = lens _vpMaxFrameRate (\ s a -> s{_vpMaxFrameRate = a});

-- | The maximum height of the output video in pixels. If you specify 'auto',
-- Elastic Transcoder uses 1080 (Full HD) as the default value. If you
-- specify a numeric value, enter an even integer between 96 and 3072.
vpMaxHeight :: Lens' VideoParameters (Maybe Text)
vpMaxHeight = lens _vpMaxHeight (\ s a -> s{_vpMaxHeight = a});

-- | Settings for the size, location, and opacity of graphics that you want
-- Elastic Transcoder to overlay over videos that are transcoded using this
-- preset. You can specify settings for up to four watermarks. Watermarks
-- appear in the specified size and location, and with the specified
-- opacity for the duration of the transcoded video.
--
-- Watermarks can be in .png or .jpg format. If you want to display a
-- watermark that is not rectangular, use the .png format, which supports
-- transparency.
--
-- When you create a job that uses this preset, you specify the .png or
-- .jpg graphics that you want Elastic Transcoder to include in the
-- transcoded videos. You can specify fewer graphics in the job than you
-- specify watermark settings in the preset, which allows you to use the
-- same preset for up to four watermarks that have different dimensions.
vpWatermarks :: Lens' VideoParameters [PresetWatermark]
vpWatermarks = lens _vpWatermarks (\ s a -> s{_vpWatermarks = a}) . _Default . _Coerce;

-- | The value that Elastic Transcoder adds to the metadata in the output
-- file.
vpDisplayAspectRatio :: Lens' VideoParameters (Maybe Text)
vpDisplayAspectRatio = lens _vpDisplayAspectRatio (\ s a -> s{_vpDisplayAspectRatio = a});

-- | To better control resolution and aspect ratio of output videos, we
-- recommend that you use the values 'MaxWidth', 'MaxHeight',
-- 'SizingPolicy', 'PaddingPolicy', and 'DisplayAspectRatio' instead of
-- 'Resolution' and 'AspectRatio'. The two groups of settings are mutually
-- exclusive. Do not use them together.
--
-- The width and height of the video in the output file, in pixels. Valid
-- values are 'auto' and /width/ x /height/:
--
-- -   'auto': Elastic Transcoder attempts to preserve the width and height
--     of the input file, subject to the following rules.
-- -   'width x height': The width and height of the output video in
--     pixels.
--
-- Note the following about specifying the width and height:
--
-- The width must be an even integer between 128 and 4096, inclusive.
--
-- The height must be an even integer between 96 and 3072, inclusive.
--
-- If you specify a resolution that is less than the resolution of the
-- input file, Elastic Transcoder rescales the output file to the lower
-- resolution.
--
-- If you specify a resolution that is greater than the resolution of the
-- input file, Elastic Transcoder rescales the output to the higher
-- resolution.
--
-- We recommend that you specify a resolution for which the product of
-- width and height is less than or equal to the applicable value in the
-- following list (/List - Max width x height value/):
--
-- -   1 - 25344
-- -   1b - 25344
-- -   1.1 - 101376
-- -   1.2 - 101376
-- -   1.3 - 101376
-- -   2 - 101376
-- -   2.1 - 202752
-- -   2.2 - 404720
-- -   3 - 404720
-- -   3.1 - 921600
-- -   3.2 - 1310720
-- -   4 - 2097152
-- -   4.1 - 2097152
vpResolution :: Lens' VideoParameters (Maybe Text)
vpResolution = lens _vpResolution (\ s a -> s{_vpResolution = a});

-- | The video codec for the output file. Valid values include 'gif',
-- 'H.264', 'mpeg2', and 'vp8'. You can only specify 'vp8' when the
-- container type is 'webm', 'gif' when the container type is 'gif', and
-- 'mpeg2' when the container type is 'mpg'.
vpCodec :: Lens' VideoParameters (Maybe Text)
vpCodec = lens _vpCodec (\ s a -> s{_vpCodec = a});

-- | To better control resolution and aspect ratio of output videos, we
-- recommend that you use the values 'MaxWidth', 'MaxHeight',
-- 'SizingPolicy', 'PaddingPolicy', and 'DisplayAspectRatio' instead of
-- 'Resolution' and 'AspectRatio'. The two groups of settings are mutually
-- exclusive. Do not use them together.
--
-- The display aspect ratio of the video in the output file. Valid values
-- include:
--
-- 'auto', '1:1', '4:3', '3:2', '16:9'
--
-- If you specify 'auto', Elastic Transcoder tries to preserve the aspect
-- ratio of the input file.
--
-- If you specify an aspect ratio for the output file that differs from
-- aspect ratio of the input file, Elastic Transcoder adds pillarboxing
-- (black bars on the sides) or letterboxing (black bars on the top and
-- bottom) to maintain the aspect ratio of the active region of the video.
vpAspectRatio :: Lens' VideoParameters (Maybe Text)
vpAspectRatio = lens _vpAspectRatio (\ s a -> s{_vpAspectRatio = a});

-- | When you set 'PaddingPolicy' to 'Pad', Elastic Transcoder may add black
-- bars to the top and bottom and\/or left and right sides of the output
-- video to make the total size of the output video match the values that
-- you specified for 'MaxWidth' and 'MaxHeight'.
vpPaddingPolicy :: Lens' VideoParameters (Maybe Text)
vpPaddingPolicy = lens _vpPaddingPolicy (\ s a -> s{_vpPaddingPolicy = a});

-- | The maximum width of the output video in pixels. If you specify 'auto',
-- Elastic Transcoder uses 1920 (Full HD) as the default value. If you
-- specify a numeric value, enter an even integer between 128 and 4096.
vpMaxWidth :: Lens' VideoParameters (Maybe Text)
vpMaxWidth = lens _vpMaxWidth (\ s a -> s{_vpMaxWidth = a});

-- | The bit rate of the video stream in the output file, in
-- kilobits\/second. Valid values depend on the values of 'Level' and
-- 'Profile'. If you specify 'auto', Elastic Transcoder uses the detected
-- bit rate of the input source. If you specify a value other than 'auto',
-- we recommend that you specify a value less than or equal to the maximum
-- H.264-compliant value listed for your level and profile:
--
-- /Level - Maximum video bit rate in kilobits\/second (baseline and main
-- Profile) : maximum video bit rate in kilobits\/second (high Profile)/
--
-- -   1 - 64 : 80
-- -   1b - 128 : 160
-- -   1.1 - 192 : 240
-- -   1.2 - 384 : 480
-- -   1.3 - 768 : 960
-- -   2 - 2000 : 2500
-- -   3 - 10000 : 12500
-- -   3.1 - 14000 : 17500
-- -   3.2 - 20000 : 25000
-- -   4 - 20000 : 25000
-- -   4.1 - 50000 : 62500
vpBitRate :: Lens' VideoParameters (Maybe Text)
vpBitRate = lens _vpBitRate (\ s a -> s{_vpBitRate = a});

-- | Applicable only when the value of Video:Codec is one of 'H.264',
-- 'MPEG2', or 'VP8'.
--
-- Whether to use a fixed value for 'FixedGOP'. Valid values are 'true' and
-- 'false':
--
-- -   'true': Elastic Transcoder uses the value of 'KeyframesMaxDist' for
--     the distance between key frames (the number of frames in a group of
--     pictures, or GOP).
-- -   'false': The distance between key frames can vary.
--
-- 'FixedGOP' must be set to 'true' for 'fmp4' containers.
vpFixedGOP :: Lens' VideoParameters (Maybe Text)
vpFixedGOP = lens _vpFixedGOP (\ s a -> s{_vpFixedGOP = a});

-- | __Profile (H.264\/VP8 Only)__
--
-- The H.264 profile that you want to use for the output file. Elastic
-- Transcoder supports the following profiles:
--
-- -   'baseline': The profile most commonly used for videoconferencing and
--     for mobile applications.
-- -   'main': The profile used for standard-definition digital TV
--     broadcasts.
-- -   'high': The profile used for high-definition digital TV broadcasts
--     and for Blu-ray discs.
--
-- __Level (H.264 Only)__
--
-- The H.264 level that you want to use for the output file. Elastic
-- Transcoder supports the following levels:
--
-- '1', '1b', '1.1', '1.2', '1.3', '2', '2.1', '2.2', '3', '3.1', '3.2',
-- '4', '4.1'
--
-- __MaxReferenceFrames (H.264 Only)__
--
-- Applicable only when the value of Video:Codec is H.264. The maximum
-- number of previously decoded frames to use as a reference for decoding
-- future frames. Valid values are integers 0 through 16, but we recommend
-- that you not use a value greater than the following:
--
-- 'Min(Floor(Maximum decoded picture buffer in macroblocks * 256 \/ (Width in pixels * Height in pixels)), 16)'
--
-- where /Width in pixels/ and /Height in pixels/ represent either MaxWidth
-- and MaxHeight, or Resolution. /Maximum decoded picture buffer in
-- macroblocks/ depends on the value of the 'Level' object. See the list
-- below. (A macroblock is a block of pixels measuring 16x16.)
--
-- -   1 - 396
-- -   1b - 396
-- -   1.1 - 900
-- -   1.2 - 2376
-- -   1.3 - 2376
-- -   2 - 2376
-- -   2.1 - 4752
-- -   2.2 - 8100
-- -   3 - 8100
-- -   3.1 - 18000
-- -   3.2 - 20480
-- -   4 - 32768
-- -   4.1 - 32768
--
-- __MaxBitRate (Optional, H.264\/MPEG2\/VP8 only)__
--
-- The maximum number of bits per second in a video buffer; the size of the
-- buffer is specified by 'BufferSize'. Specify a value between 16 and
-- 62,500. You can reduce the bandwidth required to stream a video by
-- reducing the maximum bit rate, but this also reduces the quality of the
-- video.
--
-- __BufferSize (Optional, H.264\/MPEG2\/VP8 only)__
--
-- The maximum number of bits in any x seconds of the output video. This
-- window is commonly 10 seconds, the standard segment duration when
-- you\'re using FMP4 or MPEG-TS for the container type of the output
-- video. Specify an integer greater than 0. If you specify 'MaxBitRate'
-- and omit 'BufferSize', Elastic Transcoder sets 'BufferSize' to 10 times
-- the value of 'MaxBitRate'.
--
-- __InterlacedMode (Optional, H.264\/MPEG2 Only)__
--
-- The interlace mode for the output video.
--
-- Interlaced video is used to double the perceived frame rate for a video
-- by interlacing two fields (one field on every other line, the other
-- field on the other lines) so that the human eye registers multiple
-- pictures per frame. Interlacing reduces the bandwidth required for
-- transmitting a video, but can result in blurred images and flickering.
--
-- Valid values include 'Progressive' (no interlacing, top to bottom),
-- 'TopFirst' (top field first), 'BottomFirst' (bottom field first), and
-- 'Auto'.
--
-- If 'InterlaceMode' is not specified, Elastic Transcoder uses
-- 'Progressive' for the output. If 'Auto' is specified, Elastic Transcoder
-- interlaces the output.
--
-- __ColorSpaceConversionMode (Optional, H.264\/MPEG2 Only)__
--
-- The color space conversion Elastic Transcoder applies to the output
-- video. Color spaces are the algorithms used by the computer to store
-- information about how to render color. 'Bt.601' is the standard for
-- standard definition video, while 'Bt.709' is the standard for high
-- definition video.
--
-- Valid values include 'None', 'Bt709toBt601', 'Bt601toBt709', and 'Auto'.
--
-- If you chose 'Auto' for 'ColorSpaceConversionMode' and your output is
-- interlaced, your frame rate is one of '23.97', '24', '25', '29.97',
-- '50', or '60', your 'SegmentDuration' is null, and you are using one of
-- the resolution changes from the list below, Elastic Transcoder applies
-- the following color space conversions:
--
-- -   /Standard to HD, 720x480 to 1920x1080/ - Elastic Transcoder applies
--     'Bt601ToBt709'
-- -   /Standard to HD, 720x576 to 1920x1080/ - Elastic Transcoder applies
--     'Bt601ToBt709'
-- -   /HD to Standard, 1920x1080 to 720x480/ - Elastic Transcoder applies
--     'Bt709ToBt601'
-- -   /HD to Standard, 1920x1080 to 720x576/ - Elastic Transcoder applies
--     'Bt709ToBt601'
--
-- Elastic Transcoder may change the behavior of the
-- 'ColorspaceConversionMode' 'Auto' mode in the future. All outputs in a
-- playlist must use the same 'ColorSpaceConversionMode'.
--
-- If you do not specify a 'ColorSpaceConversionMode', Elastic Transcoder
-- does not change the color space of a file. If you are unsure what
-- 'ColorSpaceConversionMode' was applied to your output file, you can
-- check the 'AppliedColorSpaceConversion' parameter included in your job
-- response. If your job does not have an 'AppliedColorSpaceConversion' in
-- its response, no 'ColorSpaceConversionMode' was applied.
--
-- __ChromaSubsampling__
--
-- The sampling pattern for the chroma (color) channels of the output
-- video. Valid values include 'yuv420p' and 'yuv422p'.
--
-- 'yuv420p' samples the chroma information of every other horizontal and
-- every other vertical line, 'yuv422p' samples the color information of
-- every horizontal line and every other vertical line.
--
-- __LoopCount (Gif Only)__
--
-- The number of times you want the output gif to loop. Valid values
-- include 'Infinite' and integers between '0' and '100', inclusive.
vpCodecOptions :: Lens' VideoParameters (HashMap Text Text)
vpCodecOptions = lens _vpCodecOptions (\ s a -> s{_vpCodecOptions = a}) . _Default . _Map;

instance FromJSON VideoParameters where
        parseJSON
          = withObject "VideoParameters"
              (\ x ->
                 VideoParameters' <$>
                   (x .:? "KeyframesMaxDist") <*> (x .:? "FrameRate")
                     <*> (x .:? "SizingPolicy")
                     <*> (x .:? "MaxFrameRate")
                     <*> (x .:? "MaxHeight")
                     <*> (x .:? "Watermarks" .!= mempty)
                     <*> (x .:? "DisplayAspectRatio")
                     <*> (x .:? "Resolution")
                     <*> (x .:? "Codec")
                     <*> (x .:? "AspectRatio")
                     <*> (x .:? "PaddingPolicy")
                     <*> (x .:? "MaxWidth")
                     <*> (x .:? "BitRate")
                     <*> (x .:? "FixedGOP")
                     <*> (x .:? "CodecOptions" .!= mempty))

instance ToJSON VideoParameters where
        toJSON VideoParameters'{..}
          = object
              (catMaybes
                 [("KeyframesMaxDist" .=) <$> _vpKeyframesMaxDist,
                  ("FrameRate" .=) <$> _vpFrameRate,
                  ("SizingPolicy" .=) <$> _vpSizingPolicy,
                  ("MaxFrameRate" .=) <$> _vpMaxFrameRate,
                  ("MaxHeight" .=) <$> _vpMaxHeight,
                  ("Watermarks" .=) <$> _vpWatermarks,
                  ("DisplayAspectRatio" .=) <$> _vpDisplayAspectRatio,
                  ("Resolution" .=) <$> _vpResolution,
                  ("Codec" .=) <$> _vpCodec,
                  ("AspectRatio" .=) <$> _vpAspectRatio,
                  ("PaddingPolicy" .=) <$> _vpPaddingPolicy,
                  ("MaxWidth" .=) <$> _vpMaxWidth,
                  ("BitRate" .=) <$> _vpBitRate,
                  ("FixedGOP" .=) <$> _vpFixedGOP,
                  ("CodecOptions" .=) <$> _vpCodecOptions])

-- | Elastic Transcoder returns a warning if the resources used by your
-- pipeline are not in the same region as the pipeline.
--
-- Using resources in the same region, such as your Amazon S3 buckets,
-- Amazon SNS notification topics, and AWS KMS key, reduces processing time
-- and prevents cross-regional charges.
--
-- /See:/ 'warning' smart constructor.
data Warning = Warning'
    { _wCode    :: !(Maybe Text)
    , _wMessage :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'Warning' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wCode'
--
-- * 'wMessage'
warning
    :: Warning
warning =
    Warning'
    { _wCode = Nothing
    , _wMessage = Nothing
    }

-- | The code of the cross-regional warning.
wCode :: Lens' Warning (Maybe Text)
wCode = lens _wCode (\ s a -> s{_wCode = a});

-- | The message explaining what resources are in a different region from the
-- pipeline.
--
-- __Note:__ AWS KMS keys must be in the same region as the pipeline.
wMessage :: Lens' Warning (Maybe Text)
wMessage = lens _wMessage (\ s a -> s{_wMessage = a});

instance FromJSON Warning where
        parseJSON
          = withObject "Warning"
              (\ x ->
                 Warning' <$> (x .:? "Code") <*> (x .:? "Message"))