跳转至

Miyuki

Python 脚本 miyuki.py 详细分析大纲


1. 脚本概述

  • 用途:从特定网站(如 missav.ai 或相关域名)批量下载视频,支持多线程、分辨率选择、封面下载、错误重试等功能。
  • 核心功能
  • 命令行参数解析(URL、认证、播放列表、搜索等)。
  • 多线程下载视频片段(JPEG 格式)。
  • 使用 ffmpeg 合并片段为 MP4 文件。
  • 封面下载与嵌入视频。
  • 错误记录与重试机制。

2. 关键模块与函数

2.1 初始化与配置
  • 常量定义
  • 记录文件(RECORD_FILEERROR_RECORD_FILE)。
  • 视频保存路径(movie_save_path_root)。
  • 正则表达式(匹配 UUID、标题、分辨率等)。
  • HTTP 请求头:模拟浏览器访问(User-Agent)。
  • Banner 显示:启动时显示 ASCII 艺术字。
2.2 多线程与进度管理
  • 线程安全计数器ThreadSafeCounter 类,用于跟踪下载进度。
  • 进度条display_progress_bar 显示实时下载进度。
  • 区间分割split_integer_into_intervals 将总任务分片供多线程处理。
2.3 网络请求与重试
  • 重试机制https_request_with_retry 实现带重试的 HTTP 请求。
  • UUID 与标题解析get_movie_uuidget_movie_title 通过正则从 HTML 提取关键信息。
2.4 视频处理
  • 下载视频片段thread_task 多线程下载 JPEG 片段。
  • 合并视频
  • video_write_jpegs_to_mp4:直接拼接片段。
  • generate_mp4_by_ffmpeg:调用 ffmpeg 生成高质量视频。
  • 封面嵌入ffcover 选项将封面设为视频预览图。
2.5 命令行参数解析
  • 参数定义:支持 -urls-auth-plist-search-file 等多种输入方式。
  • 参数验证validate_args 检查参数合法性(如分辨率、重试次数)。
2.6 高级功能
  • 播放列表解析get_public_playlist 抓取公开播放列表的视频 URL。
  • 用户收藏get_movie_collections 通过登录获取用户收藏视频。
  • 代理支持:通过 -proxy 配置 HTTP 代理。

3. 工作流程

  1. 参数解析:根据输入参数(如 URL、播放列表、文件等)生成下载任务列表。
  2. UUID 与分辨率获取:解析视频页 HTML,提取 UUID 和可选分辨率。
  3. 多线程下载:分片下载所有 JPEG 视频片段。
  4. 合并与后处理
  5. 使用 ffmpeg 合并片段(可选封面嵌入)。
  6. 重命名文件为完整标题(-title 选项)。
  7. 清理与记录
  8. 删除临时文件夹(delete_all_subfolders)。
  9. 记录成功/失败的 URL(RECORD_FILEERROR_RECORD_FILE)。

4. 依赖项

  • 外部库curl_cffi(模拟浏览器请求)、ffmpeg(视频合并)。
  • 系统命令:依赖 ffmpeg 可执行文件(需安装并加入环境变量)。

5. 风险与注意事项

  • 法律风险:需确保下载行为符合目标网站的服务条款及相关法律法规。
  • 网站结构依赖:正则表达式匹配可能因网站改版失效。
  • 安全性:忽略 SSL 验证(verify=False)可能存在安全风险。
  • 资源占用:多线程下载可能占用较高网络和存储资源。

6. 示例用法

# 从播放列表下载前50个视频,使用ffmpeg合并并嵌入封面
miyuki.py -plist "https://missav.ai/search/JULIA" -limit 50 -ffmpeg -ffcover

# 使用账号下载收藏视频
miyuki.py -auth [email protected] password -ffmpeg

# 搜索并下载特定视频
miyuki.py -search sw-950 -quality 1080 -retry 5

7. 代码改进建议

  • 异常处理增强:部分网络请求缺乏详细错误日志。
  • 配置文件支持:将常量(如路径、重试次数)外置为配置文件。
  • 动态 UA 生成:防止被网站封禁。
  • 异步优化:使用异步库(如 aiohttp)提升性能。

总结miyuki.py 是一个功能全面的视频下载工具,适合从特定网站批量获取内容,但需谨慎使用以避免法律和伦理问题。