X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=manga%2Flib.py;h=c0a9f30876345614e11fb9925c4d8dff1fc212eb;hb=3cc7937cd91ec6d3cfb7eebcd4c1afd85c5a615a;hp=21edd3db2b0b48fa593d9690bae57544afc56c85;hpb=31ea855c3d572c75c6ad8737dda8df70502c76f9;p=automanga.git diff --git a/manga/lib.py b/manga/lib.py index 21edd3d..c0a9f30 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,41 @@ 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 + self.bk = urllib.request.urlopen(url) + 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): @@ -175,7 +218,8 @@ class cursor(object): loaded = {} def findlib(name): def load(name): - mod = __import__(name, fromlist=["dummy"]) + import importlib + mod = importlib.import_module(name) if not hasattr(mod, "library"): raise ImportError("module " + name + " is not a manga library") return mod.library()