zoukankan      html  css  js  c++  java
  • 【Python】torrentParser1.02

    #------------------------------------------------------------------------------------
    # torrentParser1.02,用于解析torrent文件
    # 增加函数getStructure,getFilepathname
    # 2018年5月9日
    #------------------------------------------------------------------------------------
    from bencode import bdecode
    import time
    
    #-------------------------------------
    # torrentParser类
    #-------------------------------------
    class torrentParser(object):
        # 构造函数
        def __init__(self,filePathname):
            self.filePathname=filePathname
            with open(filePathname,'rb') as fObj:
                self.fileDic=bdecode(fObj.read()) 
    
        # 得到文件路径名
        def getFilepathname(self):  
            return self.filePathname
        
        # 得到所有键值
        def getKeys(self):  
            return self.fileDic.keys()
    
        # 得到全部内容
        def getAllContent(self):
            return self.fileDic;
    
        # 得到文件结构
        def getStructure(self):
            retval=''
            layer=0
    
            for key in self.fileDic.keys():
                value=self.fileDic[key]
                retval=retval+self.getNextNode(key,value,layer)
    
            return retval
        
        # 向下递归查找文件结构,
        def getNextNode(self,key,value,layer):
            retval="";
            layer+=1
    
            if type(value)==type({}) and len(value.keys())>0:
                for i in range(1,layer+1):
                    retval=retval+"	"
                retval=retval+str(key)+"
    "
    
                for k in value.keys():
                    v=value[k]
                    retval=retval+ self.getNextNode(k,v,layer)
            elif type(value)==type([]) and len(value)>0:
                for i in range(1,layer+1):
                    retval=retval+"	"
                retval=retval+str(key)+"
    "
    
                arr=value
    
                for it in arr:
                    if type(it)==type({}) and len(it.keys())>0:
                        for nk in it.keys():
                            nv=it[nk]
                            retval=retval+ self.getNextNode(nk,nv,layer)
            else:
                for i in range(1,layer+1):
                    retval=retval+"	"
    
                retval=retval+str(key)+"
    "
    
            return retval
    
        # 获得tracker服务器的URL
        def getAnnounce(self):  
            if 'announce' in self.fileDic:  
                return self.fileDic['announce'].decode('utf-8') 
            return ''
    
        # 获得tracker服务器的URL列表
        def getAnnounceList(self):
            retval=[]
    
            if 'announce-list' in self.fileDic:  
                arr=self.fileDic['announce-list']
                
                for childArr in arr:
    
                    if type(childArr)==type([]):
                        for item in childArr:
                            retval.append(item.decode('utf-8'))
                    else:
                        retval.append(childArr.decode('utf-8'))
    
            return retval
    
        # 得到制作日期
        def getCreateTime(self):  
            if 'creation date' in self.fileDic: 
                unixTimestamp=self.fileDic['creation date']
                firmalTime = time.localtime(unixTimestamp)        
                dt = time.strftime('%Y-%m-%d %H:%M:%S', firmalTime)
    
                return dt  
            else:  
                return ''
    
        # 获得编码方式  
        def getEncoding(self):  
            if 'encoding' in self.fileDic:  
                return self.fileDic['encoding'].decode('utf-8') #去掉字符串前面的b'
            return ''
        
        # 是否包含多个文件
        def hasMultiFiles(self):  
            if 'files' in self.fileDic['info']:  
                return True  
            else:  
                return False
        
        # 获得文件名  
        def getTitle(self): 
            arr=[]
            info = self.fileDic['info'] 
            
            if 'name.utf-8' in info:  
                arr=info['name.utf-8']  
            else:  
                arr = info['name'] 
    
            #print(str(arr))
        
            return arr.decode('utf-8') # x 开头编码的数据解码成中文
    
        # 获得备注(可选项)
        def getComment(self):  
            if 'comment' in self.fileDic:  
                return self.fileDic['comment'].decode('utf-8') 
            return ''
    
        # 获得创建者(可选项)
        def getCreatedBy(self):  
            if 'created by' in self.fileDic:  
                return self.fileDic['created by'].decode('utf-8') 
            return ''
    
        # 多文件的情况下,得到多个文件的个数
        def getFileCount(self):  
            return len(self.fileDic['info']['files'])
        
        # 多文件的情况下,获得所有文件,返回为:dic   
        def getFiles(self): 
            files=[]
        
            for item in self.fileDic['info']['files']:
                file={}
    
                for key in item.keys():
                    value=item.get(key)
                    
                    if key=='path':
                        path=value[0].decode()
                        value=path
                    if key=='path.utf-8':
                        path=value[0].decode()
                        value=path
    
                    file[key]=value
                
                files.append(file)
    
            return files
    
        # 单文件情况下,取文件名
        def getSingleFileName(self):
            #print(str(self.fileDic['info']['name']))
            #return str(self.fileDic['info']['name'],'utf-8')
            return self.getTitle();
    
        # 单文件情况下,取文件长度
        def getSingleFileLength(self):
            return self.fileDic['info']['length']
        
        # 单文件情况下,取文件md5sum
        def getSingleFileMd5sum(self):
            if 'md5sum' in self.fileDic['info']:
                return str(self.fileDic['info']['md5sum'],'utf-8')
            else:
                return ''
        
        # 单文件情况下,取文件长度
        def getSingleFilePieceLength(self):
            return self.fileDic['info']['piece length']
        
        # 单文件情况下,取文件pieces
        def getSingleFilePieces(self):
            return self.fileDic['info']['pieces']
    
        # 得到文件简报
        def getBrief(self):
            retval=""
            retval=retval+"File:"+self.filePathname+"
    "
            retval=retval+"announce:"+self.getAnnounce()+"
    "
    
            arr=self.getAnnounceList()
            if(len(arr)>0):
                retval=retval+"announce list:"+"
    "
    
                for it in arr:
                    retval=retval+"	"+it+"
    "    
            
            retval=retval+"Create time:"+self.getCreateTime()+"
    "
            retval=retval+"Ecoding:"+self.getEncoding()+"
    "
            retval=retval+"Title:"+self.getTitle()+"
    "
            retval=retval+"Comment:"+self.getComment()+"
    "
            retval=retval+"Created by:"+self.getCreatedBy()+"
    "
    
            hasMulti=self.hasMultiFiles()
            retval=retval+"has multi files:"+str(hasMulti)+"
    "
            if hasMulti==True:
                retval=retval+"[多文件结构]"+"
    "
    
                retval=retval+"包含文件个数为:"+str(self.getFileCount())+"
    "
                retval=retval+"Files:"+"
    "
    
                files=self.getFiles();
                index=1
                for item in files:
                    retval=retval+"	file#"+str(index)+"
    "    
    
                    for key in item.keys():
                        value=item.get(key)
                        retval=retval+"		"+str(key)+":"+str(value)+"
    " 
                    retval=retval+"
    "    
    
                    index=index+1
            else:
                retval=retval+"[单文件结构]"+"
    "
                retval=retval+"文件名为:"+self.getSingleFileName()+"
    "
                retval=retval+"文件长度:"+str(self.getSingleFileLength())+"byte
    "
                retval=retval+"文件md5sum:"+self.getSingleFileMd5sum()+"
    "
                retval=retval+"文件块长度:"+str(self.getSingleFilePieceLength())+"byte
    "
    
            return retval
    
    #-------------------------------------
    # 入口
    #-------------------------------------
    def main():
        tp=torrentParser(filePathname='./6.torrent')
        print('文件名='+tp.getFilepathname())
        print('文件结构:
    '+tp.getStructure())
        print('文件内容:
    '+str(tp.getAllContent()))
    
    # Start
    main()

    2018年5月9日11点18分

  • 相关阅读:
    crm 4 注释与上传附件权限
    动态图片轮播
    PHP 连接 MSSQL
    php mssql 中文各种乱码
    百度地图逆地址解析
    Microsoft Visual C++ 2015 Redistributable(x64)
    服务器 vps 空间
    Python之路【第二篇】:Python基础(二)
    Python之路【第一篇】:Python简介和入门
    2016年会成为Java EE微服务年吗?
  • 原文地址:https://www.cnblogs.com/heyang78/p/9013143.html
Copyright © 2011-2022 走看看