mastoposter-oss_images/mastoposter/sources.py

28 lines
955 B
Python
Raw Normal View History

from asyncio import exceptions
2022-08-24 08:09:41 +03:00
from json import loads
from typing import AsyncGenerator
from urllib.parse import urlencode
2022-08-24 08:28:18 +03:00
from mastoposter.types import Status
2022-08-24 08:09:41 +03:00
async def websocket_source(
url: str, reconnect: bool = False, **params
) -> AsyncGenerator[Status, None]:
2022-08-24 08:09:41 +03:00
from websockets.client import connect
from websockets.exceptions import WebSocketException
2022-08-24 08:09:41 +03:00
url = f"{url}?" + urlencode({"stream": "list", **params})
while True:
try:
async with connect(url) as ws:
while (msg := await ws.recv()) is not None:
event = loads(msg)
if "error" in event:
raise Exception(event["error"])
if event["event"] == "update":
yield Status.from_dict(loads(event["payload"]))
except (WebSocketException, TimeoutError, exceptions.TimeoutError):
if not reconnect:
raise