1
# Written by John Hoffman and Uoti Urpala
2
# see LICENSE.txt for license information
3
from bencode import bencode, bdecode
4
from BT1.btformats import check_info
5
from os.path import exists, isfile
20
def parsedir(directory, parsed, files, blocked,
21
exts = ['.torrent'], return_metainfo = False, errfunc = _errfunc):
23
errfunc('checking dir')
24
dirs_to_check = [directory]
28
while dirs_to_check: # first, recurse directories and gather torrents
29
directory = dirs_to_check.pop()
31
for f in os.listdir(directory):
39
p = os.path.join(directory, f)
40
new_files[p] = [(int(os.path.getmtime(p)),
41
os.path.getsize(p)), 0]
42
torrent_type[p] = newtorrent
44
for f in os.listdir(directory):
45
p = os.path.join(directory, f)
47
dirs_to_check.append(p)
53
# files[path] = [(modification_time, size), hash], hash is 0 if the file
54
# has not been successfully parsed
55
for p,v in new_files.items(): # re-add old items and check for changes
57
if not oldval: # new file
61
if oldval[0] == v[0]: # file is unchanged from last parse
63
if blocked.has_key(p): # parseable + blocked means duplicate
64
to_add.append(p) # other duplicate may have gone away
66
new_parsed[h] = parsed[h]
69
new_blocked[p] = 1 # same broken unparseable file
71
if parsed.has_key(h) and not blocked.has_key(p):
73
errfunc('removing '+p+' (will re-add)')
74
removed[h] = parsed[h]
78
for p in to_add: # then, parse new and changed torrents
79
new_file = new_files[p]
81
if new_parsed.has_key(h): # duplicate
82
if not blocked.has_key(p) or files[p][0] != v:
83
errfunc('**warning** '+
84
p +' is a duplicate torrent for '+new_parsed[h]['path'])
92
d = bdecode(ff.read())
94
h = sha(bencode(d['info'])).digest()
96
if new_parsed.has_key(h):
97
errfunc('**warning** '+
98
p +' is a duplicate torrent for '+new_parsed[h]['path'])
104
f = os.path.basename(p)
106
a['type'] = torrent_type[p]
110
if i.has_key('length'):
111
l = i.get('length',0)
113
elif i.has_key('files'):
114
for li in i['files']:
116
if li.has_key('length'):
120
a['name'] = i.get('name', f)
121
def setkey(k, d = d, a = a):
124
setkey('failure reason')
125
setkey('warning message')
126
setkey('announce-list')
130
errfunc('**warning** '+p+' has errors')
138
errfunc('... successful')
142
for p,v in files.items(): # and finally, mark removed torrents
143
if not new_files.has_key(p) and not blocked.has_key(p):
145
errfunc('removing '+p)
146
removed[v[1]] = parsed[v[1]]
149
errfunc('done checking')
150
return (new_parsed, new_files, new_blocked, added, removed)