|
|
@@ -68,6 +68,24 @@ def load_post(src: dict, settings: Settings):
|
|
|
|
|
|
|
|
|
# ---------- ① 读懂(图文/视频分流) ----------
|
|
|
+def _download_images(post) -> list[str]:
|
|
|
+ """live 图文帖:把 CDN 图下载到本地 /data(避开小红书防盗链),返回本地公开路径;
|
|
|
+ 单张失败则退回 CDN 直链(至少有 url)。复用 video_extract 的下载器(iOS UA + 平台 Referer)。"""
|
|
|
+ base = DATA / "xiaohongshu" / post.id
|
|
|
+ base.mkdir(parents=True, exist_ok=True)
|
|
|
+ out = []
|
|
|
+ for n, url in enumerate(post.image_urls, 1):
|
|
|
+ dst = base / f"image_{n}.webp"
|
|
|
+ pub = f"/data/demo/xiaohongshu/{post.id}/image_{n}.webp"
|
|
|
+ try:
|
|
|
+ if not dst.exists():
|
|
|
+ dst.write_bytes(video_extract._default_download(url, post.platform))
|
|
|
+ out.append(pub)
|
|
|
+ except Exception:
|
|
|
+ out.append(url)
|
|
|
+ return out
|
|
|
+
|
|
|
+
|
|
|
def read_one(src: dict, post, settings: Settings, extractor: GeminiExtractor):
|
|
|
cid = src["cid"]
|
|
|
if post.video_urls: # 视频帖:下载 mp4 + 原生整段提炼
|
|
|
@@ -83,7 +101,7 @@ def read_one(src: dict, post, settings: Settings, extractor: GeminiExtractor):
|
|
|
if src["from"] == "fixture":
|
|
|
imgs = [f"/data/demo/xiaohongshu/{post.id}/image_{n}.webp" for n in range(1, len(post.image_urls) + 1)]
|
|
|
else:
|
|
|
- imgs = list(post.image_urls) # 新帖未落盘 → 直接用 CDN url
|
|
|
+ imgs = _download_images(post) # live 帖:下载 CDN 图到本地 /data,避开防盗链
|
|
|
media = {"type": "image", "video_url": None, "images": imgs}
|
|
|
cmap = {c.index: c.content for c in ec.cards}
|
|
|
cards = [{"index": n, "content": cmap.get(n, ""), "image_url": imgs[n - 1] if n <= len(imgs) else None}
|