From 368e946cd16dfa07afea912e3effca3b1db547ec Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Sun, 15 Mar 2026 18:15:32 +0800 Subject: [PATCH 1/2] fix(bilibili): avoid nested asyncio.run() in async context BilibiliAdapter._fetch_metadata_with_retry() now calls the underlying async methods directly instead of sync wrappers that use asyncio.run(). This prevents "asyncio.run() cannot be called from a running event loop" error when the adapter is called from within an already-running event loop. Co-Authored-By: Claude Opus 4.6 --- kb_pipeline/platforms/bilibili.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kb_pipeline/platforms/bilibili.py b/kb_pipeline/platforms/bilibili.py index e91acca..fc45196 100644 --- a/kb_pipeline/platforms/bilibili.py +++ b/kb_pipeline/platforms/bilibili.py @@ -170,9 +170,11 @@ class BilibiliAdapter(PlatformAdapter): ValueError: If content_type is not supported """ if content_type == "video": - return self._extractor.extract_video_metadata(content_id) + # Call async method directly to avoid nested asyncio.run() + return await self._extractor._extract_video_async(content_id) elif content_type == "article": - return self._extractor.extract_article_metadata(content_id) + # Call async method directly to avoid nested asyncio.run() + return await self._extractor._extract_article_async(content_id) else: raise ValueError(f"Unsupported content type: {content_type}") -- 2.47.0 From 5d06056b432539033f154a136f190f456d51bbde Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Sun, 15 Mar 2026 18:16:24 +0800 Subject: [PATCH 2/2] fix(download): handle formatted duration strings in metadata Parse duration strings like "12:34" or "01:23:45" into seconds. Previously only integer duration values were handled. Co-Authored-By: Claude Opus 4.6 --- kb_pipeline/processors/download.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/kb_pipeline/processors/download.py b/kb_pipeline/processors/download.py index 55494e8..b0171c6 100644 --- a/kb_pipeline/processors/download.py +++ b/kb_pipeline/processors/download.py @@ -215,7 +215,21 @@ class DownloadProcessor(BaseProcessor): # Bilibili video duration if "metadata" in metadata and "duration" in metadata["metadata"]: - return metadata["metadata"]["duration"] + duration = metadata["metadata"]["duration"] + # Handle formatted duration string (e.g., "12:34" or "01:23:45") + if isinstance(duration, str): + if not duration.strip(): + return None + parts = duration.split(':') + try: + if len(parts) == 2: + return int(parts[0]) * 60 + int(parts[1]) + elif len(parts) == 3: + return int(parts[0]) * 3600 + int(parts[1]) * 60 + int(parts[2]) + except (ValueError, IndexError): + return None + elif isinstance(duration, (int, float)): + return int(duration) return None -- 2.47.0