go-aria2 是一个 Go 语言库,提供了一组与 aria2 兼容的工具,用于解析、编码和操作 aria2 相关的文件格式,例如 .aria2 控制文件和 DHT 路由表文件 (dht.dat)。此库旨在帮助开发者在 Go 应用程序中集成 aria2 的文件处理能力,或对 aria2 的内部文件格式进行分析和调试。
.aria2控制文件解析与生成:- 支持读取和写入
.aria2控制文件,该文件存储了下载任务的元数据、已下载的块信息以及进行中的分片数据。 - 提供
Aria2ControlFilePiece结构体,方便地访问文件的各个字段,包括版本、信息哈希、分片长度、总长度、上传长度、位域和进行中的分片信息。
- 支持读取和写入
- DHT 路由表 (
dht.dat) 解析与生成:- 支持读取和写入 aria2 的 DHT 路由表文件,该文件包含了 DHT 网络的节点信息。
- 提供
DhtRoutingTable结构体,用于表示路由表的整体结构,以及Node结构体来表示单个 DHT 节点。 - 包含将
net.UDPAddr转换为紧凑对等信息(Compact Peer Info)以及反向转换的辅助函数。
- 位域可视化:
- 提供
PlotBitfield函数,可以将下载进度位域以 ASCII 艺术形式可视化,方便直观地查看下载进度。
- 提供
使用 Go Modules 安装 go-aria2 库:
go get github.com/bilxio/go-aria2package main
import (
"fmt"
"os"
"github.com/bilxio/go-aria2/aria2"
)
func main() {
// 假设你有一个 .aria2 文件,例如 "your_download.aria2"
file, err := os.Open("your_download.aria2")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
var controlFile aria2.Aria2ControlFilePiece
err = controlFile.Decode(file)
if err != nil {
fmt.Println("Error decoding .aria2 file:", err)
return
}
fmt.Println("Successfully decoded .aria2 file:")
fmt.Println(controlFile.String())
// 访问特定字段
fmt.Printf("InfoHash: %x\n", controlFile.InfoHash)
fmt.Printf("TotalLength: %d bytes\n", controlFile.TotalLength)
}package main
import (
"fmt"
"os"
"github.com/bilxio/go-aria2/aria2"
)
func main() {
// 假设你有一个 dht.dat 文件,例如 "dht.dat"
file, err := os.Open("dht.dat")
if err != nil {
fmt.Println("Error opening dht.dat:", err)
return
}
defer file.Close()
var dhtTable aria2.DhtRoutingTable
err = dhtTable.Decode(file)
if err != nil {
fmt.Println("Error decoding dht.dat:", err)
return
}
fmt.Println("Successfully decoded dht.dat:")
fmt.Printf("Local Node ID: %x\n", dhtTable.LocalNodeID)
fmt.Printf("Number of Nodes: %d\n", len(dhtTable.Nodes))
for i, node := range dhtTable.Nodes {
fmt.Printf(" Node %d ID: %x\n", i+1, node.NodeID)
// 更多节点信息...
}
}package main
import (
"fmt"
"github.com/bilxio/go-aria2/aria2"
)
func main() {
// 示例位域数据 (假设有 32 个分片,其中一些已完成)
// 0xFF 表示前 8 个分片完成,0x0F 表示接下来的 4 个分片完成
bitfield := []byte{0xFF, 0x0F, 0x00, 0x80} // 32 bits total
// 每行显示 10 个分片
plot := aria2.PlotBitfield(bitfield, 10)
fmt.Println(plot)
}go-aria2/
├── aria2/
│ ├── aria2_file.go # .aria2 控制文件结构和编解码
│ ├── aria2_file_test.go # .aria2 控制文件测试
│ ├── dht.go # DHT 路由表结构和编解码
│ ├── dht_test.go # DHT 路由表测试
│ ├── doc.go # 包文档
│ └── plot.go # 位域可视化工具
├── go.mod # Go 模块文件
├── go.sum # Go 模块校验和
└── README.md # 项目说明
欢迎贡献!如果您有任何功能建议、错误报告或改进,请随时提交 Pull Request 或创建 Issue。
本项目采用 MIT 许可证。详情请参阅 LICENSE 文件。