From b23a69df75b5fbe3012c6d7457cbe9c5dd7e5e15 Mon Sep 17 00:00:00 2001 From: senstella Date: Mon, 3 Nov 2025 21:15:22 +0900 Subject: [PATCH] first commit --- .gitignore | 2 + CHANGELOG.md | 5 ++ LICENSE | 29 ++++++++++++ app/Main.hs | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++ popcorn.cabal | 63 ++++++++++++++++++++++++++ 5 files changed, 222 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 app/Main.hs create mode 100644 popcorn.cabal diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6ed33dc --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +dist-newstyle +.zed diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5c73961 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for popcorn + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dd4f492 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +Copyright (c) 2025, starsoverme + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..5a78810 --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,123 @@ +{-# 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!" diff --git a/popcorn.cabal b/popcorn.cabal new file mode 100644 index 0000000..ac5ae21 --- /dev/null +++ b/popcorn.cabal @@ -0,0 +1,63 @@ +cabal-version: 3.0 +-- The cabal-version field refers to the version of the .cabal specification, +-- and can be different from the cabal-install (the tool) version and the +-- Cabal (the library) version you are using. As such, the Cabal (the library) +-- version used must be equal or greater than the version stated in this field. +-- Starting from the specification version 2.2, the cabal-version field must be +-- the first thing in the cabal file. +-- Initial package description 'popcorn' generated by +-- 'cabal init'. For further documentation, see: +-- http://haskell.org/cabal/users-guide/ +-- +-- The name of the package. +name: popcorn +-- The package version. +-- See the Haskell package versioning policy (PVP) for standards +-- guiding when and how versions should be incremented. +-- https://pvp.haskell.org +-- PVP summary: +-+------- breaking API changes +-- | | +----- non-breaking API additions +-- | | | +--- code changes with no API change +version: 0.1.0.0 +-- A short (one-line) description of the package. +-- synopsis: +-- A longer description of the package. +-- description: +-- The license under which the package is released. +license: BSD-3-Clause +-- The file containing the license text. +license-file: LICENSE +-- The package author(s). +author: starsoverme +-- An email address to which users can send suggestions, bug reports, and patches. +maintainer: starsoverme@example.com +-- A copyright notice. +-- copyright: +build-type: Simple +-- Extra doc files to be distributed with the package, such as a CHANGELOG or a README. +extra-doc-files: CHANGELOG.md + +-- Extra source files to be distributed with the package, such as examples, or a tutorial module. +-- extra-source-files: +common warnings + ghc-options: -Wall + +executable popcorn + -- Import common warning flags. + import: warnings + -- .hs or .lhs file containing the Main module. + main-is: Main.hs + -- Modules included in this executable, other than Main. + -- other-modules: + -- LANGUAGE extensions used by modules in this package. + -- other-extensions: + -- Other library packages from which modules are imported. + build-depends: + aeson, + base ^>=4.17.2.1, + time, + + -- Directories containing source files. + hs-source-dirs: app + -- Base language which the package is written in. + default-language: Haskell2010