Core Package 目录结构
本目录包含 MediaGo 的核心下载功能实现。
目录结构
internal/core/
├── types.go # 核心类型定义 (Runner, Downloader 接口等)
├── downloader.go # 下载器服务实现
├── queue.go # 任务队列管理
│
├── runner/ # 命令执行器模块
│ ├── exec.go # 基础命令执行器 (ExecRunner)
│ ├── pty.go # PTY 执行器 (支持进度条)
│ ├── pty_windows.go # Windows ConPTY 实现
│ └── pty_unix.go # Unix/Linux/Mac PTY 实现
│
├── parser/ # 输出解析模块
│ ├── parser.go # 控制台输出解析器
│ └── tracker.go # 进度节流追踪器
│
└── schema/ # 配置模块
└── loader.go # Schema 配置加载器
模块说明
Runner 模块 (runner/)
命令执行器,负责启动下载程序并捕获输出。
- ExecRunner: 基础执行器,使用标准管道
- PTYRunner: 伪终端执行器,支持捕获进度条(使用
\r更新)
使用示例:
import "caorushizi.cn/mediago/internal/core/runner"
// 创建 PTY runner (推荐,支持进度条)
r := runner.NewPTYRunner()
// 或使用基础 runner
r := runner.NewExecRunner()
Parser 模块 (parser/)
解析下载程序的控制台输出,提取进度信息。
- LineParser: 使用正则表达式解析输出行
- ProgressTracker: 进度节流,避免过于频繁的更新
使用示例:
import (
"caorushizi.cn/mediago/internal/core/parser"
"caorushizi.cn/mediago/internal/core/schema"
)
// 创建解析器
lp, err := parser.NewLineParser(consoleReg)
// 解析一行输出
state := &parser.ParseState{}
event, errMsg := lp.Parse(line, state)
Schema 模块 (schema/)
从 JSON 文件加载下载器配置。
使用示例:
import "caorushizi.cn/mediago/internal/core/schema"
// 加载配置
schemas, err := schema.LoadSchemasFromJSON("configs/config.json")
// 获取特定类型的配置
s, ok := schemas.GetByType("m3u8")
核心服务
- DownloaderSvc (
downloader.go): 下载器服务,协调各模块完成下载 - TaskQueue (
queue.go): 任务队列,管理并发下载
依赖关系
cmd/server/main.go
↓
core.DownloaderSvc
↓
├── runner.PTYRunner (执行命令)
├── parser.LineParser (解析输出)
├── parser.ProgressTracker (节流进度)
└── schema.SchemaList (配置)
重要变更
从旧结构迁移
如果你有代码引用了旧的类型,请按以下方式更新:
| 旧引用 | 新引用 |
|---|---|
core.NewExecRunner() |
runner.NewExecRunner() |
core.NewPTYRunner() |
runner.NewPTYRunner() |
core.newLineParser() |
parser.NewLineParser() |
core.parseState |
parser.ParseState |
core.LoadSchemasFromJSON() |
schema.LoadSchemasFromJSON() |
core.SchemaList |
schema.SchemaList |
导入示例
import (
"caorushizi.cn/mediago/internal/core"
"caorushizi.cn/mediago/internal/core/runner"
"caorushizi.cn/mediago/internal/core/parser"
"caorushizi.cn/mediago/internal/core/schema"
)
设计原则
- 职责分离: 每个子模块专注于单一职责
- 易于测试: 模块边界清晰,便于单元测试
- 便于扩展: 添加新的 runner 或 parser 更容易
- 符合 Go 惯例: 包结构符合 Go 项目最佳实践