{"id":13617367,"url":"https://github.com/datarhei/core-client-python","last_synced_at":"2026-03-09T13:08:16.729Z","repository":{"id":94465038,"uuid":"536321968","full_name":"datarhei/core-client-python","owner":"datarhei","description":"An API client library for datarhei Core in Python3.","archived":false,"fork":false,"pushed_at":"2025-12-18T13:44:29.000Z","size":187,"stargazers_count":7,"open_issues_count":1,"forks_count":7,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-12-21T18:57:36.310Z","etag":null,"topics":["api-client","client-library","datarhei","ffmpeg","livestream","python-script","python3","video-processing","video-streaming"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/datarhei.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-09-13T21:59:01.000Z","updated_at":"2025-08-28T20:14:18.000Z","dependencies_parsed_at":"2024-03-18T15:30:35.301Z","dependency_job_id":"5d250d9c-2e10-4547-8896-f9b183cced53","html_url":"https://github.com/datarhei/core-client-python","commit_stats":{"total_commits":9,"total_committers":1,"mean_commits":9.0,"dds":0.0,"last_synced_commit":"fdf6397e5620df4bfeeee306ba7244ab96cf3e7c"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/datarhei/core-client-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datarhei%2Fcore-client-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datarhei%2Fcore-client-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datarhei%2Fcore-client-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datarhei%2Fcore-client-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/datarhei","download_url":"https://codeload.github.com/datarhei/core-client-python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datarhei%2Fcore-client-python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30297111,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T11:12:22.024Z","status":"ssl_error","status_checked_at":"2026-03-09T11:10:54.577Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-client","client-library","datarhei","ffmpeg","livestream","python-script","python3","video-processing","video-streaming"],"created_at":"2024-08-01T20:01:40.576Z","updated_at":"2026-03-09T13:08:16.660Z","avatar_url":"https://github.com/datarhei.png","language":"Python","readme":"# datarhei Core PyClient\nFor rapid development of Python applications around the [datarhei Core](https://github.com/datarhei/core).\nRequires Python 3.7+ and datarhei Core v16.10+.\n\n---\n\n-   [Features](#features)\n-   [Install](#install)\n-   [Usage](#usage)\n-   [API definitions](#api-definitions)\n    -   [General](#general)\n    -   [Cluster (experimental)](#cluster)\n    -   [Config](#config)\n    -   [Filesystem](#filesystem)\n    -   [Log](#log)\n    -   [Metadata](#metadata)\n    -   [Metrics](#metrics)\n    -   [Process](#process)\n    -   [Process Playout (commercial extention)](#process-playout-commercial-extention)\n    -   [RTMP](#rtmp)\n    -   [Session](#session)\n    -   [Skills](#skills)\n    -   [SRT](#srt)\n    -   [Widget](#widget)\n    -   [Misc](#misc)\n-   [Examples](#examples)\n    -   [GET token data](#get-token-data)\n    -   [GET processes](#get-processes)\n    -   [GET/POST/PUT/DELETE process](#post-process)\n-   [API models](#api-models)\n-   [Error handling](#error-handling)\n-   [Developing \u0026 testing](#developing--testing)\n-   [Changelog](#changelog)\n-   [Contributing](#contributing)\n-   [Licence](#licence)\n\n## Features\n-   Async \u0026 sync support\n-   Request \u0026 response validation\n-   Retries and timeout settings per request\n-   Automatic `JWT` renewal\n-   [pydantic Models](https://pydantic-docs.helpmanual.io/)\n-   [HTTPX](https://www.python-httpx.org/)\n\n## Install\n\n### Latest\n```sh\npip install https://github.com/datarhei/core-client-python/archive/refs/heads/main.tar.gz\n```\n\n### Specific version\n```sh\npip install https://github.com/datarhei/core-client-python/archive/refs/tags/{release_tag}.tar.gz\n```\n*`{release_tag}` like `1.0.0`*\n\n## Usage\n\n#### Init arguments\n\n-   `base_url: str`\n-   **optional: basic auth jwt**\n    `username: str = None, password: str = None`\n-   **optional: token injection**\n    `access_token: str = None, refresh_token: str = None`\n-   **optional: httpx global settings**\n    `retries: int = 3, timeout: float = 10.0`\n\n#### Sync\n\n```python\nfrom core_client import Client\n\nclient = Client(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\nclient.login()\n\nabout = client.about_get()\nprint(about)\n```\n\n#### Async\n\n```python\nimport asyncio\nfrom core_client import AsyncClient\n\nclient = AsyncClient(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\nclient.login()\n\nasync def main():\n    about = await client.about_get()\n    print(about)\n\nasyncio.run(main())\n```\n\n## API definitions\n\n### General\n\n-   `GET` /api\n\n    ```python\n    about()\n    ```\n\n### Cluster\n\n***Do not use in production!***\n*This is an upcoming feature. More here: [Core v16.10#cluster](https://github.com/datarhei/core/tree/cluster))*\n\n\n-   `GET` /api/v3/cluster\n\n    ```python\n    v3_cluster_get_list()\n    ```\n\n-   `POST` /api/v3/cluster/node/\n    ```python\n    v3_cluster_post_node(node: ClusterNodeAuth)\n    ```\n    *Model: [ClusterNodeAuth](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/cluster_node_auth.py)*\n\n-   `GET` /api/v3/cluster/node/{id}\n    ```python\n    v3_cluster_get_node(id: str)\n    ```\n\n-   `PUT` /api/v3/cluster/node/{id}\n    ```python\n    v3_cluster_put_node(id: str, node: ClusterNodeAuth)\n    ```\n    *Model: [ClusterNodeAuth](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/cluster_node_auth.py)*\n\n\n-   `DELETE` /api/v3/cluster/node/{id}\n    ```python\n    v3_cluster_delete_node(id: str)\n    ```\n\n-   `GET` /api/v3/cluster/node/{id}/proxy\n    ```python\n    v3_cluster_get_node_proxy(id: str)\n    ```\n\n### Config\n\n-   `GET` /api/v3/config\n\n    ```python\n    v3_config_get()\n    ```\n\n-   `PUT` /api/v3/config\n    ```python\n    v3_config_put(config: Config)\n    ```\n    *Model: [Config](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/config.py)*\n\n-   `GET` /api/v3/config/reload\n    ```python\n    v3_config_reload()\n    ```\n\n### Filesystem\n\n-   `GET` /api/v3/fs\n\n    ```python\n    v3_fs_get_list()\n    ```\n\n-   `GET` /api/v3/fs/{name}\n    ```python\n    v3_fs_get_file_list(name=str, glob: str = \"\", sort: str = \"\", order: str = \"\")\n    ```\n\n-   `GET` /api/v3/fs/{name}/{path}\n    ```python\n    v3_fs_get_file(name: str, path: str)\n    ```\n\n-   `PUT` /api/v3/fs/{name}/{path}\n    ```python\n    v3_fs_put_file(name: str, path: str, data: bytes)\n    ```\n\n-   `DELETE` /api/v3/fs/{name}/{path}\n    ```python\n    v3_fs_delete_file(name: str, path: str)\n    ```\n\n### Log\n\n-   `GET` /api/v3/log\n\n    ```python\n    v3_log_get(format: str = \"console\")\n    ```\n\n### Metadata\n\n-   `GET` /api/v3/metadata/{key}\n\n    ```python\n    v3_metadata_get(key: str)\n    ```\n\n-   `PUT` /api/v3/metadata/{key}\n    ```python\n    v3_metadata_put(key: str, data: Metadata)\n    ```\n    *Model: [Metadata](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/metadata.py)*\n\n### Metrics\n\n-   `GET` /api/v3/metrics\n\n    ```python\n    v3_metrics_get()\n    ```\n\n-   `POST` /api/v3/metrics\n\n    ```python\n    v3_metrics_post(config: Metrics)\n    ```\n    *Model: [Metrics](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/metrics.py)*\n\n### Process\n\n-   `GET` /api/v3/process\n\n    ```python\n    v3_process_get_list(filter: str = \"\", reference: str = \"\", id: str = \"\", idpattern: str = \"\", refpattern: str = \"\")\n    ```\n\n-   `POST` /api/v3/process\n    ```python\n    v3_process_post(config: ProcessConfig)\n    ```\n    *Model: [ProcessConfig](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/process_config.py)*\n\n-   `GET` /api/v3/process/{id}\n    ```python\n    v3_process_get(id: str, filter: str = \"\")\n    ```\n\n-   `PUT` /api/v3/process/{id}\n    ```python\n    v3_process_put(id: str, config: ProcessConfig)\n    ```\n    *Model: [ProcessConfig](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/process_config.py)*\n\n-   `DELETE` /api/v3/process/{id}\n    ```python\n    v3_process_delete(id: str)\n    ```\n\n-   `PUT` /api/v3/process/{id}/command\n    ```python\n    v3_process_put_command(id: str, command: ProcessCommandAction)\n    ```\n    *Model: [ProcessCommandAction](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/process_command.py)*\n\n-   `GET` /api/v3/process/{id}/config\n    ```python\n    v3_process_get_config(id: str)\n    ```\n\n-   `GET` /api/v3/process/{id}/metadata/{key}\n    ```python\n    v3_process_get_metadata(id: str, key: str)\n    ```\n\n-   `PUT` /api/v3/process/{id}/metadata/{key}\n    ```python\n    v3_process_put_metadata(id: str, key: str, data: Metadata)\n    ```\n    *Model: [Metadata](https://github.com/datarhei/core-client-python/blob/main/core_client/base/models/v3/metadata.py)*\n\n-   `GET` /api/v3/process/{id}/probe\n    ```python\n    v3_process_get_probe(id: str)\n    ```\n\n-   `GET` /api/v3/process/{id}/report\n    ```python\n    v3_process_get_report(id: str)\n    ```\n\n-   `GET` /api/v3/process/{id}/state\n    ```python\n    v3_process_get_state(id: str)\n    ```\n\n### Process Playout (commercial extention)\n\n-   `GET` /api/v3/process/{id}/playout/{input_id}/errorframe/encode\n\n    ```python\n    v3_process_get_playout_input_errorframe_encode(id: str, input_id: str)\n    ```\n\n-   `POST` /api/v3/process/{id}/playout/{input_id}/errorframe/{input_name}\n    ```python\n    v3_process_post_playout_input_errorframe_name(id: str, input_id: str, input_name: str)\n    ```\n\n-   `GET` /api/v3/process/{id}/playout/{input_id}/keyframe/{input_name}\n    ```python\n    v3_process_get_playout_input_keyframe(id: str, input_id: str, input_name: str)\n    ```\n\n-   `GET` /api/v3/process/{id}/playout/{input_id}/reopen\n    ```python\n    v3_process_get_playout_input_reopen(id: str, input_id: str)\n    ```\n\n-   `GET` /api/v3/process/{id}/playout/{input_id}/status\n    ```python\n    v3_process_get_playout_input_status(id: str, input_id: str)\n    ```\n\n-   `PUT` /api/v3/process/{id}/playout/{input_id}/stream\n    ```python\n    v3_process_put_playout_input_stream(id: str, input_id: str)\n    ```\n\n### RTMP\n\n-   `GET` /api/v3/rtmp\n\n    ```python\n    v3_rtmp_get()\n    ```\n\n### Session\n\n-   `GET` /api/v3/session\n\n    ```python\n    v3_session_get(collectors: str)\n    ```\n\n-   `GET` /api/v3/session/active\n    ```python\n    v3_session_get_active(collectors: str)\n    ```\n\n### Skills\n\n-   `GET` /api/v3/skills\n\n    ```python\n    v3_skills_get()\n    ```\n\n-   `GET` /api/v3/skills/reload\n    ```python\n    v3_skills_reload()\n    ```\n\n### SRT\n\n-   `GET` /api/v3/srt\n\n    ```python\n    v3_srt_get()\n    ```\n\n### Widget\n\n-   `GET` /api/v3/widget/process/{id}\n\n    ```python\n    v3_widget_get_process(id: str)\n    ```\n\n### Misc\n\n- `GET` /ping\n\n  ```python\n  ping()\n  ```\n\nAdditional options per request:\n- `retries: int = default of class`\n- `timeout: float = default of class`\n\n## Examples\n\n### GET token data\n\n```python\nfrom core_client import Client\n\nclient = Client(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\n\ntoken = client.login()\nprint(token)\n```\n\n### GET processes\n\n```python\nfrom core_client import Client\n\nclient = Client(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\nclient.login()\n\nprocess_list = client.v3_process_get_list()\nfor process in processes:\n    print(process.id)\n```\n\n### POST process\n\n```python\nfrom core_client import Client\n\nclient = Client(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\nclient.login()\n\nprocess_example = {\n    \"id\": \"my_proc\",\n    \"reference\": \"my_ref\",\n    \"input\": [\n        {\n            \"address\": \"testsrc=size=1280x720:rate=25\",\n            \"id\": \"input_0\",\n            \"options\": [\"-f\", \"lavfi\", \"-re\"],\n        }\n    ],\n    \"options\": [\"-loglevel\", \"info\"],\n    \"output\": [\n        {\n            \"address\": \"-\",\n            \"id\": \"output_0\",\n            \"options\": [\"-codec:v\", \"libx264\", \"-r\", \"25\", \"-f\", \"null\"]\n        }\n    ]\n}\n\npost_process = client.v3_process_post(config=process_example)\nprint(post_process)\n```\n\n### GET process\n\n```python\nfrom core_client import Client\n\nclient = Client(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\nclient.login()\n\nget_process = client.v3_process_get(id=\"my_proc\")\nprint(get_process)\n```\n\n### PUT process\n\n```python\nfrom core_client import Client\n\nclient = Client(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\nclient.login()\n\nprocess_example = {\n    \"id\": \"my_proc\",\n    \"reference\": \"my_ref\",\n    \"input\": [\n        {\n            \"address\": \"testsrc=size=1280x720:rate=25\",\n            \"id\": \"input_0\",\n            \"options\": [\"-f\", \"lavfi\", \"-re\"],\n        }\n    ],\n    \"options\": [\"-loglevel\", \"debug\"],\n    \"output\": [\n        {\n            \"address\": \"-\",\n            \"id\": \"output_0\",\n            \"options\": [\"-codec:v\", \"libx264\", \"-r\", \"25\", \"-f\", \"null\"]\n        }\n    ]\n}\n\nput_process = client.v3_process_put(id=\"testproc\", config=process_example)\nprint(put_process)\n```\n\n### DELETE process\n\n```python\nfrom core_client import Client\n\nclient = Client(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\nclient.login()\n\ndelete_process = client.v3_process_delete(id=\"testproc\")\nprint(delete_process)\n```\n\n## API models\n\nModels are located here:\n-   `core_client/base/models/`\n-   `core_client/base/models/v3`\n\n```python\nfrom core_client import Client\nfrom core_client.base.models.v3 import ProcessConfig, ProcessConfigIO\n\nclient = Client(base_url=\"http://127.0.0.1:8080\", username=\"admin\", password=\"datarhei\")\nclient.login()\n\nput_process = client.v3_process_put(id=\"my_proc\", config=ProcessConfig(\n    id=\"my_proc\",\n    reference=\"my_ref\",\n    input=[\n        ProcessConfigIO(\n            address=\"testsrc2=rate=25:size=1280x720\",\n            id=\"input_0\",\n            options=[\"-re\", \"-f\", \"lavfi\"]\n        )\n    ],\n    options=[\"-loglevel\", \"error\"],\n    output=[\n        ProcessConfigIO(\n            address=\"-\",\n            id=\"output_0\",\n            options=[\"-codec:v\", \"libx264\", \"-r\", \"25\", \"-f\", \"null\"]\n        )\n    ]\n))\nprint(put_process)\n```\n\n### Pydantic model exports:\n-   `model.dict()` exports model to dict\n-   `model.json()` exports model to json\n\n### Pydantic parse object as model:\n-   `parse_obj_as(ModelName, obj)`\n-   `ModelName.parse_obj(obj)`\n-   `ModelName(**obj)`\n\nMore details and options in the [pydantic docs](https://pydantic-docs.helpmanual.io/usage/models/#model-properties).\n\n## Error handling\n`raise_for_status()` is unused, but the exceptions are still available:\n\n```python\ntry:\n    process = client.v3_process_get_list()\nexcept httpx.HTTPError as exc:\n    print(f\"Error while requesting {exc.request.url!r}.\")\n```\n\nMore in the [HTTPX docs](https://www.python-httpx.org/exceptions/).\n\n## Developing \u0026 testing\n\n### Clone\n\n```sh\n$ git clone datarhei/core-client-python\n$ cd core-client-python \u0026\u0026 \\\n    pip install -r requirements-dev.txt\n```\n\n### Testing\n\n#### Start a [Core](https://github.com/datarhei/core) backend:\n```sh\n$ docker run -d --name core -p 8080:8080 datarhei/core:latest\n```\n\n#### Local\n```sh\n$ CORE_URL=http://127.0.0.1:8080 \\\n    pytest tests/*.py\n```\n*Use `coverage html` to create an html report.*\n\n#### Docker\n```sh\n$ docker build --build-arg PYTHON_VERSION=3.7 \\\n    -f tests/Dockerfile -t core_test .\n\n$ docker run -it --rm \\\n    -e CORE_URL=http://192.168.1.1:8080 core_test\n```\n*Notice: 127.0.0.1 is the container itself.*\n\n### Code checks\n\n```sh\n$ pre-commit run --all-files\n```\n*Requires `pip install pre-commit`.*\n\n## Changelog\n\n[Changelog](https://github.com/datarhei/core-client-python/blob/main/CHANGELOG.md)\n\n## Contributing\n\nFound a mistake or misconduct? Create a [issue](https://github.com/datarhei/core-client-python/issues) or send a pull-request.\nSuggestions for improvement are welcome.\n\n## Licence\n\n[MIT](https://github.com/datarhei/core-client-python/blob/main/LICENSE)\n","funding_links":[],"categories":["HarmonyOS"],"sub_categories":["Windows Manager"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatarhei%2Fcore-client-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdatarhei%2Fcore-client-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatarhei%2Fcore-client-python/lists"}