Mflow — 并行分片流代理(Multi Flow)
并行化的 HTTP 流代理。将客户端的 Range 请求拆分为多个并发分片(chunk)向上游并行下载,按序合并后转发给客户端,从而提升带宽利用与播放稳定性。适用于 mpv、VLC 等支持 HTTP 流的播放器,或作为加速下载的中间层。
核心能力
- 并行分片下载与按序回写
- 上游重定向检测与自动跟随(默认最多 3 次)
- 可配置:并发连接数、分片大小、重试次数、最小速度检测等
- 支持 aria2 风格的 JSON-RPC(
/jsonrpc/ method=aria2.addUri)来创建任务并返回 GID - 可选内存缓存以减少重复读取(SafeMemory)
- Windows 下彩色日志输出(colorama)
安装
通过 PyPI:
pip install mflow
或从源码安装(开发):
cd Mflow
pip install -e .
依赖与版本请参见
pyproject.toml。
快速运行
在仓库根目录或已安装后:
# 使用默认配置启动(默认端口 80)
python -m mflow
# 或指定端口 / 并发 / 分片大小
mflow --port 8080 --connections 8 --chunk-size 1M
默认监听地址为 0.0.0.0,端口可通过 --port 覆盖。
使用示例
播放器直接使用代理 URL:
mpv "http://localhost:8080/stream?url=https://example.com/video.mp4"
使用 JSON-RPC 创建任务(aria2.addUri 风格):
POST 到 http://localhost:PORT/jsonrpc,示例 body:
{
"jsonrpc": "2.0",
"method": "aria2.addUri",
"id": "1",
"params": [
["https://example.com/video.mp4"],
{"header": ["User-Agent: MyAgent/1.0"]}
]
}
返回将包含任务 GID(字符串);随后可通过 /stream?gid={GID} 来复用任务信息。
命令行参数
-p, --port:监听端口,默认 80-c, --connections:每个流允许的最大并发连接数,默认 4-s, --chunk-size:分片大小,支持后缀 K/M(例如1M,512K),默认 1M-r, --retry:每个分片的最大重试次数,默认 5--log-level:日志级别(DEBUG|INFO|WARNING|ERROR|CRITICAL),默认 INFO--cache:启用内存缓存(默认关闭)--min-speed:最低速度阈值(例如100K,0.5M),低于该值会触发重试或重建连接(默认 0,表示禁用)
示例:
mflow --port 9000 --connections 16 --chunk-size 2M --log-level DEBUG
HTTP 接口
-
GET
/stream:流媒体主接口- 参数:
url(直接上游 URL)或gid(JSON-RPC 返回的任务 ID) - 必须支持 Range(若上游不支持 Range,代理会返回 403/Forbidden)
- 返回 200 或 206,包含
Content-Range、Content-Length、Content-Type和可选Content-Disposition
- 参数:
-
POST
/jsonrpc:接收 aria2 风格的aria2.addUri,用于创建后台任务并返回 GID
实现
-
入口:
src/mflow.py(解析命令行并启动 aiohttp 应用) -
主要模块:
mflow/app.py:应用初始化、路由与日志配置mflow/handler.py:MultiFlow 控制器,实现/stream与/jsonrpc的核心逻辑mflow/link_info.py:LinkInfo(上游信息解析、client pool、文件名/类型检测)mflow/utils.py:SafeMemory、Range 解析、彩色日志格式化等工具
-
分片下载流程:解析客户端 Range -> 根据 CHUNK_SIZE 切分区间 -> 并发下载分片 -> 通过序号同步机制按序写入响应流。
-
速度检测:以 1 秒为粒度监测下载速率,低于
MIN_SPEED并且连续达到MAX_STREAK次将触发 LowSpeed 策略(例如重建连接或重试)。
排查建议
- 若播放停滞或卡顿:尝试增大
--connections或减小--chunk-size,或开启 DEBUG 日志查看详细重试信息。 - 若上游不支持 Range:无法并行化,代理会拒绝并以 403 返回。
- 使用
--cache在内存允许的情况下降低重复请求对上游的压力。
许可与贡献
项目含 LICENSE(见仓库根目录)。欢迎通过 issue/PR 贡献改进或报告问题。
Metadata
Release files for mflow 1.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| mflow-1.3.1.tar.gz | 20.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mflow-1.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 40.8 kB
Release files / mflow-1.3.1.tar.gz
| Download URL | mflow-1.3.1.tar.gz |
|---|---|
| Size | 20.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fdb9ba9add882608b98870d996af46ac18b31320168d01880bfcd7a0d6a7bc22
|
|
BLAKE2b-256 checksum How to use checksums |
26b0bb937ac06021747a3b159daf1748b96424fc0fa761ff34fb06065e02871e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.11
|
Release files / mflow-1.3.1-py3-none-any.whl
| Download URL | mflow-1.3.1-py3-none-any.whl |
|---|---|
| Size | 20.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0ddaf01f41561644b43c7e451f939a74991a2a5ab18e5a056684e54143390cf4
|
|
BLAKE2b-256 checksum How to use checksums |
544636b505b9256a46959c9292dbe95d3462adb0a61adb79968e1d87ee79d71e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.11
|
Security for mflow 1.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.