diff options
| author | zyp <zyp@localhost> | 2006-05-16 15:57:39 +0200 | 
|---|---|---|
| committer | zyp <zyp@localhost> | 2006-05-16 15:57:39 +0200 | 
| commit | 8e9e23cddd72d2dd407164f8a7e835fa6c84b4d2 (patch) | |
| tree | 9cfae322a7c94b502ceb981c4fb5cade26d05252 | |
| parent | ea36dd2639b7b562aee9aa587489be9bf9bc4c73 (diff) | |
[project @ zyp-20060516135739-925e0fe0819b13d6]
[project @ 32]
Replaced inline hash-code with hash-module.
| -rw-r--r-- | anidb_add | 73 | ||||
| -rw-r--r-- | pyanidb/hash.py | 40 | 
2 files changed, 60 insertions, 53 deletions
| @@ -1,40 +1,7 @@  #!/usr/bin/env python -import pyanidb as anidb -import ConfigParser, os, sys, thread, time, getpass, multihash - -num_threads = 0 - -def file_hash(name): -	e = multihash.Ed2k() -	f = open(name) -	data = f.read(32768)	 -	while data: -		e.update(data) -		data = f.read(32768) -	f.close() -	return e.digest() - -def hash_file(name): -	if not os.access(name, os.R_OK): -		print 'Invalid file: %s' % (name) -		return -	size = os.stat(name).st_size -	hash = file_hash(name) -	print 'Hashed: ed2k://|file|%s|%d|%s|' % (name, size, hash) -	return name, size, hash - -def hash_thread(filelist, hashlist): -	global num_threads -	num_threads += 1 -	try: -		while filelist: -			h = hash_file(filelist.pop(0)) -			if h: -				hashlist.append(h) -	except IndexError: -		pass -	num_threads -= 1 +import pyanidb, pyanidb.hash +import ConfigParser, os, sys, getpass, multihash  def auth():  	try: @@ -50,7 +17,7 @@ def auth():  username, password = auth()  try: -	a = anidb.AniDB(username, password) +	a = pyanidb.AniDB(username, password)  	#t = a.ping()  	#if t:  	#	print 'AniDB is reachable, %.3fs' % (t) @@ -62,35 +29,35 @@ try:  	if a.new_version:  		print 'New version available.' -	filelist = sys.argv[1:] -	hashlist = [] -	 -	thread.start_new_thread(hash_thread, (filelist, hashlist)) -		 -	while hashlist or num_threads or filelist: -		if not hashlist: -			time.sleep(0.1) -			continue -		name, size, hash = hashlist.pop(0) +	files = [] +	for name in sys.argv[1:]: +		if os.access(name, os.R_OK): +			files.append(name) +		else: +			print 'Invalid file: %s' % (name) +	for filename, hash in pyanidb.hash.hash_files(files): +		hash = hash.ed2k() +		size = os.stat(filename).st_size +		print 'Hashed: ed2k://|file|%s|%d|%s|' % (filename, size, hash)  		try:  			while 1:  				try:  					a.add_hash(size, hash) -				except anidb.AniDBTimeout: +				except pyanidb.AniDBTimeout:  					print 'Connection timed out, retrying.'  					continue  				break -		except anidb.AniDBUnknownFile: -			print 'Unknown file: %s' % (name) +		except pyanidb.AniDBUnknownFile: +			print 'Unknown file: %s' % (filename)  			continue -		print 'Added file: %s' % (name) +		print 'Added file: %s' % (filename)  	print 'All operations finished.' -except anidb.AniDBUserError: +except pyanidb.AniDBUserError:  	print 'Invalid username/password.'  	sys.exit(1) -except anidb.AniDBTimeout: +except pyanidb.AniDBTimeout:  	print 'Connection timed out.'  	sys.exit(1) -except anidb.AniDBError, e: +except pyanidb.AniDBError, e:  	print 'Fatal error:', e  	sys.exit(1) diff --git a/pyanidb/hash.py b/pyanidb/hash.py new file mode 100644 index 0000000..35c05ae --- /dev/null +++ b/pyanidb/hash.py @@ -0,0 +1,40 @@ +import multihash, threading, time + +def file_hash(name, algorithms): +	h = multihash.Multihash(*algorithms) +	f = open(name) +	data = f.read(32768)	 +	while data: +		h.update(data) +		data = f.read(32768) +	f.close() +	return h + +class Hashthread(threading.Thread): +	def __init__(self, filelist, hashlist, algorithms, *args, **kwargs): +		self.filelist = filelist +		self.hashlist = hashlist +		self.algorithms = algorithms +		threading.Thread.__init__(self, *args, **kwargs) +	def run(self): +		try: +			while 1: +				f = self.filelist.pop(0) +				h = file_hash(f, self.algorithms) +				self.hashlist.append((f, h)) +		except IndexError: +			return + +def hash_files(files, num_threads = 1, algorithms = ('ed2k',)): +	hashlist = [] +	threads = [] +	for x in xrange(num_threads): +		thread = Hashthread(files, hashlist, algorithms) +		thread.start() +		threads.append(thread) +	while hashlist or sum([thread.isAlive() for thread in threads]): +		try: +			yield hashlist.pop(0) +		except IndexError: +			time.sleep(0.1) +	raise StopIteration | 
