#!/usr/bin/python # -*- coding: utf-8 -*- """Hacky script to streamline organizing my 'library'. Don't expect too much here; I just hacked this together in a few minutes at almost 2 AM. But the idea is that it lets you navigate and archive or "delete" PDF files and DjVu files in a few keystrokes. """ from __future__ import print_function import os import re import readline import subprocess import sys import traceback def b(s): return "\033[36m"+s+"\033[0m" def size(bytes): if bytes < 10240: return "%dB" % bytes if bytes < 10485760: return "%dKiB" % int(bytes / 1024 + .5) if bytes < 10*2**30: return "%dMiB" % int(bytes / 2**20 + .5) return "%dGiB" % int(bytes / 2**30 + .5) def main(arkdir, filenames): assert os.path.isdir(arkdir) trash = 'arktrash' if not os.path.exists(trash): os.mkdir(trash) pos = 0 last_direction = '' while True: pos = min(pos, len(filenames)-1) while filenames and not os.path.exists(filenames[pos]): print("skipping missing", filenames[pos]) filenames[pos:pos+1] = [] if pos == len(filenames): pos -= 1 if not filenames: print("no files left") break print("(%d/%d)" % (pos+1, len(filenames)), filenames[pos], size(os.stat(filenames[pos]).st_size), b("a")+'rchive', b("v")+'iew', b("d")+'elete', b("p")+'rev', b("n")+'ext', b("r")+'ename', b('q')+'uit', b('s')+'earch') cmd = raw_input("ยค ").lower() try: if not cmd: cmd = last_direction if cmd.startswith('a'): destname = arkdir + '/' + filenames[pos] if os.path.exists(destname): print("already exists, checking md5sum...") os.system(["md5sum", destname, filenames[pos]]) else: os.rename(filenames[pos], destname) filenames[pos:pos+1] = [] elif cmd.startswith('v'): prog = ('djview' if filenames[pos].endswith('djvu') else 'gv' if filenames[pos].endswith('.ps') else 'xpdf') subprocess.check_call([prog, filenames[pos]]) elif cmd.startswith('d'): os.rename(filenames[pos], trash + '/' + filenames[pos]) filenames[pos:pos+1] = [] elif cmd.startswith('p'): pos = max(pos - 1, 0) last_direction = 'p' elif cmd.startswith('n'): pos += 1 last_direction = 'n' elif cmd.startswith('r'): readline.add_history(filenames[pos]) print("uparrow to get original filename, enter to cancel") new_filename = raw_input(filenames[pos] + " -> ") if not new_filename or new_filename == filenames[pos]: continue if os.path.exists(new_filename): print("already exists, checking md5sum...") subprocess.check_call(["md5sum", filenames[pos], new_filename]) else: os.rename(filenames[pos], new_filename) filenames[pos] = new_filename elif cmd.startswith('q'): return elif cmd.startswith('s'): regexp = re.compile(raw_input("/")) for i in range(pos+1, len(filenames)): if regexp.search(filenames[i]): pos = i break else: for i in range(0, pos): if regexp.search(filenames[i]): pos = i break else: print("not found") else: print("not understood", repr(cmd)) except: traceback.print_exc() print(b("q to exit"), "q to exit") if __name__ == '__main__': main(sys.argv[1], sys.argv[2:])