Add sync versions of stream and save methods (#215)
* Add sync versions of stream and save methods In order to provide synchronous interface to the library * Fix save_sync() failing to use metadata_fname and fix typing issues Signed-off-by: rany <ranygh@riseup.net> --------- Signed-off-by: rany <ranygh@riseup.net> Co-authored-by: rany <ranygh@riseup.net>
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
Communicate package.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import concurrent.futures
|
||||
import json
|
||||
import re
|
||||
import ssl
|
||||
@@ -9,6 +11,7 @@ import time
|
||||
import uuid
|
||||
from contextlib import nullcontext
|
||||
from io import TextIOWrapper
|
||||
from queue import Queue
|
||||
from typing import (
|
||||
Any,
|
||||
AsyncGenerator,
|
||||
@@ -498,3 +501,40 @@ class Communicate:
|
||||
):
|
||||
json.dump(message, metadata)
|
||||
metadata.write("\n")
|
||||
|
||||
def stream_sync(self) -> Generator[Dict[str, Any], None, None]:
|
||||
"""Synchronous interface for async stream method"""
|
||||
|
||||
def fetch_async_items(queue: Queue) -> None: # type: ignore
|
||||
async def get_items() -> None:
|
||||
async for item in self.stream():
|
||||
queue.put(item)
|
||||
queue.put(None)
|
||||
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
loop.run_until_complete(get_items())
|
||||
loop.close()
|
||||
|
||||
queue: Queue = Queue() # type: ignore
|
||||
|
||||
with concurrent.futures.ThreadPoolExecutor() as executor:
|
||||
executor.submit(fetch_async_items, queue)
|
||||
|
||||
while True:
|
||||
item = queue.get()
|
||||
if item is None:
|
||||
break
|
||||
yield item
|
||||
|
||||
def save_sync(
|
||||
self,
|
||||
audio_fname: Union[str, bytes],
|
||||
metadata_fname: Optional[Union[str, bytes]] = None,
|
||||
) -> None:
|
||||
"""Synchronous interface for async save method."""
|
||||
with concurrent.futures.ThreadPoolExecutor() as executor:
|
||||
future = executor.submit(
|
||||
asyncio.run, self.save(audio_fname, metadata_fname)
|
||||
)
|
||||
future.result()
|
||||
|
||||
Reference in New Issue
Block a user