packages feed

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
        ]