From 00b824f98e7d7f07bc9e3d63b5a5dbc11e6e24e9 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Wed, 10 May 2023 23:05:31 -0300 Subject: [PATCH] it's working! even on twitter. --- event.html | 3 ++- image.go | 3 ++- main.go | 1 + proxy.go | 32 ++++++++++++++++++++++++++++++++ render.go | 3 ++- text.go | 18 +++++++++++++----- 6 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 proxy.go diff --git a/event.html b/event.html index 6a4dfad..0d7af19 100644 --- a/event.html +++ b/event.html @@ -7,6 +7,7 @@ {{ if .metadata.Picture }} + {{end}} {{ if .metadata.About }} {{end}} @@ -29,7 +30,7 @@ {{ if .image }} - + {{end}} {{ if .video }} diff --git a/image.go b/image.go index 5030881..a4e552d 100644 --- a/image.go +++ b/image.go @@ -23,7 +23,8 @@ func generate(w http.ResponseWriter, r *http.Request) { } lines := normalizeText(event.Content) - img, err := drawImage(lines) + + img, err := drawImage(lines, getPreviewStyle(r)) if err != nil { log.Printf("error writing image: %s", err) http.Error(w, "error writing image!", 500) diff --git a/main.go b/main.go index 40a38e8..f28cec2 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,7 @@ import ( func main() { http.HandleFunc("/image/", generate) + http.HandleFunc("/proxy/", proxy) http.HandleFunc("/", render) port := os.Getenv("PORT") diff --git a/proxy.go b/proxy.go new file mode 100644 index 0000000..475f4a4 --- /dev/null +++ b/proxy.go @@ -0,0 +1,32 @@ +package main + +import ( + "fmt" + "net/http" + "net/http/httputil" + "net/url" +) + +func proxy(w http.ResponseWriter, r *http.Request) { + fmt.Println(r.URL.Path, ":~", r.Header.Get("user-agent")) + + src := r.URL.Query().Get("src") + urlParsed, err := url.Parse(src) + if err != nil { + http.Error(w, "Invalid URL", http.StatusBadRequest) + return + } + if urlParsed.Scheme != "http" && urlParsed.Scheme != "https" { + http.Error(w, "The URL scheme is neither HTTP nor HTTPS", http.StatusBadRequest) + return + } + + proxy := httputil.ReverseProxy{ + Director: func(r *http.Request) { + r.URL = urlParsed + r.Host = urlParsed.Host + }, + } + + proxy.ServeHTTP(w, r) +} diff --git a/render.go b/render.go index 023f7c8..d2811f5 100644 --- a/render.go +++ b/render.go @@ -19,6 +19,7 @@ var eventHTML string var tmpl = template.Must(template.New("event").Parse(eventHTML)) func render(w http.ResponseWriter, r *http.Request) { + fmt.Println(r.URL.Path, ":~", r.Header.Get("user-agent")) w.Header().Set("Content-Type", "text/html") code := r.URL.Path[1:] @@ -65,7 +66,6 @@ func render(w http.ResponseWriter, r *http.Request) { if len(imageMatch) > 0 { image = imageMatch[0] } - fmt.Println("IMAGE", image) videoMatch := regexp.MustCompile(`https:\/\/[^ ]*\.(mp4|webm)`).FindStringSubmatch(event.Content) var video string @@ -170,6 +170,7 @@ func render(w http.ResponseWriter, r *http.Request) { "videoType": videoType, "image": image, "video": video, + "proxy": "https://" + hostname + "/proxy?src=", "eventJSON": string(eventJSON), } if err := tmpl.ExecuteTemplate(w, "event", params); err != nil { diff --git a/text.go b/text.go index 282804f..b4e2d37 100644 --- a/text.go +++ b/text.go @@ -27,10 +27,18 @@ func normalizeText(t string) []string { return lines } -func drawImage(lines []string) (image.Image, error) { +func drawImage(lines []string, style string) (image.Image, error) { + width, height, paddingLeft := 700, 525, 0 + switch style { + case "twitter": + height = 366 + case "telegram": + paddingLeft = 15 + } + // get the physical image ready with colors/size fg, bg := image.Black, image.White - rgba := image.NewRGBA(image.Rect(0, 0, 700, 525)) + rgba := image.NewRGBA(image.Rect(0, 0, width, height)) // draw the empty image draw.Draw(rgba, rgba.Bounds(), bg, image.ZP, draw.Src) @@ -51,7 +59,7 @@ func drawImage(lines []string) (image.Image, error) { // draw each line separately var count float64 = 1 for _, line := range lines { - if err := drawText(c, line, count); err != nil { + if err := drawText(c, line, count, paddingLeft); err != nil { return nil, err } count++ @@ -60,12 +68,12 @@ func drawImage(lines []string) (image.Image, error) { return rgba, nil } -func drawText(c *freetype.Context, text string, line float64) error { +func drawText(c *freetype.Context, text string, line float64, paddingLeft int) error { // We need an offset because we need to know where exactly on the // image to place the text. The `line` is how much of an offset // that we need to provide (which line the text is going on). offsetY := 10 + int(c.PointToFix32(FONT_SIZE*line)>>8) - _, err := c.DrawString(text, freetype.Pt(10, offsetY)) + _, err := c.DrawString(text, freetype.Pt(10+paddingLeft, offsetY)) return err }