all repos — fixyoutube-go @ e642c6324ad5251d2eebbd04f9817c35cb0dccf4

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/birabittoh/fixyoutube-go/invidious"
 9	"github.com/joho/godotenv"
10	"github.com/sirupsen/logrus"
11	"golang.org/x/time/rate"
12)
13
14var (
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	logLevel, err := logrus.ParseLevel(os.Getenv("LOG_LEVEL"))
54	if err != nil {
55		logLevel = logrus.InfoLevel
56	}
57	logger.SetLevel(logLevel)
58
59	if logLevel == logrus.DebugLevel {
60		logger.SetLevel(logrus.DebugLevel)
61		logger.Debug("Debug mode enabled (rate limiting is disabled)")
62		debugSwitch = true
63	}
64
65	invidious.Init(logLevel, os.Getenv("INSTANCE"))
66
67	port := getEnvDefault("PORT", "3000")
68	burstTokens := getEnvDefaultParse("BURST_TOKENS", "3")
69	rateLimit := getEnvDefaultParse("RATE_LIMIT", "1")
70
71	adminUser = getEnvDefault("ADMIN_USER", "admin")
72	adminPass = getEnvDefault("ADMIN_PASS", "admin")
73
74	if adminUser == "admin" && adminPass == "admin" {
75		logger.Println("Admin credentials not set. Please set APP_ADMIN_USER and APP_ADMIN_PASS.")
76	}
77
78	r := http.NewServeMux()
79	r.HandleFunc("GET /", indexHandler)
80	r.HandleFunc("GET /watch", watchHandler)
81	r.HandleFunc("GET /shorts/{videoID}", shortHandler)
82	r.HandleFunc("GET /proxy/{videoID}", proxyHandler)
83	r.HandleFunc("GET /sub/{videoID}/{language}", subHandler)
84	r.HandleFunc("GET /refresh/{videoID}", refreshHandler)
85	r.HandleFunc("GET /cache", cacheHandler)
86	r.HandleFunc("GET /{videoID}", shortHandler)
87
88	r.HandleFunc("POST /download", downloadHandler)
89
90	var serveMux http.Handler
91	if debugSwitch {
92		serveMux = r
93	} else {
94		limiter := rate.NewLimiter(rate.Limit(rateLimit), int(burstTokens))
95		serveMux = limit(limiter, r)
96	}
97	logger.Info("Serving on port ", port)
98	http.ListenAndServe(":"+port, serveMux)
99}