diff --git a/internal/cfg/cfg.go b/internal/cfg/cfg.go index 0c8ae33..0e9fd29 100644 --- a/internal/cfg/cfg.go +++ b/internal/cfg/cfg.go @@ -36,6 +36,7 @@ const ( SKIP_IMPORT_ENV = "KOITO_SKIP_IMPORT" ALLOWED_HOSTS_ENV = "KOITO_ALLOWED_HOSTS" DISABLE_RATE_LIMIT_ENV = "KOITO_DISABLE_RATE_LIMIT" + THROTTLE_IMPORTS_MS = "KOITO_THROTTLE_IMPORTS_MS" ) type config struct { @@ -60,6 +61,7 @@ type config struct { allowedHosts []string allowAllHosts bool disableRateLimit bool + importThrottleMs int } var ( @@ -104,6 +106,8 @@ func loadConfig(getenv func(string) string) (*config, error) { cfg.lbzRelayUrl = getenv(LBZ_RELAY_URL_ENV) } + cfg.importThrottleMs, _ = strconv.Atoi(getenv(THROTTLE_IMPORTS_MS)) + cfg.disableRateLimit = parseBool(getenv(DISABLE_RATE_LIMIT_ENV)) cfg.structuredLogging = parseBool(getenv(ENABLE_STRUCTURED_LOGGING_ENV)) @@ -278,3 +282,9 @@ func RateLimitDisabled() bool { defer lock.RUnlock() return globalConfig.disableRateLimit } + +func ThrottleImportMs() int { + lock.RLock() + defer lock.RUnlock() + return globalConfig.importThrottleMs +} diff --git a/internal/importer/maloja.go b/internal/importer/maloja.go index 392f254..a4d1e53 100644 --- a/internal/importer/maloja.go +++ b/internal/importer/maloja.go @@ -39,6 +39,12 @@ func ImportMalojaFile(ctx context.Context, store db.DB, filename string) error { l.Err(err).Msgf("Failed to read import file: %s", filename) return err } + var throttleFunc = func() {} + if ms := cfg.ThrottleImportMs(); ms > 0 { + throttleFunc = func() { + time.Sleep(time.Duration(ms) * time.Millisecond) + } + } export := new(MalojaExport) err = json.NewDecoder(file).Decode(&export) if err != nil { @@ -73,6 +79,7 @@ func ImportMalojaFile(ctx context.Context, store db.DB, filename string) error { l.Err(err).Msg("Failed to import maloja playback item") return err } + throttleFunc() } _, err = os.Stat(path.Join(cfg.ConfigDir(), "import_complete")) if err != nil { diff --git a/internal/importer/spotify.go b/internal/importer/spotify.go index d79feed..275d47e 100644 --- a/internal/importer/spotify.go +++ b/internal/importer/spotify.go @@ -31,6 +31,12 @@ func ImportSpotifyFile(ctx context.Context, store db.DB, filename string) error l.Err(err).Msgf("Failed to read import file: %s", filename) return err } + var throttleFunc = func() {} + if ms := cfg.ThrottleImportMs(); ms > 0 { + throttleFunc = func() { + time.Sleep(time.Duration(ms) * time.Millisecond) + } + } export := make([]SpotifyExportItem, 0) err = json.NewDecoder(file).Decode(&export) if err != nil { @@ -59,6 +65,7 @@ func ImportSpotifyFile(ctx context.Context, store db.DB, filename string) error l.Err(err).Msg("Failed to import spotify playback item") return err } + throttleFunc() } _, err = os.Stat(path.Join(cfg.ConfigDir(), "import_complete")) if err != nil {