lrclib-client-0.3.1: src/LrcLib/Types.hs
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
module LrcLib.Types
( API,
SearchResponse,
Challenge (..),
GetError (..),
TrackData (..),
SearchQuery (..),
PublishError (..),
PublishToken,
PublishRequest (..),
)
where
import Control.Monad.Reader (ReaderT)
import Data.Aeson qualified as A
import Data.Text (Text)
import Data.Text qualified as T
import GHC.Generics (Generic)
import Network.HTTP.Client (Request)
-- | Monad for API actions that includes API url (as a base request)
type API = ReaderT Request IO
-- | Crypto proof-of-work challenge for publish
data Challenge
= Challenge
{ prefix :: Text,
target :: Text
}
deriving (A.FromJSON, Generic, Eq, Show, Read)
-- | Track data that is accepted when getting lyrics
data TrackData
= TrackData
{ id :: Integer,
trackName :: Text,
artistName :: Text,
albumName :: Text,
duration :: Float,
instrumental :: Bool,
plainLyrics :: Maybe Text,
syncedLyrics :: Maybe Text
}
deriving (A.FromJSON, Generic, Eq, Read)
-- | Error when getting lyrics
data GetError = NotFound
deriving (Generic, A.FromJSON, Show)
type PublishToken = Text
-- | Representation of request for publishing lyrics
data PublishRequest
= PublishRequest
{ trackName :: Text,
artistName :: Text,
albumName :: Text,
duration :: Float,
plainLyrics :: Text,
syncedLyrics :: Text
}
deriving (Generic, A.ToJSON)
-- | Error when publishing lyrics
data PublishError = IncorrectToken
-- | Query for search. Either text or track+artist+album
data SearchQuery
= TextQuery Text
| TrackQuery
{ track :: Text,
artist :: Maybe Text,
album :: Maybe Text
}
-- | Response when searching lyrics
type SearchResponse = [TrackData]
instance Show TrackData where
show track =
T.unpack $
T.concat
[ "Track, id: ",
T.show track.id,
", name: ",
track.trackName,
", artist: ",
track.artistName,
", album: ",
track.albumName
]