.aria2c 定义
参考文档:https://aria2.document.top/zh/technical-notes.html#aria2
解析脚本
parse_aria2c.py
import os
import sys
import struct
from datetime import datetimedef Usage():print("Usage: python3 parse_aria2c.py <aria2c_file_path> <show_detail>")print("show_detail: True or False")print("Example: python3 parse_aria2c.py aria2c_file True")def read_bytes(file, offset, length):"""读取指定偏移和长度的字节"""file.seek(offset)return file.read(length)def format_size(bytes):"""将字节大小转换为适当的单位(KB, MB, GB等),支持负数。:param bytes: 原始字节大小,可以为负数:return: 字符串,格式化后的大小和单位"""# 定义单位和阈值units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]# 记录负号sign = "-" if bytes < 0 else ""# 转为正数进行计算size = abs(bytes)index = 0# 每次除以1024,直到大小合适或达到最大单位while size >= 1024 and index < len(units) - 1:size /= 1024.0index += 1# 格式化输出,保留两位小数,并加上负号(如有)return f"{sign}{size:.2f} {units[index]}"def parse_file(file_path, show_detail=False):print(f"Start parsing file:{file_path}")file_stat = os.stat(file_path)print("------ .aria2 FILE STAT ------")print(f"Size: \t\t{format_size(file_stat.st_size)}")print(f"Modified Time: \t{datetime.fromtimestamp(file_stat.st_mtime)}")print(f"Access Time: \t{datetime.fromtimestamp(file_stat.st_atime)}")print(f"Creation Time: \t{datetime.fromtimestamp(file_stat.st_ctime)}")print()print("------ .aria2 FILE INFO ------")with open(file_path, "rb") as file:# VER (版本): 2 bytes# 从偏移量为 0 开始解析 VER (版本)ver = struct.unpack(">H", read_bytes(file, 0, 2))[0]print(f"Version: {ver}")# EXT (扩展): 4 bytes# 解析 EXT (扩展)ext = struct.unpack(">I", read_bytes(file, 2, 4))[0]print(f"Extension: {ext}")# INFO HASH LENGTH: 4 bytes# 解析 InfoHash Lengthinfo_hash_length = struct.unpack(">I", read_bytes(file, 6, 4))[0]print(f"InfoHash Length: {info_hash_length}")# INFO HASH: (INFO HASH LENGTH) bytes# 解析 InfoHashinfo_hash = read_bytes(file, 10, info_hash_length).hex()print(f"InfoHash: {info_hash}")current_offset = 10 + info_hash_length# PIECE LENGTH: 4 bytes# 解析 Piece Lengthpiece_length = struct.unpack(">I", read_bytes(file, current_offset, 4))[0]print(f"Piece Length: {piece_length} ({format_size(piece_length)})")current_offset += 4# TOTAL LENGTH: 8 bytes# 解析 Total Lengthtotal_length = struct.unpack(">Q", read_bytes(file, current_offset, 8))[0]print(f"Total Length: {total_length} ({format_size(total_length)})")current_offset += 8# UPLOAD LENGTH: 8 bytes# 解析 Upload Lengthupload_length = struct.unpack(">Q", read_bytes(file, current_offset, 8))[0]print(f"Upload Length: {upload_length} ({format_size(upload_length)})")current_offset += 8# BITFIELD LENGTH: 4 bytes# 解析 Bitfield Lengthbitfield_length = struct.unpack(">I", read_bytes(file, current_offset, 4))[0]print(f"Bitfield Length: {bitfield_length}")current_offset += 4# BITFIELD: (BITFIELD LENGTH) bytes# 解析 Bitfieldbitfield = read_bytes(file, current_offset, bitfield_length).hex()print(f"Bitfield: {bitfield}")current_offset += bitfield_length# NUM IN-FLIGHT PIECE: 4 bytes# 解析 Num In-Flight Piecenum_in_flight_piece = struct.unpack(">I", read_bytes(file, current_offset, 4))[0]print(f"Num In-Flight Piece: {num_in_flight_piece}")current_offset += 4# 以下4个字段重复 (NUM IN-FLIGHT PIECE) 次数。# INDEX: 4 bytes# LENGTH: 4 bytes# PIECE BITFIELD LENGTH: 4 bytes# PIECE BITFIELD: (PIECE BITFIELD LENGTH) bytes# 循环解析每个 Num In-Flight Piece 的字段for i in range(num_in_flight_piece):index = struct.unpack(">I", read_bytes(file, current_offset, 4))[0]length = struct.unpack(">I", read_bytes(file, current_offset + 4, 4))[0]piece_bitfield_length = struct.unpack(">I", read_bytes(file, current_offset + 8, 4))[0]current_offset += 12 # 跳过 Index (4 bytes), Length (4 bytes), Piece Bitfield Length (4 bytes)# 解析 Piece Bitfieldpiece_bitfield = read_bytes(file, current_offset, piece_bitfield_length).hex()current_offset += piece_bitfield_lengthif show_detail:print(f"In-Flight Piece {i}: Index: {index}, Length: {length} ({format_size(length)}), Piece Bitfield Length: {piece_bitfield_length}, Piece Bitfield: {piece_bitfield}")else:print(f"In-Flight Piece {i}: Index: {index}, Length: {length} ({format_size(length)})")if __name__ == '__main__':argv = sys.argvif len(argv) not in (2,3):Usage()sys.exit(1)show_detail=Falsefile_path = argv[1]if len(argv) == 3:show_detail_str = argv[2]if show_detail_str.lower() in ("true","false"):show_detail = True if show_detail_str.lower() == "true" else Falseelse:Usage()sys.exit(1)if not os.path.exists(file_path):print(f"File:{file_path} not exists")sys.exit(1)parse_file(file_path, show_detail)
运行效果:
# python3 parse_aria2c.py tst.aria2
# 简化模式
------ .aria2 FILE STAT ------
Size: 3.05 KB
Modified Time: 2025-03-14 10:44:14.239716
Access Time: 2025-03-14 10:47:17.781647
Creation Time: 2025-03-14 10:44:14.239716------ .aria2 FILE INFO ------
Version: 1
Extension: 0
InfoHash Length: 0
InfoHash:
Piece Length: 10485760 (10.00 MB)
Total Length: 12185573232 (11.35 GB)
Upload Length: 0 (0.00 B)
Bitfield Length: 146
Bitfield: ffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Num In-Flight Piece: 32
In-Flight Piece 0: Index: 51, Length: 10485760 (10.00 MB)
In-Flight Piece 1: Index: 52, Length: 10485760 (10.00 MB)
In-Flight Piece 2: Index: 53, Length: 10485760 (10.00 MB)
In-Flight Piece 3: Index: 54, Length: 10485760 (10.00 MB)
In-Flight Piece 4: Index: 55, Length: 10485760 (10.00 MB)
In-Flight Piece 5: Index: 56, Length: 10485760 (10.00 MB)
In-Flight Piece 6: Index: 57, Length: 10485760 (10.00 MB)
In-Flight Piece 7: Index: 58, Length: 10485760 (10.00 MB)
In-Flight Piece 8: Index: 59, Length: 10485760 (10.00 MB)
In-Flight Piece 9: Index: 60, Length: 10485760 (10.00 MB)
In-Flight Piece 10: Index: 61, Length: 10485760 (10.00 MB)
In-Flight Piece 11: Index: 62, Length: 10485760 (10.00 MB)
In-Flight Piece 12: Index: 63, Length: 10485760 (10.00 MB)
In-Flight Piece 13: Index: 64, Length: 10485760 (10.00 MB)
In-Flight Piece 14: Index: 65, Length: 10485760 (10.00 MB)
In-Flight Piece 15: Index: 66, Length: 10485760 (10.00 MB)
In-Flight Piece 16: Index: 67, Length: 10485760 (10.00 MB)
In-Flight Piece 17: Index: 68, Length: 10485760 (10.00 MB)
In-Flight Piece 18: Index: 69, Length: 10485760 (10.00 MB)
In-Flight Piece 19: Index: 70, Length: 10485760 (10.00 MB)
In-Flight Piece 20: Index: 71, Length: 10485760 (10.00 MB)
In-Flight Piece 21: Index: 72, Length: 10485760 (10.00 MB)
In-Flight Piece 22: Index: 73, Length: 10485760 (10.00 MB)
In-Flight Piece 23: Index: 74, Length: 10485760 (10.00 MB)
In-Flight Piece 24: Index: 75, Length: 10485760 (10.00 MB)
In-Flight Piece 25: Index: 76, Length: 10485760 (10.00 MB)
In-Flight Piece 26: Index: 77, Length: 10485760 (10.00 MB)
In-Flight Piece 27: Index: 78, Length: 10485760 (10.00 MB)
In-Flight Piece 28: Index: 79, Length: 10485760 (10.00 MB)
In-Flight Piece 29: Index: 80, Length: 10485760 (10.00 MB)
In-Flight Piece 30: Index: 81, Length: 10485760 (10.00 MB)
In-Flight Piece 31: Index: 82, Length: 10485760 (10.00 MB)# python3 parse_aria2c.py tst.aria2 True
# 详细模式
------ .aria2 FILE STAT ------
Size: 3.05 KB
Modified Time: 2025-03-14 10:44:14.239716
Access Time: 2025-03-14 10:47:17.781647
Creation Time: 2025-03-14 10:44:14.239716------ .aria2 FILE INFO ------
Version: 1
Extension: 0
InfoHash Length: 0
InfoHash:
Piece Length: 10485760 (10.00 MB)
Total Length: 12185573232 (11.35 GB)
Upload Length: 0 (0.00 B)
Bitfield Length: 146
Bitfield: ffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Num In-Flight Piece: 32
In-Flight Piece 0: Index: 51, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000
In-Flight Piece 1: Index: 52, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000000000000000
In-Flight Piece 2: Index: 53, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000
In-Flight Piece 3: Index: 54, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000
In-Flight Piece 4: Index: 55, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000
In-Flight Piece 5: Index: 56, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000000000000000000000000000000000000000000000
In-Flight Piece 6: Index: 57, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 7: Index: 58, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 8: Index: 59, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: fffffffffffffffffffffffffffffffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 9: Index: 60, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: ffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 10: Index: 61, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: ffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 11: Index: 62, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: ffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 12: Index: 63, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: fffffffffffffffc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 13: Index: 64, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: ffffffffffffffffffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 14: Index: 65, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: ffffffffffffffffffffffc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 15: Index: 66, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: ffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 16: Index: 67, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 17: Index: 68, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 18: Index: 69, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 19: Index: 70, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 20: Index: 71, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 21: Index: 72, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 22: Index: 73, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 23: Index: 74, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 24: Index: 75, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 25: Index: 76, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 26: Index: 77, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 27: Index: 78, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 28: Index: 79, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 29: Index: 80, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 30: Index: 81, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In-Flight Piece 31: Index: 82, Length: 10485760 (10.00 MB), Piece Bitfield Length: 80, Piece Bitfield: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000