【Python】torrentParser1.03
#------------------------------------------------------------------------------------
# torrentParser1.03,用于解析torrent文件
# 修改了函数getStructure,增加其节点值显示
# 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+"\t"
retval=retval+str(key)+"\n"
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+"\t"
retval=retval+str(key)+"\n"
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+"\t"
showValue=str(value)[0:50] # 显示的值
retval=retval+str(key)+":"+showValue+"\n"
return retval
# 获得tracker服务器的URL
def getAnnounce(self):
if 'announce' in self.fileDic:
return self.fileDic['announce'].decode('utf-8','ignore')
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','ignore'))
else:
retval.append(childArr.decode('utf-8','ignore'))
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','ignore')
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','ignore')
# 获得备注(可选项)
def getComment(self):
if 'comment' in self.fileDic:
return self.fileDic['comment'].decode('utf-8','ignore')
return ''
# 获得创建者(可选项)
def getCreatedBy(self):
if 'created by' in self.fileDic:
return self.fileDic['created by'].decode('utf-8','ignore')
return ''
# 多文件的情况下,得到多个文件的个数
def getFileCount(self):
return len(self.fileDic['info']['files'])
# 多文件的情况下,获得所有文件
def getFiles(self):
files=[]
for item in self.fileDic['info']['files']:
file={}
for key in item.keys():
value=item.get(key)
if key=='path':
#print('1.'+str(value))
#print('10.'+str(value[0]))
path=value[0].decode('utf8','ignore')
value=path
if key=='path.utf-8':
#print('2.'+str(value))
#print('20.'+str(value[0]))
path=value[0].decode('utf8','ignore')
value=path
file[key]=value
files.append(file)
return files
# 单文件情况下,取文件名
def getSingleFileName(self):
return self.getTitle();
# 单文件情况下,取文件长度
def getSingleFileLength(self):
return self.fileDic['info']['length']
# 单文件情况下,取文件md5sum
def getSingleFileMd5sum(self):
if 'md5sum' in self.fileDic['info']:
return self.fileDic['info']['md5sum'].decode('utf-8','ignore')
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+"\n"
retval=retval+"announce:"+self.getAnnounce()+"\n"
arr=self.getAnnounceList()
if(len(arr)>0):
retval=retval+"announce list:"+"\n"
for it in arr:
retval=retval+"\t"+it+"\n"
retval=retval+"Create time:"+self.getCreateTime()+"\n"
retval=retval+"Ecoding:"+self.getEncoding()+"\n"
retval=retval+"Title:"+self.getTitle()+"\n"
retval=retval+"Comment:"+self.getComment()+"\n"
retval=retval+"Created by:"+self.getCreatedBy()+"\n"
hasMulti=self.hasMultiFiles()
retval=retval+"has multi files:"+str(hasMulti)+"\n"
if hasMulti==True:
retval=retval+"[多文件结构]"+"\n"
retval=retval+"包含文件个数为:"+str(self.getFileCount())+"\n"
retval=retval+"Files:"+"\n"
files=self.getFiles();
index=1
for item in files:
retval=retval+"\tfile#"+str(index)+"\n"
for key in item.keys():
value=item.get(key)
retval=retval+"\t\t"+str(key)+":"+str(value)+"\n"
retval=retval+"\n"
index=index+1
else:
retval=retval+"[单文件结构]"+"\n"
retval=retval+"文件名为:"+self.getSingleFileName()+"\n"
retval=retval+"文件长度:"+str(self.getSingleFileLength())+"byte\n"
retval=retval+"文件md5sum:"+self.getSingleFileMd5sum()+"\n"
retval=retval+"文件块长度:"+str(self.getSingleFilePieceLength())+"byte\n"
return retval
#-------------------------------------
# 入口
#-------------------------------------
def main():
tp=torrentParser(filePathname='./8.torrent')
print('文件名='+tp.getFilepathname())
print('文件结构:\n'+tp.getStructure())
print('文件简报:\n'+str(tp.getBrief()))
print('文件内容:\n'+str(tp.getAllContent()))
# Start
main()
2018年5月9日
【Python】torrentParser1.03的更多相关文章
- 【Python】torrentParser1.04 增加获得磁力链URI功能
代码: #------------------------------------------------------------------------------------ # torrentP ...
- 【Python】torrentParser1.01
在昨天的版本上做了一些改进,如增加getAll,修改getSingleFileName等 代码: #-------------------------------------------------- ...
- 【Python】torrentParser1.00
代码: #------------------------------------------------------------------------------------ # torrentP ...
- 【Python】torrentParser1.02
#------------------------------------------------------------------------------------ # torrentParse ...
- 【python】列出http://www.cnblogs.com/xiandedanteng中所有博文的标题
代码: # 列出http://www.cnblogs.com/xiandedanteng中所有博文的标题 from bs4 import BeautifulSoup import requests u ...
- 【python】redis基本命令和基本用法详解
[python]redis基本命令和基本用法详解 来自http://www.cnblogs.com/wangtp/p/5636872.html 1.redis连接 redis-py提供两个类Redis ...
- 【python】下载中国大学MOOC的视频
[python]下载中国大学MOOC的视频 脚本目标: 输入课程id和cookie下载整个课程的视频文件,方便复习时候看 网站的反爬机制分析: 分析数据包的目的:找到获取m3u8文件的路径 1. 从第 ...
- 【python】M3U8下载器脚本
[python]M3U8下载器脚本 脚本目标: 1. 输入M3U8文件的链接,得到视频 2.使用异步操作,这样可以快很多,不加锁,因为懒得写,而且影响不大 已知条件: 1.m3u8文件其实就是一个记录 ...
- 【Python②】python之首秀
第一个python程序 再次说明:后面所有代码均为Python 3.3.2版本(运行环境:Windows7)编写. 安装配置好python后,我们先来写第一个python程序.打开IDLE (P ...
随机推荐
- Programming 2D Games 读书笔记(第二章)
本意还是想了解DirectX的,由于网上拿不到书的pdf文档,幸好有作者的源代码示例,想完整的看一下,基本的游戏需要的点. 下面直接以代码为例,仅用于帮助自身理解 http://www.progr ...
- Java 微服务实践 - Spring Boot 系列
https://segmentfault.com/l/1500000009515571
- oracle HA 高可用性具体解释(之二,深入解析TAF,以及HA框架)
oracle HA 高可用性具体解释(之中的一个,client.server端服务具体解释):http://write.blog.csdn.net/postedit 我们已经看到TAF是的Oracle ...
- Modbus TCP和Modbus Rtu协议的区别 转
http://blog.csdn.net/educast/article/details/9177679 Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MOD ...
- AutoMapper在MVC中的运用04-string映射各种类型、一个属性映射多个属性等
本篇AutoMapper使用场景: ※ 类型转换,源string类型分别转换成int, DateTime,Type ※ 源和目标都包含复杂类型属性 ※ 把源中的一个属性映射到目标中的多个属性 类型转换 ...
- JavaScript:回调模式(Callback Pattern)
函数就是对象,所以他们可以作为一个参数传递给其它函数: 当你将introduceBugs()作为一个参数传递给writeCode(),然后在某个时间点,writeCode()有可能执行(调用)intr ...
- Tomcat 负载均衡 及Session共享
原文:https://www.sunjianhua.cn/archives/tomcat-high-availability.html 一.安装java环境 二.安装tomcat(apache-tom ...
- iReport数据库连接找不到驱动
- 再谈Linux内核中的RCU机制
转自:http://blog.chinaunix.net/uid-23769728-id-3080134.html RCU的设计思想比较明确,通过新老指针替换的方式来实现免锁方式的共享保护.但是具体到 ...
- Win8 Metro风格的Web桌面HteOS
前言 曾经天天折腾ExtJS,折腾累了.近期这段时间開始用jquery来做一些东西,发现还是蛮有意思的.可是做到最后才发现,原来做好设计真的很重要. 上图就是HteOS项目的截图,眼下正在开发 ...