cut-the-crap-1.2.0: src/Cut/Options.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Cut.Options
( Options
, parseRecord
, in_file
, out_file
, seg_size
, silent_treshold
, detect_margin
, voice_track
, music_track
, silent_duration
, cut_noise
, work_dir
, simpleOptions
)
where
import Control.Lens ( (#)
, Lens'
, _Just
, non
)
import Data.Generics.Product.Fields
import GHC.Generics
import Options.Applicative
simpleOptions :: Options
simpleOptions = Options { inFile = "in.mkv"
, outFile = "out.mkv"
, segmentSize = _Just # def_seg_size
, silentTreshold = _Just # def_silent
, detectMargin = _Just # def_margin
, voiceTrack = _Just # 2
, musicTrack = Nothing
, silentDuration = _Just # def_duration
, cutNoise = def_cut_noise
, workDir = Nothing
}
data Options = Options
{ inFile :: FilePath
, outFile :: FilePath
, segmentSize :: Maybe Int
, silentTreshold :: Maybe Double
, silentDuration :: Maybe Double
, detectMargin :: Maybe Double
, voiceTrack :: Maybe Int
, musicTrack :: Maybe Int
, cutNoise :: Bool
, workDir :: Maybe FilePath
} deriving (Show, Generic)
in_file :: Lens' Options FilePath
in_file = field @"inFile"
out_file :: Lens' Options FilePath
out_file = field @"outFile"
def_seg_size :: Int
def_seg_size = 20
def_margin :: Double
def_margin = 0.05
def_cut_noise :: Bool
def_cut_noise = False
def_silent :: Double
def_silent = 0.0001
def_duration :: Double
def_duration = 0.25
def_voice :: Int
def_voice = 1
seg_size :: Lens' Options Int
seg_size = field @"segmentSize" . non def_seg_size
detect_margin :: Lens' Options Double
detect_margin = field @"detectMargin" . non def_margin
silent_treshold :: Lens' Options Double
silent_treshold = field @"silentTreshold" . non def_silent
silent_duration :: Lens' Options Double
silent_duration = field @"silentDuration" . non def_duration
voice_track :: Lens' Options Int
voice_track = field @"voiceTrack" . non def_voice
music_track :: Lens' Options (Maybe Int)
music_track = field @"musicTrack"
cut_noise :: Lens' Options Bool
cut_noise = field @"cutNoise"
work_dir :: Lens' Options (Maybe FilePath)
work_dir = field @"workDir"
parseRecord :: Parser Options
parseRecord =
Options
<$> option str (long "inFile" <> help "The input video")
<*> option str (long "outFile" <> help "The output name without format")
<*> optional
(option
auto
(long "segmentSize" <> help "The size of video segments in minutes")
)
<*> optional
(option
auto
( long "silentTreshold"
<> help
"The treshold for determining intersting sections, closer to zero is detects more audio (n: https://ffmpeg.org/ffmpeg-filters.html#silencedetect)"
)
)
<*> optional
(option
auto
( long "silentDuration"
<> help
"The duration before soemthing can be considered a silence (d: https://ffmpeg.org/ffmpeg-filters.html#silencedetect)"
)
)
<*> optional
(option
auto
(long "detectMargin" <> help "Margin seconds around detection")
)
<*> optional
(option
auto
(long "voiceTrack" <> help "The track to detect the silences upon")
)
<*> optional
(option auto (long "musicTrack" <> help "The track to integrate"))
<*> switch
(long "cutNoise" <> help "Whether to cut noise instead of silence")
<*> optional
(option
str
( long "workDir"
<> help
"If specified will use this as temporary directory to store intermeidate files in, good for debugging. Needs to be absolute"
)
)