module Spotify.Types.Tracks where

import Spotify.Types.Internal.CustomJSON
import Spotify.Types.Internal.EnumJSON
import Spotify.Types.Misc
import Spotify.Types.Simple

import Data.Aeson (FromJSON)
import Data.Text (Text)
import GHC.Generics (Generic)

data Track = Track
    { Track -> AlbumSimple
album :: AlbumSimple
    , Track -> [ArtistSimple]
artists :: [ArtistSimple]
    , Track -> Maybe [Text]
availableMarkets :: Maybe [Text]
    , Track -> Int
discNumber :: Int
    , Track -> Int
durationMs :: Int
    , Track -> Bool
explicit :: Bool
    , Track -> ExternalIDs
externalIds :: ExternalIDs
    , Track -> ExternalURLs
externalUrls :: ExternalURLs
    , Track -> Href
href :: Href
    , Track -> TrackID
id :: TrackID
    , Track -> Maybe Bool
isPlayable :: Maybe Bool
    , Track -> Maybe TrackLink
linkedFrom :: Maybe TrackLink
    , Track -> Maybe Restrictions
restrictions :: Maybe Restrictions
    , Track -> Text
name :: Text
    , Track -> Int
popularity :: Int
    , Track -> Maybe Text
previewUrl :: Maybe Text
    , Track -> Int
trackNumber :: Int
    , Track -> URI
uri :: URI
    }
    deriving (Track -> Track -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Track -> Track -> Bool
$c/= :: Track -> Track -> Bool
== :: Track -> Track -> Bool
$c== :: Track -> Track -> Bool
Eq, Eq Track
Track -> Track -> Bool
Track -> Track -> Ordering
Track -> Track -> Track
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Track -> Track -> Track
$cmin :: Track -> Track -> Track
max :: Track -> Track -> Track
$cmax :: Track -> Track -> Track
>= :: Track -> Track -> Bool
$c>= :: Track -> Track -> Bool
> :: Track -> Track -> Bool
$c> :: Track -> Track -> Bool
<= :: Track -> Track -> Bool
$c<= :: Track -> Track -> Bool
< :: Track -> Track -> Bool
$c< :: Track -> Track -> Bool
compare :: Track -> Track -> Ordering
$ccompare :: Track -> Track -> Ordering
Ord, Int -> Track -> ShowS
[Track] -> ShowS
Track -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Track] -> ShowS
$cshowList :: [Track] -> ShowS
show :: Track -> String
$cshow :: Track -> String
showsPrec :: Int -> Track -> ShowS
$cshowsPrec :: Int -> Track -> ShowS
Show, forall x. Rep Track x -> Track
forall x. Track -> Rep Track x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Track x -> Track
$cfrom :: forall x. Track -> Rep Track x
Generic)
    deriving (Value -> Parser [Track]
Value -> Parser Track
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Track]
$cparseJSONList :: Value -> Parser [Track]
parseJSON :: Value -> Parser Track
$cparseJSON :: Value -> Parser Track
FromJSON) via CustomJSON Track

