Delete getmanga output files that aren't properly completed.
[automanga.git] / getmanga
index 9a4fa31..7dea808 100755 (executable)
--- a/getmanga
+++ b/getmanga
@@ -12,7 +12,7 @@ def msg(vl, msg, *args):
         sys.stderr.write("getmanga: " + (msg % args) + "\n")
 
 def getprop(nm, default=None):
-    if "dl-" + nm in mprof.props:
+    if mprof and "dl-" + nm in mprof.props:
         return mprof.props["dl-" + nm]
     if nm in props:
         return props[nm]
@@ -37,33 +37,35 @@ def expand(pattern, page):
     ret = ""
     si = 0
     fp = 0
+    stack = list(zip([t for t, i in page.stack], [t for t, i in page.stack[1:]] + [page], [i for t, i in page.stack]))
     while True:
         p = pattern.find('%', fp)
         if p < 0:
-            if si < len(page.stack):
+            if si < len(stack):
                 sys.stderr.write("getmanga: pattern %s did not match page %s\n" %
-                                 (pattern, "/".join(t.name for t, i in page.stack)))
+                                 (pattern, "/".join(c.name for t, c, i in stack)))
                 sys.exit(1)
             return ret + pattern[fp:]
         ret += pattern[fp:p]
-        m = pattern[p:p + 1]
+        m = pattern[p + 1:p + 2]
+        fp = p + 2
         if m == "%":
             ret += "%"
         else:
-            if si >= len(page.stack):
+            if si >= len(stack):
                 sys.stderr.write("getmanga: pattern %s did not match page %s\n" %
-                                 (pattern, "/".join(t.name for t, i in page.stack)))
+                                 (pattern, "/".join(c.name for t, c, i in stack)))
                 sys.exit(1)
-            t, ti = page.stack[si]
+            t, ct, ti = stack[si]
             si += 1
             if m == "i":
                 ret += "%0*i" % (digits(len(t) + 1), ti + 1)
             elif m == "n":
-                ret += t.name
+                ret += ct.name
             elif m == "d":
-                ret += t.id
+                ret += ct.id
             else:
-                sys.stderr.write("getmanga: %s: unknown specified `%s'\n" % (m))
+                sys.stderr.write("getmanga: %s: unknown specifier `%s'\n" % (pattern, m))
                 sys.exit(1)
 
 def download(mng, tdir, pattern):
@@ -81,11 +83,17 @@ def download(mng, tdir, pattern):
         msg(1, "getting %s...", nm)
         with page.open() as fp:
             with open(path, "wb") as out:
-                while True:
-                    data = fp.read(65536)
-                    if data == b"":
-                        break
-                    out.write(data)
+                done = False
+                try:
+                    while True:
+                        data = fp.read(65536)
+                        if data == b"":
+                            done = True
+                            break
+                        out.write(data)
+                finally:
+                    if not done:
+                        os.unlink(path)
             try:
                 img = Image.open(path)
             except OSError:
@@ -102,13 +110,14 @@ def download(mng, tdir, pattern):
         time.sleep(cwait)
 
 def usage(out):
-    out.write("usage: getmanga [-hv] [-w WAIT] [-p PROFILE] DIRECTORY [LIBRARY ID]\n")
+    out.write("usage: getmanga [-hv] [-w WAIT] [-p PROFILE] [-P PATTERN] DIRECTORY [LIBRARY ID]\n")
 
 def main():
     global verbose, wait, mprof, props
 
-    opts, args = getopt.getopt(sys.argv[1:], "hvp:w:")
-    profnm = ""
+    opts, args = getopt.getopt(sys.argv[1:], "hvp:w:P:")
+    profnm = None
+    pattern = None
     for o, a in opts:
         if o == "-h":
             usage(sys.stdout)
@@ -119,6 +128,8 @@ def main():
             verbose += 1
         elif o == "-w":
             wait = int(a)
+        elif o == "-P":
+            pattern = a
     if len(args) < 1:
         usage(sys.stderr)
         sys.exit(1)
@@ -132,14 +143,16 @@ def main():
     props = {}
     if os.path.exists(pfile):
         with open(pfile, "r") as fp:
-            for words in splitlines(f):
+            for words in manga.profile.splitlines(fp):
                 if words[0] == "set" and len(words) > 2:
                     props[words[1]] = words[2]
                 elif words[0] == "lset" and len(words) > 1:
                     props[words[1]] = words[2:]
 
-    if profnm == "":
+    if profnm is None:
         profile = manga.profile.profile.last()
+    elif profnm == "":
+        profile = None
     else:
         profile = manga.profile.profile.byname(profnm)
 
@@ -163,9 +176,12 @@ def main():
     except KeyError:
         sys.stderr.write("getmanga: no such manga: %s\n" % (mid))
         sys.exit(1)
-    mprof = profile.getmanga(libnm, mng.id)
+    if profile is not None:
+        mprof = profile.getmanga(libnm, mng.id)
+    else:
+        mprof = None
 
-    download(mprof.open(), tdir, getprop("pattern"))
+    download(mng, tdir, pattern or getprop("pattern"))
 
 if __name__ == "__main__":
     try: