#!/usr/bin/python3 import sys, os, io, getopt, ann, subprocess, tempfile pj = os.path.join def opentty(): try: return io.TextIOWrapper(io.FileIO(os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY), "r+")) except OSError as exc: sys.stderr.write("anndl: terminal not available for interactive input: %s\n" % (exc.strerror)) sys.exit(1) def choose(opts): tty.write("%d matches:\n" % (len(opts))) for i, anime in enumerate(opts): tty.write("%d. %s\n" % (i + 1, anime.name)) tty.write("> ") tty.flush() resp = tty.readline().strip() if resp == "": return opts[0] if not resp.isdigit(): sys.stderr.write("anndl: %s: not a number\n" % resp) sys.exit(1) n = int(resp) - 1 if not 0 <= n < len(opts): sys.stderr.write("anndl: %s: no such option\n" % resp) sys.exit(1) return opts[n] def prompt(line, default=""): tty.write(line) if line[-1:] != " ": if default != "": tty.write(" [%s]" % (default)) tty.write(": ") tty.flush() resp = tty.readline().strip() if resp == "": return default return resp def edit(string): fd, path = tempfile.mkstemp() try: with os.fdopen(fd, "w") as fp: fp.write(string) subprocess.run([os.getenv("EDITOR"), path]) with open(path, "r") as fp: return fp.read() finally: os.unlink(path) def usage(out): out.write("usage: anndl [-h] SERIES\n") def main(argv): global tty opts, args = getopt.getopt(argv[1:], "h") for o, a in opts: if o == "-h": usage(sys.stdout) sys.exit(0) if len(args) < 1: usage(sys.stderr) sys.exit(1) name = args[0] tty = opentty() match = ann.getlist(name) if len(match) == 0: sys.stderr.write("anndl: could not find %s\n" % (name)) sys.exit(1) elif len(match) == 1: get = match[0] elif len(match) < 10: get = choose(match) else: sys.stderr.write("anndl: %s matches %i series\n" % (name, len(match))) sys.exit(1) if get.eps is None: tty.write("could not find number of eps\n") if prompt("accept? ")[:1].lower() != "y": sys.exit(1) name = prompt("canonical name", get.name) sexpr = "\"" + r"L~%s[^0-9]*0*%%i([^0-9]*(\[^]]*\]|\([^\)]*\)|v2))*[^0-9]*\.(avi|ogm|mkv|mp4)$" + "\"" sexpr = sexpr % (name.lower().replace(" ", ".*")) tty.write("sexpr: %s\n" % (sexpr)) if prompt("accept? ")[:1].lower() != "y": sexpr = edit(sexpr) root = pj(os.getenv("HOME"), "dc/autodl/cur", name) dl = pj(root, ".autodl") try: os.mkdir(root) except OSError as exc: sys.stderr.write("anndl: %s: %s\n" % (root, exc.strerror)) sys.exit(1) os.mkdir(dl) with open(pj(dl, "disabled"), "w") as fp: pass with open(pj(root, "nextep"), "w") as fp: fp.write("1\n") with open(pj(dl, "uarg"), "w") as fp: if get.eps is None: melen = 2 else: melen = len(str(get.eps)) fp.write("rename:auto:%s:$i:move:../autodl/cur/%s\n" % (name, melen, name)) with open(pj(dl, "sexpr")) as fp: fp.write("%s\n" % sexpr) with open(pj(dl, "curep")) as fp: fp.write("1\n") if get.eps is not None: with open(pj(dl, "maxep")) as fp: fp.write("%i\n" % get.eps) if prompt("begin? ")[:1].lower() == "y": os.unlink(pj(dl, "disabled")) if __name__ == "__main__": try: main(sys.argv) except KeyboardInterrupt: sys.exit(1)