X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=manga%2Flib.py;h=da64e0c1a0e4ee56d7b632d6d2170e0c59ae5dce;hb=9d051be1387a18756e9e01e93e8d52ecd53cadd1;hp=373c93258a95107b7145433ea47ccc90cb20b5aa;hpb=bc48738dbde976a77f953c96127f047092d48a35;p=automanga.git diff --git a/manga/lib.py b/manga/lib.py index 373c932..da64e0c 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. @@ -136,11 +149,42 @@ class imgstream(object): """Close this stream.""" raise NotImplementedError() - def read(self, sz = None): + def read(self, sz=None): """Read SZ bytes from the stream, or the entire rest of the stream of SZ is not given.""" raise NotImplementedError() +class stdimgstream(imgstream): + """A standard implementation of imgstream, for libraries which + have no particular implementation requirements.""" + + def __init__(self, url): + import urllib.request + req = urllib.request.Request(url, headers={"User-Agent": "automanga/1"}) + self.bk = urllib.request.urlopen(req) + ok = False + try: + if self.bk.getcode() != 200: + raise IOError("Server error: " + str(self.bk.getcode())) + self.ctype = self.bk.info()["Content-Type"] + self.clen = int(self.bk.info()["Content-Length"]) + ok = True + finally: + if not ok: + self.bk.close() + + def fileno(self): + return self.bk.fileno() + + def close(self): + self.bk.close() + + def read(self, sz=None): + if sz is None: + return self.bk.read() + else: + return self.bk.read(sz) + class cursor(object): def __init__(self, ob): if isinstance(ob, cursor): @@ -148,9 +192,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 @@ -165,24 +209,31 @@ class cursor(object): def prev(self): 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 - -def _lazymod(name): - return __import__(name, fromlist=["dummy"]) -class _lazydict(object): - def __init__(self): - self.bk = {} - def __setitem__(self, key, val): - self.bk[key] = "u", val - def __getitem__(self, key): - st, v = self.bk[key] - if st == "u": - v = self.bk[key] = v() - return v -libraries = _lazydict() -libraries["mf"] = lambda: _lazymod("manga.mangafox").library() + def iterator(): + yield self.cur + while True: + try: + yield self.next() + except StopIteration: + break + return iterator() + +loaded = {} +def findlib(name): + def load(name): + import importlib + mod = importlib.import_module(name) + 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]