3 import sys, os, getopt, time, random
4 import manga.lib, manga.profile
10 def msg(vl, msg, *args):
12 sys.stderr.write("getmanga: " + (msg % args) + "\n")
14 def getprop(nm, default=None):
15 if mprof and "dl-" + nm in mprof.props:
16 return mprof.props["dl-" + nm]
30 for t, i in page.stack:
33 ret += "%0*i" % (digits(len(t) + 1), i + 1)
36 def expand(pattern, page):
40 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]))
42 p = pattern.find('%', fp)
45 sys.stderr.write("getmanga: pattern %s did not match page %s\n" %
46 (pattern, "/".join(c.name for t, c, i in stack)))
48 return ret + pattern[fp:]
50 m = pattern[p + 1:p + 2]
56 sys.stderr.write("getmanga: pattern %s did not match page %s\n" %
57 (pattern, "/".join(c.name for t, c, i in stack)))
62 ret += "%0*i" % (digits(len(t) + 1), ti + 1)
68 sys.stderr.write("getmanga: %s: unknown specifier `%s'\n" % (pattern, m))
71 def download(mng, tdir, pattern):
72 exts = ["", ".jpg", ".jpeg", ".png", ".gif"]
73 fmts = {"PNG": "png", "JPEG": "jpeg", "GIF": "gif"}
74 for page in manga.lib.cursor(mng):
78 nm = expand(pattern, page)
79 path = os.path.join(tdir, nm)
80 if any(os.path.exists(path + ext) for ext in exts):
81 msg(2, "%s exists, skipping", nm)
83 msg(1, "getting %s...", nm)
84 with page.open() as fp:
85 with open(path, "wb") as out:
98 img = Image.open(path)
104 sys.stderr.write("getmanga: warning: could not determine file format of %s, leaving as is\n" % nm)
106 os.rename(path, path + "." + fmts[fmt])
107 msg(3, "%s -> %s", nm, nm + "." + fmts[fmt])
108 cwait = abs(random.gauss(0, 1) * wait)
109 msg(2, "waiting %.1f s...", cwait)
113 out.write("usage: getmanga [-hv] [-w WAIT] [-p PROFILE] [-P PATTERN] DIRECTORY [LIBRARY ID]\n")
116 global verbose, wait, mprof, props
118 opts, args = getopt.getopt(sys.argv[1:], "hvp:w:P:")
138 if not os.path.isdir(tdir):
139 sys.stderr.write("getmanga: %s: not a directory\n" % (tdir))
142 pfile = os.path.join(tdir, ".props")
144 if os.path.exists(pfile):
145 with open(pfile, "r") as fp:
146 for words in manga.profile.splitlines(fp):
147 if words[0] == "set" and len(words) > 2:
148 props[words[1]] = words[2]
149 elif words[0] == "lset" and len(words) > 1:
150 props[words[1]] = words[2:]
153 profile = manga.profile.profile.last()
157 profile = manga.profile.profile.byname(profnm)
163 libnm, mid = args[1:3]
164 elif isinstance(props.get("manga"), list):
165 libnm, mid = props["manga"]
167 sys.stderr.write("getmanga: %s: id is neither saved nor given\n" % (tdir))
170 lib = manga.lib.findlib(libnm)
172 sys.stderr.write("getmanga: no such library: %s\n" % (libnm))
177 sys.stderr.write("getmanga: no such manga: %s\n" % (mid))
179 if profile is not None:
180 mprof = profile.getmanga(libnm, mng.id)
184 download(mng, tdir, pattern or getprop("pattern"))
186 if __name__ == "__main__":
189 except KeyboardInterrupt: