giffer

Create .gif images from sites like youtube.com
Log | Files | Refs | LICENSE

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 }