package realdebrid import ( "math" "net/http" "strings" "time" ) func RetryUntilOk[T any](fn func() (T, error)) T { const initialDelay = 1 * time.Second const maxDelay = 128 * time.Second for i := 0; ; i++ { result, err := fn() if err == nil || !strings.Contains(err.Error(), "429") { return result } delay := time.Duration(math.Min(float64(initialDelay*time.Duration(math.Pow(2, float64(i)))), float64(maxDelay))) time.Sleep(delay) } } func canFetchFirstByte(url string) bool { // Create a new HTTP request req, err := http.NewRequest("GET", url, nil) if err != nil { return false } // Set the Range header to request only the first byte req.Header.Set("Range", "bytes=0-0") // Execute the request resp, err := http.DefaultClient.Do(req) if err != nil { return false } defer resp.Body.Close() // If server supports partial content if resp.StatusCode == http.StatusPartialContent { buffer := make([]byte, 1) _, err := resp.Body.Read(buffer) return err == nil } if resp.StatusCode != http.StatusOK { return false } // If server doesn't support partial content, try reading the first byte and immediately close buffer := make([]byte, 1) _, err = resp.Body.Read(buffer) resp.Body.Close() // Close immediately after reading return err == nil }