msd: downloading status api

This commit is contained in:
Maxim Devaev 2022-07-24 16:16:45 +03:00
parent 1564c68727
commit 1055dadcb9
2 changed files with 34 additions and 10 deletions

View File

@ -155,14 +155,28 @@ class BaseMsd(BasePlugin):
raise NotImplementedError()
class MsdImageReader:
def __init__(self, path: str, chunk_size: int) -> None:
class MsdImageReader: # pylint: disable=too-many-instance-attributes
def __init__(self, notifier: aiotools.AioNotifier, path: str, chunk_size: int) -> None:
self.__notifier = notifier
self.__name = os.path.basename(path)
self.__path = path
self.__chunk_size = chunk_size
self.__file: Optional[aiofiles.base.AiofilesContextManager] = None
self.__file_size: int = 0
self.__file_size = 0
self.__readed = 0
self.__tick = 0.0
def get_size(self) -> int:
assert self.__file is not None
return self.__file_size
def get_state(self) -> Dict:
return {
"name": self.__name,
"size": self.__file_size,
"readed": self.__readed,
}
async def open(self) -> "MsdImageReader":
assert self.__file is None
@ -171,18 +185,22 @@ class MsdImageReader:
self.__file = await aiofiles.open(self.__path, mode="rb") # type: ignore
return self
def get_size(self) -> int:
assert self.__file is not None
return self.__file_size
async def read(self) -> bytes:
assert self.__file is not None
return (await self.__file.read(self.__chunk_size)) # type: ignore
chunk = await self.__file.read(self.__chunk_size) # type: ignore
self.__readed += len(chunk)
now = time.monotonic()
if self.__tick + 1 < now or self.__readed == self.__file_size:
self.__tick = now
await self.__notifier.notify()
return chunk
async def close(self) -> None:
assert self.__file is not None
logger = get_logger()
logger.info("Closed image reader ...")
logger.info("Closing image reader ...")
try:
await self.__file.close() # type: ignore
except Exception:

View File

@ -204,6 +204,8 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
del storage["images"][name]["path"]
del storage["images"][name]["in_storage"]
storage["downloading"] = (self.__reader.get_state() if self.__reader else None)
if self.__writer:
# При загрузке файла показываем актуальную статистику вручную
storage["uploading"] = self.__writer.get_state()
@ -343,7 +345,11 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
if name not in self.__state.storage.images or not os.path.exists(path):
raise MsdUnknownImageError()
self.__reader = await MsdImageReader(path, self.__read_chunk_size).open()
self.__reader = await MsdImageReader(
notifier=self.__notifier,
path=path,
chunk_size=self.__read_chunk_size,
).open()
yield self.__reader.get_size()