This Jupyter Notebook is the appendix to an AYON Community guide.
Find the full guide here AYON REST API Guide
pip install ayon-python-api
pip install httpx
I'll be using these functions to process the response of AYON Server.
## Some Helper Functions
def get_projects_names(con):
projects = con.get_projects()
names = map(lambda b: b["name"], projects)
return list(names)
def get_bundle_names(con):
bundles = con.get_bundles()["bundles"]
names = map(lambda b: b["name"], bundles)
return list(names)
def get_available_versions_of_addon(con, addon_name):
addons = con.get_addons_info()["addons"]
core_addons = next(filter(lambda b: b["name"]==addon_name, addons), {})
core_addons_version = list(core_addons.get("versions", {}).keys())
return core_addons_version
ayon-python-api
is Ynput's official library for accessing AYON's API.
It uses AYON_SERVER_URL
and AYON_API_KEY
environment variables to connect with AYON Server.
import os
os.environ["AYON_SERVER_URL"] = "<your-ayon-server-url>"
os.environ["AYON_API_KEY"] = "<your-ayon-api-key>"
import ayon_api
con = ayon_api.get_server_api_connection()
projects = get_projects_names(con)
print("Current Projects:", projects)
bundles = get_bundle_names(con)
print("Available Bundles:", bundles)
core_versions = get_available_versions_of_addon(con, "core")
print("Available versions of Core addon:", core_versions)
ayon_api.close_connection
Current Projects: ['demo_Big_Episodic', 'demo_Big_Feature', 'demo_Commercial', 'Robo', 'RoboAyon', 'RoboPype', 'Test'] Available Bundles: ['AYON-CORE-0.2.0-2024-02-08', 'Dev-2023-12-20-01'] Available versions of Core addon: ['0.2.0', '0.3.0-dev.1']
<function ayon_api._api.close_connection()>
A simple AYON python API implementation.
It was made for the purpose of learning.
Also, there could be situations (e.g. in CI/CD workflows) where you'd prefere to implement the two requests you'd need isntead of downlaoding the whole ayon-python-api
library.
"""
Many thanks to Danell,
This code was directly inspired by his community guide.
https://community.ynput.io/t/developing-with-ayons-rest-api/1237
This code can:
- login
- get_projects
- get_bundles
- get_addons_info
- delete_addon_version
- upload_addon_zip_url
- upload_addon_zip_file
"""
import httpx
class SimpleAyonRestCommands:
def __init__(self, ayon_server_url, username, password):
self.ayon_server_url = ayon_server_url
self.credentials = {
"name": username,
"password":password
}
self.headers = {}
self.ayon_login()
def ayon_login(self):
req = f"{self.ayon_server_url}/api/auth/login"
response = httpx.post(
req,
json=self.credentials,
)
self.token = response.json().get("token")
self.headers["Authorization"] = f"Bearer {self.token}"
def get_projects(self):
req = f"{self.ayon_server_url}/api/projects"
response = httpx.get(
req,
headers=self.headers
)
return response.json().get("projects")
def get_bundles(self):
req = f"{self.ayon_server_url}/api/bundles"
response = httpx.get(
req,
params={
"archived": False
},
headers=self.headers
)
return response.json()
def get_addons_info(self):
req = f"{self.ayon_server_url}/api/addons"
response = httpx.get(
req,
headers=self.headers
)
return response.json()
def delete_addon_version(self, addon_name, addon_version):
req = f"{self.ayon_server_url}/api/addons/{addon_name}/{addon_version}"
response = httpx.delete(
req,
params={
"purge" : True
},
headers=self.headers
)
return response.json()
def upload_addon_zip_url(self, addon_url, addon_name, addon_version):
req = f"{self.ayon_server_url}/api/addons/install"
response = httpx.post(
req,
params = {
"url" : addon_url,
"addonName": addon_name,
"addonVersion" :addon_version
},
headers=self.headers
)
return response.json()
def upload_addon_zip_file(self, addon_filepath):
chunk_size = 1024 * 1024
req = f"{self.ayon_server_url}/api/addons/install"
with open(addon_filepath, "rb") as stream:
response = httpx.post(
req,
data=self.upload_chunks_iter(stream, chunk_size),
headers=self.headers
)
response.raise_for_status()
return response.json()
@staticmethod
def upload_chunks_iter(file_stream, chunk_size):
while True:
chunk = file_stream.read(chunk_size)
if not chunk:
break
yield chunk
It uses username
, password
and ayon_Server_url
to connect with AYON Server.
username = "<your-user-name>"
password = "<your-password>"
ayon_server_url = "<your-ayon-server-url>"
con = SimpleAyonRestCommands(ayon_server_url,
username,
password)
projects = get_projects_names(con)
print("Current Projects:", projects)
bundles = get_bundle_names(con)
print("Available Bundles:", bundles)
core_versions = get_available_versions_of_addon(con, "core")
print("Available versions of Core addon:", core_versions)
Current Projects: ['demo_Big_Episodic', 'demo_Big_Feature', 'demo_Commercial', 'Robo', 'RoboAyon', 'RoboPype', 'Test'] Available Bundles: ['AYON-CORE-0.2.0-2024-02-08', 'Dev-2023-12-20-01'] Available versions of Core addon: ['0.2.0', '0.3.0-dev.1']