mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 09:10:30 +08:00
msd: downloading status api
This commit is contained in:
parent
1564c68727
commit
1055dadcb9
@ -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:
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user