data AudioFeatures = AudioFeatures
    { AudioFeatures -> Float
acousticness :: Float
    , AudioFeatures -> URL
analysisUrl :: URL
    , AudioFeatures -> Float
danceability :: Float
    , AudioFeatures -> Int
durationMs :: Int
    , AudioFeatures -> Float
energy :: Float
    , AudioFeatures -> TrackID
id :: TrackID
    , AudioFeatures -> Float
instrumentalness :: Float
    , AudioFeatures -> Key
key :: Key
    , AudioFeatures -> Float
liveness :: Float
    , AudioFeatures -> Float
loudness :: Float
    , AudioFeatures -> Modality
mode :: Modality
    , AudioFeatures -> Float
speechiness :: Float
    , AudioFeatures -> Float
tempo :: Float
    , AudioFeatures -> Int
timeSignature :: Int
    , AudioFeatures -> Href
trackHref :: Href
    , AudioFeatures -> URI
uri :: URI
    , AudioFeatures -> Float
valence :: Float
    }
    deriving (AudioFeatures -> AudioFeatures -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AudioFeatures -> AudioFeatures -> Bool
$c/= :: AudioFeatures -> AudioFeatures -> Bool
== :: AudioFeatures -> AudioFeatures -> Bool
$c== :: AudioFeatures -> AudioFeatures -> Bool
Eq, Eq AudioFeatures
AudioFeatures -> AudioFeatures -> Bool
AudioFeatures -> AudioFeatures -> Ordering
AudioFeatures -> AudioFeatures -> AudioFeatures
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AudioFeatures -> AudioFeatures -> AudioFeatures
$cmin :: AudioFeatures -> AudioFeatures -> AudioFeatures
max :: AudioFeatures -> AudioFeatures -> AudioFeatures
$cmax :: AudioFeatures -> AudioFeatures -> AudioFeatures
>= :: AudioFeatures -> AudioFeatures -> Bool
$c>= :: AudioFeatures -> AudioFeatures -> Bool
> :: AudioFeatures -> AudioFeatures -> Bool
$c> :: AudioFeatures -> AudioFeatures -> Bool
<= :: AudioFeatures -> AudioFeatures -> Bool
$c<= :: AudioFeatures -> AudioFeatures -> Bool
< :: AudioFeatures -> AudioFeatures -> Bool
$c< :: AudioFeatures -> AudioFeatures -> Bool
compare :: AudioFeatures -> AudioFeatures -> Ordering
$ccompare :: AudioFeatures -> AudioFeatures -> Ordering
Ord, Int -> AudioFeatures -> ShowS
[AudioFeatures] -> ShowS
AudioFeatures -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AudioFeatures] -> ShowS
$cshowList :: [AudioFeatures] -> ShowS
show :: AudioFeatures -> String
$cshow :: AudioFeatures -> String
showsPrec :: Int -> AudioFeatures -> ShowS
$cshowsPrec :: Int -> AudioFeatures -> ShowS
Show, forall x. Rep AudioFeatures x -> AudioFeatures
forall x. AudioFeatures -> Rep AudioFeatures x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AudioFeatures x -> AudioFeatures
$cfrom :: forall x. AudioFeatures -> Rep AudioFeatures x
Generic)
    deriving (Value -> Parser [AudioFeatures]
Value -> Parser AudioFeatures
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [AudioFeatures]
$cparseJSONList :: Value -> Parser [AudioFeatures]
parseJSON :: Value -> Parser AudioFeatures
$cparseJSON :: Value -> Parser AudioFeatures
FromJSON) via CustomJSON AudioFeatures

