{-# LANGUAGE OverloadedStrings #-}
module AcousticBrainz.MetaData where
import AcousticBrainz.Version
import Data.Aeson
import Data.Aeson.Types
import Data.Scientific
data MetaData = MetaData
{ _audioProperties :: AudioProperties
, _tags :: Tags
, _version :: Version
} deriving(Eq, Read, Show)
data AudioProperties = AudioProperties
{ _analysisSampleRate :: Natural
, _bitRate :: Natural
, _codec :: Text
, _downmix :: Text
, _equalLoudness :: Natural
, _length :: Scientific
, _lossless :: Bool
, _md5Encoded :: Text
, _replayGain :: Scientific
, _sampleRate :: Natural
} deriving(Eq, Ord, Read, Show)
instance FromJSON AudioProperties where
parseJSON = withObject "audio_properties" $ \v -> AudioProperties
<$> v .: "analysis_sample_rate"
<*> v .: "bit_rate"
<*> v .: "codec"
<*> v .: "downmix"
<*> v .: "equal_loudness"
<*> v .: "length"
<*> ((int2bool <$> v .: "lossless") <|> v .: "lossless")
<*> v .: "md5_encoded"
<*> v .: "replay_gain"
<*> v .: "sample_rate"
where int2bool :: Int -> Bool
int2bool 0 = False
int2bool _ = True
newtype Tags = Tags (HashMap Text Value) deriving(Eq, Read, Show)
instance FromJSON Tags where
parseJSON = withObject "tags" $ pure . Tags