export def cmd [ inputs: list outputs: list ]: nothing -> record { { input: $inputs filters: [] output: $outputs args: [] options: { chain_filters: false } } } export def "cmd to-args" []: record -> list { let command = $in; [ ...($command.input | reduce -f [] { |it, acc| $acc | append ['-i', $it ] }) ...$command.args ...['-filter_complex' ($command.filters | filtergraph to-string)] ...($command.output) ] } export def "cmd filters append" [ complex_filter: list ]: record -> record { let cmd = $in; if ($cmd.options.chain_filters) { $cmd | update filters { let original = $in; ($original | range 0..-2) | append [ (($original | default [] | last) | append $complex_filter) ] } } else { $cmd | update filters { append [$complex_filter] } } } export def "parse filtergraph" [ ]: string -> list>> { split row ';' | each { parse filterchain } } export def "parse filterchain" [ ]: string -> table> { split row ',' | each { parse filter } } export def "parse filter" [ ]: string -> table> { parse --regex '^\s*(?:\[(?[^\s]+)\]\s*)?(?[^=\s\[]+)\s*(?:=(?[^\[\s,;]*)\s*)?(?:\[(?[^\s,;]+)\])?' | first | update params { parse --regex `(?:(?[^=]+)=)?(?[^:]+):?` } | update input { split row '][' | filter { not ($in | is-empty) } } | update output { split row '][' | filter { not ($in | is-empty) } } } # TODO: Remove export export def "filtergraph to-string" [] { # : list -> string { $in | each { filterchain to-string } | str join ';' } def "filterchain to-string" []: table -> string { $in | each { filter to-string }| str join ',' } def "filter to-string" []: record name: string params: table output: list> -> string { $in | update input { str join '][' } | update output { str join '][' } | update params { each { format '{param}={value}' } | str join ':' | str replace -ar '(?<=^|:)=' '' } | format '[{input}]{name}={params}[{output}]' | str replace -ar '\[\]|=(?=[\[,;])' '' } # Set the input and outputs of a filter chain export def filterchain [ #input: list #output: list filter: closure ] { let cmd = $in; let original_option = $cmd.options.chain_filters; # TODO: Assign inputs and outputs $cmd | update options.chain_filters { not $in } | do $filter | update options.chain_filters $original_option; } # Build a record representaion of a complex filter export def complex-filter [ --input (-i): list = [] --output (-o): list = [] name: string params: record = {} ]: nothing -> record name: string params: table output: list> { { input: $input name: $name params: ($params | transpose param value | compact param value) output: $output } }