Server changes/Sonarr

This commit is contained in:
ponzischeme89
2026-07-27 21:06:51 +12:00
parent 62f6345a40
commit 8d6cf2f5a1
42 changed files with 2388 additions and 284 deletions
+39 -2
View File
@@ -4,6 +4,7 @@ package main
import (
"context"
"encoding/hex"
"errors"
"flag"
"fmt"
@@ -20,7 +21,9 @@ import (
"github.com/ponzischeme89/memby/server/internal/config"
"github.com/ponzischeme89/memby/server/internal/emby"
"github.com/ponzischeme89/memby/server/internal/library"
"github.com/ponzischeme89/memby/server/internal/logging"
"github.com/ponzischeme89/memby/server/internal/recommend"
"github.com/ponzischeme89/memby/server/internal/sonarr"
"github.com/ponzischeme89/memby/server/internal/store"
)
@@ -37,7 +40,8 @@ func main() {
return
}
log := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
logLevel := logging.ParseLevel(os.Getenv("MEMBY_LOG_LEVEL"))
log := logging.New(os.Stdout, logLevel)
if err := run(log); err != nil {
log.Error("fatal", "error", err)
@@ -82,6 +86,34 @@ func run(log *slog.Logger) error {
}
embyClient := emby.New(cfg.EmbyURL, cfg.EmbyPublicURL, cfg.ClientName, cfg.UpstreamTimeout)
retiredSessions, err := st.TrimSessionsToLimit(ctx, cfg.MaxClientsPerUser)
if err != nil {
return err
}
for _, sess := range retiredSessions {
_ = ca.Delete(ctx, cache.SessionKey(hex.EncodeToString(sess.TokenHash)))
if err := embyClient.Logout(ctx, emby.Credentials{
UserID: sess.EmbyUserID, Token: sess.EmbyToken,
DeviceID: sess.DeviceID, DeviceName: sess.DeviceName,
}); err != nil {
log.Warn("could not retire excess emby session",
"username", sess.Username,
"device", sess.DeviceName,
"error", err,
)
}
}
if len(retiredSessions) > 0 {
log.Info("enforced per-user device allowance",
"retired_sessions", len(retiredSessions),
"max_clients_per_user", cfg.MaxClientsPerUser,
)
}
var sonarrClient *sonarr.Client
if cfg.SonarrURL != "" {
sonarrClient = sonarr.New(cfg.SonarrURL, cfg.SonarrAPIKey, cfg.UpstreamTimeout)
log.Info("sonarr integration enabled", "url", cfg.SonarrURL)
}
recommender := recommend.NewEngine(embyClient, log)
// Candidates come from the imported library when one exists, which keeps the
@@ -99,6 +131,7 @@ func run(log *slog.Logger) error {
Store: st,
Cache: ca,
Recommender: recommender,
Sonarr: sonarrClient,
Syncer: syncer,
Log: log,
})
@@ -135,7 +168,11 @@ func run(log *slog.Logger) error {
errCh := make(chan error, 1)
go func() {
log.Info("listening", "addr", cfg.ListenAddr, "emby", cfg.EmbyURL)
log.Info("server ready",
"listen", cfg.ListenAddr,
"emby", cfg.EmbyURL,
"sync_every", cfg.SyncInterval,
)
if err := httpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
errCh <- err
}