6 if c not in "0123456789.":
17 while p < len(nm) and pdigit(nm[p]):
23 while p < len(nm) and nm[p].isalpha():
40 def findname(names, files):
41 matches = list(names.keys())
43 matches = [pfx for pfx in matches if f.startswith(pfx)]
44 if len(matches) < 1: return None
45 matches.sort(key=len, reverse=True)
46 return names[matches[0]]
50 if not nmpath.exists():
53 with nmpath.open("r") as fp:
58 ret[line[:p]] = line[p + 1:]
61 class imgstream(lib.imgstream):
62 def __init__(self, path):
63 self.bk = path.open("rb")
64 self.clen = os.fstat(self.bk.fileno()).st_size
69 def read(self, sz=None):
70 return self.bk.read(sz)
73 def __init__(self, manga, path, name, id, stack):
81 return imgstream(self.path)
83 class interm(lib.pagelist):
84 def __init__(self, name, id, stack, direct):
91 return len(self.direct)
93 def __getitem__(self, n):
99 s = genstr(decode1(dent))
104 for p, n in zip(mx, s):
112 class manga(lib.manga):
113 exts = ["jpg", "jpeg", "png", "gif"]
115 def __init__(self, path):
116 path = path.resolve()
117 if not path.is_dir():
118 raise IOError("No such directory: " + path)
120 self.id = os.fspath(path)
122 if (self.path/"name").exists():
123 with (self.path/"name").open("r") as s:
124 self.name = s.readline().strip()
126 self.name = path.name
127 self.direct = self.destruct()
130 return len(self.direct)
132 def __getitem__(self, idx):
133 return self.direct[idx]
136 if (self.path/"order").exists():
137 with (self.path/"order").open("r") as s:
138 return True, [line.strip() for line in s if (self.path/line.strip()).exists()]
140 return False, [dent for dent in (dent.name for dent in self.path.iterdir()) if '.' in dent and dent[dent.rindex('.') + 1:] in self.exts]
142 def bakenames(self, files):
148 nm = nm[:nm.rindex('.')]
154 ordered, files = self.imglist()
155 pages, orig = self.bakenames(files)
156 mx = maxstruct(pages)
158 raise TypeError("could not figure out any structure")
159 var = [i for i, part in enumerate(mx) if part == int]
160 structs = [(nm, decode1(nm)) for nm in pages]
162 structs.sort(key=lambda o: "".join(o[1][len(mx):]))
163 for i in reversed(var):
164 structs.sort(key=lambda o: o[1][i])
165 readnames = prefixes(self.path)
166 def constree(p, structs, idx):
169 for nm, st in structs:
170 id = "".join(st[len(mx):])
171 pages.append(page(self, self.path/orig[nm], id, id, p.stack + [(p, len(pages))]))
176 for nm, st in structs:
183 sub = [(nm, st) for nm, st in structs if st[var[idx]] == id]
186 id = "".join(st[var[idx]:])
187 ret.append(page(self, self.path/orig[nm], id, id, p.stack + [(p, len(ret))]))
189 name = findname(readnames, [nm for (nm, st) in sub]) or id
190 cur = interm(name, id, p.stack + [(p, len(ret))], [])
191 cur.direct = constree(cur, sub, idx + 1)
194 return constree(self, structs, 0)
196 class dumb(lib.library):
198 path = pathlib.Path(id)
199 if not path.is_dir():
203 class directory(dumb):
204 def __init__(self, path):
205 if not path.is_dir():
206 raise IOError("No such directory: " + path)
209 def byname(self, prefix):
211 prefix = prefix.lower()
212 for dent in self.path.iterdir():
213 if dent.name[:len(prefix)].lower() == prefix:
214 ret.append(manga(dent))
217 def search(self, expr):
219 return [manga(dent) for dent in self.path.iterdir() if expr in dent.name.lower()]
222 for dent in self.path.iterdir():