[rule34] implement 'pool' pagination (#2853)

This commit is contained in:
Mike Fährmann
2022-08-25 19:00:27 +02:00
parent 70dc4ce911
commit 67a2efb885

View File

@@ -62,6 +62,24 @@ class GelbooruV02Extractor(booru.BooruExtractor):
return return
params["pid"] += 1 params["pid"] += 1
def _pagination_html(self, params):
url = self.root + "/index.php"
params["pid"] = self.page_start * self.per_page
data = {}
while True:
num_ids = 0
page = self.request(url, params=params).text
for data["id"] in text.extract_iter(page, '" id="p', '"'):
num_ids += 1
for post in self._api_request(data):
yield post.attrib
if num_ids < self.per_page:
return
params["pid"] += self.per_page
@staticmethod @staticmethod
def _prepare(post): def _prepare(post):
post["date"] = text.parse_datetime( post["date"] = text.parse_datetime(
@@ -207,7 +225,12 @@ class GelbooruV02PoolExtractor(GelbooruV02Extractor):
def __init__(self, match): def __init__(self, match):
GelbooruV02Extractor.__init__(self, match) GelbooruV02Extractor.__init__(self, match)
self.pool_id = match.group(match.lastindex) self.pool_id = match.group(match.lastindex)
self.post_ids = ()
if self.category == "rule34":
self.posts = self._posts_pages
self.per_page = 45
else:
self.post_ids = ()
def skip(self, num): def skip(self, num):
self.page_start += num self.page_start += num
@@ -235,6 +258,13 @@ class GelbooruV02PoolExtractor(GelbooruV02Extractor):
for post in self._api_request(params): for post in self._api_request(params):
yield post.attrib yield post.attrib
def _posts_pages(self):
return self._pagination_html({
"page": "pool",
"s" : "show",
"id" : self.pool_id,
})
class GelbooruV02FavoriteExtractor(GelbooruV02Extractor): class GelbooruV02FavoriteExtractor(GelbooruV02Extractor):
subcategory = "favorite" subcategory = "favorite"
@@ -268,27 +298,11 @@ class GelbooruV02FavoriteExtractor(GelbooruV02Extractor):
return {"favorite_id": text.parse_int(self.favorite_id)} return {"favorite_id": text.parse_int(self.favorite_id)}
def posts(self): def posts(self):
url = self.root + "/index.php" return self._pagination_html({
params = {
"page": "favorites", "page": "favorites",
"s" : "view", "s" : "view",
"id" : self.favorite_id, "id" : self.favorite_id,
"pid" : self.page_start * self.per_page, })
}
data = {}
while True:
num_ids = 0
page = self.request(url, params=params).text
for data["id"] in text.extract_iter(page, '" id="p', '"'):
num_ids += 1
for post in self._api_request(data):
yield post.attrib
if num_ids < self.per_page:
return
params["pid"] += self.per_page
class GelbooruV02PostExtractor(GelbooruV02Extractor): class GelbooruV02PostExtractor(GelbooruV02Extractor):