Files
popcorn/app/Main.hs
2025-11-03 21:15:22 +09:00

124 lines
3.0 KiB
Haskell

{-# 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!"