data Modality
    = Minor
    | Major
    deriving (Modality -> Modality -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Modality -> Modality -> Bool
$c/= :: Modality -> Modality -> Bool
== :: Modality -> Modality -> Bool
$c== :: Modality -> Modality -> Bool
Eq, Eq Modality
Modality -> Modality -> Bool
Modality -> Modality -> Ordering
Modality -> Modality -> Modality
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Modality -> Modality -> Modality
$cmin :: Modality -> Modality -> Modality
max :: Modality -> Modality -> Modality
$cmax :: Modality -> Modality -> Modality
>= :: Modality -> Modality -> Bool
$c>= :: Modality -> Modality -> Bool
> :: Modality -> Modality -> Bool
$c> :: Modality -> Modality -> Bool
<= :: Modality -> Modality -> Bool
$c<= :: Modality -> Modality -> Bool
< :: Modality -> Modality -> Bool
$c< :: Modality -> Modality -> Bool
compare :: Modality -> Modality -> Ordering
$ccompare :: Modality -> Modality -> Ordering
Ord, Int -> Modality -> ShowS
[Modality] -> ShowS
Modality -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Modality] -> ShowS
$cshowList :: [Modality] -> ShowS
show :: Modality -> String
$cshow :: Modality -> String
showsPrec :: Int -> Modality -> ShowS
$cshowsPrec :: Int -> Modality -> ShowS
Show, forall x. Rep Modality x -> Modality
forall x. Modality -> Rep Modality x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Modality x -> Modality
$cfrom :: forall x. Modality -> Rep Modality x
Generic, Int -> Modality
Modality -> Int
Modality -> [Modality]
Modality -> Modality
Modality -> Modality -> [Modality]
Modality -> Modality -> Modality -> [Modality]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Modality -> Modality -> Modality -> [Modality]
$cenumFromThenTo :: Modality -> Modality -> Modality -> [Modality]
enumFromTo :: Modality -> Modality -> [Modality]
$cenumFromTo :: Modality -> Modality -> [Modality]
enumFromThen :: Modality -> Modality -> [Modality]
$cenumFromThen :: Modality -> Modality -> [Modality]
enumFrom :: Modality -> [Modality]
$cenumFrom :: Modality -> [Modality]
fromEnum :: Modality -> Int
$cfromEnum :: Modality -> Int
toEnum :: Int -> Modality
$ctoEnum :: Int -> Modality
pred :: Modality -> Modality
$cpred :: Modality -> Modality
succ :: Modality -> Modality
$csucc :: Modality -> Modality
Enum)
    deriving (Value -> Parser [Modality]
Value -> Parser Modality
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Modality]
$cparseJSONList :: Value -> Parser [Modality]
parseJSON :: Value -> Parser Modality
$cparseJSON :: Value -> Parser Modality
FromJSON) via EnumJSON Modality

data SavedTrack = SavedTrack
    { SavedTrack -> Text
addedAt :: Text
    , SavedTrack -> Track
track :: Track
    }
    deriving (SavedTrack -> SavedTrack -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SavedTrack -> SavedTrack -> Bool
$c/= :: SavedTrack -> SavedTrack -> Bool
== :: SavedTrack -> SavedTrack -> Bool
$c== :: SavedTrack -> SavedTrack -> Bool
Eq, Eq SavedTrack
SavedTrack -> SavedTrack -> Bool
SavedTrack -> SavedTrack -> Ordering
SavedTrack -> SavedTrack -> SavedTrack
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SavedTrack -> SavedTrack -> SavedTrack
$cmin :: SavedTrack -> SavedTrack -> SavedTrack
max :: SavedTrack -> SavedTrack -> SavedTrack
$cmax :: SavedTrack -> SavedTrack -> SavedTrack
>= :: SavedTrack -> SavedTrack -> Bool
$c>= :: SavedTrack -> SavedTrack -> Bool
> :: SavedTrack -> SavedTrack -> Bool
$c> :: SavedTrack -> SavedTrack -> Bool
<= :: SavedTrack -> SavedTrack -> Bool
$c<= :: SavedTrack -> SavedTrack -> Bool
< :: SavedTrack -> SavedTrack -> Bool
$c< :: SavedTrack -> SavedTrack -> Bool
compare :: SavedTrack -> SavedTrack -> Ordering
$ccompare :: SavedTrack -> SavedTrack -> Ordering
Ord, Int -> SavedTrack -> ShowS
[SavedTrack] -> ShowS
SavedTrack -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SavedTrack] -> ShowS
$cshowList :: [SavedTrack] -> ShowS
show :: SavedTrack -> String
$cshow :: SavedTrack -> String
showsPrec :: Int -> SavedTrack -> ShowS
$cshowsPrec :: Int -> SavedTrack -> ShowS
Show, forall x. Rep SavedTrack x -> SavedTrack
forall x. SavedTrack -> Rep SavedTrack x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SavedTrack x -> SavedTrack
$cfrom :: forall x. SavedTrack -> Rep SavedTrack x
Generic)
    deriving (Value -> Parser [SavedTrack]
Value -> Parser SavedTrack
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [SavedTrack]
$cparseJSONList :: Value -> Parser [SavedTrack]
parseJSON :: Value -> Parser SavedTrack
$cparseJSON :: Value -> Parser SavedTrack
FromJSON) via CustomJSON SavedTrack