Skip to content

Commit

Permalink
Update connect_scrypted_client (#932)
Browse files Browse the repository at this point in the history
  • Loading branch information
raman325 committed Jul 6, 2023
1 parent 6d8b3c1 commit c31e68f
Showing 1 changed file with 49 additions and 39 deletions.
88 changes: 49 additions & 39 deletions packages/python-client/test.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
from __future__ import annotations

import asyncio
from contextlib import nullcontext
import engineio
import os
import aiohttp
import rpc_reader
import plugin_remote
from plugin_remote import SystemManager, MediaManager
from plugin_remote import DeviceManager, SystemManager, MediaManager
from scrypted_python.scrypted_sdk import ScryptedStatic

class EioRpcTransport(rpc_reader.RpcTransport):
Expand Down Expand Up @@ -35,57 +38,62 @@ async def send():


async def connect_scrypted_client(
base_url: str, username: str, password: str, plugin_id: str = "@scrypted/core"
):
transport: EioRpcTransport, base_url: str, username: str, password: str, plugin_id: str = "@scrypted/core", session: aiohttp.ClientSession | None = None
) -> ScryptedStatic:
login_url = f"{base_url}/login"
login_body = {
"username": username,
"password": password,
}

async with aiohttp.ClientSession() as session:
async with session.post(
if session:
cm = nullcontext(session)
else:
cm = aiohttp.ClientSession()

async with cm as _session:
async with _session.post(
login_url, verify_ssl=False, json=login_body
) as response:
login_response = await response.json()

headers = {"Authorization": login_response["authorization"]}

loop = asyncio.get_event_loop()
transport = EioRpcTransport(loop)

await transport.eio.connect(
base_url,
headers=headers,
engineio_path=f"/endpoint/{plugin_id}/engine.io/api/",
)

ret = asyncio.Future[ScryptedStatic](loop=loop)
peer, peerReadLoop = await rpc_reader.prepare_peer_readloop(loop, transport)
peer.params['print'] = print
def callback(api, pluginId, hostInfo):
remote = plugin_remote.PluginRemote(peer, api, pluginId, hostInfo, loop)
wrapped = remote.setSystemState
async def remoteSetSystemState(systemState):
await wrapped(systemState)
async def resolve():
sdk = ScryptedStatic()
sdk.api = api
sdk.remote = remote
sdk.systemManager = SystemManager(api, remote.systemState)
sdk.mediaManager = MediaManager(await api.getMediaManager())
ret.set_result(sdk)
asyncio.run_coroutine_threadsafe(resolve(), loop)
remote.setSystemState = remoteSetSystemState
return remote
peer.params['getRemote'] = callback
asyncio.run_coroutine_threadsafe(peerReadLoop(), loop)

sdk = await ret
return sdk
headers = {"Authorization": login_response["authorization"]}

await transport.eio.connect(
base_url,
headers=headers,
engineio_path=f"/endpoint/{plugin_id}/engine.io/api/",
)

ret = asyncio.Future[ScryptedStatic](loop=transport.loop)
peer, peerReadLoop = await rpc_reader.prepare_peer_readloop(transport.loop, transport)
peer.params['print'] = print
def callback(api, pluginId, hostInfo):
remote = plugin_remote.PluginRemote(peer, api, pluginId, hostInfo, transport.loop)
wrapped = remote.setSystemState
async def remoteSetSystemState(systemState):
await wrapped(systemState)
async def resolve():
sdk = ScryptedStatic()
sdk.api = api
sdk.remote = remote
sdk.systemManager = SystemManager(api, remote.systemState)
sdk.deviceManager = DeviceManager(remote.nativeIds, sdk.systemManager)
sdk.mediaManager = MediaManager(await api.getMediaManager())
ret.set_result(sdk)
asyncio.run_coroutine_threadsafe(resolve(), transport.loop)
remote.setSystemState = remoteSetSystemState
return remote
peer.params['getRemote'] = callback
asyncio.run_coroutine_threadsafe(peerReadLoop(), transport.loop)

sdk = await ret
return sdk

async def main():
transport = EioRpcTransport(asyncio.get_event_loop())
sdk = await connect_scrypted_client(
transport,
"https://localhost:10443",
os.environ["SCRYPTED_USERNAME"],
os.environ["SCRYPTED_PASSWORD"],
Expand All @@ -94,6 +102,8 @@ async def main():
for id in sdk.systemManager.getSystemState():
device = sdk.systemManager.getDeviceById(id)
print(device.name)

await transport.eio.disconnect()
os._exit(0)

loop = asyncio.new_event_loop()
Expand Down

0 comments on commit c31e68f

Please sign in to comment.