{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE GADTs #-} module Main where import Data.Aeson import Data.Time import GHC.Generics data ContentType = Movie | Series | Channel | Tv deriving (Show, Eq, Generic, FromJSON, ToJSON) newtype ID = ID String deriving (Show, Eq, Generic, FromJSON, ToJSON) newtype IDPrefix = IDPrefix String deriving (Show, Eq, Generic, FromJSON, ToJSON) newtype Url = Url String deriving (Show, Eq, Generic, FromJSON, ToJSON) data ImageShape = Square | Poster | Landscape deriving (Show, Eq, Generic, FromJSON, ToJSON) data YearInfo = Single Int | Range Int Int deriving (Show, Eq, Generic, FromJSON, ToJSON) data Trailer = Trailer String | Clip String deriving (Show, Eq, Generic, FromJSON, ToJSON) data MetaLink = MetaLink { name :: String, category :: [String], url :: Url } deriving (Show, Generic, FromJSON, ToJSON) data Stream = UrlStream Url | YoutubeStream Url | TorrentStream | ExternalStream MetaLink deriving (Show, Generic, FromJSON, ToJSON) data Video = Video { id :: ID, title :: String, released :: UTCTime, thumbnail :: Maybe Url, streams :: Maybe [Stream], available :: Maybe Bool, -- or maybe just bool is fine episode :: Maybe Int, season :: Maybe Int, trailers :: Maybe [Stream], overview :: Maybe String } deriving (Show, Generic, FromJSON, ToJSON) data Feature = Search { required :: Bool, options :: Maybe [IDPrefix], optionsLimit :: Maybe Int } | Genre { required :: Bool, options :: Maybe [IDPrefix], optionsLimit :: Maybe Int } | Skip deriving (Show, Generic, FromJSON, ToJSON) data Resource a where MetaResource :: { metaTypes :: [ContentType], metaIdPrefix :: [IDPrefix] } -> Resource MetaData CatalogResource :: { catalogTypes :: [ContentType], catalogIdPrefix :: [IDPrefix], catalogExtra :: [Feature] } -> Resource Catalog StreamResource :: { streamTypes :: [ContentType], streamIdPrefix :: [IDPrefix] } -> Resource Stream SubtitleResource :: { subtitleTypes :: [ContentType], subtitleIdPrefix :: [IDPrefix] } -> Resource Subtitle data MetaData = Meta { id :: ID, contentType :: ContentType, name :: String, genres :: Maybe [String], poster :: Maybe Url, posterShape :: Maybe ImageShape, background :: Maybe Url, logo :: Maybe Url, description :: Maybe String, releaseInfo :: Maybe YearInfo, director :: Maybe [String], cast :: Maybe [String], imdbRating :: Maybe Float, released :: Maybe UTCTime, trailers :: Maybe [Trailer], links :: Maybe [MetaLink], video :: Maybe [Video], runtime :: Maybe String, language :: Maybe String, country :: Maybe String, awards :: Maybe String, website :: Maybe Url } deriving (Show, Generic, FromJSON, ToJSON) data Catalog = Catalog {} data Subtitle = Subtitle {} main :: IO () main = putStrLn "Hello, Haskell!"