-- | Run shell programs
--
-- We mostly add a lot of logging to figure out what goes on
module Cut.Shell
( ffmpeg
, ffmpeg'
, floatToText
, youtube_dl
)
where
import Data.Text (Text)
import qualified Data.Text as Text
import Numeric
import Shelly hiding (run, command)
import Network.URI(URI)
import Text.Printf
import Data.Time
-- | Wrap ffmpeg for convenience and logging
-- technically supports multiple inputs but for convenice we threw that.
ffmpeg :: Prelude.FilePath -> [Text] -> Sh [Text]
ffmpeg file args = ffmpeg' ("-y" : "-i" : Text.pack file : args)
ffmpeg' :: [Text] -> Sh [Text]
ffmpeg' = run "ffmpeg"
-- | Format floats for cli
floatToText :: Double -> Text
floatToText = Text.pack . flip (showFFloat (Just 10)) ""
run :: FilePath -> [Text] -> Sh [Text]
run command args = do
time' <- liftIO getCurrentTime
let format = formatTime defaultTimeLocale "%F %T" time'
liftIO $ putStrLn "--- "
liftIO $ printf "%s: %s %s" format command (Text.unwords args)
liftIO $ putStrLn " " -- flush
run_ command args
liftIO $ putStrLn "--- "
Text.lines <$> lastStderr
youtube_dl :: URI -> FilePath -> Sh [Text]
youtube_dl uri path' = run "youtube-dl" args
where
args = [Text.pack $ show uri
, "-o", Text.pack path'
, "--merge-output-format", "mkv"
]