diff --git a/cmd/oceanbench/broadcast.go b/cmd/oceanbench/broadcast.go index e34c54e5..01e9a840 100644 --- a/cmd/oceanbench/broadcast.go +++ b/cmd/oceanbench/broadcast.go @@ -68,6 +68,7 @@ const ( broadcastToken broadcastDelete broadcastSelect + broadcastResetState // Vidforward control API request actions. vidforwardCreate @@ -435,6 +436,22 @@ func broadcastHandler(w http.ResponseWriter, r *http.Request) { } msg = "slate uploaded successfully" + case broadcastResetState: + err = resetState(ctx, &req.CurrentBroadcast) + if err != nil { + reportError(w, r, req, "could not reset state: %v", err) + return + } + v, err := model.GetVariable(ctx, settingsStore, sKey, broadcastScope+"."+cfg.Name) + if err != nil { + reportError(w, r, req, "could not load saved broadcast: %v", err) + return + } + err = json.Unmarshal([]byte(v.Value), cfg) + if err != nil { + reportError(w, r, req, "could not unmarshal broadcast: %v", err) + return + } } writeTemplate(w, r, "broadcast.html", &req, msg) @@ -450,6 +467,7 @@ func stringToAction(s string, req broadcastRequest) Action { "broadcast-token": broadcastToken, "broadcast-delete": broadcastDelete, "broadcast-select": broadcastSelect, + "broadcast-reset-state": broadcastResetState, "vidforward-create": vidforwardCreate, "vidforward-play": vidforwardPlay, "vidforward-slate": vidforwardSlate, @@ -495,6 +513,37 @@ func saveBroadcast(ctx context.Context, cfg *Cfg) error { return nil } +// resetState sends a request to reset the state of a broadcast to the broadcast manager service (oceantv). +// TODO: Add JWT signing. +func resetState(ctx context.Context, cfg *Cfg) error { + data, err := json.Marshal(cfg) + if err != nil { + return fmt.Errorf("error marshalling BroadcastConfig: %w", err) + } + + const resetStateEndpoint = "/broadcast/reset-state" + url := tvURL + resetStateEndpoint + reader := bytes.NewReader(data) + req, err := http.NewRequest("POST", url, reader) + if err != nil { + return fmt.Errorf("error creating %s request: %w", resetStateEndpoint, err) + } + req.Header.Set("Content-Type", "application/json") + + clt := &http.Client{} + resp, err := clt.Do(req) + if err != nil { + return fmt.Errorf("error sending %s request: %w", resetStateEndpoint, err) + } + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("%s request failed with status code: %s", resetStateEndpoint, http.StatusText(resp.StatusCode)) + } + + log.Printf("%s OK", resetStateEndpoint) + return nil +} + // deleteBroadcast deletes a broadcast from the datastore and also updates the BroadcastVars // list and CurrentBroadcast config to clear the form on next page write. func deleteBroadcast(ctx context.Context, req *broadcastRequest, store datastore.Store) error { diff --git a/cmd/oceanbench/main.go b/cmd/oceanbench/main.go index d12c3718..8b762760 100644 --- a/cmd/oceanbench/main.go +++ b/cmd/oceanbench/main.go @@ -73,7 +73,7 @@ import ( ) const ( - version = "v0.32.2" + version = "v0.32.3" localSite = "localhost" localDevice = "localdevice" localEmail = "localuser@localhost" diff --git a/cmd/oceanbench/t/broadcast.html b/cmd/oceanbench/t/broadcast.html index 1b723bbf..5a9ce6e3 100644 --- a/cmd/oceanbench/t/broadcast.html +++ b/cmd/oceanbench/t/broadcast.html @@ -148,6 +148,10 @@