diff options
-rwxr-xr-x | anidb | 54 | ||||
-rw-r--r-- | pyanidb/__init__.py | 18 | ||||
-rw-r--r-- | pyanidb/hash.py | 8 |
3 files changed, 44 insertions, 36 deletions
@@ -1,9 +1,17 @@ #!/usr/bin/env python import pyanidb, pyanidb.hash -import ConfigParser, optparse, os, sys, getpass +try: + import ConfigParser +except ImportError: + import configparser as ConfigParser +import optparse, os, sys, getpass from collections import deque +# Workaround for input/raw_input +if hasattr(__builtins__, 'raw_input'): + input = raw_input + # Colors. red = lambda x: '\x1b[1;31m' + x + '\x1b[0m' @@ -60,7 +68,7 @@ if options.cache: try: import xattr except ImportError: - print red('No xattr, caching disabled.') + print(red('No xattr, caching disabled.')) options.cache = False options.identify = options.identify or options.rename options.login = options.add or options.watched or options.identify @@ -71,7 +79,7 @@ if not options.format: if options.login: if not options.username: - options.username = raw_input('Username: ') + options.username = input('Username: ') if not options.password: options.password = getpass.getpass() @@ -82,12 +90,12 @@ remaining = deque(args) while remaining: name = remaining.popleft() if not os.access(name, os.R_OK): - print red('Invalid file:'), name + print('{0} {1}'.format(red('Invalid file:'), name)) elif os.path.isfile(name): files.append(name) elif os.path.isdir(name): if not options.recursive: - print red('Is a directory:'), name + print('{0} {1}'.format(red('Is a directory:'), name)) else: for sub in sorted(os.listdir(name)): if sub.startswith('.'): @@ -99,7 +107,7 @@ while remaining: remaining.appendleft(sub) if not files: - print blue('Nothing to do.') + print(blue('Nothing to do.')) sys.exit(0) # Authorization. @@ -108,15 +116,15 @@ if options.login: a = pyanidb.AniDB(options.username, options.password) try: a.auth() - print blue('Logged in as user:'), options.username + print('{0} {1}'.format(blue('Logged in as user:'), options.username)) except pyanidb.AniDBUserError: - print red('Invalid username/password.') + print(red('Invalid username/password.')) sys.exit(1) except pyanidb.AniDBTimeout: - print red('Connection timed out.') + print(red('Connection timed out.')) sys.exit(1) - except pyanidb.AniDBError, e: - print red('Fatal error:'), e + except pyanidb.AniDBError as e: + print('{0} {1}'.format(red('Fatal error:'), e)) sys.exit(1) # Hashing. @@ -124,7 +132,7 @@ if options.login: hashed = unknown = 0 for file in pyanidb.hash.hash_files(files, options.cache, (('ed2k', 'md5', 'sha1', 'crc32') if options.multihash else ('ed2k',))): - print blue('Hashed:'), 'ed2k://|file|%s|%d|%s|%s' % (file.name, file.size, file.ed2k, ' (cached)' if file.cached else '') + print('{0} ed2k://|file|{1}|{2}|{3}|{4}'.format(blue('Hashed:'), file.name, file.size, file.ed2k, ' (cached)' if file.cached else '')) fid = (file.size, file.ed2k) hashed += 1 @@ -132,16 +140,16 @@ for file in pyanidb.hash.hash_files(files, options.cache, (('ed2k', 'md5', 'sha1 # Multihash. if options.multihash: - print blue('MD5:'), file.md5 - print blue('SHA1:'), file.sha1 - print blue('CRC32:'), file.crc32 + print('{0} {1}'.format(blue('MD5:'), file.md5)) + print('{0} {1}'.format(blue('SHA1:'), file.sha1)) + print('{0} {1}'.format(blue('CRC32:'), file.crc32)) # Identify. if options.identify: info = a.get_file(fid, ('gtag', 'romaji', 'epno', 'state', 'epromaji', 'crc32', 'filetype'), True) fid = int(info['fid']) - print green('Identified:'), '[%s] %s - %s - %s' % (info['gtag'], info['romaji'], info['epno'], info['epromaji']) + print('{0} [{1}] {2} - {3} - {4}'.format(green('Identified:'), info['gtag'], info['romaji'], info['epno'], info['epromaji'])) # Renaming. @@ -155,34 +163,34 @@ for file in pyanidb.hash.hash_files(files, options.cache, (('ed2k', 'md5', 'sha1 'crc': info['crc32'], 'CRC': info['crc32'].upper(), 'suf': info['filetype']} - for name, value in rename_data.iteritems(): + for name, value in rename_data.items(): s = s.replace(r'%' + name, value) if s[0] == '_': s = s[1:].replace(' ', '_') s = s.replace('/', '_') - print yellow('Renaming to:'), s + print('{0} {1}'.format(yellow('Renaming to:'), s)) os.rename(file.name, os.path.join(os.path.split(file.name)[0], s)) # Adding. if options.add: a.add_file(fid, viewed = options.watched, retry = True) - print green('Added to mylist.') + print(green('Added to mylist.')) # Watched. elif options.watched: a.add_file(fid, viewed = True, edit = True, retry = True) - print green('Marked watched.') + print(green('Marked watched.')) except pyanidb.AniDBUnknownFile: - print red('Unknown file.') + print(red('Unknown file.')) unknown += 1 except pyanidb.AniDBNotInMylist: - print red('File not in mylist.') + print(red('File not in mylist.')) # Finished. -print blue('Hashed %d files%s.' % (hashed, (', %d unknown' % unknown) if unknown else '')) +print(blue('Hashed {0} files{1}.'.format(hashed, ', {0} unknown'.format(unknown) if unknown else ''))) diff --git a/pyanidb/__init__.py b/pyanidb/__init__.py index d570345..6a3f222 100644 --- a/pyanidb/__init__.py +++ b/pyanidb/__init__.py @@ -2,7 +2,7 @@ import socket, time protover = 3 client = 'pyanidb' -clientver = 6 +clientver = 7 states = { 'unknown': 0, @@ -25,7 +25,7 @@ acode = ( 'short', 'synonym', 'category', '', '', '', '', '') info = fcode + acode -info = dict([(info[i], 1L << i) for i in xrange(len(info)) if info[i]]) +info = dict([(info[i], 1 << i) for i in range(len(info)) if info[i]]) class AniDBError(Exception): pass @@ -70,23 +70,23 @@ class AniDB: self.sock.close() def newver_msg(self): - print 'New version available.' + print('New version available.') def retry_msg(self): - print 'Connection timed out, retrying.' + print('Connection timed out, retrying.') def execute(self, cmd, args = None, retry = False): if not args: args = {} while 1: - data = '%s %s' % (cmd, '&'.join(['%s=%s' % a for a in args.iteritems()])) + data = '{0} {1}\n'.format(cmd, '&'.join(['{0}={1}'.format(*a) for a in args.items()])) t = time.time() if t < self.lasttime + 2: time.sleep(self.lasttime + 2 - t) self.lasttime = time.time() - self.sock.sendto(data + '\n', self.server) + self.sock.sendto(data.encode(), 0, self.server) try: - data = self.sock.recv(8192).split('\n') + data = self.sock.recv(8192).decode().split('\n') except socket.timeout: if retry: self.retry_msg() @@ -132,9 +132,9 @@ class AniDB: except TypeError: args = {'fid': fid} info_codes = list(info_codes) - info_codes.sort(lambda x, y: cmp(info[x], info[y])) + info_codes.sort(key = lambda x: info[x]) info_code = sum([info[code] for code in info_codes]) - args.update({'s': self.session, 'fcode': info_code & 0xffffffffL, 'acode': info_code >> 32}) + args.update({'s': self.session, 'fcode': info_code & 0xffffffff, 'acode': info_code >> 32}) while 1: code, text, data = self.execute('FILE', args, retry) if code == 220: diff --git a/pyanidb/hash.py b/pyanidb/hash.py index 912fc67..489f15a 100644 --- a/pyanidb/hash.py +++ b/pyanidb/hash.py @@ -35,7 +35,7 @@ class Crc32: self.s = binascii.crc32(data, self.s) def hexdigest(self): - return '%08x' % (self.s & 0xffffffff) + return '{0:08x}'.format(self.s & 0xffffffff) hasher_obj = { 'ed2k': Ed2k, @@ -52,7 +52,7 @@ class Hash: update_list.append(h.update) setattr(self, a, h.hexdigest) - f = open(filename) + f = open(filename, 'rb') data = f.read(131072) while data: for u in update_list: @@ -80,7 +80,7 @@ class File: cache = dict([(n[13:], xattr.getxattr(self.name, n)) for n in xattr.listxattr(self.name) if n.startswith('user.pyanidb.')]) if 'mtime' not in cache or str(int(self.mtime)) != cache.pop('mtime'): return - for n, v in cache.iteritems(): + for n, v in cache.items(): setattr(self, n, v) self.cached = True @@ -119,7 +119,7 @@ class Hashthread(threading.Thread): def hash_files(files, cache = False, algorithms = ('ed2k',), num_threads = 1): hashlist = [] threads = [] - for x in xrange(num_threads): + for x in range(num_threads): thread = Hashthread(files, hashlist, algorithms, cache) thread.start() threads.append(thread) |