diff options
Diffstat (limited to 'anidb_add')
-rw-r--r-- | anidb_add | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/anidb_add b/anidb_add new file mode 100644 index 0000000..04dc1df --- /dev/null +++ b/anidb_add @@ -0,0 +1,96 @@ +#!/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 + +def auth(): + try: + c = ConfigParser.ConfigParser() + c.read(os.path.expanduser('~/.pyanidb.conf')) + username = c.get('auth', 'username') + password = c.get('auth', 'password') + except: + username = raw_input('Username: ') + password = getpass.getpass() + return username, password + +username, password = auth() + +try: + a = anidb.AniDB(username, password) + #t = a.ping() + #if t: + # print 'AniDB is reachable, %.3fs' % (t) + #else: + # print 'AniDB is unreachable.' + # sys.exit(1) + a.auth() + print 'Logged in as user %s.' % (username) + 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) + try: + while 1: + try: + a.add_hash(size, hash) + except anidb.AniDBTimeout: + print 'Connection timed out, retrying.' + continue + break + except anidb.AniDBUnknownFile: + print 'Unknown file: %s' % (name) + continue + print 'Added file: %s' % (name) + print 'All operations finished.' +except anidb.AniDBUserError: + print 'Invalid username/password.' + sys.exit(1) +except anidb.AniDBTimeout: + print 'Connection timed out.' + sys.exit(1) +except anidb.AniDBError, e: + print 'Fatal error:', e + sys.exit(1) |