From 1ec5d0ddb8d05b0d1ed0574c8bb55c52c775eb44 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Tue, 4 Jul 2023 22:53:45 -0600
Subject: [PATCH] Clean up some previewer code

---
 url_previewing/calculated_previewer.go |  8 +++++---
 url_previewing/http.go                 |  5 ++---
 url_previewing/oembed_previewer.go     | 26 +++++++++++++++-----------
 url_previewing/util.go                 |  7 ++++---
 4 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/url_previewing/calculated_previewer.go b/url_previewing/calculated_previewer.go
index 0720c8c6..73365dd0 100644
--- a/url_previewing/calculated_previewer.go
+++ b/url_previewing/calculated_previewer.go
@@ -2,16 +2,16 @@ package url_previewing
 
 import (
 	"github.com/prometheus/client_golang/prometheus"
-	"github.com/ryanuber/go-glob"
 	"github.com/turt2live/matrix-media-repo/common"
 	"github.com/turt2live/matrix-media-repo/common/rcontext"
 	"github.com/turt2live/matrix-media-repo/metrics"
+	"github.com/turt2live/matrix-media-repo/thumbnailing"
 )
 
 func GenerateCalculatedPreview(urlPayload *UrlPayload, languageHeader string, ctx rcontext.RequestContext) (Result, error) {
 	r, filename, contentType, err := downloadRawContent(urlPayload, ctx.Config.UrlPreviews.FilePreviewTypes, languageHeader, ctx)
 	if err != nil {
-		ctx.Log.Error("Error downloading content: ", err)
+		ctx.Log.Warn("Error downloading content: ", err)
 
 		// Make sure the unsupported error gets passed through
 		if err == ErrPreviewUnsupported {
@@ -49,8 +49,10 @@ func GenerateCalculatedPreview(urlPayload *UrlPayload, languageHeader string, ct
 		SiteName:    "", // intentionally empty
 	}
 
-	if glob.Glob("image/*", img.ContentType) {
+	if thumbnailing.IsSupported(img.ContentType) {
 		result.Image = img
+	} else {
+		defer img.Data.Close()
 	}
 
 	metrics.UrlPreviewsGenerated.With(prometheus.Labels{"type": "calculated"}).Inc()
diff --git a/url_previewing/http.go b/url_previewing/http.go
index 553bd524..c8ba4b26 100644
--- a/url_previewing/http.go
+++ b/url_previewing/http.go
@@ -186,9 +186,8 @@ func downloadImage(urlPayload *UrlPayload, languageHeader string, ctx rcontext.R
 	}
 
 	image := &Image{
-		ContentType:   resp.Header.Get("Content-Type"),
-		Data:          resp.Body,
-		ContentLength: resp.ContentLength,
+		ContentType: resp.Header.Get("Content-Type"),
+		Data:        resp.Body,
 	}
 
 	_, params, err := mime.ParseMediaType(resp.Header.Get("Content-Disposition"))
diff --git a/url_previewing/oembed_previewer.go b/url_previewing/oembed_previewer.go
index 423e2be5..6e424993 100644
--- a/url_previewing/oembed_previewer.go
+++ b/url_previewing/oembed_previewer.go
@@ -5,6 +5,7 @@ import (
 	"net/url"
 	"os"
 	"path"
+	"sync"
 
 	"github.com/getsentry/sentry-go"
 
@@ -18,25 +19,28 @@ import (
 )
 
 var oembedInstance *oembed.Oembed
+var oembedLock = new(sync.Once)
 
 func getOembed() *oembed.Oembed {
 	if oembedInstance != nil {
 		return oembedInstance
 	}
 
-	oembedInstance = oembed.NewOembed()
+	oembedLock.Do(func() {
+		oembedInstance = oembed.NewOembed()
 
-	data, err := os.ReadFile(path.Join(config.Runtime.AssetsPath, "providers.json"))
-	if err != nil {
-		sentry.CaptureException(err)
-		logrus.Fatal(err)
-	}
+		data, err := os.ReadFile(path.Join(config.Runtime.AssetsPath, "providers.json"))
+		if err != nil {
+			sentry.CaptureException(err)
+			logrus.Fatal(err)
+		}
 
-	err = oembedInstance.ParseProviders(bytes.NewReader(data))
-	if err != nil {
-		sentry.CaptureException(err)
-		logrus.Fatal(err)
-	}
+		err = oembedInstance.ParseProviders(bytes.NewReader(data))
+		if err != nil {
+			sentry.CaptureException(err)
+			logrus.Fatal(err)
+		}
+	})
 
 	return oembedInstance
 }
diff --git a/url_previewing/util.go b/url_previewing/util.go
index bcc3b11c..c364bcb5 100644
--- a/url_previewing/util.go
+++ b/url_previewing/util.go
@@ -5,11 +5,12 @@ import (
 	"strings"
 )
 
+var surroundingWhitespace = regexp.MustCompile(`^[\s\p{Zs}]+|[\s\p{Zs}]+$`)
+var interiorWhitespace = regexp.MustCompile(`[\s\p{Zs}]{2,}`)
+var newlines = regexp.MustCompile(`[\r\n]`)
+
 func summarize(text string, maxWords int, maxLength int) string {
 	// Normalize the whitespace to be something useful (crush it to one giant line)
-	surroundingWhitespace := regexp.MustCompile(`^[\s\p{Zs}]+|[\s\p{Zs}]+$`)
-	interiorWhitespace := regexp.MustCompile(`[\s\p{Zs}]{2,}`)
-	newlines := regexp.MustCompile(`[\r\n]`)
 	text = surroundingWhitespace.ReplaceAllString(text, "")
 	text = interiorWhitespace.ReplaceAllString(text, " ")
 	text = newlines.ReplaceAllString(text, " ")
-- 
GitLab