python获取bt种子的详细信息

bt种子具体文件结构如下:
全部内容必须都为bencoding编码类型。
整个文件为一个字典结构,包含如下关键字
announce:tracker服务器的URL(字符串)
announce-list(可选):备用tracker服务器列表(列表)
creation date(可选):种子创建的时间,Unix标准时间格式,从1970 1月1日 00:00:00到创建时间的秒数(整数)
comment(可选):备注(字符串)
created by(可选):创建人或创建程序的信息(字符串)
info:一个字典结构,包含文件的主要信息,为分二种情况:单文件结构或多文件结构
1.单文件结构如下:
length:文件长度,单位字节(整数)
md5sum(可选):长32个字符的文件的MD5校验和,BT不使用这个值,只是为了兼容一些程序所保留!(字符串)
name:文件名(字符串)
piece length:每个块的大小,单位字节(整数)
pieces:每个块的20个字节的SHA1 Hash的值(二进制格式)
2.多文件结构如下:
files:一个字典结构
length:文件长度,单位字节(整数)
md5sum(可选):同单文件结构中相同
path:文件的路径和名字,是一个列表结构,如\test\test.txt 列表为l4:test8test.txte
name:最上层的目录名字(字符串)
piece length:同单文件结构中相同

pieces:同单文件结构中相同

知道了这些就很好解析了

Parser.py

 

# -*- coding: utf-8 -*-

from bencode import bdecode
class Parser(object):

    def __init__(self,filePath):
        self.path = filePath
        metainfo_file = open(str(self.path), 'rb')
        self.metainfo = bdecode(metainfo_file.read())

        metainfo_file.close()
    def getStruct(self):
        print self.metainfo.keys()

    #如果是单文件就返回:0
    #如果是多文件就返回:1
    def checkType(self):
        if 'files' in self.metainfo['info']:
            return 1
        else:
            return 0

    def getCreationDate(self):
        if 'creation date' in self.metainfo:
            return self.metainfo['creation date']
        else:
            return ''

    def getInfo(self):
        return self.metainfo['info'].keys()

     #获得文件名
    def getName(self):

        info = self.metainfo['info']

        if 'name.utf-8' in info:
            filename=info['name.utf-8']
        else:
            filename = info['name']

        for c in filename:
            if c=="'":
                filename=filename.replace(c,"\\\'")
        return filename

    #多文件的情况下,获得所有文件,返回为:dic 
    def getInfoFiles(self):
        return self.metainfo['info']['files']

    #返回创建时间
    def getCreatedBy(self):
        if 'created by' in self.metainfo:
            return self.metainfo['created by']
        else:
            return ''

    #获得编码方式
    def getEncoding(self):
        if 'encoding' in self.metainfo:
            return self.metainfo['encoding']
        return ""

    def getComments(self):
        info = self.metainfo['info']

        if 'comment.utf-8' in self.metainfo:
            comment=self.metainfo['comment.utf-8']
            return comment
        else:
            return ''

test.py

 

 

#-*- coding:utf-8 -*-
import Parser
import time

if __name__ == "__main__":
    parser=Parser.Parser('test1.torrent')
    print parser.getStruct()
    print parser.getCreationDate()
    print 'creation date:'+time.strftime('%Y-%m-%d',time.localtime(parser.getCreationDate()))
    print 'comments:'+parser.getComments()
    print 'name:'+parser.getName()
    print 'encoding:'+parser.getEncoding()
    print 'created by:'+parser.getCreatedBy()
    print parser.getInfo()
    print parser.getInfoFiles()
    print parser.checkType()
    print parser.getSize()

结果:

 

 

作者:iloster 发表于2014-4-23 14:56:26 原文链接

Tagged:

Comments are closed.