Added simplistic keyword searching to mrnet and local libraries.
[automanga.git] / manga / lib.py
index 3c83ab1..353d7ad 100644 (file)
@@ -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.
@@ -172,17 +185,16 @@ class cursor(object):
     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()
+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]