diff --git a/url_previewing/calculated_previewer.go b/url_previewing/calculated_previewer.go
index 0720c8c657539dee57a5a90e57e2a46335cde2bb..73365dd0484d6ae8111bbf2852f8fca60005ec96 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 553bd524044e62d2c497291a820702641e1292b6..c8ba4b26481b910679350cac7562148d39e8ac15 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 423e2be5d22597b532834b5fd96b5c9792611cbe..6e42499346f89537bc3de556c0b65fdd5ea03937 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 bcc3b11ca209987828b0945c2e820e25a8fca321..c364bcb575a751a8b10381462ef0e43963bfee63 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, " ")