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) }