diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,9 +7,8 @@
 
 
 ## Version
-
-`1.6.1`
-
+ 
+`2.0` - Derived from API version @2017-09-30@ of the AWS service descriptions, licensed under Apache 2.0.
 
 ## Description
 
@@ -26,7 +25,7 @@
 The provided lenses should be compatible with any of the major lens libraries
 [lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
 
-See [Network.AWS.KinesisVideoMedia](http://hackage.haskell.org/package/amazonka-kinesis-video-media/docs/Network-AWS-KinesisVideoMedia.html)
+See [Amazonka.KinesisVideoMedia](http://hackage.haskell.org/package/amazonka-kinesis-video-media/docs/Amazonka-KinesisVideoMedia.html)
 or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
 
 
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import           Distribution.Simple
-main = defaultMain
diff --git a/amazonka-kinesis-video-media.cabal b/amazonka-kinesis-video-media.cabal
--- a/amazonka-kinesis-video-media.cabal
+++ b/amazonka-kinesis-video-media.cabal
@@ -1,86 +1,86 @@
-name:                  amazonka-kinesis-video-media
-version:               1.6.1
-synopsis:              Amazon Kinesis Video Streams Media SDK.
-homepage:              https://github.com/brendanhay/amazonka
-bug-reports:           https://github.com/brendanhay/amazonka/issues
-license:               MPL-2.0
-license-file:          LICENSE
-author:                Brendan Hay
-maintainer:            Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-copyright:             Copyright (c) 2013-2018 Brendan Hay
-category:              Network, AWS, Cloud, Distributed Computing
-build-type:            Simple
-cabal-version:         >= 1.10
-extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
+cabal-version:      2.2
+name:               amazonka-kinesis-video-media
+version:            2.0
+synopsis:           Amazon Kinesis Video Streams Media SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
 description:
-    The types from this library are intended to be used with
-    <http://hackage.haskell.org/package/amazonka amazonka>, which provides
-    mechanisms for specifying AuthN/AuthZ information, sending requests,
-    and receiving responses.
-    .
-    Lenses are used for constructing and manipulating types,
-    due to the depth of nesting of AWS types and transparency regarding
-    de/serialisation into more palatable Haskell values.
-    The provided lenses should be compatible with any of the major lens libraries
-    such as <http://hackage.haskell.org/package/lens lens> or
-    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
-    .
-    See "Network.AWS.KinesisVideoMedia" or <https://aws.amazon.com/documentation/ the AWS documentation>
-    to get started.
+  Derived from API version @2017-09-30@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.KinesisVideoMedia.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.KinesisVideoMedia" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
 
 source-repository head
-    type:              git
-    location:          git://github.com/brendanhay/amazonka.git
-    subdir:            amazonka-kinesis-video-media
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-kinesis-video-media
 
 library
-    default-language:  Haskell2010
-    hs-source-dirs:    src gen
-
-    ghc-options:
-        -Wall
-        -fwarn-incomplete-uni-patterns
-        -fwarn-incomplete-record-updates
-        -funbox-strict-fields
-
-    exposed-modules:
-          Network.AWS.KinesisVideoMedia
-        , Network.AWS.KinesisVideoMedia.GetMedia
-        , Network.AWS.KinesisVideoMedia.Types
-        , Network.AWS.KinesisVideoMedia.Waiters
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
 
-    other-modules:
-          Network.AWS.KinesisVideoMedia.Types.Product
-        , Network.AWS.KinesisVideoMedia.Types.Sum
+  exposed-modules:
+    Amazonka.KinesisVideoMedia
+    Amazonka.KinesisVideoMedia.GetMedia
+    Amazonka.KinesisVideoMedia.Lens
+    Amazonka.KinesisVideoMedia.Types
+    Amazonka.KinesisVideoMedia.Types.StartSelector
+    Amazonka.KinesisVideoMedia.Types.StartSelectorType
+    Amazonka.KinesisVideoMedia.Waiters
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , base          >= 4.7     && < 5
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
 
 test-suite amazonka-kinesis-video-media-test
-    type:              exitcode-stdio-1.0
-    default-language:  Haskell2010
-    hs-source-dirs:    test
-    main-is:           Main.hs
-
-    ghc-options:       -Wall -threaded
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
 
-    -- This section is encoded by the template and any modules added by
-    -- hand outside these namespaces will not correctly be added to the
-    -- distribution package.
-    other-modules:
-          Test.AWS.KinesisVideoMedia
-        , Test.AWS.Gen.KinesisVideoMedia
-        , Test.AWS.KinesisVideoMedia.Internal
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.KinesisVideoMedia
+    Test.Amazonka.KinesisVideoMedia
+    Test.Amazonka.KinesisVideoMedia.Internal
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , amazonka-test == 1.6.1.*
-        , amazonka-kinesis-video-media
-        , base
-        , bytestring
-        , tasty
-        , tasty-hunit
-        , text
-        , time
-        , unordered-containers
+  build-depends:
+    , amazonka-core                 >=2.0 && <2.1
+    , amazonka-kinesis-video-media
+    , amazonka-test                 >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/gen/Amazonka/KinesisVideoMedia.hs b/gen/Amazonka/KinesisVideoMedia.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KinesisVideoMedia.hs
@@ -0,0 +1,91 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.KinesisVideoMedia
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2017-09-30@ of the AWS service descriptions, licensed under Apache 2.0.
+module Amazonka.KinesisVideoMedia
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** ClientLimitExceededException
+    _ClientLimitExceededException,
+
+    -- ** ConnectionLimitExceededException
+    _ConnectionLimitExceededException,
+
+    -- ** InvalidArgumentException
+    _InvalidArgumentException,
+
+    -- ** InvalidEndpointException
+    _InvalidEndpointException,
+
+    -- ** NotAuthorizedException
+    _NotAuthorizedException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** GetMedia
+    GetMedia (GetMedia'),
+    newGetMedia,
+    GetMediaResponse (GetMediaResponse'),
+    newGetMediaResponse,
+
+    -- * Types
+
+    -- ** StartSelectorType
+    StartSelectorType (..),
+
+    -- ** StartSelector
+    StartSelector (StartSelector'),
+    newStartSelector,
+  )
+where
+
+import Amazonka.KinesisVideoMedia.GetMedia
+import Amazonka.KinesisVideoMedia.Lens
+import Amazonka.KinesisVideoMedia.Types
+import Amazonka.KinesisVideoMedia.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'KinesisVideoMedia'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/KinesisVideoMedia/GetMedia.hs b/gen/Amazonka/KinesisVideoMedia/GetMedia.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KinesisVideoMedia/GetMedia.hs
@@ -0,0 +1,398 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.KinesisVideoMedia.GetMedia
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use this API to retrieve media content from a Kinesis video stream. In
+-- the request, you identify the stream name or stream Amazon Resource Name
+-- (ARN), and the starting chunk. Kinesis Video Streams then returns a
+-- stream of chunks in order by fragment number.
+--
+-- You must first call the @GetDataEndpoint@ API to get an endpoint. Then
+-- send the @GetMedia@ requests to this endpoint using the
+-- <https://docs.aws.amazon.com/cli/latest/reference/ --endpoint-url parameter>.
+--
+-- When you put media data (fragments) on a stream, Kinesis Video Streams
+-- stores each incoming fragment and related metadata in what is called a
+-- \"chunk.\" For more information, see
+-- <https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html PutMedia>.
+-- The @GetMedia@ API returns a stream of these chunks starting from the
+-- chunk that you specify in the request.
+--
+-- The following limits apply when using the @GetMedia@ API:
+--
+-- -   A client can call @GetMedia@ up to five times per second per stream.
+--
+-- -   Kinesis Video Streams sends media data at a rate of up to 25
+--     megabytes per second (or 200 megabits per second) during a
+--     @GetMedia@ session.
+--
+-- If an error is thrown after invoking a Kinesis Video Streams media API,
+-- in addition to the HTTP status code and the response body, it includes
+-- the following pieces of information:
+--
+-- -   @x-amz-ErrorType@ HTTP header – contains a more specific error type
+--     in addition to what the HTTP status code provides.
+--
+-- -   @x-amz-RequestId@ HTTP header – if you want to report an issue to
+--     AWS, the support team can better diagnose the problem if given the
+--     Request Id.
+--
+-- Both the HTTP status code and the ErrorType header can be utilized to
+-- make programmatic decisions about whether errors are retry-able and
+-- under what conditions, as well as provide information on what actions
+-- the client programmer might need to take in order to successfully try
+-- again.
+--
+-- For more information, see the __Errors__ section at the bottom of this
+-- topic, as well as
+-- <https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/CommonErrors.html Common Errors>.
+module Amazonka.KinesisVideoMedia.GetMedia
+  ( -- * Creating a Request
+    GetMedia (..),
+    newGetMedia,
+
+    -- * Request Lenses
+    getMedia_streamARN,
+    getMedia_streamName,
+    getMedia_startSelector,
+
+    -- * Destructuring the Response
+    GetMediaResponse (..),
+    newGetMediaResponse,
+
+    -- * Response Lenses
+    getMediaResponse_contentType,
+    getMediaResponse_httpStatus,
+    getMediaResponse_payload,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KinesisVideoMedia.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetMedia' smart constructor.
+data GetMedia = GetMedia'
+  { -- | The ARN of the stream from where you want to get the media content. If
+    -- you don\'t specify the @streamARN@, you must specify the @streamName@.
+    streamARN :: Prelude.Maybe Prelude.Text,
+    -- | The Kinesis video stream name from where you want to get the media
+    -- content. If you don\'t specify the @streamName@, you must specify the
+    -- @streamARN@.
+    streamName :: Prelude.Maybe Prelude.Text,
+    -- | Identifies the starting chunk to get from the specified stream.
+    startSelector :: StartSelector
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMedia' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'streamARN', 'getMedia_streamARN' - The ARN of the stream from where you want to get the media content. If
+-- you don\'t specify the @streamARN@, you must specify the @streamName@.
+--
+-- 'streamName', 'getMedia_streamName' - The Kinesis video stream name from where you want to get the media
+-- content. If you don\'t specify the @streamName@, you must specify the
+-- @streamARN@.
+--
+-- 'startSelector', 'getMedia_startSelector' - Identifies the starting chunk to get from the specified stream.
+newGetMedia ::
+  -- | 'startSelector'
+  StartSelector ->
+  GetMedia
+newGetMedia pStartSelector_ =
+  GetMedia'
+    { streamARN = Prelude.Nothing,
+      streamName = Prelude.Nothing,
+      startSelector = pStartSelector_
+    }
+
+-- | The ARN of the stream from where you want to get the media content. If
+-- you don\'t specify the @streamARN@, you must specify the @streamName@.
+getMedia_streamARN :: Lens.Lens' GetMedia (Prelude.Maybe Prelude.Text)
+getMedia_streamARN = Lens.lens (\GetMedia' {streamARN} -> streamARN) (\s@GetMedia' {} a -> s {streamARN = a} :: GetMedia)
+
+-- | The Kinesis video stream name from where you want to get the media
+-- content. If you don\'t specify the @streamName@, you must specify the
+-- @streamARN@.
+getMedia_streamName :: Lens.Lens' GetMedia (Prelude.Maybe Prelude.Text)
+getMedia_streamName = Lens.lens (\GetMedia' {streamName} -> streamName) (\s@GetMedia' {} a -> s {streamName = a} :: GetMedia)
+
+-- | Identifies the starting chunk to get from the specified stream.
+getMedia_startSelector :: Lens.Lens' GetMedia StartSelector
+getMedia_startSelector = Lens.lens (\GetMedia' {startSelector} -> startSelector) (\s@GetMedia' {} a -> s {startSelector = a} :: GetMedia)
+
+instance Core.AWSRequest GetMedia where
+  type AWSResponse GetMedia = GetMediaResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveBody
+      ( \s h x ->
+          GetMediaResponse'
+            Prelude.<$> (h Data..#? "Content-Type")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Prelude.pure x)
+      )
+
+instance Prelude.Hashable GetMedia where
+  hashWithSalt _salt GetMedia' {..} =
+    _salt
+      `Prelude.hashWithSalt` streamARN
+      `Prelude.hashWithSalt` streamName
+      `Prelude.hashWithSalt` startSelector
+
+instance Prelude.NFData GetMedia where
+  rnf GetMedia' {..} =
+    Prelude.rnf streamARN
+      `Prelude.seq` Prelude.rnf streamName
+      `Prelude.seq` Prelude.rnf startSelector
+
+instance Data.ToHeaders GetMedia where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON GetMedia where
+  toJSON GetMedia' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("StreamARN" Data..=) Prelude.<$> streamARN,
+            ("StreamName" Data..=) Prelude.<$> streamName,
+            Prelude.Just
+              ("StartSelector" Data..= startSelector)
+          ]
+      )
+
+instance Data.ToPath GetMedia where
+  toPath = Prelude.const "/getMedia"
+
+instance Data.ToQuery GetMedia where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetMediaResponse' smart constructor.
+data GetMediaResponse = GetMediaResponse'
+  { -- | The content type of the requested media.
+    contentType :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The payload Kinesis Video Streams returns is a sequence of chunks from
+    -- the specified stream. For information about the chunks, see . The chunks
+    -- that Kinesis Video Streams returns in the @GetMedia@ call also include
+    -- the following additional Matroska (MKV) tags:
+    --
+    -- -   AWS_KINESISVIDEO_CONTINUATION_TOKEN (UTF-8 string) - In the event
+    --     your @GetMedia@ call terminates, you can use this continuation token
+    --     in your next request to get the next chunk where the last request
+    --     terminated.
+    --
+    -- -   AWS_KINESISVIDEO_MILLIS_BEHIND_NOW (UTF-8 string) - Client
+    --     applications can use this tag value to determine how far behind the
+    --     chunk returned in the response is from the latest chunk on the
+    --     stream.
+    --
+    -- -   AWS_KINESISVIDEO_FRAGMENT_NUMBER - Fragment number returned in the
+    --     chunk.
+    --
+    -- -   AWS_KINESISVIDEO_SERVER_TIMESTAMP - Server timestamp of the
+    --     fragment.
+    --
+    -- -   AWS_KINESISVIDEO_PRODUCER_TIMESTAMP - Producer timestamp of the
+    --     fragment.
+    --
+    -- The following tags will be present if an error occurs:
+    --
+    -- -   AWS_KINESISVIDEO_ERROR_CODE - String description of an error that
+    --     caused GetMedia to stop.
+    --
+    -- -   AWS_KINESISVIDEO_ERROR_ID: Integer code of the error.
+    --
+    -- The error codes are as follows:
+    --
+    -- -   3002 - Error writing to the stream
+    --
+    -- -   4000 - Requested fragment is not found
+    --
+    -- -   4500 - Access denied for the stream\'s KMS key
+    --
+    -- -   4501 - Stream\'s KMS key is disabled
+    --
+    -- -   4502 - Validation error on the stream\'s KMS key
+    --
+    -- -   4503 - KMS key specified in the stream is unavailable
+    --
+    -- -   4504 - Invalid usage of the KMS key specified in the stream
+    --
+    -- -   4505 - Invalid state of the KMS key specified in the stream
+    --
+    -- -   4506 - Unable to find the KMS key specified in the stream
+    --
+    -- -   5000 - Internal error
+    payload :: Data.ResponseBody
+  }
+  deriving (Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMediaResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'contentType', 'getMediaResponse_contentType' - The content type of the requested media.
+--
+-- 'httpStatus', 'getMediaResponse_httpStatus' - The response's http status code.
+--
+-- 'payload', 'getMediaResponse_payload' - The payload Kinesis Video Streams returns is a sequence of chunks from
+-- the specified stream. For information about the chunks, see . The chunks
+-- that Kinesis Video Streams returns in the @GetMedia@ call also include
+-- the following additional Matroska (MKV) tags:
+--
+-- -   AWS_KINESISVIDEO_CONTINUATION_TOKEN (UTF-8 string) - In the event
+--     your @GetMedia@ call terminates, you can use this continuation token
+--     in your next request to get the next chunk where the last request
+--     terminated.
+--
+-- -   AWS_KINESISVIDEO_MILLIS_BEHIND_NOW (UTF-8 string) - Client
+--     applications can use this tag value to determine how far behind the
+--     chunk returned in the response is from the latest chunk on the
+--     stream.
+--
+-- -   AWS_KINESISVIDEO_FRAGMENT_NUMBER - Fragment number returned in the
+--     chunk.
+--
+-- -   AWS_KINESISVIDEO_SERVER_TIMESTAMP - Server timestamp of the
+--     fragment.
+--
+-- -   AWS_KINESISVIDEO_PRODUCER_TIMESTAMP - Producer timestamp of the
+--     fragment.
+--
+-- The following tags will be present if an error occurs:
+--
+-- -   AWS_KINESISVIDEO_ERROR_CODE - String description of an error that
+--     caused GetMedia to stop.
+--
+-- -   AWS_KINESISVIDEO_ERROR_ID: Integer code of the error.
+--
+-- The error codes are as follows:
+--
+-- -   3002 - Error writing to the stream
+--
+-- -   4000 - Requested fragment is not found
+--
+-- -   4500 - Access denied for the stream\'s KMS key
+--
+-- -   4501 - Stream\'s KMS key is disabled
+--
+-- -   4502 - Validation error on the stream\'s KMS key
+--
+-- -   4503 - KMS key specified in the stream is unavailable
+--
+-- -   4504 - Invalid usage of the KMS key specified in the stream
+--
+-- -   4505 - Invalid state of the KMS key specified in the stream
+--
+-- -   4506 - Unable to find the KMS key specified in the stream
+--
+-- -   5000 - Internal error
+newGetMediaResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'payload'
+  Data.ResponseBody ->
+  GetMediaResponse
+newGetMediaResponse pHttpStatus_ pPayload_ =
+  GetMediaResponse'
+    { contentType = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      payload = pPayload_
+    }
+
+-- | The content type of the requested media.
+getMediaResponse_contentType :: Lens.Lens' GetMediaResponse (Prelude.Maybe Prelude.Text)
+getMediaResponse_contentType = Lens.lens (\GetMediaResponse' {contentType} -> contentType) (\s@GetMediaResponse' {} a -> s {contentType = a} :: GetMediaResponse)
+
+-- | The response's http status code.
+getMediaResponse_httpStatus :: Lens.Lens' GetMediaResponse Prelude.Int
+getMediaResponse_httpStatus = Lens.lens (\GetMediaResponse' {httpStatus} -> httpStatus) (\s@GetMediaResponse' {} a -> s {httpStatus = a} :: GetMediaResponse)
+
+-- | The payload Kinesis Video Streams returns is a sequence of chunks from
+-- the specified stream. For information about the chunks, see . The chunks
+-- that Kinesis Video Streams returns in the @GetMedia@ call also include
+-- the following additional Matroska (MKV) tags:
+--
+-- -   AWS_KINESISVIDEO_CONTINUATION_TOKEN (UTF-8 string) - In the event
+--     your @GetMedia@ call terminates, you can use this continuation token
+--     in your next request to get the next chunk where the last request
+--     terminated.
+--
+-- -   AWS_KINESISVIDEO_MILLIS_BEHIND_NOW (UTF-8 string) - Client
+--     applications can use this tag value to determine how far behind the
+--     chunk returned in the response is from the latest chunk on the
+--     stream.
+--
+-- -   AWS_KINESISVIDEO_FRAGMENT_NUMBER - Fragment number returned in the
+--     chunk.
+--
+-- -   AWS_KINESISVIDEO_SERVER_TIMESTAMP - Server timestamp of the
+--     fragment.
+--
+-- -   AWS_KINESISVIDEO_PRODUCER_TIMESTAMP - Producer timestamp of the
+--     fragment.
+--
+-- The following tags will be present if an error occurs:
+--
+-- -   AWS_KINESISVIDEO_ERROR_CODE - String description of an error that
+--     caused GetMedia to stop.
+--
+-- -   AWS_KINESISVIDEO_ERROR_ID: Integer code of the error.
+--
+-- The error codes are as follows:
+--
+-- -   3002 - Error writing to the stream
+--
+-- -   4000 - Requested fragment is not found
+--
+-- -   4500 - Access denied for the stream\'s KMS key
+--
+-- -   4501 - Stream\'s KMS key is disabled
+--
+-- -   4502 - Validation error on the stream\'s KMS key
+--
+-- -   4503 - KMS key specified in the stream is unavailable
+--
+-- -   4504 - Invalid usage of the KMS key specified in the stream
+--
+-- -   4505 - Invalid state of the KMS key specified in the stream
+--
+-- -   4506 - Unable to find the KMS key specified in the stream
+--
+-- -   5000 - Internal error
+getMediaResponse_payload :: Lens.Lens' GetMediaResponse Data.ResponseBody
+getMediaResponse_payload = Lens.lens (\GetMediaResponse' {payload} -> payload) (\s@GetMediaResponse' {} a -> s {payload = a} :: GetMediaResponse)
diff --git a/gen/Amazonka/KinesisVideoMedia/Lens.hs b/gen/Amazonka/KinesisVideoMedia/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KinesisVideoMedia/Lens.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.KinesisVideoMedia.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.KinesisVideoMedia.Lens
+  ( -- * Operations
+
+    -- ** GetMedia
+    getMedia_streamARN,
+    getMedia_streamName,
+    getMedia_startSelector,
+    getMediaResponse_contentType,
+    getMediaResponse_httpStatus,
+    getMediaResponse_payload,
+
+    -- * Types
+
+    -- ** StartSelector
+    startSelector_afterFragmentNumber,
+    startSelector_continuationToken,
+    startSelector_startTimestamp,
+    startSelector_startSelectorType,
+  )
+where
+
+import Amazonka.KinesisVideoMedia.GetMedia
+import Amazonka.KinesisVideoMedia.Types.StartSelector
diff --git a/gen/Amazonka/KinesisVideoMedia/Types.hs b/gen/Amazonka/KinesisVideoMedia/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KinesisVideoMedia/Types.hs
@@ -0,0 +1,170 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.KinesisVideoMedia.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.KinesisVideoMedia.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _ClientLimitExceededException,
+    _ConnectionLimitExceededException,
+    _InvalidArgumentException,
+    _InvalidEndpointException,
+    _NotAuthorizedException,
+    _ResourceNotFoundException,
+
+    -- * StartSelectorType
+    StartSelectorType (..),
+
+    -- * StartSelector
+    StartSelector (..),
+    newStartSelector,
+    startSelector_afterFragmentNumber,
+    startSelector_continuationToken,
+    startSelector_startTimestamp,
+    startSelector_startSelectorType,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.KinesisVideoMedia.Types.StartSelector
+import Amazonka.KinesisVideoMedia.Types.StartSelectorType
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2017-09-30@ of the Amazon Kinesis Video Streams Media SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "KinesisVideoMedia",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "kinesisvideo",
+      Core.signingName = "kinesisvideo",
+      Core.version = "2017-09-30",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "KinesisVideoMedia",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | Kinesis Video Streams has throttled the request because you have
+-- exceeded the limit of allowed client calls. Try making the call later.
+_ClientLimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ClientLimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ClientLimitExceededException"
+    Prelude.. Core.hasStatus 400
+
+-- | Kinesis Video Streams has throttled the request because you have
+-- exceeded the limit of allowed client connections.
+_ConnectionLimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConnectionLimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ConnectionLimitExceededException"
+    Prelude.. Core.hasStatus 400
+
+-- | The value for this input parameter is invalid.
+_InvalidArgumentException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidArgumentException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidArgumentException"
+    Prelude.. Core.hasStatus 400
+
+-- | Status Code: 400, Caller used wrong endpoint to write data to a stream.
+-- On receiving such an exception, the user must call @GetDataEndpoint@
+-- with @AccessMode@ set to \"READ\" and use the endpoint Kinesis Video
+-- returns in the next @GetMedia@ call.
+_InvalidEndpointException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidEndpointException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidEndpointException"
+    Prelude.. Core.hasStatus 400
+
+-- | Status Code: 403, The caller is not authorized to perform an operation
+-- on the given stream, or the token has expired.
+_NotAuthorizedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_NotAuthorizedException =
+  Core._MatchServiceError
+    defaultService
+    "NotAuthorizedException"
+    Prelude.. Core.hasStatus 401
+
+-- | Status Code: 404, The stream with the given name does not exist.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
diff --git a/gen/Amazonka/KinesisVideoMedia/Types/StartSelector.hs b/gen/Amazonka/KinesisVideoMedia/Types/StartSelector.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KinesisVideoMedia/Types/StartSelector.hs
@@ -0,0 +1,200 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.KinesisVideoMedia.Types.StartSelector
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.KinesisVideoMedia.Types.StartSelector where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KinesisVideoMedia.Types.StartSelectorType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Identifies the chunk on the Kinesis video stream where you want the
+-- @GetMedia@ API to start returning media data. You have the following
+-- options to identify the starting chunk:
+--
+-- -   Choose the latest (or oldest) chunk.
+--
+-- -   Identify a specific chunk. You can identify a specific chunk either
+--     by providing a fragment number or timestamp (server or producer).
+--
+-- -   Each chunk\'s metadata includes a continuation token as a Matroska
+--     (MKV) tag (@AWS_KINESISVIDEO_CONTINUATION_TOKEN@). If your previous
+--     @GetMedia@ request terminated, you can use this tag value in your
+--     next @GetMedia@ request. The API then starts returning chunks
+--     starting where the last API ended.
+--
+-- /See:/ 'newStartSelector' smart constructor.
+data StartSelector = StartSelector'
+  { -- | Specifies the fragment number from where you want the @GetMedia@ API to
+    -- start returning the fragments.
+    afterFragmentNumber :: Prelude.Maybe Prelude.Text,
+    -- | Continuation token that Kinesis Video Streams returned in the previous
+    -- @GetMedia@ response. The @GetMedia@ API then starts with the chunk
+    -- identified by the continuation token.
+    continuationToken :: Prelude.Maybe Prelude.Text,
+    -- | A timestamp value. This value is required if you choose the
+    -- PRODUCER_TIMESTAMP or the SERVER_TIMESTAMP as the @startSelectorType@.
+    -- The @GetMedia@ API then starts with the chunk containing the fragment
+    -- that has the specified timestamp.
+    startTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | Identifies the fragment on the Kinesis video stream where you want to
+    -- start getting the data from.
+    --
+    -- -   NOW - Start with the latest chunk on the stream.
+    --
+    -- -   EARLIEST - Start with earliest available chunk on the stream.
+    --
+    -- -   FRAGMENT_NUMBER - Start with the chunk after a specific fragment.
+    --     You must also specify the @AfterFragmentNumber@ parameter.
+    --
+    -- -   PRODUCER_TIMESTAMP or SERVER_TIMESTAMP - Start with the chunk
+    --     containing a fragment with the specified producer or server
+    --     timestamp. You specify the timestamp by adding @StartTimestamp@.
+    --
+    -- -   CONTINUATION_TOKEN - Read using the specified continuation token.
+    --
+    -- If you choose the NOW, EARLIEST, or CONTINUATION_TOKEN as the
+    -- @startSelectorType@, you don\'t provide any additional information in
+    -- the @startSelector@.
+    startSelectorType :: StartSelectorType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartSelector' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'afterFragmentNumber', 'startSelector_afterFragmentNumber' - Specifies the fragment number from where you want the @GetMedia@ API to
+-- start returning the fragments.
+--
+-- 'continuationToken', 'startSelector_continuationToken' - Continuation token that Kinesis Video Streams returned in the previous
+-- @GetMedia@ response. The @GetMedia@ API then starts with the chunk
+-- identified by the continuation token.
+--
+-- 'startTimestamp', 'startSelector_startTimestamp' - A timestamp value. This value is required if you choose the
+-- PRODUCER_TIMESTAMP or the SERVER_TIMESTAMP as the @startSelectorType@.
+-- The @GetMedia@ API then starts with the chunk containing the fragment
+-- that has the specified timestamp.
+--
+-- 'startSelectorType', 'startSelector_startSelectorType' - Identifies the fragment on the Kinesis video stream where you want to
+-- start getting the data from.
+--
+-- -   NOW - Start with the latest chunk on the stream.
+--
+-- -   EARLIEST - Start with earliest available chunk on the stream.
+--
+-- -   FRAGMENT_NUMBER - Start with the chunk after a specific fragment.
+--     You must also specify the @AfterFragmentNumber@ parameter.
+--
+-- -   PRODUCER_TIMESTAMP or SERVER_TIMESTAMP - Start with the chunk
+--     containing a fragment with the specified producer or server
+--     timestamp. You specify the timestamp by adding @StartTimestamp@.
+--
+-- -   CONTINUATION_TOKEN - Read using the specified continuation token.
+--
+-- If you choose the NOW, EARLIEST, or CONTINUATION_TOKEN as the
+-- @startSelectorType@, you don\'t provide any additional information in
+-- the @startSelector@.
+newStartSelector ::
+  -- | 'startSelectorType'
+  StartSelectorType ->
+  StartSelector
+newStartSelector pStartSelectorType_ =
+  StartSelector'
+    { afterFragmentNumber =
+        Prelude.Nothing,
+      continuationToken = Prelude.Nothing,
+      startTimestamp = Prelude.Nothing,
+      startSelectorType = pStartSelectorType_
+    }
+
+-- | Specifies the fragment number from where you want the @GetMedia@ API to
+-- start returning the fragments.
+startSelector_afterFragmentNumber :: Lens.Lens' StartSelector (Prelude.Maybe Prelude.Text)
+startSelector_afterFragmentNumber = Lens.lens (\StartSelector' {afterFragmentNumber} -> afterFragmentNumber) (\s@StartSelector' {} a -> s {afterFragmentNumber = a} :: StartSelector)
+
+-- | Continuation token that Kinesis Video Streams returned in the previous
+-- @GetMedia@ response. The @GetMedia@ API then starts with the chunk
+-- identified by the continuation token.
+startSelector_continuationToken :: Lens.Lens' StartSelector (Prelude.Maybe Prelude.Text)
+startSelector_continuationToken = Lens.lens (\StartSelector' {continuationToken} -> continuationToken) (\s@StartSelector' {} a -> s {continuationToken = a} :: StartSelector)
+
+-- | A timestamp value. This value is required if you choose the
+-- PRODUCER_TIMESTAMP or the SERVER_TIMESTAMP as the @startSelectorType@.
+-- The @GetMedia@ API then starts with the chunk containing the fragment
+-- that has the specified timestamp.
+startSelector_startTimestamp :: Lens.Lens' StartSelector (Prelude.Maybe Prelude.UTCTime)
+startSelector_startTimestamp = Lens.lens (\StartSelector' {startTimestamp} -> startTimestamp) (\s@StartSelector' {} a -> s {startTimestamp = a} :: StartSelector) Prelude.. Lens.mapping Data._Time
+
+-- | Identifies the fragment on the Kinesis video stream where you want to
+-- start getting the data from.
+--
+-- -   NOW - Start with the latest chunk on the stream.
+--
+-- -   EARLIEST - Start with earliest available chunk on the stream.
+--
+-- -   FRAGMENT_NUMBER - Start with the chunk after a specific fragment.
+--     You must also specify the @AfterFragmentNumber@ parameter.
+--
+-- -   PRODUCER_TIMESTAMP or SERVER_TIMESTAMP - Start with the chunk
+--     containing a fragment with the specified producer or server
+--     timestamp. You specify the timestamp by adding @StartTimestamp@.
+--
+-- -   CONTINUATION_TOKEN - Read using the specified continuation token.
+--
+-- If you choose the NOW, EARLIEST, or CONTINUATION_TOKEN as the
+-- @startSelectorType@, you don\'t provide any additional information in
+-- the @startSelector@.
+startSelector_startSelectorType :: Lens.Lens' StartSelector StartSelectorType
+startSelector_startSelectorType = Lens.lens (\StartSelector' {startSelectorType} -> startSelectorType) (\s@StartSelector' {} a -> s {startSelectorType = a} :: StartSelector)
+
+instance Prelude.Hashable StartSelector where
+  hashWithSalt _salt StartSelector' {..} =
+    _salt
+      `Prelude.hashWithSalt` afterFragmentNumber
+      `Prelude.hashWithSalt` continuationToken
+      `Prelude.hashWithSalt` startTimestamp
+      `Prelude.hashWithSalt` startSelectorType
+
+instance Prelude.NFData StartSelector where
+  rnf StartSelector' {..} =
+    Prelude.rnf afterFragmentNumber
+      `Prelude.seq` Prelude.rnf continuationToken
+      `Prelude.seq` Prelude.rnf startTimestamp
+      `Prelude.seq` Prelude.rnf startSelectorType
+
+instance Data.ToJSON StartSelector where
+  toJSON StartSelector' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AfterFragmentNumber" Data..=)
+              Prelude.<$> afterFragmentNumber,
+            ("ContinuationToken" Data..=)
+              Prelude.<$> continuationToken,
+            ("StartTimestamp" Data..=)
+              Prelude.<$> startTimestamp,
+            Prelude.Just
+              ("StartSelectorType" Data..= startSelectorType)
+          ]
+      )
diff --git a/gen/Amazonka/KinesisVideoMedia/Types/StartSelectorType.hs b/gen/Amazonka/KinesisVideoMedia/Types/StartSelectorType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KinesisVideoMedia/Types/StartSelectorType.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.KinesisVideoMedia.Types.StartSelectorType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.KinesisVideoMedia.Types.StartSelectorType
+  ( StartSelectorType
+      ( ..,
+        StartSelectorType_CONTINUATION_TOKEN,
+        StartSelectorType_EARLIEST,
+        StartSelectorType_FRAGMENT_NUMBER,
+        StartSelectorType_NOW,
+        StartSelectorType_PRODUCER_TIMESTAMP,
+        StartSelectorType_SERVER_TIMESTAMP
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype StartSelectorType = StartSelectorType'
+  { fromStartSelectorType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern StartSelectorType_CONTINUATION_TOKEN :: StartSelectorType
+pattern StartSelectorType_CONTINUATION_TOKEN = StartSelectorType' "CONTINUATION_TOKEN"
+
+pattern StartSelectorType_EARLIEST :: StartSelectorType
+pattern StartSelectorType_EARLIEST = StartSelectorType' "EARLIEST"
+
+pattern StartSelectorType_FRAGMENT_NUMBER :: StartSelectorType
+pattern StartSelectorType_FRAGMENT_NUMBER = StartSelectorType' "FRAGMENT_NUMBER"
+
+pattern StartSelectorType_NOW :: StartSelectorType
+pattern StartSelectorType_NOW = StartSelectorType' "NOW"
+
+pattern StartSelectorType_PRODUCER_TIMESTAMP :: StartSelectorType
+pattern StartSelectorType_PRODUCER_TIMESTAMP = StartSelectorType' "PRODUCER_TIMESTAMP"
+
+pattern StartSelectorType_SERVER_TIMESTAMP :: StartSelectorType
+pattern StartSelectorType_SERVER_TIMESTAMP = StartSelectorType' "SERVER_TIMESTAMP"
+
+{-# COMPLETE
+  StartSelectorType_CONTINUATION_TOKEN,
+  StartSelectorType_EARLIEST,
+  StartSelectorType_FRAGMENT_NUMBER,
+  StartSelectorType_NOW,
+  StartSelectorType_PRODUCER_TIMESTAMP,
+  StartSelectorType_SERVER_TIMESTAMP,
+  StartSelectorType'
+  #-}
diff --git a/gen/Amazonka/KinesisVideoMedia/Waiters.hs b/gen/Amazonka/KinesisVideoMedia/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/KinesisVideoMedia/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.KinesisVideoMedia.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.KinesisVideoMedia.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.KinesisVideoMedia.Lens
+import Amazonka.KinesisVideoMedia.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/gen/Network/AWS/KinesisVideoMedia.hs b/gen/Network/AWS/KinesisVideoMedia.hs
deleted file mode 100644
--- a/gen/Network/AWS/KinesisVideoMedia.hs
+++ /dev/null
@@ -1,98 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
-{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.KinesisVideoMedia
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
---
---
---
-module Network.AWS.KinesisVideoMedia
-    (
-    -- * Service Configuration
-      kinesisVideoMedia
-
-    -- * Errors
-    -- $errors
-
-    -- ** ConnectionLimitExceededException
-    , _ConnectionLimitExceededException
-
-    -- ** InvalidArgumentException
-    , _InvalidArgumentException
-
-    -- ** NotAuthorizedException
-    , _NotAuthorizedException
-
-    -- ** ClientLimitExceededException
-    , _ClientLimitExceededException
-
-    -- ** InvalidEndpointException
-    , _InvalidEndpointException
-
-    -- ** ResourceNotFoundException
-    , _ResourceNotFoundException
-
-    -- * Waiters
-    -- $waiters
-
-    -- * Operations
-    -- $operations
-
-    -- ** GetMedia
-    , module Network.AWS.KinesisVideoMedia.GetMedia
-
-    -- * Types
-
-    -- ** StartSelectorType
-    , StartSelectorType (..)
-
-    -- ** StartSelector
-    , StartSelector
-    , startSelector
-    , ssContinuationToken
-    , ssAfterFragmentNumber
-    , ssStartTimestamp
-    , ssStartSelectorType
-    ) where
-
-import Network.AWS.KinesisVideoMedia.GetMedia
-import Network.AWS.KinesisVideoMedia.Types
-import Network.AWS.KinesisVideoMedia.Waiters
-
-{- $errors
-Error matchers are designed for use with the functions provided by
-<http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
-This allows catching (and rethrowing) service specific errors returned
-by 'KinesisVideoMedia'.
--}
-
-{- $operations
-Some AWS operations return results that are incomplete and require subsequent
-requests in order to obtain the entire result set. The process of sending
-subsequent requests to continue where a previous request left off is called
-pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
-1000 objects at a time, and you must send subsequent requests with the
-appropriate Marker in order to retrieve the next page of results.
-
-Operations that have an 'AWSPager' instance can transparently perform subsequent
-requests, correctly setting Markers and other request facets to iterate through
-the entire result set of a truncated API operation. Operations which support
-this have an additional note in the documentation.
-
-Many operations have the ability to filter results on the server side. See the
-individual operation parameters for details.
--}
-
-{- $waiters
-Waiters poll by repeatedly sending a request until some remote success condition
-configured by the 'Wait' specification is fulfilled. The 'Wait' specification
-determines how many attempts should be made, in addition to delay and retry strategies.
--}
diff --git a/gen/Network/AWS/KinesisVideoMedia/GetMedia.hs b/gen/Network/AWS/KinesisVideoMedia/GetMedia.hs
deleted file mode 100644
--- a/gen/Network/AWS/KinesisVideoMedia/GetMedia.hs
+++ /dev/null
@@ -1,170 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.KinesisVideoMedia.GetMedia
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Use this API to retrieve media content from a Kinesis video stream. In the request, you identify stream name or stream Amazon Resource Name (ARN), and the starting chunk. Kinesis Video Streams then returns a stream of chunks in order by fragment number.
---
---
--- When you put media data (fragments) on a stream, Kinesis Video Streams stores each incoming fragment and related metadata in what is called a "chunk." For more information, see . The @GetMedia@ API returns a stream of these chunks starting from the chunk that you specify in the request.
---
--- The following limits apply when using the @GetMedia@ API:
---
---     * A client can call @GetMedia@ up to five times per second per stream.
---
---     * Kinesis Video Streams sends media data at a rate of up to 25 megabytes per second (or 200 megabits per second) during a @GetMedia@ session.
---
---
---
-module Network.AWS.KinesisVideoMedia.GetMedia
-    (
-    -- * Creating a Request
-      getMedia
-    , GetMedia
-    -- * Request Lenses
-    , gmStreamARN
-    , gmStreamName
-    , gmStartSelector
-
-    -- * Destructuring the Response
-    , getMediaResponse
-    , GetMediaResponse
-    -- * Response Lenses
-    , gmrsContentType
-    , gmrsResponseStatus
-    , gmrsPayload
-    ) where
-
-import Network.AWS.KinesisVideoMedia.Types
-import Network.AWS.KinesisVideoMedia.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'getMedia' smart constructor.
-data GetMedia = GetMedia'
-  { _gmStreamARN     :: !(Maybe Text)
-  , _gmStreamName    :: !(Maybe Text)
-  , _gmStartSelector :: !StartSelector
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetMedia' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gmStreamARN' - The ARN of the stream from where you want to get the media content. If you don't specify the @streamARN@ , you must specify the @streamName@ .
---
--- * 'gmStreamName' - The Kinesis video stream name from where you want to get the media content. If you don't specify the @streamName@ , you must specify the @streamARN@ .
---
--- * 'gmStartSelector' - Identifies the starting chunk to get from the specified stream.
-getMedia
-    :: StartSelector -- ^ 'gmStartSelector'
-    -> GetMedia
-getMedia pStartSelector_ =
-  GetMedia'
-    { _gmStreamARN = Nothing
-    , _gmStreamName = Nothing
-    , _gmStartSelector = pStartSelector_
-    }
-
-
--- | The ARN of the stream from where you want to get the media content. If you don't specify the @streamARN@ , you must specify the @streamName@ .
-gmStreamARN :: Lens' GetMedia (Maybe Text)
-gmStreamARN = lens _gmStreamARN (\ s a -> s{_gmStreamARN = a})
-
--- | The Kinesis video stream name from where you want to get the media content. If you don't specify the @streamName@ , you must specify the @streamARN@ .
-gmStreamName :: Lens' GetMedia (Maybe Text)
-gmStreamName = lens _gmStreamName (\ s a -> s{_gmStreamName = a})
-
--- | Identifies the starting chunk to get from the specified stream.
-gmStartSelector :: Lens' GetMedia StartSelector
-gmStartSelector = lens _gmStartSelector (\ s a -> s{_gmStartSelector = a})
-
-instance AWSRequest GetMedia where
-        type Rs GetMedia = GetMediaResponse
-        request = postJSON kinesisVideoMedia
-        response
-          = receiveBody
-              (\ s h x ->
-                 GetMediaResponse' <$>
-                   (h .#? "Content-Type") <*> (pure (fromEnum s)) <*>
-                     (pure x))
-
-instance Hashable GetMedia where
-
-instance NFData GetMedia where
-
-instance ToHeaders GetMedia where
-        toHeaders = const mempty
-
-instance ToJSON GetMedia where
-        toJSON GetMedia'{..}
-          = object
-              (catMaybes
-                 [("StreamARN" .=) <$> _gmStreamARN,
-                  ("StreamName" .=) <$> _gmStreamName,
-                  Just ("StartSelector" .= _gmStartSelector)])
-
-instance ToPath GetMedia where
-        toPath = const "/getMedia"
-
-instance ToQuery GetMedia where
-        toQuery = const mempty
-
--- | /See:/ 'getMediaResponse' smart constructor.
-data GetMediaResponse = GetMediaResponse'
-  { _gmrsContentType    :: !(Maybe Text)
-  , _gmrsResponseStatus :: !Int
-  , _gmrsPayload        :: !RsBody
-  } deriving (Show, Generic)
-
-
--- | Creates a value of 'GetMediaResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gmrsContentType' - The content type of the requested media.
---
--- * 'gmrsResponseStatus' - -- | The response status code.
---
--- * 'gmrsPayload' - The payload Kinesis Video Streams returns is a sequence of chunks from the specified stream. For information about the chunks, see . The chunks that Kinesis Video Streams returns in the @GetMedia@ call also include the following additional Matroska (MKV) tags:      * AWS_KINESISVIDEO_CONTINUATION_TOKEN (UTF-8 string) - In the event your @GetMedia@ call terminates, you can use this continuation token in your next request to get the next chunk where the last request terminated.     * AWS_KINESISVIDEO_MILLIS_BEHIND_NOW (UTF-8 string) - Client applications can use this tag value to determine how far behind the chunk returned in the response is from the latest chunk on the stream.      * AWS_KINESISVIDEO_FRAGMENT_NUMBER - Fragment number returned in the chunk.     * AWS_KINESISVIDEO_SERVER_TIMESTAMP - Server time stamp of the fragment.     * AWS_KINESISVIDEO_PRODUCER_TIMESTAMP - Producer time stamp of the fragment. The following tags will be present if an error occurs:     * AWS_KINESISVIDEO_ERROR_CODE - String description of an error that caused GetMedia to stop.     * AWS_KINESISVIDEO_ERROR_ID: Integer code of the error. The error codes are as follows:     * 3002 - Error writing to the stream     * 4000 - Requested fragment is not found     * 4500 - Access denied for the stream's KMS key     * 4501 - Stream's KMS key is disabled     * 4502 - Validation error on the Stream's KMS key     * 4503 - KMS key specified in the stream is unavailable     * 4504 - Invalid usage of the KMS key specified in the stream     * 4505 - Invalid state of the KMS key specified in the stream     * 4506 - Unable to find the KMS key specified in the stream     * 5000 - Internal error
-getMediaResponse
-    :: Int -- ^ 'gmrsResponseStatus'
-    -> RsBody -- ^ 'gmrsPayload'
-    -> GetMediaResponse
-getMediaResponse pResponseStatus_ pPayload_ =
-  GetMediaResponse'
-    { _gmrsContentType = Nothing
-    , _gmrsResponseStatus = pResponseStatus_
-    , _gmrsPayload = pPayload_
-    }
-
-
--- | The content type of the requested media.
-gmrsContentType :: Lens' GetMediaResponse (Maybe Text)
-gmrsContentType = lens _gmrsContentType (\ s a -> s{_gmrsContentType = a})
-
--- | -- | The response status code.
-gmrsResponseStatus :: Lens' GetMediaResponse Int
-gmrsResponseStatus = lens _gmrsResponseStatus (\ s a -> s{_gmrsResponseStatus = a})
-
--- | The payload Kinesis Video Streams returns is a sequence of chunks from the specified stream. For information about the chunks, see . The chunks that Kinesis Video Streams returns in the @GetMedia@ call also include the following additional Matroska (MKV) tags:      * AWS_KINESISVIDEO_CONTINUATION_TOKEN (UTF-8 string) - In the event your @GetMedia@ call terminates, you can use this continuation token in your next request to get the next chunk where the last request terminated.     * AWS_KINESISVIDEO_MILLIS_BEHIND_NOW (UTF-8 string) - Client applications can use this tag value to determine how far behind the chunk returned in the response is from the latest chunk on the stream.      * AWS_KINESISVIDEO_FRAGMENT_NUMBER - Fragment number returned in the chunk.     * AWS_KINESISVIDEO_SERVER_TIMESTAMP - Server time stamp of the fragment.     * AWS_KINESISVIDEO_PRODUCER_TIMESTAMP - Producer time stamp of the fragment. The following tags will be present if an error occurs:     * AWS_KINESISVIDEO_ERROR_CODE - String description of an error that caused GetMedia to stop.     * AWS_KINESISVIDEO_ERROR_ID: Integer code of the error. The error codes are as follows:     * 3002 - Error writing to the stream     * 4000 - Requested fragment is not found     * 4500 - Access denied for the stream's KMS key     * 4501 - Stream's KMS key is disabled     * 4502 - Validation error on the Stream's KMS key     * 4503 - KMS key specified in the stream is unavailable     * 4504 - Invalid usage of the KMS key specified in the stream     * 4505 - Invalid state of the KMS key specified in the stream     * 4506 - Unable to find the KMS key specified in the stream     * 5000 - Internal error
-gmrsPayload :: Lens' GetMediaResponse RsBody
-gmrsPayload = lens _gmrsPayload (\ s a -> s{_gmrsPayload = a})
diff --git a/gen/Network/AWS/KinesisVideoMedia/Types.hs b/gen/Network/AWS/KinesisVideoMedia/Types.hs
deleted file mode 100644
--- a/gen/Network/AWS/KinesisVideoMedia/Types.hs
+++ /dev/null
@@ -1,134 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.KinesisVideoMedia.Types
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.KinesisVideoMedia.Types
-    (
-    -- * Service Configuration
-      kinesisVideoMedia
-
-    -- * Errors
-    , _ConnectionLimitExceededException
-    , _InvalidArgumentException
-    , _NotAuthorizedException
-    , _ClientLimitExceededException
-    , _InvalidEndpointException
-    , _ResourceNotFoundException
-
-    -- * StartSelectorType
-    , StartSelectorType (..)
-
-    -- * StartSelector
-    , StartSelector
-    , startSelector
-    , ssContinuationToken
-    , ssAfterFragmentNumber
-    , ssStartTimestamp
-    , ssStartSelectorType
-    ) where
-
-import Network.AWS.KinesisVideoMedia.Types.Product
-import Network.AWS.KinesisVideoMedia.Types.Sum
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Sign.V4
-
--- | API version @2017-09-30@ of the Amazon Kinesis Video Streams Media SDK configuration.
-kinesisVideoMedia :: Service
-kinesisVideoMedia =
-  Service
-    { _svcAbbrev = "KinesisVideoMedia"
-    , _svcSigner = v4
-    , _svcPrefix = "kinesisvideo"
-    , _svcVersion = "2017-09-30"
-    , _svcEndpoint = defaultEndpoint kinesisVideoMedia
-    , _svcTimeout = Just 70
-    , _svcCheck = statusSuccess
-    , _svcError = parseJSONError "KinesisVideoMedia"
-    , _svcRetry = retry
-    }
-  where
-    retry =
-      Exponential
-        { _retryBase = 5.0e-2
-        , _retryGrowth = 2
-        , _retryAttempts = 5
-        , _retryCheck = check
-        }
-    check e
-      | has (hasCode "ThrottledException" . hasStatus 400) e =
-        Just "throttled_exception"
-      | has (hasStatus 429) e = Just "too_many_requests"
-      | has (hasCode "ThrottlingException" . hasStatus 400) e =
-        Just "throttling_exception"
-      | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
-      | has (hasStatus 504) e = Just "gateway_timeout"
-      | has (hasCode "RequestThrottledException" . hasStatus 400) e =
-        Just "request_throttled_exception"
-      | has (hasStatus 502) e = Just "bad_gateway"
-      | has (hasStatus 503) e = Just "service_unavailable"
-      | has (hasStatus 500) e = Just "general_server_error"
-      | has (hasStatus 509) e = Just "limit_exceeded"
-      | otherwise = Nothing
-
-
--- | Kinesis Video Streams has throttled the request because you have exceeded the limit of allowed client connections.
---
---
-_ConnectionLimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
-_ConnectionLimitExceededException =
-  _MatchServiceError kinesisVideoMedia "ConnectionLimitExceededException" .
-  hasStatus 400
-
-
--- | The value for this input parameter is invalid.
---
---
-_InvalidArgumentException :: AsError a => Getting (First ServiceError) a ServiceError
-_InvalidArgumentException =
-  _MatchServiceError kinesisVideoMedia "InvalidArgumentException" .
-  hasStatus 400
-
-
--- | Status Code: 403, The caller is not authorized to perform an operation on the given stream, or the token has expired.
---
---
-_NotAuthorizedException :: AsError a => Getting (First ServiceError) a ServiceError
-_NotAuthorizedException =
-  _MatchServiceError kinesisVideoMedia "NotAuthorizedException" . hasStatus 401
-
-
--- | Kinesis Video Streams has throttled the request because you have exceeded the limit of allowed client calls. Try making the call later.
---
---
-_ClientLimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
-_ClientLimitExceededException =
-  _MatchServiceError kinesisVideoMedia "ClientLimitExceededException" .
-  hasStatus 400
-
-
--- | Status Code: 400, Caller used wrong endpoint to write data to a stream. On receiving such an exception, the user must call @GetDataEndpoint@ with @AccessMode@ set to "READ" and use the endpoint Kinesis Video returns in the next @GetMedia@ call.
---
---
-_InvalidEndpointException :: AsError a => Getting (First ServiceError) a ServiceError
-_InvalidEndpointException =
-  _MatchServiceError kinesisVideoMedia "InvalidEndpointException" .
-  hasStatus 400
-
-
--- | Status Code: 404, The stream with the given name does not exist.
---
---
-_ResourceNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_ResourceNotFoundException =
-  _MatchServiceError kinesisVideoMedia "ResourceNotFoundException" .
-  hasStatus 404
-
diff --git a/gen/Network/AWS/KinesisVideoMedia/Types/Product.hs b/gen/Network/AWS/KinesisVideoMedia/Types/Product.hs
deleted file mode 100644
--- a/gen/Network/AWS/KinesisVideoMedia/Types/Product.hs
+++ /dev/null
@@ -1,96 +0,0 @@
-{-# 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.KinesisVideoMedia.Types.Product
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.KinesisVideoMedia.Types.Product where
-
-import Network.AWS.KinesisVideoMedia.Types.Sum
-import Network.AWS.Lens
-import Network.AWS.Prelude
-
--- | Identifies the chunk on the Kinesis video stream where you want the @GetMedia@ API to start returning media data. You have the following options to identify the starting chunk:
---
---
---     * Choose the latest (or oldest) chunk.
---
---     * Identify a specific chunk. You can identify a specific chunk either by providing a fragment number or time stamp (server or producer).
---
---     * Each chunk's metadata includes a continuation token as a Matroska (MKV) tag (@AWS_KINESISVIDEO_CONTINUATION_TOKEN@ ). If your previous @GetMedia@ request terminated, you can use this tag value in your next @GetMedia@ request. The API then starts returning chunks starting where the last API ended.
---
---
---
---
--- /See:/ 'startSelector' smart constructor.
-data StartSelector = StartSelector'
-  { _ssContinuationToken   :: !(Maybe Text)
-  , _ssAfterFragmentNumber :: !(Maybe Text)
-  , _ssStartTimestamp      :: !(Maybe POSIX)
-  , _ssStartSelectorType   :: !StartSelectorType
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'StartSelector' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'ssContinuationToken' - Continuation token that Kinesis Video Streams returned in the previous @GetMedia@ response. The @GetMedia@ API then starts with the chunk identified by the continuation token.
---
--- * 'ssAfterFragmentNumber' - Specifies the fragment number from where you want the @GetMedia@ API to start returning the fragments.
---
--- * 'ssStartTimestamp' - A time stamp value. This value is required if you choose the PRODUCER_TIMESTAMP or the SERVER_TIMESTAMP as the @startSelectorType@ . The @GetMedia@ API then starts with the chunk containing the fragment that has the specified time stamp.
---
--- * 'ssStartSelectorType' - Identifies the fragment on the Kinesis video stream where you want to start getting the data from.     * NOW - Start with the latest chunk on the stream.     * EARLIEST - Start with earliest available chunk on the stream.     * FRAGMENT_NUMBER - Start with the chunk containing the specific fragment. You must also specify the @StartFragmentNumber@ .     * PRODUCER_TIMESTAMP or SERVER_TIMESTAMP - Start with the chunk containing a fragment with the specified producer or server time stamp. You specify the time stamp by adding @StartTimestamp@ .     * CONTINUATION_TOKEN - Read using the specified continuation token.
-startSelector
-    :: StartSelectorType -- ^ 'ssStartSelectorType'
-    -> StartSelector
-startSelector pStartSelectorType_ =
-  StartSelector'
-    { _ssContinuationToken = Nothing
-    , _ssAfterFragmentNumber = Nothing
-    , _ssStartTimestamp = Nothing
-    , _ssStartSelectorType = pStartSelectorType_
-    }
-
-
--- | Continuation token that Kinesis Video Streams returned in the previous @GetMedia@ response. The @GetMedia@ API then starts with the chunk identified by the continuation token.
-ssContinuationToken :: Lens' StartSelector (Maybe Text)
-ssContinuationToken = lens _ssContinuationToken (\ s a -> s{_ssContinuationToken = a})
-
--- | Specifies the fragment number from where you want the @GetMedia@ API to start returning the fragments.
-ssAfterFragmentNumber :: Lens' StartSelector (Maybe Text)
-ssAfterFragmentNumber = lens _ssAfterFragmentNumber (\ s a -> s{_ssAfterFragmentNumber = a})
-
--- | A time stamp value. This value is required if you choose the PRODUCER_TIMESTAMP or the SERVER_TIMESTAMP as the @startSelectorType@ . The @GetMedia@ API then starts with the chunk containing the fragment that has the specified time stamp.
-ssStartTimestamp :: Lens' StartSelector (Maybe UTCTime)
-ssStartTimestamp = lens _ssStartTimestamp (\ s a -> s{_ssStartTimestamp = a}) . mapping _Time
-
--- | Identifies the fragment on the Kinesis video stream where you want to start getting the data from.     * NOW - Start with the latest chunk on the stream.     * EARLIEST - Start with earliest available chunk on the stream.     * FRAGMENT_NUMBER - Start with the chunk containing the specific fragment. You must also specify the @StartFragmentNumber@ .     * PRODUCER_TIMESTAMP or SERVER_TIMESTAMP - Start with the chunk containing a fragment with the specified producer or server time stamp. You specify the time stamp by adding @StartTimestamp@ .     * CONTINUATION_TOKEN - Read using the specified continuation token.
-ssStartSelectorType :: Lens' StartSelector StartSelectorType
-ssStartSelectorType = lens _ssStartSelectorType (\ s a -> s{_ssStartSelectorType = a})
-
-instance Hashable StartSelector where
-
-instance NFData StartSelector where
-
-instance ToJSON StartSelector where
-        toJSON StartSelector'{..}
-          = object
-              (catMaybes
-                 [("ContinuationToken" .=) <$> _ssContinuationToken,
-                  ("AfterFragmentNumber" .=) <$>
-                    _ssAfterFragmentNumber,
-                  ("StartTimestamp" .=) <$> _ssStartTimestamp,
-                  Just ("StartSelectorType" .= _ssStartSelectorType)])
diff --git a/gen/Network/AWS/KinesisVideoMedia/Types/Sum.hs b/gen/Network/AWS/KinesisVideoMedia/Types/Sum.hs
deleted file mode 100644
--- a/gen/Network/AWS/KinesisVideoMedia/Types/Sum.hs
+++ /dev/null
@@ -1,59 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE LambdaCase         #-}
-{-# LANGUAGE OverloadedStrings  #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.KinesisVideoMedia.Types.Sum
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.KinesisVideoMedia.Types.Sum where
-
-import Network.AWS.Prelude
-
-data StartSelectorType
-  = ContinuationToken
-  | Earliest
-  | FragmentNumber
-  | Now
-  | ProducerTimestamp
-  | ServerTimestamp
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText StartSelectorType where
-    parser = takeLowerText >>= \case
-        "continuation_token" -> pure ContinuationToken
-        "earliest" -> pure Earliest
-        "fragment_number" -> pure FragmentNumber
-        "now" -> pure Now
-        "producer_timestamp" -> pure ProducerTimestamp
-        "server_timestamp" -> pure ServerTimestamp
-        e -> fromTextError $ "Failure parsing StartSelectorType from value: '" <> e
-           <> "'. Accepted values: continuation_token, earliest, fragment_number, now, producer_timestamp, server_timestamp"
-
-instance ToText StartSelectorType where
-    toText = \case
-        ContinuationToken -> "CONTINUATION_TOKEN"
-        Earliest -> "EARLIEST"
-        FragmentNumber -> "FRAGMENT_NUMBER"
-        Now -> "NOW"
-        ProducerTimestamp -> "PRODUCER_TIMESTAMP"
-        ServerTimestamp -> "SERVER_TIMESTAMP"
-
-instance Hashable     StartSelectorType
-instance NFData       StartSelectorType
-instance ToByteString StartSelectorType
-instance ToQuery      StartSelectorType
-instance ToHeader     StartSelectorType
-
-instance ToJSON StartSelectorType where
-    toJSON = toJSONText
diff --git a/gen/Network/AWS/KinesisVideoMedia/Waiters.hs b/gen/Network/AWS/KinesisVideoMedia/Waiters.hs
deleted file mode 100644
--- a/gen/Network/AWS/KinesisVideoMedia/Waiters.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies      #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.KinesisVideoMedia.Waiters
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.KinesisVideoMedia.Waiters where
-
-import Network.AWS.KinesisVideoMedia.Types
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Waiter
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,20 +2,22 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2018 Brendan Hay
+-- Copyright   : (c) 2013-2023 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Maintainer  : Brendan Hay
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
---
 module Main (main) where
 
+import Test.Amazonka.KinesisVideoMedia
+import Test.Amazonka.KinesisVideoMedia.Internal
 import Test.Tasty
-import Test.AWS.KinesisVideoMedia
-import Test.AWS.KinesisVideoMedia.Internal
 
 main :: IO ()
-main = defaultMain $ testGroup "KinesisVideoMedia"
-    [ testGroup "tests"    tests
-    , testGroup "fixtures" fixtures
-    ]
+main =
+  defaultMain $
+    testGroup
+      "KinesisVideoMedia"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/AWS/Gen/KinesisVideoMedia.hs b/test/Test/AWS/Gen/KinesisVideoMedia.hs
deleted file mode 100644
--- a/test/Test/AWS/Gen/KinesisVideoMedia.hs
+++ /dev/null
@@ -1,50 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-orphans        #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Test.AWS.Gen.KinesisVideoMedia
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.Gen.KinesisVideoMedia where
-
-import Data.Proxy
-import Network.AWS.KinesisVideoMedia
-import Test.AWS.Fixture
-import Test.AWS.KinesisVideoMedia.Internal
-import Test.AWS.Prelude
-import Test.Tasty
-
--- Auto-generated: the actual test selection needs to be manually placed into
--- the top-level so that real test data can be incrementally added.
---
--- This commented snippet is what the entire set should look like:
-
--- fixtures :: TestTree
--- fixtures =
---     [ testGroup "request"
---         [ requestGetMedia $
---             getMedia
---
---           ]
-
---     , testGroup "response"
---         [ responseGetMedia $
---             getMediaResponse
---
---           ]
---     ]
-
--- Requests
-
-requestGetMedia :: GetMedia -> TestTree
-requestGetMedia = req
-    "GetMedia"
-    "fixture/GetMedia.yaml"
-
--- Responses
diff --git a/test/Test/AWS/KinesisVideoMedia.hs b/test/Test/AWS/KinesisVideoMedia.hs
deleted file mode 100644
--- a/test/Test/AWS/KinesisVideoMedia.hs
+++ /dev/null
@@ -1,20 +0,0 @@
--- |
--- Module      : Test.AWS.KinesisVideoMedia
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.KinesisVideoMedia
-    ( tests
-    , fixtures
-    ) where
-
-import Test.Tasty (TestTree)
-
-tests :: [TestTree]
-tests = []
-
-fixtures :: [TestTree]
-fixtures = []
diff --git a/test/Test/AWS/KinesisVideoMedia/Internal.hs b/test/Test/AWS/KinesisVideoMedia/Internal.hs
deleted file mode 100644
--- a/test/Test/AWS/KinesisVideoMedia/Internal.hs
+++ /dev/null
@@ -1,9 +0,0 @@
--- |
--- Module      : Test.AWS.KinesisVideoMedia.Internal
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.KinesisVideoMedia.Internal where
diff --git a/test/Test/Amazonka/Gen/KinesisVideoMedia.hs b/test/Test/Amazonka/Gen/KinesisVideoMedia.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/KinesisVideoMedia.hs
@@ -0,0 +1,50 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.KinesisVideoMedia
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.KinesisVideoMedia where
+
+import Amazonka.KinesisVideoMedia
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.KinesisVideoMedia.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestGetMedia $
+--             newGetMedia
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseGetMedia $
+--             newGetMediaResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestGetMedia :: GetMedia -> TestTree
+requestGetMedia =
+  req
+    "GetMedia"
+    "fixture/GetMedia.yaml"
+
+-- Responses
diff --git a/test/Test/Amazonka/KinesisVideoMedia.hs b/test/Test/Amazonka/KinesisVideoMedia.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/KinesisVideoMedia.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.KinesisVideoMedia
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.KinesisVideoMedia
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/KinesisVideoMedia/Internal.hs b/test/Test/Amazonka/KinesisVideoMedia/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/KinesisVideoMedia/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.KinesisVideoMedia.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.KinesisVideoMedia.Internal where
