X-Git-Url: http://dolda2000.com/gitweb/?p=automanga.git;a=blobdiff_plain;f=manga%2Fmangafox.py;h=30329c2db8170961d9148845e452a9f26700e6b9;hp=cb289441932610a34338ebce02a4fae9e065f34f;hb=d2f58cfc0a7804bb3aad1cbe190c6b83a2a5cde3;hpb=3683ab38c8cb8b221c2ec20c898fa47a884d3842 diff --git a/manga/mangafox.py b/manga/mangafox.py index cb28944..30329c2 100644 --- a/manga/mangafox.py +++ b/manga/mangafox.py @@ -6,7 +6,19 @@ soup = BeautifulSoup.BeautifulSoup class imgstream(lib.imgstream): def __init__(self, url): self.bk = urllib.urlopen(url) - self.ctype = self.bk.info()["Content-Type"] + 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() @@ -24,6 +36,8 @@ class page(lib.page): self.volume = self.chapter.volume self.manga = self.volume.manga self.n = n + self.id = str(n) + self.name = u"Page %s" % n self.url = url self.ciurl = None @@ -36,11 +50,18 @@ class page(lib.page): def open(self): return imgstream(self.iurl()) + def __str__(self): + return self.name + + def __repr__(self): + return "" % (self.manga.name, self.volume.name, self.chapter.name, self.name) + class chapter(lib.pagelist): - def __init__(self, volume, stack, name, url): + def __init__(self, volume, stack, id, name, url): self.stack = stack self.volume = volume self.manga = volume.manga + self.id = id self.name = name self.url = url self.cpag = None @@ -70,9 +91,10 @@ class chapter(lib.pagelist): return "" % (self.manga.name, self.volume.name, self.name) class volume(lib.pagelist): - def __init__(self, manga, stack, name): + def __init__(self, manga, stack, id, name): self.stack = stack self.manga = manga + self.id = id self.name = name self.ch = [] @@ -95,8 +117,9 @@ def nextel(el): return el class manga(lib.manga): - def __init__(self, lib, name, url): + def __init__(self, lib, id, name, url): self.lib = lib + self.id = id self.name = name self.url = url self.cvol = None @@ -112,15 +135,18 @@ class manga(lib.manga): if self.cvol is None: page = soup(htcache.fetch(self.url)) vls = page.find("div", id="chapters").findAll("div", attrs={"class": "slide"}) - self.cvol = [] + cvol = [] for i, vn in enumerate(reversed(vls)): - vol = volume(self, [(self, i)], vn.find("h3", attrs={"class": "volume"}).contents[0].strip()) + name = vn.find("h3", attrs={"class": "volume"}).contents[0].strip() + vid = name.encode("utf8") + vol = volume(self, [(self, i)], vid, name) cls = nextel(vn) if cls.name != u"ul" or cls["class"] != u"chlist": raise Exception("parse error: weird volume list for %r" % self) for o, ch in enumerate(reversed(cls.findAll("li"))): n = ch.div.h3 or ch.div.h4 name = n.a.string + chid = name.encode("utf8") for span in ch("span"): try: if u" title " in (u" " + span["class"] + u" "): @@ -128,10 +154,15 @@ class manga(lib.manga): except KeyError: pass url = n.a["href"].encode("us-ascii") - if url[-7:] != "/1.html": + if url[-7:] == "/1.html": + url = url[:-6] + elif url[-1:] == "/": + pass + else: raise Exception("parse error: unexpected chapter URL for %r: %s" % (self, url)) - vol.ch.append(chapter(vol, vol.stack + [(vol, o)], name, url[:-6])) - self.cvol.append(vol) + vol.ch.append(chapter(vol, vol.stack + [(vol, o)], chid, name, url)) + cvol.append(vol) + self.cvol = cvol return self.cvol def __str__(self): @@ -145,17 +176,20 @@ def libalphacmp(a, b): class library(lib.library): def __init__(self): - self.base = "http://www.mangafox.com/" + self.base = "http://mangafox.me/" def alphapage(self, pno): page = soup(htcache.fetch(self.base + ("directory/%i.htm?az" % pno))) ls = page.find("div", id="mangalist").find("ul", attrs={"class": "list"}).findAll("li") ret = [] + ubase = self.base + "manga/" for m in ls: t = m.find("div", attrs={"class": "manga_text"}).find("a", attrs={"class": "title"}) name = t.string url = t["href"].encode("us-ascii") - ret.append(manga(self, name, url)) + if url[:len(ubase)] != ubase or url.find('/', len(ubase)) != (len(url) - 1): + raise Exception("parse error: unexpected manga URL for %r: %s" % (name, url)) + ret.append(manga(self, url[len(ubase):-1], name, url)) return ret def alphapages(self): @@ -197,5 +231,14 @@ class library(lib.library): ls = self.alphapage(pno) i = 0 + def byid(self, id): + url = self.base + ("manga/%s/" % id) + page = soup(htcache.fetch(url)) + if page.find("div", id="title") is None: + # Assume we got the search page + raise KeyError(id) + name = page.find("div", id="series_info").find("div", attrs={"class": "cover"}).img["alt"] + return manga(self, id, name, url) + def __iter__(self): raise NotImplementedError("mangafox iterator")