{-# LANGUAGE CPP, QuasiQuotes, ScopedTypeVariables, FlexibleContexts, OverloadedStrings, NamedFieldPuns, ViewPatterns #-} -- | module Test.Sandwich.WebDriver.Internal.Video where import Control.Monad.IO.Class import Data.Maybe import Data.String.Interpolate import System.Environment import System.Process import Test.Sandwich.WebDriver.Internal.Types #ifdef darwin_HOST_OS import Safe #endif getVideoArgs path (width, height, x, y) (VideoSettings {..}) maybeXvfbSession = do #ifdef linux_HOST_OS displayNum <- case maybeXvfbSession of Nothing -> fromMaybe "" <$> (liftIO $ lookupEnv "DISPLAY") Just (XvfbSession {xvfbDisplayNum}) -> return $ ":" <> show xvfbDisplayNum let videoPath = [i|#{path}.avi|] let env' = [("DISPLAY", displayNum)] let env = case maybeXvfbSession of Nothing -> Just env' Just (XvfbSession {xvfbXauthority}) -> Just (("XAUTHORITY", xvfbXauthority) : env') let cmd = ["-draw_mouse", (if hideMouseWhenRecording then "0" else "1") , "-y" , "-nostdin" , "-f", "x11grab" , "-s", [i|#{width}x#{height}|] , "-i", [i|#{displayNum}.0+#{x},#{y}|]] ++ x11grabOptions ++ [videoPath] return ((proc "ffmpeg" cmd) { env = env }) #endif #ifdef darwin_HOST_OS maybeScreenNumber <- liftIO getMacScreenNumber let videoPath = [i|#{path}.avi|] let cmd = case maybeScreenNumber of Just screenNumber -> ["-y" , "-nostdin" , "-f", "avfoundation" , "-i", [i|#{screenNumber}|]] ++ avfoundationOptions ++ [videoPath] Nothing -> error [i|Not launching ffmpeg since OS X screen number couldn't be determined.|] return ((proc "ffmpeg" cmds) { env = Nothing }) #endif #ifdef mingw32_HOST_OS let videoPath = [i|#{path}.mkv|] let cmd = ["-f", "gdigrab" , "-nostdin" , "-draw_mouse", (if hideMouseWhenRecording then "0" else "1") , "-i", "desktop"] ++ gdigrabOptions ++ [videoPath] return ((proc "ffmpeg.exe" cmd) { env = Nothing }) #endif