"""抖音视频/图文解析编排层 链路(2026-10 起,免浏览器):短链/全链接 → `douyin_web.fetch_douyin_web` (短链重定向、签名请求 web detail 接口、最高码率/最高画质下载都在该模块内)。 旧链路(iesdouyin SSR 静态解析 + playwright 浏览器拦截)已废弃, 详见 services/fetchers/douyin_web.py 顶部说明。 """ from pathlib import Path from typing import Optional, Union from nonebot import logger from ..services.fetchers.douyin_web import fetch_douyin_web from ..utils import get_data_dir, parse_netscape_cookies from ..policy import Policy from .sender import PendingMedia, _as_paths async def parse_douyin( url: str, ) -> tuple[Optional[str], Optional[Union[Path, list[Path]]], bool]: """解析抖音链接(短链 / 全链接),返回 (title, file_paths, is_image_post)""" try: cookies_path = get_data_dir() / "cookies.txt" cookies = parse_netscape_cookies(cookies_path) return await fetch_douyin_web(url, cookies) except Exception: logger.exception(f"获取直链失败 {url}") return None, None, False async def process_douyin_res( title: str, file_paths: Union[Path, list[Path]], is_private: bool, image_post: bool, policy: Policy | None = None, platform: str | None = None, ) -> tuple[Optional[PendingMedia], Optional[str]]: """下载已完成 → 打包为待发送媒体(不上传、不发送、不清理) 多级发送(temp 本地 → S3 链接 → 回退本地)与群文件上传由 send_pending_media 统一按 policy 处理;platform 用于群文件限定平台。 """ if not file_paths: return None, None return ( PendingMedia( files=_as_paths(file_paths), image_post=image_post, is_private=is_private, policy=policy, platform=platform, title=title, ), None, )