diff --git a/pkg/nest/api.go b/pkg/nest/api.go index e9c5f10f..4e9e4dbd 100644 --- a/pkg/nest/api.go +++ b/pkg/nest/api.go @@ -184,16 +184,10 @@ func (a *API) ExchangeSDP(projectID, deviceID, offer string) (string, error) { return "", err } - // Handle 409 (Conflict) and 429 (Too Many Requests) - if res.StatusCode == 409 || res.StatusCode == 429 { + // Handle 409 (Conflict), 429 (Too Many Requests), and 401 (Unauthorized) + if res.StatusCode == 409 || res.StatusCode == 429 || res.StatusCode == 401 { res.Body.Close() if attempt < maxRetries-1 { - log.Info(). - Int("status", res.StatusCode). - Float64("delay", retryDelay.Seconds()). - Int("attempt", attempt+1). - Int("max_retries", maxRetries-1). - Msg("API request failed, retrying") // Get new token from Google if err := a.refreshToken(); err != nil { return "", err @@ -471,20 +465,22 @@ type Device struct { } func (a *API) StartExtendStreamTimer() { - // Calculate the duration until 30 seconds before the stream expires - duration := time.Until(a.StreamExpiresAt.Add(-30 * time.Second)) - a.extendTimer = time.AfterFunc(duration, func() { + if a.extendTimer != nil { + return + } + + a.extendTimer = time.NewTimer(time.Until(a.StreamExpiresAt) - time.Minute) + go func() { + <-a.extendTimer.C if err := a.ExtendStream(); err != nil { return } - duration = time.Until(a.StreamExpiresAt.Add(-30 * time.Second)) - a.extendTimer.Reset(duration) - }) + }() } func (a *API) StopExtendStreamTimer() { - if a.extendTimer == nil { - return + if a.extendTimer != nil { + a.extendTimer.Stop() + a.extendTimer = nil } - a.extendTimer.Stop() } diff --git a/pkg/nest/client.go b/pkg/nest/client.go index 65153624..7bd381f9 100644 --- a/pkg/nest/client.go +++ b/pkg/nest/client.go @@ -6,15 +6,12 @@ import ( "strings" "time" - "github.com/AlexxIT/go2rtc/internal/app" "github.com/AlexxIT/go2rtc/pkg/core" "github.com/AlexxIT/go2rtc/pkg/rtsp" "github.com/AlexxIT/go2rtc/pkg/webrtc" pion "github.com/pion/webrtc/v3" ) -var log = app.GetLogger("nest") - type WebRTCClient struct { conn *webrtc.Conn api *API @@ -55,12 +52,6 @@ func Dial(rawURL string) (core.Producer, error) { } lastErr = err if attempt < maxRetries-1 { - log.Info(). - Float64("delay", retryDelay.Seconds()). - Int("attempt", attempt+1). - Int("max_retries", maxRetries-1). - Err(err). - Msg("API initialization failed, retrying") time.Sleep(retryDelay) retryDelay *= 2 // exponential backoff } @@ -146,12 +137,6 @@ func rtcConn(nestAPI *API, rawURL, projectID, deviceID string) (*WebRTCClient, e if err != nil { lastErr = err if attempt < maxRetries-1 { - log.Info(). - Float64("delay", retryDelay.Seconds()). - Int("attempt", attempt+1). - Int("max_retries", maxRetries-1). - Err(err). - Msg("WebRTC connection setup failed, retrying") time.Sleep(retryDelay) retryDelay *= 2 continue