From 9fd50a6ae3018615c9c5cbd40e3603d9c86e470c Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 28 Jan 2025 14:51:50 +0200 Subject: [PATCH] media: fix saving thumbnail hashes --- pkg/gomuks/media.go | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/pkg/gomuks/media.go b/pkg/gomuks/media.go index f2b040f..1cd9d24 100644 --- a/pkg/gomuks/media.go +++ b/pkg/gomuks/media.go @@ -90,10 +90,15 @@ func (gmx *Gomuks) downloadMediaFromCache(ctx context.Context, w http.ResponseWr } if entry.ThumbnailHash == nil { err := gmx.generateAvatarThumbnail(entry, gmx.Config.Media.ThumbnailSize) - if err != nil { + if errors.Is(err, os.ErrNotExist) && !force { + return false + } else if err != nil { log.Err(err).Msg("Failed to generate avatar thumbnail") + gmx.saveMediaCacheEntryWithThumbnail(ctx, entry, err) w.WriteHeader(http.StatusInternalServerError) return true + } else { + gmx.saveMediaCacheEntryWithThumbnail(ctx, entry, nil) } } hash = entry.ThumbnailHash @@ -101,13 +106,15 @@ func (gmx *Gomuks) downloadMediaFromCache(ctx context.Context, w http.ResponseWr cacheFile, err := os.Open(gmx.cacheEntryToPath(hash[:])) if useThumbnail && errors.Is(err, os.ErrNotExist) { err = gmx.generateAvatarThumbnail(entry, gmx.Config.Media.ThumbnailSize) - if errors.Is(err, os.ErrNotExist) { - // Fall through to next error handler + if errors.Is(err, os.ErrNotExist) && !force { + return false } else if err != nil { log.Err(err).Msg("Failed to generate avatar thumbnail") + gmx.saveMediaCacheEntryWithThumbnail(ctx, entry, err) w.WriteHeader(http.StatusInternalServerError) return true } else { + gmx.saveMediaCacheEntryWithThumbnail(ctx, entry, nil) cacheFile, err = os.Open(gmx.cacheEntryToPath(hash[:])) } } @@ -151,6 +158,19 @@ func cacheEntryToHeaders(w http.ResponseWriter, entry *database.Media, thumbnail w.Header().Set("ETag", entry.ETag(thumbnail)) } +func (gmx *Gomuks) saveMediaCacheEntryWithThumbnail(ctx context.Context, entry *database.Media, err error) { + if errors.Is(err, os.ErrNotExist) { + return + } + if err != nil { + entry.ThumbnailError = err.Error() + } + err = gmx.Client.DB.Media.Put(ctx, entry) + if err != nil { + zerolog.Ctx(ctx).Err(err).Msg("Failed to save cache entry after generating thumbnail") + } +} + func (gmx *Gomuks) generateAvatarThumbnail(entry *database.Media, size int) error { cacheFile, err := os.Open(gmx.cacheEntryToPath(entry.Hash[:])) if err != nil {