Multi Flow - Concurrent Streaming Proxy
Project description
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 贡献改进或报告问题。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mflow-1.3.1.tar.gz.
File metadata
- Download URL: mflow-1.3.1.tar.gz
- Upload date:
- Size: 20.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fdb9ba9add882608b98870d996af46ac18b31320168d01880bfcd7a0d6a7bc22
|
|
| MD5 |
8fec3218773c42696457afb82aa40bc7
|
|
| BLAKE2b-256 |
26b0bb937ac06021747a3b159daf1748b96424fc0fa761ff34fb06065e02871e
|
File details
Details for the file mflow-1.3.1-py3-none-any.whl.
File metadata
- Download URL: mflow-1.3.1-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ddaf01f41561644b43c7e451f939a74991a2a5ab18e5a056684e54143390cf4
|
|
| MD5 |
9882085afef5c185b4b13e7649c7a858
|
|
| BLAKE2b-256 |
544636b505b9256a46959c9292dbe95d3462adb0a61adb79968e1d87ee79d71e
|