Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

57 rindas
1.2KB

  1. package nmos
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "strings"
  8. "time"
  9. )
  10. type QueryClient struct {
  11. BaseURL string
  12. HTTPClient *http.Client
  13. }
  14. func NewQueryClient(baseURL string) *QueryClient {
  15. return &QueryClient{
  16. BaseURL: strings.TrimRight(baseURL, "/"),
  17. HTTPClient: &http.Client{
  18. Timeout: 10 * time.Second,
  19. },
  20. }
  21. }
  22. func (c *QueryClient) GetSenders(ctx context.Context) ([]Sender, error) {
  23. var out []Sender
  24. if err := c.getJSON(ctx, "/x-nmos/query/v1.3/senders", &out); err != nil {
  25. return nil, err
  26. }
  27. return out, nil
  28. }
  29. func (c *QueryClient) GetReceivers(ctx context.Context) ([]Receiver, error) {
  30. var out []Receiver
  31. if err := c.getJSON(ctx, "/x-nmos/query/v1.3/receivers", &out); err != nil {
  32. return nil, err
  33. }
  34. return out, nil
  35. }
  36. func (c *QueryClient) getJSON(ctx context.Context, path string, target any) error {
  37. req, err := http.NewRequestWithContext(ctx, http.MethodGet, c.BaseURL+path, nil)
  38. if err != nil {
  39. return err
  40. }
  41. resp, err := c.HTTPClient.Do(req)
  42. if err != nil {
  43. return err
  44. }
  45. defer resp.Body.Close()
  46. if resp.StatusCode < 200 || resp.StatusCode >= 300 {
  47. return fmt.Errorf("NMOS query %s returned %s", path, resp.Status)
  48. }
  49. return json.NewDecoder(resp.Body).Decode(target)
  50. }