module IsoHunt.Item(
Item(..),
) where
import GHC.Generics
import Control.Applicative
import Data.Aeson
import qualified Data.HashMap.Strict as H
import Data.Text
import Data.Typeable
data Item
= Item {
title :: Text,
link :: Text,
guid :: Text,
enclosureUrl :: Text,
length :: Integer,
tracker :: Text,
trackerUrl :: Text,
kws :: Text,
exempts :: Text,
category :: Text,
originalSite :: Text,
originalLink :: Text,
size :: Text,
files :: Integer,
seeds :: Maybe Integer,
leechers :: Maybe Integer,
downloads :: Maybe Integer,
votes :: Integer,
comments :: Integer,
hash :: Text,
pubDate :: Text
} deriving (Generic, Eq, Show, Ord, Typeable)
instance FromJSON Item where
parseJSON (Object v) =
Item <$>
v .: "title" <*>
v .: "link" <*>
v .: "guid" <*>
v .: "enclosure_url" <*>
v .: "length" <*>
v .: "tracker" <*>
v .: "tracker_url" <*>
v .: "kws" <*>
v .: "exempts" <*>
v .: "category" <*>
v .: "original_site" <*>
v .: "original_link" <*>
v .: "size" <*>
v .: "files" <*>
int v "Seeds" <*>
int v "leechers" <*>
int v "downloads" <*>
v .: "votes" <*>
v .: "comments" <*>
v .: "hash" <*>
v .: "pubDate"
int obj key = case H.lookup key obj of
Nothing -> fail $ "key " ++ show key ++ " not present"
Just (Number v) -> pure (Just $ floor v)
Just _ -> pure Nothing