From 797e115191e7df4d16d9bec2def0c3cc7a4d9155 Mon Sep 17 00:00:00 2001 From: Hazel Noack Date: Wed, 16 Jul 2025 14:24:42 +0200 Subject: [PATCH] rewrote cache to work better --- internal/cache/cache.go | 97 ++++++++++++++++++++++++++++++++++++ internal/rendering/config.go | 9 ---- internal/server/server.go | 24 +++++---- 3 files changed, 111 insertions(+), 19 deletions(-) create mode 100644 internal/cache/cache.go diff --git a/internal/cache/cache.go b/internal/cache/cache.go new file mode 100644 index 0000000..950ed43 --- /dev/null +++ b/internal/cache/cache.go @@ -0,0 +1,97 @@ +package cache + +import ( + "crypto/sha1" + "encoding/hex" + "errors" + "io" + "net/http" + "net/url" + "os" + "path/filepath" + + "github.com/labstack/echo/v4" +) + +type Cache struct { + CacheDir string + Disabled bool +} + +func getCacheDir() (string, error) { + baseDir, err := os.UserCacheDir() + if err != nil { + baseDir = "/tmp" + } + cacheDir := filepath.Join(baseDir, "startpage") + err = os.MkdirAll(cacheDir, 0o755) + if err != nil { + return "", err + } + return cacheDir, nil +} + +func getProfileCacheDir(profile string) (string, error) { + var profileCacheDir string + + cacheDir, err := getCacheDir() + if err != nil { + return profileCacheDir, err + } + + profileCacheDir = filepath.Join(cacheDir, profile) + err = os.MkdirAll(cacheDir, 0o755) + return profileCacheDir, err +} + +func NewCache(profile string) Cache { + cacheDir, err := getProfileCacheDir(profile) + + return Cache{ + CacheDir: cacheDir, + Disabled: err != nil, + } +} + +const baseCacheUrl = "cache" + +func (c Cache) StartStaticServer(e *echo.Echo) error { + e.Static("/"+baseCacheUrl, c.CacheDir) + return nil +} + +func hashUrl(url string) string { + h := sha1.New() + io.WriteString(h, url) + return hex.EncodeToString(h.Sum(nil)) +} + +func (c Cache) CacheUrl(urlString string) (string, error) { + filename := hashUrl(urlString) + filepath.Ext(urlString) + targetPath := filepath.Join(c.CacheDir, filename) + + // if the file was already downloaded it doesn't need to be downloaded again + if _, err := os.Stat(targetPath); errors.Is(err, os.ErrNotExist) { + resp, err := http.Get(urlString) + if !errors.Is(err, os.ErrNotExist) { + return urlString, err + } + defer resp.Body.Close() + + file, err := os.Create(targetPath) + if err != nil { + return urlString, err + } + defer file.Close() + + _, err = io.Copy(file, resp.Body) + + if err != nil { + return urlString, err + } + } else { + return url.JoinPath(baseCacheUrl, filename) + } + + return url.JoinPath(baseCacheUrl, filename) +} diff --git a/internal/rendering/config.go b/internal/rendering/config.go index bd9f6f2..8348582 100644 --- a/internal/rendering/config.go +++ b/internal/rendering/config.go @@ -138,12 +138,3 @@ func (rc *Config) LoadConfigFile(file string) error { return toml.Unmarshal(content, rc) } - -func (c *Config) Init() error { - log.Println("downloading website icons...") - for i := range c.Template.Websites { - c.Template.Websites[i].Cache() - } - - return nil -} diff --git a/internal/server/server.go b/internal/server/server.go index f5b333e..a14fa28 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -5,6 +5,7 @@ import ( "net/http" "strconv" + "gitea.elara.ws/Hazel/transfem-startpage/internal/cache" "gitea.elara.ws/Hazel/transfem-startpage/internal/rendering" "github.com/labstack/echo/v4" ) @@ -17,11 +18,6 @@ func Start(profile string) error { return err } - err = Config.Init() - if err != nil { - return err - } - err = Config.FetchDiyHrt() if err != nil { log.Println(err) @@ -30,11 +26,19 @@ func Start(profile string) error { e := echo.New() // statically serve the file - cacheDir, err := rendering.GetCacheDir() - if err == nil { - e.Static("/cache", cacheDir) - } else { - log.Println("didn't enable cache dir", err) + cache := cache.NewCache(profile) + if !cache.Disabled { + cache.StartStaticServer(e) + + log.Println("downloading website icons...") + for i, w := range Config.Template.Websites { + u, err := cache.CacheUrl(w.ImageUrl) + if err != nil { + log.Println(err) + } + Config.Template.Websites[i].ImageUrl = u + Config.Template.Websites[i].IsFetched = true + } } // https://echo.labstack.com/docs/cookbook/embed-resources