module Network.API.TheMovieDB.Types.Movie
(MovieID, Movie(..), moviePosterURLs) where
import Control.Applicative
import Control.Monad (liftM)
import Data.Aeson
import Data.Aeson.Types (typeMismatch)
import Data.Time (Day(..))
import Network.API.TheMovieDB.Types.Configuration (Configuration(..))
import Network.API.TheMovieDB.Types.Genre (Genre(..))
import Network.API.TheMovieDB.Types.ReleaseDate (ReleaseDate(..))
type MovieID = Int
data Movie = Movie
{ movieID :: MovieID
, movieTitle :: String
, movieOverview :: String
, movieGenres :: [Genre]
, moviePopularity :: Double
, moviePosterPath :: String
, movieReleaseDate :: Day
, movieAdult :: Bool
, movieIMDB :: String
, movieRunTime :: Int
} deriving (Eq, Show)
instance FromJSON Movie where
parseJSON (Object v) =
Movie <$> v .: "id"
<*> v .: "title"
<*> v .:? "overview" .!= ""
<*> v .:? "genres" .!= []
<*> v .:? "popularity" .!= 0.0
<*> v .:? "poster_path" .!= ""
<*> liftM releaseDate (v .: "release_date")
<*> v .:? "adult" .!= False
<*> v .:? "imdb_id" .!= ""
<*> v .:? "runtime" .!= 0
parseJSON _ = empty
moviePosterURLs :: Configuration -> Movie -> [String]
moviePosterURLs c m = [base ++ size ++ poster | size <- cfgPosterSizes c]
where base = cfgImageBaseURL c
poster = moviePosterPath m