Files
seanime-docker/seanime-2.9.10/internal/util/proxies/image_proxy.go
2025-09-20 14:08:38 +01:00

71 lines
1.7 KiB
Go

package util
import (
"encoding/json"
"io"
"net/http"
"seanime/internal/util"
"github.com/labstack/echo/v4"
)
type ImageProxy struct{}
func (ip *ImageProxy) GetImage(url string, headers map[string]string) ([]byte, error) {
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
for key, value := range headers {
req.Header.Add(key, value)
}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return body, nil
}
func (ip *ImageProxy) setHeaders(c echo.Context) {
c.Set("Content-Type", "image/jpeg")
c.Set("Cache-Control", "public, max-age=31536000")
c.Set("Access-Control-Allow-Origin", "*")
c.Set("Access-Control-Allow-Methods", "GET")
c.Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
c.Set("Access-Control-Allow-Credentials", "true")
}
func (ip *ImageProxy) ProxyImage(c echo.Context) (err error) {
defer util.HandlePanicInModuleWithError("util/ImageProxy", &err)
url := c.QueryParam("url")
headersJSON := c.QueryParam("headers")
if url == "" || headersJSON == "" {
return c.String(echo.ErrBadRequest.Code, "No URL provided")
}
headers := make(map[string]string)
if err := json.Unmarshal([]byte(headersJSON), &headers); err != nil {
return c.String(echo.ErrBadRequest.Code, "Error parsing headers JSON")
}
ip.setHeaders(c)
imageBuffer, err := ip.GetImage(url, headers)
if err != nil {
return c.String(echo.ErrInternalServerError.Code, "Error fetching image")
}
return c.Blob(http.StatusOK, c.Response().Header().Get("Content-Type"), imageBuffer)
}