mirror of
https://github.com/gabehf/Koito.git
synced 2026-03-07 13:38:15 -08:00
chore: push image processing to a dedicated thread
This commit is contained in:
parent
a35d1391a6
commit
aba2b76def
9 changed files with 168 additions and 54 deletions
|
|
@ -101,6 +101,8 @@ func Run(
|
|||
EnableDeezer: !cfg.DeezerDisabled(),
|
||||
})
|
||||
|
||||
ip := catalog.NewImageProcessor(1)
|
||||
|
||||
userCount, _ := store.CountUsers(ctx)
|
||||
if userCount < 1 {
|
||||
l.Debug().Msg("Creating default user...")
|
||||
|
|
@ -145,7 +147,7 @@ func Run(
|
|||
mux.Use(chimiddleware.Recoverer)
|
||||
mux.Use(chimiddleware.RealIP)
|
||||
// call router binds on mux
|
||||
bindRoutes(mux, &ready, store, mbzC)
|
||||
bindRoutes(mux, &ready, store, mbzC, ip)
|
||||
|
||||
httpServer := &http.Server{
|
||||
Addr: cfg.ListenAddr(),
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ import (
|
|||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func ImageHandler(store db.DB) http.HandlerFunc {
|
||||
func ImageHandler(store db.DB, ip *catalog.ImageProcessor) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
l := logger.FromContext(r.Context())
|
||||
size := chi.URLParam(r, "size")
|
||||
|
|
@ -31,7 +31,7 @@ func ImageHandler(store db.DB) http.HandlerFunc {
|
|||
|
||||
imgid, err := uuid.Parse(filename)
|
||||
if err != nil {
|
||||
serveDefaultImage(w, r, imageSize)
|
||||
serveDefaultImage(w, r, imageSize, ip)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -51,7 +51,7 @@ func ImageHandler(store db.DB) http.HandlerFunc {
|
|||
if _, err = os.Stat(fullSizePath); os.IsNotExist(err) {
|
||||
if _, err = os.Stat(largeSizePath); os.IsNotExist(err) {
|
||||
l.Warn().Msgf("Could not find requested image %s. If this image is tied to an album or artist, it should be replaced", imgid.String())
|
||||
serveDefaultImage(w, r, imageSize)
|
||||
serveDefaultImage(w, r, imageSize, ip)
|
||||
return
|
||||
} else if err != nil {
|
||||
// non-not found error for full file
|
||||
|
|
@ -80,7 +80,7 @@ func ImageHandler(store db.DB) http.HandlerFunc {
|
|||
return
|
||||
}
|
||||
|
||||
err = catalog.CompressAndSaveImage(r.Context(), imgid.String(), imageSize, bytes.NewReader(imageBuf))
|
||||
err = ip.EnqueueCompressAndSave(r.Context(), imgid.String(), imageSize, bytes.NewReader(imageBuf))
|
||||
if err != nil {
|
||||
l.Err(err).Msg("Failed to save compressed image to cache")
|
||||
}
|
||||
|
|
@ -96,7 +96,7 @@ func ImageHandler(store db.DB) http.HandlerFunc {
|
|||
}
|
||||
}
|
||||
|
||||
func serveDefaultImage(w http.ResponseWriter, r *http.Request, size catalog.ImageSize) {
|
||||
func serveDefaultImage(w http.ResponseWriter, r *http.Request, size catalog.ImageSize, ip *catalog.ImageProcessor) {
|
||||
var lock sync.Mutex
|
||||
l := logger.FromContext(r.Context())
|
||||
defaultImagePath := filepath.Join(cfg.ConfigDir(), catalog.ImageCacheDir, string(size), "default_img")
|
||||
|
|
@ -127,7 +127,7 @@ func serveDefaultImage(w http.ResponseWriter, r *http.Request, size catalog.Imag
|
|||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
err = catalog.CompressAndSaveImage(r.Context(), "default_img", size, file)
|
||||
err = ip.EnqueueCompressAndSave(r.Context(), "default_img", size, file)
|
||||
if err != nil {
|
||||
l.Err(err).Msg("Error when caching default img at desired size")
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ type ReplaceImageResponse struct {
|
|||
Message string `json:"message,omitempty"`
|
||||
}
|
||||
|
||||
func ReplaceImageHandler(store db.DB) http.HandlerFunc {
|
||||
func ReplaceImageHandler(store db.DB, ip *catalog.ImageProcessor) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
l := logger.FromContext(ctx)
|
||||
|
|
@ -80,7 +80,7 @@ func ReplaceImageHandler(store db.DB) http.HandlerFunc {
|
|||
dlSize = catalog.ImageSizeLarge
|
||||
}
|
||||
l.Debug().Msg("Downloading album image from source...")
|
||||
err = catalog.DownloadAndCacheImage(ctx, id, fileUrl, dlSize)
|
||||
err = ip.EnqueueDownloadAndCache(ctx, id, fileUrl, dlSize)
|
||||
if err != nil {
|
||||
l.Err(err).Msg("Failed to cache image")
|
||||
}
|
||||
|
|
@ -120,7 +120,7 @@ func ReplaceImageHandler(store db.DB) http.HandlerFunc {
|
|||
dlSize = catalog.ImageSizeLarge
|
||||
}
|
||||
|
||||
err = catalog.CompressAndSaveImage(ctx, id.String(), dlSize, file)
|
||||
err = ip.EnqueueCompressAndSave(ctx, id.String(), dlSize, file)
|
||||
if err != nil {
|
||||
utils.WriteError(w, "Could not save file", http.StatusInternalServerError)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import (
|
|||
|
||||
"github.com/gabehf/koito/engine/handlers"
|
||||
"github.com/gabehf/koito/engine/middleware"
|
||||
"github.com/gabehf/koito/internal/catalog"
|
||||
"github.com/gabehf/koito/internal/cfg"
|
||||
"github.com/gabehf/koito/internal/db"
|
||||
mbz "github.com/gabehf/koito/internal/mbz"
|
||||
|
|
@ -24,10 +25,11 @@ func bindRoutes(
|
|||
ready *atomic.Bool,
|
||||
db db.DB,
|
||||
mbz mbz.MusicBrainzCaller,
|
||||
ip *catalog.ImageProcessor,
|
||||
) {
|
||||
r.With(chimiddleware.RequestSize(5<<20)).
|
||||
With(middleware.AllowedHosts).
|
||||
Get("/images/{size}/{filename}", handlers.ImageHandler(db))
|
||||
Get("/images/{size}/{filename}", handlers.ImageHandler(db, ip))
|
||||
|
||||
r.Route("/apis/web/v1", func(r chi.Router) {
|
||||
r.Use(middleware.AllowedHosts)
|
||||
|
|
@ -65,7 +67,7 @@ func bindRoutes(
|
|||
|
||||
r.Group(func(r chi.Router) {
|
||||
r.Use(middleware.ValidateSession(db))
|
||||
r.Post("/replace-image", handlers.ReplaceImageHandler(db))
|
||||
r.Post("/replace-image", handlers.ReplaceImageHandler(db, ip))
|
||||
r.Post("/merge/tracks", handlers.MergeTracksHandler(db))
|
||||
r.Post("/merge/albums", handlers.MergeReleaseGroupsHandler(db))
|
||||
r.Post("/merge/artists", handlers.MergeArtistsHandler(db))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue