diff --git a/js/docs/src/content/docs/lex-reference/openapi.json b/js/docs/src/content/docs/lex-reference/openapi.json index f9b0ae1c..c6143cc9 100644 --- a/js/docs/src/content/docs/lex-reference/openapi.json +++ b/js/docs/src/content/docs/lex-reference/openapi.json @@ -517,6 +517,47 @@ } } }, + "/xrpc/place.stream.playback.getPlaybackServer": { + "get": { + "summary": "Get available playback servers for a livestream.", + "operationId": "place.stream.playback.getPlaybackServer", + "tags": ["place.stream.playback"], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "servers": { + "type": "array", + "description": "List of available playback server addresses", + "items": { + "type": "string" + } + } + }, + "required": ["servers"] + } + } + } + } + }, + "parameters": [ + { + "name": "stream", + "in": "query", + "required": true, + "description": "Identifier of the stream to get playback servers for", + "schema": { + "type": "string", + "description": "Identifier of the stream to get playback servers for" + } + } + ] + } + }, "/xrpc/place.stream.playback.whep": { "post": { "summary": "Play a stream over WebRTC using WHEP.", diff --git a/js/docs/src/content/docs/lex-reference/playback/place-stream-playback-getplaybackserver.md b/js/docs/src/content/docs/lex-reference/playback/place-stream-playback-getplaybackserver.md new file mode 100644 index 00000000..64a17f6b --- /dev/null +++ b/js/docs/src/content/docs/lex-reference/playback/place-stream-playback-getplaybackserver.md @@ -0,0 +1,77 @@ +--- +title: place.stream.playback.getPlaybackServer +description: Reference for the place.stream.playback.getPlaybackServer lexicon +--- + +**Lexicon Version:** 1 + +## Definitions + + + +### `main` + +**Type:** `query` + +Get available playback servers for a livestream. + +**Parameters:** + +| Name | Type | Req'd | Description | Constraints | +| -------- | -------- | ----- | ---------------------------------------------------- | ----------- | +| `stream` | `string` | ✅ | Identifier of the stream to get playback servers for | | + +**Output:** + +- **Encoding:** `application/json` +- **Schema:** + +**Schema Type:** `object` + +| Name | Type | Req'd | Description | Constraints | +| --------- | ----------------- | ----- | ------------------------------------------- | ----------- | +| `servers` | Array of `string` | ✅ | List of available playback server addresses | | + +--- + +## Lexicon Source + +```json +{ + "lexicon": 1, + "id": "place.stream.playback.getPlaybackServer", + "defs": { + "main": { + "type": "query", + "description": "Get available playback servers for a livestream.", + "parameters": { + "type": "params", + "required": ["stream"], + "properties": { + "stream": { + "type": "string", + "description": "Identifier of the stream to get playback servers for" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["servers"], + "properties": { + "servers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of available playback server addresses" + } + } + } + }, + "errors": [] + } + } +} +``` diff --git a/lexicons/place/stream/playback/getPlaybackServer.json b/lexicons/place/stream/playback/getPlaybackServer.json new file mode 100644 index 00000000..181502fe --- /dev/null +++ b/lexicons/place/stream/playback/getPlaybackServer.json @@ -0,0 +1,37 @@ +{ + "lexicon": 1, + "id": "place.stream.playback.getPlaybackServer", + "defs": { + "main": { + "type": "query", + "description": "Get available playback servers for a livestream.", + "parameters": { + "type": "params", + "required": ["stream"], + "properties": { + "stream": { + "type": "string", + "description": "Identifier of the stream to get playback servers for" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["servers"], + "properties": { + "servers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of available playback server addresses" + } + } + } + }, + "errors": [] + } + } +} diff --git a/pkg/spxrpc/place_stream_playback.go b/pkg/spxrpc/place_stream_playback.go index 3c786697..d3b5bb77 100644 --- a/pkg/spxrpc/place_stream_playback.go +++ b/pkg/spxrpc/place_stream_playback.go @@ -10,11 +10,19 @@ import ( "strings" "github.com/labstack/echo/v4" + placestream "stream.place/streamplace/pkg/streamplace" "github.com/pion/webrtc/v4" "github.com/streamplace/oatproxy/pkg/oatproxy" "stream.place/streamplace/pkg/constants" ) +func (s *Server) handlePlaceStreamPlaybackGetPlaybackServer(ctx context.Context, stream string) (*placestream.PlaybackGetPlaybackServer_Output, error) { + addr := strings.TrimPrefix(s.cli.ServerDID(), "did:web:") + return &placestream.PlaybackGetPlaybackServer_Output{ + Servers: []string{addr}, + }, nil +} + func (s *Server) handlePlaceStreamPlaybackWhep(ctx context.Context, rendition string, streamer string, r io.Reader, _contentType string) (io.Reader, error) { if alias, ok := s.aliases[streamer]; ok { streamer = alias diff --git a/pkg/spxrpc/stubs.go b/pkg/spxrpc/stubs.go index 346c0a55..2ddcf76a 100644 --- a/pkg/spxrpc/stubs.go +++ b/pkg/spxrpc/stubs.go @@ -305,6 +305,7 @@ func (s *Server) RegisterHandlersPlaceStream(e *echo.Echo) error { e.POST("/xrpc/place.stream.multistream.deleteTarget", s.HandlePlaceStreamMultistreamDeleteTarget) e.GET("/xrpc/place.stream.multistream.listTargets", s.HandlePlaceStreamMultistreamListTargets) e.POST("/xrpc/place.stream.multistream.putTarget", s.HandlePlaceStreamMultistreamPutTarget) + e.GET("/xrpc/place.stream.playback.getPlaybackServer", s.HandlePlaceStreamPlaybackGetPlaybackServer) e.POST("/xrpc/place.stream.playback.whep", s.HandlePlaceStreamPlaybackWhep) e.POST("/xrpc/place.stream.server.createWebhook", s.HandlePlaceStreamServerCreateWebhook) e.POST("/xrpc/place.stream.server.deleteWebhook", s.HandlePlaceStreamServerDeleteWebhook) @@ -798,6 +799,20 @@ func (s *Server) HandlePlaceStreamMultistreamPutTarget(c echo.Context) error { return c.JSON(200, out) } +func (s *Server) HandlePlaceStreamPlaybackGetPlaybackServer(c echo.Context) error { + ctx, span := otel.Tracer("server").Start(c.Request().Context(), "HandlePlaceStreamPlaybackGetPlaybackServer") + defer span.End() + stream := c.QueryParam("stream") + var out *placestream.PlaybackGetPlaybackServer_Output + var handleErr error + // func (s *Server) handlePlaceStreamPlaybackGetPlaybackServer(ctx context.Context,stream string) (*placestream.PlaybackGetPlaybackServer_Output, error) + out, handleErr = s.handlePlaceStreamPlaybackGetPlaybackServer(ctx, stream) + if handleErr != nil { + return handleErr + } + return c.JSON(200, out) +} + func (s *Server) HandlePlaceStreamPlaybackWhep(c echo.Context) error { ctx, span := otel.Tracer("server").Start(c.Request().Context(), "HandlePlaceStreamPlaybackWhep") defer span.End() diff --git a/pkg/streamplace/playbackgetPlaybackServer.go b/pkg/streamplace/playbackgetPlaybackServer.go new file mode 100644 index 00000000..d1c2e42a --- /dev/null +++ b/pkg/streamplace/playbackgetPlaybackServer.go @@ -0,0 +1,32 @@ +// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. + +// Lexicon schema: place.stream.playback.getPlaybackServer + +package streamplace + +import ( + "context" + + lexutil "github.com/bluesky-social/indigo/lex/util" +) + +// PlaybackGetPlaybackServer_Output is the output of a place.stream.playback.getPlaybackServer call. +type PlaybackGetPlaybackServer_Output struct { + // servers: List of available playback server addresses + Servers []string `json:"servers" cborgen:"servers"` +} + +// PlaybackGetPlaybackServer calls the XRPC method "place.stream.playback.getPlaybackServer". +// +// stream: Identifier of the stream to get playback servers for +func PlaybackGetPlaybackServer(ctx context.Context, c lexutil.LexClient, stream string) (*PlaybackGetPlaybackServer_Output, error) { + var out PlaybackGetPlaybackServer_Output + + params := map[string]interface{}{} + params["stream"] = stream + if err := c.LexDo(ctx, lexutil.Query, "", "place.stream.playback.getPlaybackServer", params, nil, &out); err != nil { + return nil, err + } + + return &out, nil +}