all repos — fixyoutube-go @ 4fde0f88bf0b2a1271263fadb19eebd2c2caa622

A better way to embed YouTube videos everywhere (inspired by FixTweet).

fixyoutube.go (view raw)

 1package main
 2
 3import (
 4	"net/http"
 5	"os"
 6	"strconv"
 7
 8	"github.com/joho/godotenv"
 9	"github.com/sirupsen/logrus"
10	"golang.org/x/time/rate"
11)
12
13var (
14	apiKey      string
15	debugSwitch = false
16	logger      = logrus.New()
17)
18
19func limit(limiter *rate.Limiter, next http.Handler) http.Handler {
20	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
21		if !limiter.Allow() {
22			status := http.StatusTooManyRequests
23			http.Error(w, http.StatusText(status), status)
24			return
25		}
26		next.ServeHTTP(w, r)
27	})
28}
29
30func getenvDefault(key string, def string) string {
31	res := os.Getenv(key)
32	if res == "" {
33		return def
34	}
35	return res
36}
37
38func getenvDefaultParse(key string, def string) float64 {
39	value := getenvDefault(key, def)
40	res, err := strconv.ParseFloat(value, 64)
41	if err != nil {
42		logger.Fatal(err)
43	}
44	return res
45}
46
47func main() {
48	err := godotenv.Load()
49	if err != nil {
50		logger.Info("No .env file provided.")
51	}
52
53	if os.Getenv("DEBUG") != "" {
54		logger.SetLevel(logrus.DebugLevel)
55		logger.Debug("Debug mode enabled (rate limiting is disabled)")
56		debugSwitch = true
57	}
58
59	apiKey = getenvDefault("API_KEY", "itsme")
60	port := getenvDefault("PORT", "3000")
61	burstTokens := getenvDefaultParse("BURST_TOKENS", "3")
62	rateLimit := getenvDefaultParse("RATE_LIMIT", "1")
63
64	r := http.NewServeMux()
65	r.HandleFunc("/", indexHandler)
66	r.HandleFunc("/clear", clearHandler)
67	r.HandleFunc("/watch", watchHandler)
68	r.HandleFunc("/proxy/{videoId}", proxyHandler)
69	r.HandleFunc("/{videoId}", shortHandler)
70
71	var serveMux http.Handler
72	if debugSwitch {
73		serveMux = r
74	} else {
75		limiter := rate.NewLimiter(rate.Limit(rateLimit), int(burstTokens))
76		serveMux = limit(limiter, r)
77	}
78	logger.Info("Serving on port ", port)
79	http.ListenAndServe(":"+port, serveMux)
80}