From c67c0b9f9bfddd0801f85469c877fe4614a4376e Mon Sep 17 00:00:00 2001 From: Richard Weyer Date: Sun, 24 May 2026 16:44:05 +0200 Subject: [PATCH] feat(api): add optional thumbnails to Server API (Issue ebu#64) --- v1/specification/open-api/docs/app.bundle.js | 4 +- v1/specification/open-api/server-api.yaml | 84 +++++++++++++++++ .../src/generated/server-api.ts | 93 +++++++++++++++++++ 3 files changed, 179 insertions(+), 2 deletions(-) diff --git a/v1/specification/open-api/docs/app.bundle.js b/v1/specification/open-api/docs/app.bundle.js index a536fdd..12694ee 100644 --- a/v1/specification/open-api/docs/app.bundle.js +++ b/v1/specification/open-api/docs/app.bundle.js @@ -15,7 +15,7 @@ \****************************************************/ /***/ ((module) => { -eval("module.exports = {\"openapi\":\"3.0.3\",\"info\":{\"title\":\"OGraf Server API\",\"description\":\"The OGraf Server API is used to control an OGraf-compatible server\",\"version\":\"1.0.0\",\"license\":{\"name\":\"MIT License\",\"url\":\"http://opensource.org/licenses/MIT\"},\"x-logo\":{\"url\":\"https://github.com/ebu/ograf/blob/main/docs/logo/ograf-logo-colour.svg\",\"backgroundColor\":\"#FFFFFF\",\"altText\":\"OGraf\"}},\"servers\":[{\"url\":\"http://localhost:8080/ograf/v1\"},{\"url\":\"http://localhost:3000/ograf/v1\"},{\"url\":\"http://localhost/ograf/v1\"}],\"paths\":{\"/\":{\"get\":{\"summary\":\"Server information\",\"responses\":{\"200\":{\"description\":\"Returns information about the server\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"description\":\"Name of the server\",\"example\":\"My Ograf Server\"},\"description\":{\"type\":\"string\",\"description\":\"Longer description of the server\",\"example\":\"This server handles graphics for the main news shows\"},\"author\":{\"description\":\"Information about the author/manufacturer of the Server\",\"$ref\":\"#/components/schemas/Author\"},\"version\":{\"type\":\"string\",\"description\":\"Version of the Server\",\"example\":\"1.0\"}},\"required\":[\"name\"]}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/graphics\":{\"get\":{\"summary\":\"List graphics\",\"responses\":{\"200\":{\"description\":\"Returns a list of available OGraf Graphics\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphics\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/GraphicListInfo\"}}},\"required\":[\"graphics\"]}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/graphics/{graphicId}\":{\"get\":{\"summary\":\"Retrieve info about a graphic\",\"parameters\":[{\"in\":\"path\",\"name\":\"graphicId\",\"description\":\"ID of the graphic to retrieve\",\"schema\":{\"$ref\":\"#/components/schemas/GraphicId\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"Returns info of an OGraf Graphic\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphic\":{\"$ref\":\"#/components/schemas/GraphicManifest\"},\"metadata\":{\"$ref\":\"#/components/schemas/GraphicMetadata\"}},\"required\":[\"graphic\",\"manifest\"]}}}},\"404\":{\"description\":\"No Graphic found with the given ID and version\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}},\"delete\":{\"summary\":\"Delete a graphic\",\"parameters\":[{\"in\":\"path\",\"name\":\"graphicId\",\"description\":\"ID of the graphic to delete\",\"schema\":{\"$ref\":\"#/components/schemas/GraphicId\"},\"required\":true},{\"in\":\"query\",\"name\":\"force\",\"description\":\"Whether to force deletion. If force not true, it is recommended that the server keeps the Graphic contents for a while, but unlist it. This is to ensure that any currently-on-air Graphics are not affected.\",\"schema\":{\"type\":\"boolean\",\"default\":false}}],\"responses\":{\"200\":{\"description\":\"Graphic deleted\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\"}}}},\"404\":{\"description\":\"No Graphic found with the given ID and version\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers\":{\"get\":{\"summary\":\"List Renderers\",\"responses\":{\"200\":{\"description\":\"Returns a list of available Renderers\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderers\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/RendererId\"},\"name\":{\"$ref\":\"#/components/schemas/RendererInfo/properties/name\"},\"description\":{\"$ref\":\"#/components/schemas/RendererInfo/properties/description\"}},\"required\":[\"id\",\"name\"]}}},\"required\":[\"renderers\"]}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}\":{\"get\":{\"summary\":\"Retrieve info about a renderer\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"Returns info of a Renderer\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderer\":{\"$ref\":\"#/components/schemas/RendererInfo\"}},\"required\":[\"renderer\"]}}}},\"404\":{\"description\":\"No Renderer found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target\":{\"get\":{\"summary\":\"Retrieve info about a RenderTarget\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true},{\"in\":\"query\",\"name\":\"renderTarget\",\"description\":\"The RenderTarget to retrieve info about. Note that this is a JSON-stringified RenderTargetIdentifier!\",\"schema\":{\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"Returns info of a Renderer\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/RenderTargetInfo\"}}}},\"404\":{\"description\":\"No RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/customActions/{customActionId}\":{\"post\":{\"summary\":\"Invoke a CustomAction on a Renderer\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true},{\"in\":\"path\",\"name\":\"customActionId\",\"schema\":{\"type\":\"string\"},\"required\":true,\"description\":\"ID of the CustomAction to be invoked\",\"example\":\"shake-it\"}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"payload\":{\"description\":\"Payload to send into the CustomAction\",\"example\":{\"foo\":\"bar\"}},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}},\"required\":[\"payload\"]}}}},\"responses\":{\"200\":{\"description\":\"CustomAction successfully executed, returning result\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"result\":{\"example\":\"Yes, I did it!\"}}}}}},\"404\":{\"description\":\"No Renderer found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/clear\":{\"put\":{\"summary\":\"Clear (remove) GraphicInstance(s) from one (or more) RenderTargets\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"filters\":{\"type\":\"array\",\"description\":\"List of filters for what Graphics to clear. If no filters are defined, All graphics are cleared. If multiple filters are defined, any GraphicInstances matching at least one of the filters will be cleared.\",\"items\":{\"$ref\":\"#/components/schemas/GraphicFilter\"}}},\"required\":[\"filters\"]}}}},\"responses\":{\"200\":{\"description\":\"GraphicInstance(s) successfully cleared\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ClearGraphicsResponse\"}}}},\"404\":{\"description\":\"No Renderer found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/load\":{\"post\":{\"summary\":\"Load a Graphic onto a RenderTarget (ie create a GraphicInstance at a RenderTarget)\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to load the graphic onto\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicId\":{\"description\":\"The graphic to load\",\"$ref\":\"#/components/schemas/GraphicId\"},\"params\":{\"description\":\"Params to send to the load() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Data to send to the load() method of the GraphicInstance\",\"example\":\"{ \\\"name\\\": \\\"John Doe\\\" }\"}},\"required\":[\"data\"]}},\"required\":[\"renderTarget\",\"graphicId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"Graphic successfully loaded, returns GraphicInstanceId of the new GraphicInstance\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the newly created GraphicInstance. Use this id to target the GraphicInstance for further actions.\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the load() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the load() method\",\"type\":\"string\",\"example\":\"Loaded OK\"}},\"required\":[\"graphicInstanceId\",\"statusCode\"]}}}},\"404\":{\"description\":\"No Graphic or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"load() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/updateAction\":{\"post\":{\"summary\":\"For GraphicInstance at a RenderTarget: Call the updateAction() method\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to target with the command.\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Id of the GraphicInstance to target with the command\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"params\":{\"$ref\":\"#/components/schemas/UpdateActionParams\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"updateAction() successfully executed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the affected GraphicInstance\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the updateAction() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the updateAction() method\",\"type\":\"string\"}},\"required\":[\"graphicInstanceId\",\"statusCode\"]}}}},\"404\":{\"description\":\"No GraphicInstance or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"updateAction() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/playAction\":{\"post\":{\"summary\":\"For GraphicInstance at a RenderTarget: Call the playAction() method\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to target with the command.\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Id of the GraphicInstance to target with the command\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"params\":{\"$ref\":\"#/components/schemas/PlayActionParams\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"playAction() successfully executed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the affected GraphicInstance\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the playAction() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the playAction() method\",\"type\":\"string\",\"example\":\"Playing!\"},\"currentStep\":{\"description\":\"The resulting step from a PlayAction\",\"type\":\"number\",\"example\":1}},\"required\":[\"graphicInstanceId\",\"statusCode\",\"currentStep\"]}}}},\"404\":{\"description\":\"No GraphicInstance or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"playAction() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/stopAction\":{\"post\":{\"summary\":\"For GraphicInstance at a RenderTarget: Call the stopAction() method\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to target with the command\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Id of the GraphicInstance to target with the command\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"params\":{\"$ref\":\"#/components/schemas/StopActionParams\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"stopAction() successfully executed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the affected GraphicInstance\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the stopAction() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the stopAction() method\",\"type\":\"string\",\"example\":\"Stopped safely\"}},\"required\":[\"graphicInstanceId\",\"statusCode\"]}}}},\"404\":{\"description\":\"No GraphicInstance or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"stopAction() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/customActions/{customActionId}\":{\"post\":{\"summary\":\"For GraphicInstance at a RenderTarget: Call the customAction() method\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true},{\"in\":\"path\",\"name\":\"customActionId\",\"schema\":{\"type\":\"string\"},\"required\":true,\"description\":\"ID of the CustomAction to be invoked, as defined by the Graphic manifest\",\"example\":\"highlight\"}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to target with the command\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Id of the GraphicInstance to target with the command\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"params\":{\"$ref\":\"#/components/schemas/CustomActionParams\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"customAction() successfully executed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the affected GraphicInstance\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the customAction() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the customAction() method\",\"type\":\"string\",\"example\":\"Highlighting\"}},\"required\":[\"graphicInstanceId\",\"statusCode\"]}}}},\"404\":{\"description\":\"No GraphicInstance or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"customAction() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}}},\"components\":{\"schemas\":{\"ErrorResponse\":{\"type\":\"object\",\"description\":\"A response object containing problem details, see https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\",\"properties\":{\"type\":{\"type\":\"string\",\"example\":\"https://example.com/probs/out-of-credit\",\"description\":\"A URI reference that identifies the problem type. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"},\"title\":{\"type\":\"string\",\"example\":\"Internal Server Error\",\"description\":\"A short, human-readable summary of the problem type. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"},\"status\":{\"type\":\"integer\",\"example\":500,\"description\":\"The HTTP status code generated by the origin server for this occurrence of the problem. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"},\"detail\":{\"type\":\"string\",\"example\":\"Internal Server Error\",\"description\":\"A human-readable explanation specific to this occurrence of the problem. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"},\"instance\":{\"type\":\"string\",\"example\":\"/renderers/renderer-0/target/graphicInstance/\",\"description\":\"A URI reference that identifies the specific occurrence of the problem. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"}}},\"ClearGraphicsResponse\":{\"type\":\"object\",\"properties\":{\"graphicInstances\":{\"description\":\"A list of the GraphicInstances that were cleared\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"ID of the RenderTarget that the graphicInstance was cleared from\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Unique ID of the GraphicInstance that was just cleared\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\"]}}},\"required\":[\"graphicInstances\"]},\"GraphicFilter\":{\"description\":\"If set, apply filters to which GraphicInstances to affect. If no properties in this object are defined, any GraphicInstance will match. If multiple properties are defined, only GraphicsInstances that match all properties will match.\",\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"(Optional) If set, will only affect GraphicInstances from a certain RenderTarget\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicId\":{\"description\":\"(Optional) If set, will only affect GraphicInstances of a certain Graphic id\",\"$ref\":\"#/components/schemas/GraphicId\"},\"graphicInstanceId\":{\"description\":\"(Optional) If set, will only affect a specific GraphicInstance\",\"type\":\"string\"}}},\"RendererId\":{\"description\":\"ID of the Renderer\",\"type\":\"string\",\"example\":\"renderer-0\"},\"RenderTargetIdentifier\":{\"description\":\"Identifier of a RenderTarget. The type of this is defined by the renderTarget schema of a Renderer. (Must be a shallow object)\",\"example\":\"{ \\\"bank\\\": 1, \\\"layer\\\": 14 }\"},\"GraphicId\":{\"description\":\"ID of the Ograf Graphic\",\"type\":\"string\",\"example\":\"simple-l3rd\"},\"GraphicInstanceId\":{\"description\":\"ID of an GraphicInstance. A GraphicInstance is a specific instance of a Graphic that is loaded onto a RenderTarget.\",\"type\":\"string\",\"example\":\"graphic-instance-0\"},\"GraphicListInfo\":{\"type\":\"object\",\"title\":\"GraphicListInfo\",\"description\":\"Minimal information about an OGraf Graphic\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/GraphicId\"},\"name\":{\"description\":\"Short name of the graphic\",\"type\":\"string\",\"example\":\"Simple LowerThird\"},\"description\":{\"description\":\"Description of the graphic\",\"type\":\"string\",\"example\":\"A simple lower third for the Main news show\"}},\"required\":[\"id\",\"name\"]},\"GraphicMetadata\":{\"type\":\"object\",\"title\":\"GraphicMetadata\",\"description\":\"Metadata information about an OGraf Graphic, generated by the server\",\"properties\":{\"createdAt\":{\"description\":\"DateTime of when the Graphic was created ( ISO8601 string )\",\"type\":\"string\",\"example\":\"2025-11-12T15:48:34Z\"},\"createdBy\":{\"description\":\"Information about who created the graphic\",\"$ref\":\"#/components/schemas/Author\"},\"updatedAt\":{\"description\":\"DateTime of when the Graphic was last updated ( ISO8601 string )\",\"type\":\"string\",\"example\":\"2025-11-12T15:48:34Z\"},\"updatedBy\":{\"description\":\"Information about who last updated the graphic\",\"$ref\":\"#/components/schemas/Author\"}},\"required\":[\"createdAt\"]},\"GraphicManifest\":{\"type\":\"object\",\"description\":\"OGraf manifest, see https://ograf.ebu.io/v1/specification/json-schemas/graphics/schema.json\",\"$ref\":\"../json-schemas/graphics/schema.json\"},\"RendererInfo\":{\"type\":\"object\",\"title\":\"RendererInfo\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/RendererId\"},\"name\":{\"description\":\"Short name of the renderer\",\"type\":\"string\",\"example\":\"My Renderer\"},\"description\":{\"description\":\"Description of the renderer\",\"type\":\"string\",\"example\":\"A simple, layer-based renderer\"},\"customActions\":{\"type\":\"array\",\"description\":\"Custom Actions that can be invoked on the Renderer.\",\"items\":{\"$ref\":\"../json-schemas/lib/action.json\"}},\"renderCharacteristics\":{\"$ref\":\"#/components/schemas/RenderCharacteristics\",\"type\":\"object\"},\"renderTargetSchema\":{\"$ref\":\"#/components/schemas/RenderTargetSchema\"},\"status\":{\"description\":\"Status of the renderer\",\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"OK\",\"WARNING\",\"ERROR\"],\"example\":\"OK\"},\"message\":{\"type\":\"string\",\"example\":\"Renderer is running\"}},\"required\":[\"status\"]},\"renderTargets\":{\"description\":\"List of active RenderTargets and their contents\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/RenderTargetInfo\"}}},\"required\":[\"id\",\"name\",\"status\",\"renderTargets\"]},\"RenderTargetInfo\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"Identifier of the RenderTarget\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"name\":{\"description\":\"Name of the RenderTarget\",\"type\":\"string\",\"example\":\"Layer 0\"},\"description\":{\"description\":\"Longer description of the RenderTarget\",\"type\":\"string\"},\"graphicInstances\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"graphic\":{\"$ref\":\"#/components/schemas/GraphicListInfo\"}},\"required\":[\"graphicInstanceId\",\"graphic\"]}}},\"required\":[\"renderTarget\",\"name\",\"graphicInstances\"]},\"ShallowGDDObjectSchema\":{\"allOf\":[{\"$ref\":\"https://superflytv.github.io/GraphicsDataDefinition/gdd-meta-schema/v1/lib/object.json\"},{\"type\":\"object\",\"properties\":{\"type\":{\"type\":\"string\",\"enum\":[\"boolean\",\"integer\",\"number\",\"string\"]}},\"additionalProperties\":true,\"required\":[\"type\"]}]},\"RenderTargetSchema\":{\"description\":\"Schema of the RenderTarget. This is a GDD/JSON-object schema that describes the structure of the RenderTarget identifier. See https://superflytv.github.io/GraphicsDataDefinition\",\"type\":\"object\",\"x-$ref\":\"https://superflytv.github.io/GraphicsDataDefinition/gdd-meta-schema/v1/lib/object.json\",\"externalDocs\":{\"url\":\"https://superflytv.github.io/GraphicsDataDefinition/gdd-meta-schema/v1/lib/object.json\"},\"example\":\"{ \\\"type\\\": \\\"object\\\", \\\"properties\\\": { \\\"bank\\\": { \\\"type\\\": \\\"integer\\\" }, \\\"layer\\\": { \\\"type\\\": \\\"integer\\\" } }, \\\"required\\\": [ \\\"bank\\\", \\\"layer\\\" ] }\",\"oneOf\":[{\"$ref\":\"#/components/schemas/ShallowGDDObjectSchema\"},{\"type\":\"object\",\"properties\":{\"allOf\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ShallowGDDObjectSchema\"}},\"anyOf\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ShallowGDDObjectSchema\"}},\"oneOf\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ShallowGDDObjectSchema\"}}}}]},\"RenderCharacteristics\":{\"type\":\"object\",\"description\":\"Renderer Characteristics. This corresponds to the 'renderRequirements' field in the Graphic manifest.\",\"properties\":{\"resolution\":{\"type\":\"object\",\"properties\":{\"width\":{\"type\":\"number\",\"example\":1920},\"height\":{\"type\":\"number\",\"example\":1080}},\"required\":[\"width\",\"height\"]},\"frameRate\":{\"type\":\"number\",\"description\":\"Which frameRate the renderer will be rendering in. Examples: 50, 60, 29.97\",\"example\":50},\"accessToPublicInternet\":{\"type\":\"boolean\",\"description\":\"Whether the renderer has access to the public internet or not\",\"example\":true}}},\"Author\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"example\":\"John Doe\"},\"email\":{\"type\":\"string\",\"example\":\"john.doe@ograf.io\"},\"url\":{\"type\":\"string\",\"example\":\"https://ograf.ebu.io/\"}},\"required\":[\"name\"]},\"UpdateActionParams\":{\"description\":\"Params to send to the updateAction() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Data to send to the updateAction() method of the GraphicInstance\",\"example\":\"{ \\\"name\\\": \\\"John Doe\\\" }\"},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}},\"required\":[\"data\"]},\"PlayActionParams\":{\"description\":\"Params to send to the playAction() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"delta\":{\"description\":\"How far to advance. 1 = next step/segment. (defaults to 1)\",\"type\":\"number\"},\"goto\":{\"description\":\"Jump to a specific step/segment (defaults to undefined)\",\"type\":\"number\"},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}}},\"StopActionParams\":{\"description\":\"Params to send to the stopAction() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}}},\"CustomActionParams\":{\"description\":\"Params to send to the customAction() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"payload\":{\"description\":\"Payload to send into the Custom Action\",\"example\":{\"foo\":\"bar\"}},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}},\"required\":[\"payload\"]},\"CustomActionParamsWithId\":{\"description\":\"Params to send to the customAction() method of the GraphicInstance, including the action id\",\"type\":\"object\",\"properties\":{\"id\":{\"description\":\"Action id, as defined by the Graphic manifest\",\"type\":\"string\",\"example\":\"highlight\"},\"payload\":{\"description\":\"Payload to send into the Custom Action\",\"example\":{\"foo\":\"bar\"}},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}},\"required\":[\"id\",\"payload\"]}}}}\n\n//# sourceURL=webpack://ograf-dev-server-api/../../specification/open-api/server-api.yaml?"); +eval("module.exports = {\"openapi\":\"3.0.3\",\"info\":{\"title\":\"OGraf Server API\",\"description\":\"The OGraf Server API is used to control an OGraf-compatible server\",\"version\":\"1.0.0\",\"license\":{\"name\":\"MIT License\",\"url\":\"http://opensource.org/licenses/MIT\"},\"x-logo\":{\"url\":\"https://github.com/ebu/ograf/blob/main/docs/logo/ograf-logo-colour.svg\",\"backgroundColor\":\"#FFFFFF\",\"altText\":\"OGraf\"}},\"servers\":[{\"url\":\"http://localhost:8080/ograf/v1\"},{\"url\":\"http://localhost:3000/ograf/v1\"},{\"url\":\"http://localhost/ograf/v1\"}],\"paths\":{\"/\":{\"get\":{\"summary\":\"Server information\",\"responses\":{\"200\":{\"description\":\"Returns information about the server\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"description\":\"Name of the server\",\"example\":\"My Ograf Server\"},\"description\":{\"type\":\"string\",\"description\":\"Longer description of the server\",\"example\":\"This server handles graphics for the main news shows\"},\"author\":{\"description\":\"Information about the author/manufacturer of the Server\",\"$ref\":\"#/components/schemas/Author\"},\"version\":{\"type\":\"string\",\"description\":\"Version of the Server\",\"example\":\"1.0\"}},\"required\":[\"name\"]}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/graphics\":{\"get\":{\"summary\":\"List graphics\",\"responses\":{\"200\":{\"description\":\"Returns a list of available OGraf Graphics\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphics\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/GraphicListInfo\"}}},\"required\":[\"graphics\"]}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/graphics/{graphicId}\":{\"get\":{\"summary\":\"Retrieve info about a graphic\",\"parameters\":[{\"in\":\"path\",\"name\":\"graphicId\",\"description\":\"ID of the graphic to retrieve\",\"schema\":{\"$ref\":\"#/components/schemas/GraphicId\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"Returns info of an OGraf Graphic\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphic\":{\"$ref\":\"#/components/schemas/GraphicManifest\"},\"metadata\":{\"$ref\":\"#/components/schemas/GraphicMetadata\"}},\"required\":[\"graphic\",\"manifest\"]}}}},\"404\":{\"description\":\"No Graphic found with the given ID and version\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}},\"delete\":{\"summary\":\"Delete a graphic\",\"parameters\":[{\"in\":\"path\",\"name\":\"graphicId\",\"description\":\"ID of the graphic to delete\",\"schema\":{\"$ref\":\"#/components/schemas/GraphicId\"},\"required\":true},{\"in\":\"query\",\"name\":\"force\",\"description\":\"Whether to force deletion. If force not true, it is recommended that the server keeps the Graphic contents for a while, but unlist it. This is to ensure that any currently-on-air Graphics are not affected.\",\"schema\":{\"type\":\"boolean\",\"default\":false}}],\"responses\":{\"200\":{\"description\":\"Graphic deleted\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\"}}}},\"404\":{\"description\":\"No Graphic found with the given ID and version\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/graphics/{graphicId}/thumbnail\":{\"get\":{\"summary\":\"Retrieve a thumbnail image for a graphic\",\"parameters\":[{\"in\":\"path\",\"name\":\"graphicId\",\"description\":\"ID of the graphic to retrieve the thumbnail from\",\"schema\":{\"$ref\":\"#/components/schemas/GraphicId\"},\"required\":true},{\"in\":\"query\",\"name\":\"file\",\"description\":\"URL-encoded thumbnail file reference, matching a `thumbnails[].file` value from the Graphic manifest. Relative paths are resolved relative to the Graphic manifest or package.\",\"schema\":{\"type\":\"string\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"Returns the requested thumbnail image\",\"content\":{\"image/png\":{\"schema\":{\"type\":\"string\",\"format\":\"binary\"}},\"image/jpeg\":{\"schema\":{\"type\":\"string\",\"format\":\"binary\"}},\"image/gif\":{\"schema\":{\"type\":\"string\",\"format\":\"binary\"}},\"image/webp\":{\"schema\":{\"type\":\"string\",\"format\":\"binary\"}}}},\"400\":{\"description\":\"Missing or invalid thumbnail file reference\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"404\":{\"description\":\"No Graphic or thumbnail found with the given ID and file reference\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers\":{\"get\":{\"summary\":\"List Renderers\",\"responses\":{\"200\":{\"description\":\"Returns a list of available Renderers\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderers\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/RendererId\"},\"name\":{\"$ref\":\"#/components/schemas/RendererInfo/properties/name\"},\"description\":{\"$ref\":\"#/components/schemas/RendererInfo/properties/description\"}},\"required\":[\"id\",\"name\"]}}},\"required\":[\"renderers\"]}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}\":{\"get\":{\"summary\":\"Retrieve info about a renderer\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"Returns info of a Renderer\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderer\":{\"$ref\":\"#/components/schemas/RendererInfo\"}},\"required\":[\"renderer\"]}}}},\"404\":{\"description\":\"No Renderer found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target\":{\"get\":{\"summary\":\"Retrieve info about a RenderTarget\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true},{\"in\":\"query\",\"name\":\"renderTarget\",\"description\":\"The RenderTarget to retrieve info about. Note that this is a JSON-stringified RenderTargetIdentifier!\",\"schema\":{\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"required\":true}],\"responses\":{\"200\":{\"description\":\"Returns info of a Renderer\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/RenderTargetInfo\"}}}},\"404\":{\"description\":\"No RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/customActions/{customActionId}\":{\"post\":{\"summary\":\"Invoke a CustomAction on a Renderer\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true},{\"in\":\"path\",\"name\":\"customActionId\",\"schema\":{\"type\":\"string\"},\"required\":true,\"description\":\"ID of the CustomAction to be invoked\",\"example\":\"shake-it\"}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"payload\":{\"description\":\"Payload to send into the CustomAction\",\"example\":{\"foo\":\"bar\"}},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}},\"required\":[\"payload\"]}}}},\"responses\":{\"200\":{\"description\":\"CustomAction successfully executed, returning result\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"result\":{\"example\":\"Yes, I did it!\"}}}}}},\"404\":{\"description\":\"No Renderer found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/clear\":{\"put\":{\"summary\":\"Clear (remove) GraphicInstance(s) from one (or more) RenderTargets\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"filters\":{\"type\":\"array\",\"description\":\"List of filters for what Graphics to clear. If no filters are defined, All graphics are cleared. If multiple filters are defined, any GraphicInstances matching at least one of the filters will be cleared.\",\"items\":{\"$ref\":\"#/components/schemas/GraphicFilter\"}}},\"required\":[\"filters\"]}}}},\"responses\":{\"200\":{\"description\":\"GraphicInstance(s) successfully cleared\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ClearGraphicsResponse\"}}}},\"404\":{\"description\":\"No Renderer found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/load\":{\"post\":{\"summary\":\"Load a Graphic onto a RenderTarget (ie create a GraphicInstance at a RenderTarget)\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to load the graphic onto\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicId\":{\"description\":\"The graphic to load\",\"$ref\":\"#/components/schemas/GraphicId\"},\"params\":{\"description\":\"Params to send to the load() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Data to send to the load() method of the GraphicInstance\",\"example\":\"{ \\\"name\\\": \\\"John Doe\\\" }\"}},\"required\":[\"data\"]}},\"required\":[\"renderTarget\",\"graphicId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"Graphic successfully loaded, returns GraphicInstanceId of the new GraphicInstance\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the newly created GraphicInstance. Use this id to target the GraphicInstance for further actions.\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the load() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the load() method\",\"type\":\"string\",\"example\":\"Loaded OK\"}},\"required\":[\"graphicInstanceId\",\"statusCode\"]}}}},\"404\":{\"description\":\"No Graphic or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"load() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/updateAction\":{\"post\":{\"summary\":\"For GraphicInstance at a RenderTarget: Call the updateAction() method\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to target with the command.\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Id of the GraphicInstance to target with the command\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"params\":{\"$ref\":\"#/components/schemas/UpdateActionParams\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"updateAction() successfully executed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the affected GraphicInstance\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the updateAction() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the updateAction() method\",\"type\":\"string\"}},\"required\":[\"graphicInstanceId\",\"statusCode\"]}}}},\"404\":{\"description\":\"No GraphicInstance or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"updateAction() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/playAction\":{\"post\":{\"summary\":\"For GraphicInstance at a RenderTarget: Call the playAction() method\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to target with the command.\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Id of the GraphicInstance to target with the command\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"params\":{\"$ref\":\"#/components/schemas/PlayActionParams\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"playAction() successfully executed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the affected GraphicInstance\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the playAction() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the playAction() method\",\"type\":\"string\",\"example\":\"Playing!\"},\"currentStep\":{\"description\":\"The resulting step from a PlayAction\",\"type\":\"number\",\"example\":1}},\"required\":[\"graphicInstanceId\",\"statusCode\",\"currentStep\"]}}}},\"404\":{\"description\":\"No GraphicInstance or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"playAction() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/stopAction\":{\"post\":{\"summary\":\"For GraphicInstance at a RenderTarget: Call the stopAction() method\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to target with the command\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Id of the GraphicInstance to target with the command\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"params\":{\"$ref\":\"#/components/schemas/StopActionParams\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"stopAction() successfully executed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the affected GraphicInstance\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the stopAction() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the stopAction() method\",\"type\":\"string\",\"example\":\"Stopped safely\"}},\"required\":[\"graphicInstanceId\",\"statusCode\"]}}}},\"404\":{\"description\":\"No GraphicInstance or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"stopAction() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}},\"/renderers/{rendererId}/target/graphicInstance/customActions/{customActionId}\":{\"post\":{\"summary\":\"For GraphicInstance at a RenderTarget: Call the customAction() method\",\"parameters\":[{\"in\":\"path\",\"name\":\"rendererId\",\"description\":\"ID of the Renderer\",\"schema\":{\"$ref\":\"#/components/schemas/RendererId\"},\"required\":true},{\"in\":\"path\",\"name\":\"customActionId\",\"schema\":{\"type\":\"string\"},\"required\":true,\"description\":\"ID of the CustomAction to be invoked, as defined by the Graphic manifest\",\"example\":\"highlight\"}],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"The RenderTarget to target with the command\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Id of the GraphicInstance to target with the command\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"params\":{\"$ref\":\"#/components/schemas/CustomActionParams\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\",\"params\"]}}}},\"responses\":{\"200\":{\"description\":\"customAction() successfully executed\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"description\":\"Unique ID of the affected GraphicInstance\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"statusCode\":{\"description\":\"Returned by the customAction() method\",\"type\":\"number\",\"example\":200},\"statusMessage\":{\"description\":\"Returned by the customAction() method\",\"type\":\"string\",\"example\":\"Highlighting\"}},\"required\":[\"graphicInstanceId\",\"statusCode\"]}}}},\"404\":{\"description\":\"No GraphicInstance or RenderTarget found\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"500\":{\"description\":\"Internal Server Error (ie the error comes from the Server or Renderer)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}},\"550\":{\"description\":\"customAction() threw an error (ie the error comes from within GraphicInstance)\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ErrorResponse\"}}}}}}}},\"components\":{\"schemas\":{\"ErrorResponse\":{\"type\":\"object\",\"description\":\"A response object containing problem details, see https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\",\"properties\":{\"type\":{\"type\":\"string\",\"example\":\"https://example.com/probs/out-of-credit\",\"description\":\"A URI reference that identifies the problem type. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"},\"title\":{\"type\":\"string\",\"example\":\"Internal Server Error\",\"description\":\"A short, human-readable summary of the problem type. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"},\"status\":{\"type\":\"integer\",\"example\":500,\"description\":\"The HTTP status code generated by the origin server for this occurrence of the problem. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"},\"detail\":{\"type\":\"string\",\"example\":\"Internal Server Error\",\"description\":\"A human-readable explanation specific to this occurrence of the problem. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"},\"instance\":{\"type\":\"string\",\"example\":\"/renderers/renderer-0/target/graphicInstance/\",\"description\":\"A URI reference that identifies the specific occurrence of the problem. See https://www.rfc-editor.org/rfc/rfc7807.html#section-3.1 for details.\"}}},\"ClearGraphicsResponse\":{\"type\":\"object\",\"properties\":{\"graphicInstances\":{\"description\":\"A list of the GraphicInstances that were cleared\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"ID of the RenderTarget that the graphicInstance was cleared from\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicInstanceId\":{\"description\":\"Unique ID of the GraphicInstance that was just cleared\",\"$ref\":\"#/components/schemas/GraphicInstanceId\"}},\"required\":[\"renderTarget\",\"graphicInstanceId\"]}}},\"required\":[\"graphicInstances\"]},\"GraphicFilter\":{\"description\":\"If set, apply filters to which GraphicInstances to affect. If no properties in this object are defined, any GraphicInstance will match. If multiple properties are defined, only GraphicsInstances that match all properties will match.\",\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"(Optional) If set, will only affect GraphicInstances from a certain RenderTarget\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"graphicId\":{\"description\":\"(Optional) If set, will only affect GraphicInstances of a certain Graphic id\",\"$ref\":\"#/components/schemas/GraphicId\"},\"graphicInstanceId\":{\"description\":\"(Optional) If set, will only affect a specific GraphicInstance\",\"type\":\"string\"}}},\"RendererId\":{\"description\":\"ID of the Renderer\",\"type\":\"string\",\"example\":\"renderer-0\"},\"RenderTargetIdentifier\":{\"description\":\"Identifier of a RenderTarget. The type of this is defined by the renderTarget schema of a Renderer. (Must be a shallow object)\",\"example\":\"{ \\\"bank\\\": 1, \\\"layer\\\": 14 }\"},\"GraphicId\":{\"description\":\"ID of the Ograf Graphic\",\"type\":\"string\",\"example\":\"simple-l3rd\"},\"GraphicInstanceId\":{\"description\":\"ID of an GraphicInstance. A GraphicInstance is a specific instance of a Graphic that is loaded onto a RenderTarget.\",\"type\":\"string\",\"example\":\"graphic-instance-0\"},\"GraphicThumbnail\":{\"type\":\"object\",\"title\":\"GraphicThumbnail\",\"description\":\"Thumbnail image for a Graphic. This matches entries in the Graphic manifest `thumbnails` property.\",\"properties\":{\"file\":{\"type\":\"string\",\"description\":\"Path to the image file, relative to the manifest or absolute. Allowed formats: PNG, JPG, GIF, webp.\"},\"resolution\":{\"type\":\"object\",\"description\":\"Resolution of the image in pixels. When present, the UI can derive aspect ratio (e.g. width/height) and choose or scale the thumbnail appropriately.\",\"properties\":{\"width\":{\"type\":\"integer\",\"minimum\":1,\"description\":\"Width in pixels.\"},\"height\":{\"type\":\"integer\",\"minimum\":1,\"description\":\"Height in pixels.\"}},\"required\":[\"width\",\"height\"]}},\"required\":[\"file\"]},\"GraphicListInfo\":{\"type\":\"object\",\"title\":\"GraphicListInfo\",\"description\":\"Minimal information about an OGraf Graphic\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/GraphicId\"},\"name\":{\"description\":\"Short name of the graphic\",\"type\":\"string\",\"example\":\"Simple LowerThird\"},\"description\":{\"description\":\"Description of the graphic\",\"type\":\"string\",\"example\":\"A simple lower third for the Main news show\"},\"thumbnails\":{\"description\":\"Optional list of thumbnail images for the Graphic. Each entry references an image file (PNG, JPG, GIF, or webp) and may specify its resolution so UIs can choose or scale appropriately.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/GraphicThumbnail\"}}},\"required\":[\"id\",\"name\"]},\"GraphicMetadata\":{\"type\":\"object\",\"title\":\"GraphicMetadata\",\"description\":\"Metadata information about an OGraf Graphic, generated by the server\",\"properties\":{\"createdAt\":{\"description\":\"DateTime of when the Graphic was created ( ISO8601 string )\",\"type\":\"string\",\"example\":\"2025-11-12T15:48:34Z\"},\"createdBy\":{\"description\":\"Information about who created the graphic\",\"$ref\":\"#/components/schemas/Author\"},\"updatedAt\":{\"description\":\"DateTime of when the Graphic was last updated ( ISO8601 string )\",\"type\":\"string\",\"example\":\"2025-11-12T15:48:34Z\"},\"updatedBy\":{\"description\":\"Information about who last updated the graphic\",\"$ref\":\"#/components/schemas/Author\"}},\"required\":[\"createdAt\"]},\"GraphicManifest\":{\"type\":\"object\",\"description\":\"OGraf manifest, see https://ograf.ebu.io/v1/specification/json-schemas/graphics/schema.json\",\"$ref\":\"../json-schemas/graphics/schema.json\"},\"RendererInfo\":{\"type\":\"object\",\"title\":\"RendererInfo\",\"properties\":{\"id\":{\"$ref\":\"#/components/schemas/RendererId\"},\"name\":{\"description\":\"Short name of the renderer\",\"type\":\"string\",\"example\":\"My Renderer\"},\"description\":{\"description\":\"Description of the renderer\",\"type\":\"string\",\"example\":\"A simple, layer-based renderer\"},\"customActions\":{\"type\":\"array\",\"description\":\"Custom Actions that can be invoked on the Renderer.\",\"items\":{\"$ref\":\"../json-schemas/lib/action.json\"}},\"renderCharacteristics\":{\"$ref\":\"#/components/schemas/RenderCharacteristics\",\"type\":\"object\"},\"renderTargetSchema\":{\"$ref\":\"#/components/schemas/RenderTargetSchema\"},\"status\":{\"description\":\"Status of the renderer\",\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"OK\",\"WARNING\",\"ERROR\"],\"example\":\"OK\"},\"message\":{\"type\":\"string\",\"example\":\"Renderer is running\"}},\"required\":[\"status\"]},\"renderTargets\":{\"description\":\"List of active RenderTargets and their contents\",\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/RenderTargetInfo\"}}},\"required\":[\"id\",\"name\",\"status\",\"renderTargets\"]},\"RenderTargetInfo\":{\"type\":\"object\",\"properties\":{\"renderTarget\":{\"description\":\"Identifier of the RenderTarget\",\"$ref\":\"#/components/schemas/RenderTargetIdentifier\"},\"name\":{\"description\":\"Name of the RenderTarget\",\"type\":\"string\",\"example\":\"Layer 0\"},\"description\":{\"description\":\"Longer description of the RenderTarget\",\"type\":\"string\"},\"graphicInstances\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"graphicInstanceId\":{\"$ref\":\"#/components/schemas/GraphicInstanceId\"},\"graphic\":{\"$ref\":\"#/components/schemas/GraphicListInfo\"}},\"required\":[\"graphicInstanceId\",\"graphic\"]}}},\"required\":[\"renderTarget\",\"name\",\"graphicInstances\"]},\"ShallowGDDObjectSchema\":{\"allOf\":[{\"$ref\":\"https://superflytv.github.io/GraphicsDataDefinition/gdd-meta-schema/v1/lib/object.json\"},{\"type\":\"object\",\"properties\":{\"type\":{\"type\":\"string\",\"enum\":[\"boolean\",\"integer\",\"number\",\"string\"]}},\"additionalProperties\":true,\"required\":[\"type\"]}]},\"RenderTargetSchema\":{\"description\":\"Schema of the RenderTarget. This is a GDD/JSON-object schema that describes the structure of the RenderTarget identifier. See https://superflytv.github.io/GraphicsDataDefinition\",\"type\":\"object\",\"x-$ref\":\"https://superflytv.github.io/GraphicsDataDefinition/gdd-meta-schema/v1/lib/object.json\",\"externalDocs\":{\"url\":\"https://superflytv.github.io/GraphicsDataDefinition/gdd-meta-schema/v1/lib/object.json\"},\"example\":\"{ \\\"type\\\": \\\"object\\\", \\\"properties\\\": { \\\"bank\\\": { \\\"type\\\": \\\"integer\\\" }, \\\"layer\\\": { \\\"type\\\": \\\"integer\\\" } }, \\\"required\\\": [ \\\"bank\\\", \\\"layer\\\" ] }\",\"oneOf\":[{\"$ref\":\"#/components/schemas/ShallowGDDObjectSchema\"},{\"type\":\"object\",\"properties\":{\"allOf\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ShallowGDDObjectSchema\"}},\"anyOf\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ShallowGDDObjectSchema\"}},\"oneOf\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/ShallowGDDObjectSchema\"}}}}]},\"RenderCharacteristics\":{\"type\":\"object\",\"description\":\"Renderer Characteristics. This corresponds to the 'renderRequirements' field in the Graphic manifest.\",\"properties\":{\"resolution\":{\"type\":\"object\",\"properties\":{\"width\":{\"type\":\"number\",\"example\":1920},\"height\":{\"type\":\"number\",\"example\":1080}},\"required\":[\"width\",\"height\"]},\"frameRate\":{\"type\":\"number\",\"description\":\"Which frameRate the renderer will be rendering in. Examples: 50, 60, 29.97\",\"example\":50},\"accessToPublicInternet\":{\"type\":\"boolean\",\"description\":\"Whether the renderer has access to the public internet or not\",\"example\":true}}},\"Author\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"example\":\"John Doe\"},\"email\":{\"type\":\"string\",\"example\":\"john.doe@ograf.io\"},\"url\":{\"type\":\"string\",\"example\":\"https://ograf.ebu.io/\"}},\"required\":[\"name\"]},\"UpdateActionParams\":{\"description\":\"Params to send to the updateAction() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"data\":{\"description\":\"Data to send to the updateAction() method of the GraphicInstance\",\"example\":\"{ \\\"name\\\": \\\"John Doe\\\" }\"},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}},\"required\":[\"data\"]},\"PlayActionParams\":{\"description\":\"Params to send to the playAction() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"delta\":{\"description\":\"How far to advance. 1 = next step/segment. (defaults to 1)\",\"type\":\"number\"},\"goto\":{\"description\":\"Jump to a specific step/segment (defaults to undefined)\",\"type\":\"number\"},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}}},\"StopActionParams\":{\"description\":\"Params to send to the stopAction() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}}},\"CustomActionParams\":{\"description\":\"Params to send to the customAction() method of the GraphicInstance\",\"type\":\"object\",\"properties\":{\"payload\":{\"description\":\"Payload to send into the Custom Action\",\"example\":{\"foo\":\"bar\"}},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}},\"required\":[\"payload\"]},\"CustomActionParamsWithId\":{\"description\":\"Params to send to the customAction() method of the GraphicInstance, including the action id\",\"type\":\"object\",\"properties\":{\"id\":{\"description\":\"Action id, as defined by the Graphic manifest\",\"type\":\"string\",\"example\":\"highlight\"},\"payload\":{\"description\":\"Payload to send into the Custom Action\",\"example\":{\"foo\":\"bar\"}},\"skipAnimation\":{\"description\":\"If true, skips animation (defaults to false)\",\"type\":\"boolean\"}},\"required\":[\"id\",\"payload\"]}}}}\n\n//# sourceURL=webpack://ograf-dev-server-api/../../specification/open-api/server-api.yaml?"); /***/ }), @@ -14446,7 +14446,7 @@ eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPAC /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var swagger_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! swagger-ui */ \"./node_modules/swagger-ui/dist/swagger-ui-es-bundle-core.js\");\n/* harmony import */ var swagger_ui_dist_swagger_ui_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! swagger-ui/dist/swagger-ui.css */ \"./node_modules/swagger-ui/dist/swagger-ui.css\");\n\r\n\r\n\r\nconst spec = __webpack_require__(/*! ../../../specification/open-api/server-api.yaml */ \"../../specification/open-api/server-api.yaml\");\r\n\r\nconst ui = (0,swagger_ui__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\r\n spec,\r\n dom_id: '#swagger',\r\n});\r\n\r\nui.initOAuth({\r\n appName: \"Swagger UI Webpack Demo\",\r\n // See https://demo.identityserver.io/ for configuration details.\r\n clientId: 'implicit'\r\n});\r\n\n\n//# sourceURL=webpack://ograf-dev-server-api/./src/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var swagger_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! swagger-ui */ \"./node_modules/swagger-ui/dist/swagger-ui-es-bundle-core.js\");\n/* harmony import */ var swagger_ui_dist_swagger_ui_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! swagger-ui/dist/swagger-ui.css */ \"./node_modules/swagger-ui/dist/swagger-ui.css\");\n\n\n\nconst spec = __webpack_require__(/*! ../../../specification/open-api/server-api.yaml */ \"../../specification/open-api/server-api.yaml\");\n\nconst ui = (0,swagger_ui__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n spec,\n dom_id: '#swagger',\n});\n\nui.initOAuth({\n appName: \"Swagger UI Webpack Demo\",\n // See https://demo.identityserver.io/ for configuration details.\n clientId: 'implicit'\n});\n\n\n//# sourceURL=webpack://ograf-dev-server-api/./src/index.js?"); /***/ }), diff --git a/v1/specification/open-api/server-api.yaml b/v1/specification/open-api/server-api.yaml index 74a981f..84803ae 100644 --- a/v1/specification/open-api/server-api.yaml +++ b/v1/specification/open-api/server-api.yaml @@ -145,6 +145,60 @@ paths: application/json: schema: $ref: "#/components/schemas/ErrorResponse" + /graphics/{graphicId}/thumbnail: + get: + summary: Retrieve a thumbnail image for a graphic + parameters: + - in: path + name: graphicId + description: ID of the graphic to retrieve the thumbnail from + schema: + $ref: "#/components/schemas/GraphicId" + required: true + - in: query + name: file + description: "URL-encoded thumbnail file reference, matching a `thumbnails[].file` value from the Graphic manifest. Relative paths are resolved relative to the Graphic manifest or package." + schema: + type: string + required: true + responses: + 200: + description: Returns the requested thumbnail image + content: + image/png: + schema: + type: string + format: binary + image/jpeg: + schema: + type: string + format: binary + image/gif: + schema: + type: string + format: binary + image/webp: + schema: + type: string + format: binary + 400: + description: Missing or invalid thumbnail file reference + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + 404: + description: No Graphic or thumbnail found with the given ID and file reference + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + 500: + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" # ------------------ Renderers ------------------------------------------------------------------------------ /renderers: get: @@ -789,6 +843,31 @@ components: type: string example: "graphic-instance-0" # Objects + GraphicThumbnail: + type: object + title: GraphicThumbnail + description: "Thumbnail image for a Graphic. This matches entries in the Graphic manifest `thumbnails` property." + properties: + file: + type: string + description: "Path to the image file, relative to the manifest or absolute. Allowed formats: PNG, JPG, GIF, webp." + resolution: + type: object + description: "Resolution of the image in pixels. When present, the UI can derive aspect ratio (e.g. width/height) and choose or scale the thumbnail appropriately." + properties: + width: + type: integer + minimum: 1 + description: "Width in pixels." + height: + type: integer + minimum: 1 + description: "Height in pixels." + required: + - width + - height + required: + - file GraphicListInfo: type: object title: GraphicListInfo @@ -804,6 +883,11 @@ components: description: "Description of the graphic" type: string example: "A simple lower third for the Main news show" + thumbnails: + description: "Optional list of thumbnail images for the Graphic. Each entry references an image file (PNG, JPG, GIF, or webp) and may specify its resolution so UIs can choose or scale appropriately." + type: array + items: + $ref: "#/components/schemas/GraphicThumbnail" required: - id - name diff --git a/v1/typescript-definitions/src/generated/server-api.ts b/v1/typescript-definitions/src/generated/server-api.ts index 63fd4ba..ba12032 100644 --- a/v1/typescript-definitions/src/generated/server-api.ts +++ b/v1/typescript-definitions/src/generated/server-api.ts @@ -224,6 +224,78 @@ export interface paths { patch?: never; trace?: never; }; + "/graphics/{graphicId}/thumbnail": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Retrieve a thumbnail image for a graphic */ + get: { + parameters: { + query: { + /** @description URL-encoded thumbnail file reference, matching a `thumbnails[].file` value from the Graphic manifest. Relative paths are resolved relative to the Graphic manifest or package. */ + file: string; + }; + header?: never; + path: { + /** @description ID of the graphic to retrieve the thumbnail from */ + graphicId: components["schemas"]["GraphicId"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns the requested thumbnail image */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "image/png": string; + "image/jpeg": string; + "image/gif": string; + "image/webp": string; + }; + }; + /** @description Missing or invalid thumbnail file reference */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description No Graphic or thumbnail found with the given ID and file reference */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal Server Error */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/renderers": { parameters: { query?: never; @@ -1108,6 +1180,25 @@ export interface components { * @example graphic-instance-0 */ GraphicInstanceId: string; + /** + * GraphicThumbnail + * @description Thumbnail image for a Graphic. This matches entries in the Graphic manifest `thumbnails` property. + */ + GraphicThumbnail: { + /** @description Path to the image file, relative to the manifest or absolute. Allowed formats: PNG, JPG, GIF, webp. */ + file: string; + /** @description Resolution of the image in pixels. When present, the UI can derive aspect ratio (e.g. width/height) and choose or scale the thumbnail appropriately. */ + resolution?: { + /** @description Width in pixels. */ + width: number; + /** @description Height in pixels. */ + height: number; + } & { + [key: string]: unknown; + }; + } & { + [key: string]: unknown; + }; /** * GraphicListInfo * @description Minimal information about an OGraf Graphic @@ -1124,6 +1215,8 @@ export interface components { * @example A simple lower third for the Main news show */ description?: string; + /** @description Optional list of thumbnail images for the Graphic. Each entry references an image file (PNG, JPG, GIF, or webp) and may specify its resolution so UIs can choose or scale appropriately. */ + thumbnails?: components["schemas"]["GraphicThumbnail"][]; } & { [key: string]: unknown; };