53 lines
1.5 KiB
Haskell
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
|