viddl/src/Helpers.hs

53 lines
1.5 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
module Helpers where
import YTDL
import Config
import Text.Read (readMaybe)
import qualified Data.Text.Lazy as TL
import Network.URI
import System.Exit
parseArgs :: ViddlConfig -> [String] -> IO ViddlConfig
parseArgs _ ("-h":_) = exitHelp
parseArgs _ ("--help":_) = exitHelp
parseArgs cfg@(ViddlConfig _ d) ("-p":p':xs) = case (readMaybe p' :: Maybe Int) of
(Just p) -> parseArgs (ViddlConfig p d) xs
Nothing -> parseArgs cfg (p':xs)
parseArgs (ViddlConfig p _) ("-d":d:xs) = parseArgs (ViddlConfig p d) xs
parseArgs cfg (_:xs) = parseArgs cfg xs
parseArgs cfg [] = pure cfg
exitHelp :: IO a
exitHelp = putStrLn "viddl [-p port] [-d dir]" >> exitSuccess
getRes :: TL.Text -> Maybe Resolution
getRes ("144p") = Just P144
getRes ("240p") = Just P240
getRes ("360p") = Just P360
getRes ("480p") = Just P480
getRes ("720p") = Just P720
getRes ("1080p") = Just P1080
getRes ("max") = Just PMAX
getRes ("audio") = Just Audio
getRes _ = Nothing
isRes :: TL.Text -> Bool
isRes res = case getRes res of
(Just _) -> True
_ -> False
-- ssrf paranoia
isOkPath :: String -> Bool
isOkPath p = not $ isIPv4address p || isIPv6address p || p == "localhost"
isURL :: TL.Text -> Bool
isURL uri = case parseURI (TL.unpack uri) of
(Just u) -> case uriAuthority u of
(Just (URIAuth _ p _)) -> isOkPath p
_ -> False
_ -> False