1 import bs4, json, urllib
2 from urllib.parse import urljoin
3 from . import lib, htcache
4 soup = bs4.BeautifulSoup
5 soupify = lambda cont: soup(cont, "html.parser")
8 def __init__(self, chapter, stack, n, url):
10 self.chapter = chapter
11 self.manga = chapter.manga
14 self.name = "Page %s" % (n + 1,)
18 return lib.stdimgstream(self.iurl)
24 return "<kakalot.page %r.%r.%r>" % (self.manga.name, self.chapter.name, self.name)
26 class chapter(lib.pagelist):
27 def __init__(self, manga, stack, id, name, url):
35 def __getitem__(self, i):
36 return self.pages()[i]
39 return len(self.pages())
43 pg = soupify(htcache.fetch(self.url))
45 for n, img in enumerate(pg.find("div", id="vungdoc").findAll("img")):
46 url = urljoin(self.url, img["src"])
47 pag.append(page(self, self.stack + [(self, n)], n, url))
55 return "<kakalot.chapter %r.%r>" % (self.manga.name, self.name)
57 class manga(lib.manga):
58 def __init__(self, lib, id, name, url):
66 def __getitem__(self, i):
74 page = soupify(htcache.fetch(self.url))
75 cls = page.find("div", attrs={"class": "chapter-list"})
77 for row in reversed(cls.findAll("div", attrs={"class": "row"})):
79 url = urljoin(self.url, link["href"])
81 p2 = url.rfind("/", 0, p1 - 1)
82 if p1 < 0 or p2 < 0 or url[p2 + 1 : p1] != self.id:
83 raise Exception("unexpected chapter url: %s" % (url,))
86 raise Exception("unexpected chapter url: %s" % (url,))
88 cch.append(chapter(self, [(self, len(cch))], cid, name, url))
96 return "<kakalot.manga %r>" % self.name
98 class library(lib.library):
100 self.base = "https://mangakakalot.com/"
103 url = urljoin(self.base + "manga/", id)
104 page = soupify(htcache.fetch(url))
105 ul = page.find("ul", attrs={"class": "manga-info-text"})
106 if ul is None: raise KeyError(id)
108 if name is None: raise KeyError(id)
110 return manga(self, id, name, url)
112 def search(self, expr):
113 values = {"searchword": expr}
114 req = urllib.request.Request(self.base + "home_json_search",
115 urllib.parse.urlencode(values).encode("ascii"),
116 headers={"User-Agent": "automanga/1"})
117 with urllib.request.urlopen(req) as resp:
118 rc = json.loads(resp.read().decode("utf-8"))
120 if "nameunsigned" in obj:
122 yield self.byid(obj["nameunsigned"])