X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=manga%2Flib.py;h=353d7ada48a9b53c40f2dd1e04fe2115caa30b79;hb=ffd12e718bf1915abde0455fdf05a34d0632ed4d;hp=e7c531cd189375201bbc6c51a619be3ff9029e95;hpb=d8bea304f828ed02f5f1984ae1245b1074c82830;p=automanga.git diff --git a/manga/lib.py b/manga/lib.py index e7c531c..353d7ad 100644 --- a/manga/lib.py +++ b/manga/lib.py @@ -9,6 +9,19 @@ class library(object): All libraries should implement this.""" raise NotImplementedError() + def search(self, string): + """Returns an iterable object of mangas in this library that + matches the search string in a library-dependent manner. While + each library is at liberty to define its own matching + criteria, it is probably likely to involve something akin to + searching for keywords in the titles of the library. + + Searching may return very many results and may be slow to + iterate. + + Not all libraries need implement this.""" + raise NotImplementedError() + def byid(self, id): """Returns a previously known manga by its string ID, or raises KeyError if no such manga could be found. @@ -36,14 +49,18 @@ class pagetree(object): `id', which should be a string that can be passed to the `byid' function of its parent node to recover the node. Such string ID should be more persistent than the node's numeric index in the - parent.""" + parent. + + All pagetree objects should contain an attribute `name', + containing some human-readable Unicode representation of the + pagelist.""" def idlist(self): """Returns a list of the IDs necessary to resolve this node from the root node.""" if len(self.stack) == 0: - raise Exception("Cannot get ID list on root node.") - return [n.id for n, i in self.stack[1:]] + [self.id] + return [] + return self.stack[-1][0].idlist() + [self.id] def byidlist(self, idlist): if len(idlist) == 0: @@ -52,10 +69,7 @@ class pagetree(object): class pagelist(pagetree): """Class representing a list of either pages, or nested - pagelists. Might be, for instance, a volume or a chapter. - - All pagelists should contain an attribute `name', containing some - human-readable Unicode representation of the pagelist.""" + pagelists. Might be, for instance, a volume or a chapter.""" def __len__(self): """Return the number of (direct) sub-nodes in this pagelist. @@ -115,7 +129,9 @@ class imgstream(object): when exiting the with-scope. All imgstreams should contain an attribute `ctype', being the - Content-Type of the image being read by the stream.""" + Content-Type of the image being read by the stream, and `clen`, + being either an int describing the total number of bytes in the + stream, or None if the value is not known in advance.""" def __enter__(self): return self @@ -123,6 +139,12 @@ class imgstream(object): def __exit__(self, *exc_info): self.close() + def fileno(self): + """If reading the imgstream may block, fileno() should return + a file descriptor that can be polled. If fileno() returns + None, that should mean that reading will not block.""" + return None + def close(self): """Close this stream.""" raise NotImplementedError() @@ -139,9 +161,9 @@ class cursor(object): else: self.cur = self.descend(ob) - def descend(self, ob): + def descend(self, ob, last=False): while isinstance(ob, pagelist): - ob = ob[0] + ob = ob[len(ob) - 1 if last else 0] if not isinstance(ob, page): raise TypeError("object in page tree was unexpectedly not a pagetree") return ob @@ -154,11 +176,25 @@ class cursor(object): raise StopIteration() def prev(self): - for n, i in reversed(self.cur,stack): + for n, i in reversed(self.cur.stack): if i > 0: - self.cur = self.descend(n[i - 1]) + self.cur = self.descend(n[i - 1], True) return self.cur raise StopIteration() def __iter__(self): return self + +loaded = {} +def findlib(name): + def load(name): + mod = __import__(name, fromlist=["dummy"]) + if not hasattr(mod, "library"): + raise ImportError("module " + name + " is not a manga library") + return mod.library() + if name not in loaded: + try: + loaded[name] = load("manga." + name) + except ImportError: + loaded[name] = load(name) + return loaded[name]