Files
youtubethumbnails/main.go
prettysunflower 2c544f35c8
All checks were successful
Build Docker images / acls (push) Successful in 1m23s
Made HQ images black bar removal a bit better
2025-05-18 18:28:48 +02:00

112 lines
2.5 KiB
Go

package main
import (
"fmt"
"image"
"image/color"
"image/jpeg"
"io"
"net/http"
)
func main() {
http.HandleFunc("/", getRoot)
http.HandleFunc("/favicon.ico", getRoot)
http.HandleFunc("/{videoId}", getYouTubeThumbnail)
_ = http.ListenAndServe(":3333", nil)
}
func getYouTubeThumbnail(writer http.ResponseWriter, request *http.Request) {
videoId := request.PathValue("videoId")
resp, err := http.Get("https://img.youtube.com/vi/" + videoId + "/maxresdefault.jpg")
if err != nil {
fmt.Println(err.Error())
return
}
if resp.StatusCode == 200 {
body, _ := io.ReadAll(resp.Body)
_, _ = io.WriteString(writer, string(body))
} else if resp.StatusCode == 404 {
mqResp, err := http.Get("https://img.youtube.com/vi/" + videoId + "/mqdefault.jpg")
if err != nil {
fmt.Println(err.Error())
return
}
imageMq, _, err := image.Decode(mqResp.Body)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(imageMq.Bounds().Max.X, imageMq.Bounds().Max.Y)
hqResp, err := http.Get("https://img.youtube.com/vi/" + videoId + "/hqdefault.jpg")
if err != nil {
fmt.Println(err.Error())
return
}
imageHq, _, err := image.Decode(hqResp.Body)
if err != nil {
fmt.Println(err.Error())
return
}
imageMqBounds := imageMq.Bounds()
imageHqBounds := imageHq.Bounds()
if imageMqBounds.Max.X > imageMqBounds.Max.Y {
fmt.Println("Youtube thumbnail horizontal")
fmt.Println("Ideal size")
fmt.Print(imageHq.Bounds().Max.X, ", ")
idealHeight := imageMqBounds.Max.Y * 100 /
(imageMqBounds.Max.X * 100 / imageHqBounds.Max.X)
idealHeight -= 4
fmt.Println(idealHeight)
newImage := image.NewRGBA64(image.Rectangle{
Min: image.Point{},
Max: image.Point{
X: imageHqBounds.Max.X, Y: idealHeight,
},
})
for i := 0; i < idealHeight; i++ {
for j := 0; j < imageHqBounds.Max.X; j++ {
iHq := (imageHqBounds.Max.Y / 2) - (idealHeight / 2) + i
r, g, b, a := imageHq.At(j, iHq).RGBA()
newImage.SetRGBA64(j, i, color.RGBA64{
R: uint16(r),
G: uint16(g),
B: uint16(b),
A: uint16(a),
})
}
}
err := jpeg.Encode(writer, newImage, nil)
if err != nil {
return
}
return
} else {
fmt.Println("Youtube thumbnail vertical")
}
} else {
_, _ = io.WriteString(writer, "Something went wrong")
}
}
func getRoot(writer http.ResponseWriter, request *http.Request) {
_, _ = io.WriteString(writer, "youtubethumbnails is a tool that allows you to get YouTube thumbnails. You can fetch thumbnails with the /{videoId} endpoint.")
}