all repos — fixyoutube-go @ v1.0.1

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	debugSwitch = false
15	logger      = logrus.New()
16)
17
18func limit(limiter *rate.Limiter, next http.Handler) http.Handler {
19	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
20		if !limiter.Allow() {
21			status := http.StatusTooManyRequests
22			http.Error(w, http.StatusText(status), status)
23			return
24		}
25		next.ServeHTTP(w, r)
26	})
27}
28
29func getEnvDefault(key string, def string) string {
30	res := os.Getenv(key)
31	if res == "" {
32		return def
33	}
34	return res
35}
36
37func getEnvDefaultParse(key string, def string) float64 {
38	value := getEnvDefault(key, def)
39	res, err := strconv.ParseFloat(value, 64)
40	if err != nil {
41		logger.Fatal(err)
42	}
43	return res
44}
45
46func main() {
47	err := godotenv.Load()
48	if err != nil {
49		logger.Info("No .env file provided.")
50	}
51
52	logLevel, err := logrus.ParseLevel(os.Getenv("LOG_LEVEL"))
53	if err != nil {
54		logLevel = logrus.InfoLevel
55	}
56	logger.SetLevel(logLevel)
57
58	if logLevel == logrus.DebugLevel {
59		logger.SetLevel(logrus.DebugLevel)
60		logger.Debug("Debug mode enabled (rate limiting is disabled)")
61		debugSwitch = true
62	}
63
64	port := getEnvDefault("PORT", "3000")
65	burstTokens := getEnvDefaultParse("BURST_TOKENS", "3")
66	rateLimit := getEnvDefaultParse("RATE_LIMIT", "1")
67
68	adminUser = getEnvDefault("ADMIN_USER", "admin")
69	adminPass = getEnvDefault("ADMIN_PASS", "admin")
70
71	if adminUser == "admin" && adminPass == "admin" {
72		logger.Println("Admin credentials not set. Please set APP_ADMIN_USER and APP_ADMIN_PASS.")
73	}
74
75	r := http.NewServeMux()
76	r.HandleFunc("GET /", indexHandler)
77	r.HandleFunc("GET /watch", watchHandler)
78	r.HandleFunc("GET /shorts/{videoID}", shortHandler)
79	r.HandleFunc("GET /proxy/{videoID}", proxyHandler)
80	r.HandleFunc("GET /sub/{videoID}/{language}", subHandler)
81	r.HandleFunc("GET /refresh/{videoID}", refreshHandler)
82	r.HandleFunc("GET /cache", cacheHandler)
83	r.HandleFunc("GET /{videoID}", shortHandler)
84
85	r.HandleFunc("POST /download", downloadHandler)
86
87	var serveMux http.Handler
88	if debugSwitch {
89		serveMux = r
90	} else {
91		limiter := rate.NewLimiter(rate.Limit(rateLimit), int(burstTokens))
92		serveMux = limit(limiter, r)
93	}
94	logger.Info("Serving on port ", port)
95	http.ListenAndServe(":"+port, serveMux)
96}