main.go (2317B)
1 package main 2 3 import ( 4 "flag" 5 "io" 6 "log" 7 "os" 8 9 "golang.org/x/crypto/ssh/terminal" 10 11 "github.com/jackmordaunt/giffer" 12 ) 13 14 var ( 15 videofile string 16 start float64 17 end float64 18 dest string 19 fps float64 20 width int 21 height int 22 url string 23 debug bool 24 ) 25 26 func main() { 27 flag.StringVar(&videofile, "v", "", "path to video file to gifify") 28 flag.StringVar(&url, "url", "", "url to video file to gifenate") 29 flag.Float64Var(&start, "s", 0.0, "time in seconds to start the gif") 30 flag.Float64Var(&end, "e", 0.0, "time in seconds to end the gif") 31 flag.StringVar(&dest, "dest", "movie.gif", "a destination filename for the animated gif") 32 flag.IntVar(&width, "width", 0, "width in pixels of the output frames") 33 flag.IntVar(&height, "height", 0, "height in pixels of the output frames") 34 flag.Float64Var(&fps, "fps", 24, "frames per second") 35 flag.BoolVar(&debug, "debug", false, "debug mode") 36 flag.Parse() 37 if terminal.IsTerminal(int(os.Stdin.Fd())) { 38 tmp, err := os.Create("tmp") 39 if err != nil { 40 log.Fatalf("creating temporary file: %v", err) 41 } 42 defer tmp.Close() 43 defer os.Remove("tmp") 44 if _, err := io.Copy(tmp, os.Stdin); err != nil { 45 log.Fatalf("writing temporary file: %v", err) 46 } 47 tmp.Close() 48 videofile = "tmp" 49 } else if url != "" { 50 dl := giffer.Downloader{ 51 Dir: "./tmp/dl", 52 FFmpeg: "ffmpeg", 53 Debug: debug, 54 Out: os.Stdout, 55 } 56 downloaded, err := dl.Download(url, start, end) 57 if err != nil { 58 log.Fatalf("downloading: %v", err) 59 } 60 videofile = downloaded 61 } 62 t := giffer.Engine{ 63 FFmpeg: "ffmpeg", 64 Convert: "convert", 65 Debug: debug, 66 Out: os.Stdout, 67 } 68 gif, err := t.Transcode(videofile, 0, 0, width, height, fps) 69 if err != nil { 70 log.Fatalf("converting to gif: %v", err) 71 } 72 if err := t.Crush(gif, 4); err != nil { 73 log.Fatalf("optimising gif: %v", err) 74 } 75 defer t.Clean() 76 var out io.WriteCloser 77 if terminal.IsTerminal(int(os.Stdout.Fd())) { 78 out = os.Stdout 79 } else { 80 out, err = os.Open(dest) 81 if err != nil { 82 log.Fatalf("opening destination file: %v", err) 83 } 84 } 85 defer out.Close() 86 gifFile, err := os.Open(gif) 87 if err != nil { 88 log.Fatalf("opening gif file: %v", err) 89 } 90 defer gifFile.Close() 91 if _, err := io.Copy(out, gifFile); err != nil { 92 log.Fatalf("writing gif to file: %v", err) 93 } 94 }