X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=manga%2Flocal.py;h=9e6fabcf68fcdbc13aeb7d44cae101ae59760b7c;hb=0d299ac79ff30e3d6ed288d58e3f11fda6891c60;hp=d1a839ce650c13f6c5f19ca59237f4276ee80b3b;hpb=1f51eb5842dd016ac3258b670be44633d22062fc;p=automanga.git diff --git a/manga/local.py b/manga/local.py index d1a839c..9e6fabc 100644 --- a/manga/local.py +++ b/manga/local.py @@ -1,5 +1,5 @@ import os -import lib +from . import lib pj = os.path.join def decode1(nm): @@ -32,6 +32,27 @@ def genstr(s): ret += [part] return ret +def findname(names, files): + matches = list(names.keys()) + for f in files: + matches = [pfx for pfx in matches if f.startswith(pfx)] + if len(matches) < 1: return None + matches.sort(key=len, reverse=True) + return names[matches[0]] + +def prefixes(path): + nmpath = pj(path, "names") + if not os.path.exists(nmpath): + return {} + ret = {} + with open(nmpath, "r") as fp: + for line in fp: + line = line.strip() + p = line.find(' ') + if p < 0: continue + ret[line[:p]] = line[p + 1:] + return ret + class imgstream(lib.imgstream): def __init__(self, path): self.bk = open(path, 'rb') @@ -95,9 +116,9 @@ class manga(lib.manga): self.stack = [] if os.path.exists(pj(self.path, "name")): with open(pj(self.path, "name")) as s: - self.name = s.readline().strip().decode("utf-8") + self.name = s.readline().strip() else: - self.name = os.path.basename(path).decode("utf-8") + self.name = os.path.basename(path) self.direct = self.destruct() def __len__(self): @@ -128,12 +149,15 @@ class manga(lib.manga): ordered, files = self.imglist() pages, orig = self.bakenames(files) mx = maxstruct(pages) + if mx is None: + raise TypeError("could not figure out any structure") var = [i for i, part in enumerate(mx) if part == int] structs = [(nm, decode1(nm)) for nm in pages] if not ordered: structs.sort(key=lambda o: "".join(o[1][len(mx):])) for i in reversed(var): structs.sort(key=lambda o: int(o[1][i])) + readnames = prefixes(self.path) def constree(p, structs, idx): if idx == len(var): pages = [] @@ -151,9 +175,16 @@ class manga(lib.manga): oids.append(cur) ret = [] for id in oids: - cur = interm(id, id, p.stack + [(p, len(ret))], []) - cur.direct = constree(cur, [(nm, st) for nm, st in structs if st[var[idx]] == id], idx + 1) - ret.append(cur) + sub = [(nm, st) for nm, st in structs if st[var[idx]] == id] + if len(sub) == 1: + nm, st = sub[0] + id = "".join(st[var[idx]:]) + ret.append(page(self, pj(self.path, orig[nm]), id, id, p.stack + [(p, len(ret))])) + else: + name = findname(readnames, [nm for (nm, st) in sub]) or id + cur = interm(name, id, p.stack + [(p, len(ret))], []) + cur.direct = constree(cur, sub, idx + 1) + ret.append(cur) return ret return constree(self, structs, 0) @@ -177,8 +208,13 @@ class directory(dumb): ret.append(manga(pj(self.path, dent))) return ret + def search(self, expr): + expr = expr.lower() + return [manga(pj(self.path, dent)) for dent in os.listdir(self.path) if expr in dent.lower()] + def __iter__(self): for dent in os.listdir(self.path): yield manga(pj(self.path, dent)) + library = dumb