{- Gifcurry (C) 2016 David Lettier lettier.com -} {-# LANGUAGE DeriveDataTypeable , NamedFieldPuns #-} {-# OPTIONS_GHC -fno-cse #-} import Control.Monad import System.Console.CmdArgs import qualified Gifcurry data CliArgs = CliArgs { input_file :: String , output_file :: String , save_as_video :: Bool , start_time :: Float , duration_time :: Float , width_size :: Int , quality_percent :: Float , font_choice :: String , top_text :: String , bottom_text :: String , left_crop :: Float , right_crop :: Float , top_crop :: Float , bottom_crop :: Float } deriving (Data, Typeable, Show, Eq) programName :: String programName = "gifcurry_cli" info :: String info = unlines [ logo , "Gifcurry" ++ " " ++ Gifcurry.versionNumber , "(C) 2016 David Lettier" ,"lettier.com" ] cliArgs :: CliArgs cliArgs = CliArgs { input_file = "" &= groupname "FILE IO" &= typFile &= help "The input video file path and name." , output_file = "" &= groupname "FILE IO" &= typFile &= help "The output GIF file path and name." , save_as_video = False &= groupname "FILE IO" &= name "m" &= help "If present, saves the GIF as a video." , start_time = 0.0 &= groupname "TIME" &= name "s" &= help "The start time (in seconds) for the first frame." , duration_time = 1.0 &= groupname "TIME" &= help "How long the GIF lasts (in seconds) from the start time." , width_size = 500 &= groupname "OUTPUT FILE SIZE" &= help "How wide the GIF needs to be. Height will scale to match." , quality_percent = 100.0 &= groupname "OUTPUT FILE SIZE" &= help ( "From 1 (very low quality) to 100 (the best quality). " ++ "Controls how many colors are used and how many frames per second there are." ) , font_choice = Gifcurry.defaultFontChoice &= groupname "TEXT" &= typ "TEXT" &= help "Choose your desired font for the top and bottom text." , top_text = "" &= groupname "TEXT" &= typ "TEXT" &= name "t" &= help "The text you wish to add to the top of the GIF." , bottom_text = "" &= groupname "TEXT" &= typ "TEXT" &= name "b" &= help "The text you wish to add to the bottom of the GIF." , left_crop = 0.0 &= groupname "CROP" &= name "L" &= help "The amount you wish to crop from the left." , right_crop = 0.0 &= groupname "CROP" &= name "R" &= help "The amount you wish to crop from the right." , top_crop = 0.0 &= groupname "CROP" &= name "T" &= help "The amount you wish to crop from the top." , bottom_crop = 0.0 &= groupname "CROP" &= name "B" &= help "The amount you wish to crop from the bottom." } &= summary info &= program programName &= details ["Visit https://github.com/lettier/gifcurry for more information.", ""] main :: IO () main = do cliArgs' <- cmdArgs cliArgs let params = makeGifParams cliArgs' putStrLn info paramsValid <- Gifcurry.gifParamsValid params if paramsValid then void $ Gifcurry.gif params else putStrLn $ "[INFO] Type \"" ++ programName ++ " -?\" for help." return () makeGifParams :: CliArgs -> Gifcurry.GifParams makeGifParams CliArgs { input_file , output_file , save_as_video , start_time , duration_time , width_size , quality_percent , font_choice , top_text , bottom_text , left_crop , right_crop , top_crop , bottom_crop } = Gifcurry.GifParams { Gifcurry.inputFile = input_file , Gifcurry.outputFile = output_file , Gifcurry.saveAsVideo = save_as_video , Gifcurry.startTime = start_time , Gifcurry.durationTime = duration_time , Gifcurry.widthSize = width_size , Gifcurry.qualityPercent = quality_percent , Gifcurry.fontChoice = font_choice , Gifcurry.topText = top_text , Gifcurry.bottomText = bottom_text , Gifcurry.leftCrop = left_crop , Gifcurry.rightCrop = right_crop , Gifcurry.topCrop = top_crop , Gifcurry.bottomCrop = bottom_crop } logo :: String logo = unlines [ "" , " ╓╦NÑ╫╫╫╫╫ÑNw, " , " , `Ñ╫╫╫╫Ñ `'╩╫╫╫Ñw ,╓ææµ ║▓▓⌐ ,▄▄▓▄ " , " ]╫Ñ Ñ╫╫╫ ,╫N ╙╫╫╫╫Ñ ╓▓▓▀╙╙▀╨ .╓, ,▓▓▌, ,╓╥╓, ,, ,,, ,, ,╓ ,, ,╓ ,, ., " , " ]╫╫╫Ñ '╫╫⌐ Ñ╫⌐ Ñ╫╫╫╫Ñ -▓▓M ╥╥╥╥ ▐▓▓ ▀▓▓▀▀ ▄▓▀╙▀▀ ▓▓Γ ╫▓▌ ╫▓▓▌▀ ▓▓▓▀▀╙▓▓ ▓▓▀" , " ╩╫╫╫╫H ╠Ñ 1╫H ╫ '╫╫╫╫╣ ▓▓H ╙▐▓▓ ▐▓▓ ▓▓Γ ▐▓▓⌐ ▓▓Γ ╫▓▌ ╫▓▌ ▓▓▌ ║▓▌╢▓▌ " , " ]╫╫╫╫╫ ' j╫Å j╫H ╠╫╫╫╫ ╙▓▓▄▄▄▓▓ ▐▓▓ ▓▓Γ ▀▓▌▄▄▄ ▓▓▌▄▓▓▌ ╫▓▌ ▓▓▌ ▓▓▓▓ " , " Ñ╫╫╫╫N jÑ╬ .╫╫╫⌐ Ñ╫╬┘ └╙╙╙└ `└└ └└` ╙╙╙` ╙╙└`└` `└└ └└` ,▓▓▀ " , " ╨╫╫╫╫N '┘ ╬╫╫╫╫ ╩` ▀▀▀└ " , " `╙Ñ╫╫╫N╦╦╫╫╫╫╫╩ " , " `'╙╙╙╙'`` " , "" ]