diff --git a/backend/MediaCacheManager.py b/backend/MediaCacheManager.py index 00e3aa4..1e9f1a0 100644 --- a/backend/MediaCacheManager.py +++ b/backend/MediaCacheManager.py @@ -42,8 +42,8 @@ class ChunkInfo(object): @functools.total_ordering class MediaChunkHolder(object): waiters: collections.deque[asyncio.Future] - requesters: list[Request] = [] - unique_id: str = "" + requesters: list[Request] + unique_id: str info: ChunkInfo @staticmethod @@ -56,9 +56,11 @@ class MediaChunkHolder(object): self.mem = bytes() self.length = len(self.mem) self.waiters = collections.deque() + self.requesters = [] def __repr__(self) -> str: - return f"MediaChunk,unique_id:{self.unique_id},{self.info},mlen:{self.length}" + pl = [f"{id(req)}" for req in self.requesters] + return f"MediaChunk,unique_id:{self.unique_id},{self.info},mlen:{self.length},req:{pl}" def __eq__(self, other: Union["MediaChunkHolder", ChunkInfo, int]): if isinstance(other, int): @@ -110,11 +112,12 @@ class MediaChunkHolder(object): async def is_disconneted(self) -> bool: while self.requesters: - req = self.requesters[0] - if not await req.is_disconnected(): - return False try: + req = self.requesters[0] + if not await req.is_disconnected(): + return False self.requesters.remove(req) + logger.info(f"remove req:{id(req)=},{self}") except Exception as err: logger.warning(f"{err=}, trace:{traceback.format_exc()}") return False @@ -127,9 +130,9 @@ class MediaChunkHolder(object): self.waiters.append(waiter) try: await waiter - except: + except Exception as err: waiter.cancel() - logger.warning("waiter cancel") + logger.warning(f"waiter cancel:{err=},{traceback.format_exc()}") try: self.waiters.remove(waiter) except ValueError: diff --git a/backend/TgFileSystemClient.py b/backend/TgFileSystemClient.py index 22645d4..802a9b6 100644 --- a/backend/TgFileSystemClient.py +++ b/backend/TgFileSystemClient.py @@ -356,6 +356,7 @@ class TgFileSystemClient(object): align_pos = pos align_size = min(self.SINGLE_MEDIA_SIZE, file_size - align_pos) holder = self.media_chunk_manager.create_media_chunk_holder(msg.chat_id, msg.id, align_pos, align_size) + logger.info(f"new holder create:{holder}") holder.add_chunk_requester(req) self.media_chunk_manager.set_media_chunk(holder) self.task_queue.put_nowait((cur_task_id, self._download_media_chunk(msg, holder))) diff --git a/backend/api.py b/backend/api.py index e29c1fd..b17c879 100644 --- a/backend/api.py +++ b/backend/api.py @@ -177,7 +177,6 @@ async def get_tg_file_media_stream(token: str, cid: int, mid: int, request: Requ @app.get("/tg/api/v1/file/get/{chat_id}/{msg_id}/{file_name}") @apiutils.atimeit async def get_tg_file_media(chat_id: int|str, msg_id: int, file_name: str, sign: str, req: Request): - logger.info(f"request: {chat_id=},{msg_id=},{file_name=},{req=},{id(req)=}") try: if isinstance(chat_id, str): chat_id = int(chat_id) diff --git a/frontend/home.py b/frontend/home.py index 3004f28..feec3f5 100644 --- a/frontend/home.py +++ b/frontend/home.py @@ -9,7 +9,7 @@ st.set_page_config(page_title="TgToolbox", page_icon="🕹️", layout="wide", i backend_status = api.get_backend_client_status() need_login = False -if not backend_status["init"]: +if backend_status is None or not backend_status["init"]: st.status("Server not ready") time.sleep(0.5) st.rerun()