mirror of https://github.com/ErsatzTV/ErsatzTV.git
Browse Source
* generate openapi definitions as separate build task * first defns * install etv-client module in docker * include python entrypoint in docker * update changelogpull/2369/head
8 changed files with 3803 additions and 2 deletions
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,297 @@
@@ -0,0 +1,297 @@
|
||||
{ |
||||
"openapi": "3.0.1", |
||||
"info": { |
||||
"title": "ErsatzTV | v1", |
||||
"version": "1.0.0" |
||||
}, |
||||
"paths": { |
||||
"/api/channels/{channelNumber}/playout/reset": { |
||||
"post": { |
||||
"tags": [ |
||||
"Channels" |
||||
], |
||||
"summary": "Reset channel playout", |
||||
"parameters": [ |
||||
{ |
||||
"name": "channelNumber", |
||||
"in": "path", |
||||
"required": true, |
||||
"schema": { |
||||
"type": "string" |
||||
} |
||||
} |
||||
], |
||||
"responses": { |
||||
"200": { |
||||
"description": "OK" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"/api/libraries/{id}/scan": { |
||||
"post": { |
||||
"tags": [ |
||||
"Libraries" |
||||
], |
||||
"summary": "Scan library", |
||||
"parameters": [ |
||||
{ |
||||
"name": "id", |
||||
"in": "path", |
||||
"required": true, |
||||
"schema": { |
||||
"type": "integer", |
||||
"format": "int32" |
||||
} |
||||
} |
||||
], |
||||
"responses": { |
||||
"200": { |
||||
"description": "OK" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"/api/libraries/{id}/scan-show": { |
||||
"post": { |
||||
"tags": [ |
||||
"Libraries" |
||||
], |
||||
"summary": "Scan show", |
||||
"parameters": [ |
||||
{ |
||||
"name": "id", |
||||
"in": "path", |
||||
"required": true, |
||||
"schema": { |
||||
"type": "integer", |
||||
"format": "int32" |
||||
} |
||||
} |
||||
], |
||||
"requestBody": { |
||||
"content": { |
||||
"application/json-patch+json": { |
||||
"schema": { |
||||
"$ref": "#/components/schemas/ScanShowRequest" |
||||
} |
||||
}, |
||||
"application/json": { |
||||
"schema": { |
||||
"$ref": "#/components/schemas/ScanShowRequest" |
||||
} |
||||
}, |
||||
"text/json": { |
||||
"schema": { |
||||
"$ref": "#/components/schemas/ScanShowRequest" |
||||
} |
||||
}, |
||||
"application/*+json": { |
||||
"schema": { |
||||
"$ref": "#/components/schemas/ScanShowRequest" |
||||
} |
||||
} |
||||
}, |
||||
"required": true |
||||
}, |
||||
"responses": { |
||||
"200": { |
||||
"description": "OK" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"/api/maintenance/gc": { |
||||
"get": { |
||||
"tags": [ |
||||
"Maintenance" |
||||
], |
||||
"summary": "Garbage collect", |
||||
"parameters": [ |
||||
{ |
||||
"name": "force", |
||||
"in": "query", |
||||
"schema": { |
||||
"type": "boolean", |
||||
"default": false |
||||
} |
||||
} |
||||
], |
||||
"responses": { |
||||
"200": { |
||||
"description": "OK" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"/api/maintenance/empty_trash": { |
||||
"post": { |
||||
"tags": [ |
||||
"Maintenance" |
||||
], |
||||
"summary": "Empty trash", |
||||
"responses": { |
||||
"200": { |
||||
"description": "OK" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"/api/sessions": { |
||||
"get": { |
||||
"tags": [ |
||||
"Sessions" |
||||
], |
||||
"summary": "Get sessions", |
||||
"responses": { |
||||
"200": { |
||||
"description": "OK", |
||||
"content": { |
||||
"text/plain": { |
||||
"schema": { |
||||
"type": "array", |
||||
"items": { |
||||
"$ref": "#/components/schemas/HlsSessionModel" |
||||
} |
||||
} |
||||
}, |
||||
"application/json": { |
||||
"schema": { |
||||
"type": "array", |
||||
"items": { |
||||
"$ref": "#/components/schemas/HlsSessionModel" |
||||
} |
||||
} |
||||
}, |
||||
"text/json": { |
||||
"schema": { |
||||
"type": "array", |
||||
"items": { |
||||
"$ref": "#/components/schemas/HlsSessionModel" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"/api/session/{channelNumber}": { |
||||
"delete": { |
||||
"tags": [ |
||||
"Sessions" |
||||
], |
||||
"summary": "Stop session", |
||||
"parameters": [ |
||||
{ |
||||
"name": "channelNumber", |
||||
"in": "path", |
||||
"required": true, |
||||
"schema": { |
||||
"type": "string" |
||||
} |
||||
} |
||||
], |
||||
"responses": { |
||||
"200": { |
||||
"description": "OK" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"/api/version": { |
||||
"get": { |
||||
"tags": [ |
||||
"Version" |
||||
], |
||||
"summary": "Get version", |
||||
"responses": { |
||||
"200": { |
||||
"description": "OK", |
||||
"content": { |
||||
"text/plain": { |
||||
"schema": { |
||||
"type": "string" |
||||
} |
||||
}, |
||||
"application/json": { |
||||
"schema": { |
||||
"type": "string" |
||||
} |
||||
}, |
||||
"text/json": { |
||||
"schema": { |
||||
"type": "string" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"components": { |
||||
"schemas": { |
||||
"HlsSessionModel": { |
||||
"required": [ |
||||
"channelNumber", |
||||
"state", |
||||
"transcodedUntil", |
||||
"lastAccess" |
||||
], |
||||
"type": "object", |
||||
"properties": { |
||||
"channelNumber": { |
||||
"type": "string", |
||||
"nullable": true |
||||
}, |
||||
"state": { |
||||
"type": "string", |
||||
"nullable": true |
||||
}, |
||||
"transcodedUntil": { |
||||
"type": "string", |
||||
"format": "date-time" |
||||
}, |
||||
"lastAccess": { |
||||
"type": "string", |
||||
"format": "date-time" |
||||
} |
||||
} |
||||
}, |
||||
"ScanShowRequest": { |
||||
"required": [ |
||||
"showTitle" |
||||
], |
||||
"type": "object", |
||||
"properties": { |
||||
"showTitle": { |
||||
"type": "string", |
||||
"nullable": true |
||||
}, |
||||
"deepScan": { |
||||
"type": "boolean", |
||||
"default": false |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"tags": [ |
||||
{ |
||||
"name": "Channels" |
||||
}, |
||||
{ |
||||
"name": "Libraries" |
||||
}, |
||||
{ |
||||
"name": "Maintenance" |
||||
}, |
||||
{ |
||||
"name": "Sessions" |
||||
}, |
||||
{ |
||||
"name": "Version" |
||||
} |
||||
] |
||||
} |
||||
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/python3 |
||||
|
||||
import argparse |
||||
import importlib |
||||
import sys |
||||
|
||||
from uuid import UUID |
||||
|
||||
import etv_client |
||||
from etv_client.api import scripted_schedule_api |
||||
|
||||
def main(): |
||||
parser = argparse.ArgumentParser(description="Run an ETV scripted schedule") |
||||
parser.add_argument('host', help="The ETV host (e.g., http://localhost:8409)") |
||||
parser.add_argument('build_id', type=UUID, help="The build ID for the playout") |
||||
parser.add_argument('mode', choices=['reset', 'continue'], help="The playout build mode") |
||||
parser.add_argument('script_name', help="The name of the script module to use (e.g., one)") |
||||
|
||||
known_args, unknown_args = parser.parse_known_args() |
||||
|
||||
try: |
||||
script_module = importlib.import_module(f"scripts.{known_args.script_name}") |
||||
except ImportError: |
||||
print(f"Error: cannot find a script file named '{known_args.script_name}.py' in the 'scripts' directory.") |
||||
sys.exit(1) |
||||
|
||||
configuration = etv_client.Configuration(host=known_args.host) |
||||
|
||||
with etv_client.ApiClient(configuration) as api_client: |
||||
try: |
||||
define_content = getattr(script_module, 'define_content') |
||||
reset_playout = getattr(script_module, 'reset_playout') |
||||
build_playout = getattr(script_module, 'build_playout') |
||||
|
||||
api_instance = scripted_schedule_api.ScriptedScheduleApi(api_client) |
||||
|
||||
context = api_instance.get_context(known_args.build_id) |
||||
|
||||
define_content(api_instance, context, known_args.build_id) |
||||
|
||||
if known_args.mode == "reset": |
||||
reset_playout(api_instance, context, known_args.build_id) |
||||
|
||||
build_playout(api_instance, context, known_args.build_id) |
||||
except etv_client.ApiException as e: |
||||
print(f"Exception when calling scripted schedule api: {e}\n") |
||||
except AttributeError as e: |
||||
print(f"Error: the '{known_args.script_name}' script is missing a required function. {e}") |
||||
|
||||
if __name__ == "__main__": |
||||
main() |
||||
|
||||
Loading…
Reference in new issue