fix: Live Photo 视频的文件名序号与相对应图片的文件名序号不匹配,且视频以及 Live Photo 视频的文件名与图片的文件名格式不一致问题#644
fix: Live Photo 视频的文件名序号与相对应图片的文件名序号不匹配,且视频以及 Live Photo 视频的文件名与图片的文件名格式不一致问题#644YuanChenCheung wants to merge 7 commits into
Conversation
…26-07-01T12:00:00 转换为 2026-07-01_12-00-00,与 _download_weibo_images 使用完全一致的格式。包含回退逻辑:解析失败时降级为旧格式。
…ivephoto 条目的 videoSrc 并记录其在过滤后 pics 中的位置索引,使 Live Photo 视频的文件名序号与对应图片文件名序号保持一致。
PR Titlefeat: 新增 markdown_image_order 配置,支持两种图片与 Live Photo 的排列模式。 PR Description变更概述在 Markdown 输出模式中,新增 变更内容新增配置项
|
PR Titlefeat: 新增 markdown_preview 配置,支持各类媒体文件在 Markdown 中的预览开关。 PR Description变更概述在 此前 Markdown 输出中,图片使用 变更内容新增配置块
|
| 配置项 | 默认值 | 说明 |
|---|---|---|
link_preview |
0 |
网页链接 |
original_video_preview |
0 |
原创微博视频 |
retweet_video_preview |
0 |
转发微博视频 |
original_image_preview |
1 |
原创微博图片 |
retweet_image_preview |
1 |
转发微博图片 |
original_live_photo_preview |
0 |
原创微博 Live Photo |
retweet_live_photo_preview |
0 |
转发微博 Live Photo |
inline_image_preview |
1 |
正文中"查看图片"占位符 |
每个选项取值 0(普通链接 [text](url))或 1(预览 )。
兼容性
- 完全向后兼容:默认值与现有硬编码行为一致(图片预览,其余不预览),现有用户升级后无需修改任何配置
- 用户可自由组合 8 个开关,实现任意预览策略(如全预览、全不预览、仅视频预览等)
markdown_preview非必填项,缺失整个块或部分 key 均自动使用默认值- 对非 Markdown 输出模式无任何影响
PR Titlefeat: 新增 markdown_file_dir 与 download_folder_name 配置,支持自定义媒体文件的存储目录名。 PR Description变更概述新增 此前所有媒体文件的目录名均为硬编码。其中图片的逻辑最为复杂,存在两套不同的路径约定:
这种不一致导致用户无法统一自定义。本次变更将两个维度的路径均暴露为配置项,同时完全保留原始默认值,确保向后兼容。 变更内容新增配置块
|
| 配置项 | 默认值 | 对应原始硬编码 |
|---|---|---|
original_image_dir |
img |
img/ |
retweet_image_dir |
img |
img/ |
original_video_dir |
原创微博视频 |
原创微博视频/ |
retweet_video_dir |
转发微博视频 |
转发微博视频/ |
original_live_photo_dir |
原创微博Live Photo视频 |
原创微博Live Photo视频/ |
retweet_live_photo_dir |
转发微博Live Photo视频 |
转发微博Live Photo视频/ |
新增配置块 download_folder_name(config.json)
控制非 markdown 模式(以及 markdown 模式中视频/Live Photo)下载到本地的目录名。
| 配置项 | 默认值 | 对应原始硬编码 |
|---|---|---|
original_image_folder |
原创微博图片 |
原创微博图片/ |
retweet_image_folder |
转发微博图片 |
转发微博图片/ |
original_video_folder |
原创微博视频 |
原创微博视频/ |
retweet_video_folder |
转发微博视频 |
转发微博视频/ |
original_live_photo_folder |
原创微博Live Photo视频 |
原创微博Live Photo视频/ |
retweet_live_photo_folder |
转发微博Live Photo视频 |
转发微博Live Photo视频/ |
兼容性
- 完全向后兼容:默认值与原始硬编码完全一致,现有用户升级后无任何行为变化
- 两个配置块均非必填,缺失整个块或部分 key 自动使用默认值
- 对非 Markdown 输出模式无任何影响
PR Titlerefactor: 新增 config.json.example 模板,将 config.json 从版本控制中移除。 PR Description变更概述新增
变更内容新增
|
…tweet_pic_download 的 bug。
PR Titlefeat: 新增 markdown_sort_order 与 missing_weibo_report 配置,修复转发图片下载不尊重 retweet_pic_download 的 bug。 PR Description变更概述本次变更包含三个独立改进:
变更内容新增配置项
|
PR Title
fix: Live Photo 视频的文件名序号与相对应图片的文件名序号不匹配,且视频以及Live Photo 视频的文件名与图片的文件名格式不一致问题
PR Description
问题描述 / Problem
微博 API 返回的
live_photo数组是独立于pics数组的顶层字段,两者各自从 0 开始计数。当一条微博同时包含普通图片和 Live Photo 时,live_photo列表中的视频无法正确定位其在pics中的对应图片位置,导致下载后视频文件名与对应的静态图片文件名序号不匹配。举例: 一条微博有 4 张图,其中第 1 张为普通图片,第 2/3/4 张为 Live Photo:
2024-01-15_10-30-00_1.jpg2024-01-15_10-30-00_1.jpg2024-01-15_10-30-00_2.jpg2024-01-15_10-30-00_2.jpg2024-01-15_10-30-00_3.jpg2024-01-15_10-30-00_3.jpg2024-01-15_10-30-00_4.jpg2024-01-15_10-30-00_4.jpg20240115T_xxxxxxxxxxx_1.mp42024-01-15_10-30-00_2.mp420240115T_xxxxxxxxxxx_2.mp42024-01-15_10-30-00_3.mp420240115T_xxxxxxxxxxx_3.mp42024-01-15_10-30-00_4.mp4根因分析 / Root Cause
旧的
get_live_photo_url()直接读取 API 返回的顶层live_photo数组,该数组仅包含 Live Photo 视频 URL,索引从 0 开始独立计算,不感知pics中普通图片的存在。当普通图片与 Live Photo 混合时,两者序号必然错位。而 API 返回的
pics数组中,每个条目带有type字段("livephoto"表示 Live Photo),且 Live Photo 条目包含videoSrc字段(即实际视频 URL),同时还包含pid信息。因此正确的做法是从pics中提取 Live Photo 信息,而非依赖独立的live_photo数组。解决方案 / Solution
重写
get_live_photo_url(),改为遍历pics数组(使用与get_pics()完全一致的过滤逻辑),从type: "livephoto"的条目中提取videoSrc字段,并记录每条视频在过滤后 pics 中的 1-based 位置索引。同时将其返回类型从纯字符串改为包含url和indices的字典。下载和 Markdown 文件名生成时,使用该索引替代独立计数,确保 Live Photo 视频文件名与对应静态图片文件名序号一致。
修改文件 / Files Changed
weibo.py(5 处修改)get_live_photo_url()— 重写,从pics数组提取videoSrc并返回{"url": ..., "indices": [...]}字典parse_weibo()— 同时存储live_photo_url和live_photo_indiceshandle_download()— video 和 live_photo 下载逻辑拆分为独立分支,live_photo 分支使用live_photo_indices命名get_download_file_names()— 同上拆分,用于 Markdown 链接生成get_write_info()— 从输出中排除内部字段live_photo_indices兼容性 / Compatibility
live_photo_url仍为分号分隔的 URL 字符串,存量数据和下游消费者不受影响live_photo_indices缺失,自动回退到j+1的独立计数方式