package main import ( "bufio" "bytes" "fmt" "go/format" "log" "os" "os/exec" "strings" ) func must(err error) { if err == nil { return } log.Fatal(err) } func main() { cmd := exec.Command("ffmpeg", "-codecs") outputBytes, err := cmd.Output() must(err) code := `package codecs var ( ` bufreader := bufio.NewScanner(bytes.NewReader(outputBytes)) /*Encoders: V..... = Video A..... = Audio S..... = Subtitle .F.... = Frame-level multithreading ..S... = Slice-level multithreading ...X.. = Codec is experimental ....B. = Supports draw_horiz_band .....D = Supports direct rendering method 1 ------ V..... a64multi Multicolor charset for Commodore 64 (codec a64_multi) V..... a64multi5 Multicolor charset for Commodore 64, extended with 5th color (colram) (codec a64_multi5)*/ waitingForList := true for bufreader.Scan() && waitingForList { text := bufreader.Text() if text == " -------" { waitingForList = false } } for bufreader.Scan() { text := bufreader.Text() //isVideo := text[1] == 'V' //isAudio := text[1] == 'A' //isSubtitle := text[1] == 'S' text = text[8:] cols := strings.Fields(text) id := cols[0] name := strings.Join(cols[1:], " ") code += fmt.Sprintf(` // %s Codec_%s = %q `, name, strings.ToUpper(id), id) } code += ` ) ` codeBytes, err := format.Source([]byte(code)) must(err) f, err := os.Create("gen_codecs.go") must(err) defer f.Close() _, err = f.Write(codeBytes) must(err) }