summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/furaffinity.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/furaffinity.py')
-rw-r--r--gallery_dl/extractor/furaffinity.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/gallery_dl/extractor/furaffinity.py b/gallery_dl/extractor/furaffinity.py
index 61226b6..6dfd75d 100644
--- a/gallery_dl/extractor/furaffinity.py
+++ b/gallery_dl/extractor/furaffinity.py
@@ -30,15 +30,21 @@ class FuraffinityExtractor(Extractor):
self.offset = 0
def items(self):
+ metadata = self.metadata()
for post_id in util.advance(self.posts(), self.offset):
post = self._parse_post(post_id)
if post:
+ if metadata:
+ post.update(metadata)
yield Message.Directory, post
yield Message.Url, post["url"], post
def posts(self):
return self._pagination()
+ def metadata(self):
+ return None
+
def skip(self, num):
self.offset += num
return num
@@ -133,6 +139,40 @@ class FuraffinityExtractor(Extractor):
yield from text.extract_iter(page, 'id="sid-', '"')
path = text.extract(page, 'right" href="', '"')[0]
+ def _pagination_search(self, query):
+ url = self.root + "/search/"
+ data = {
+ "page" : 0,
+ "next_page" : "Next",
+ "order-by" : "relevancy",
+ "order-direction": "desc",
+ "range" : "all",
+ "rating-general" : "on",
+ "rating-mature" : "on",
+ "rating-adult" : "on",
+ "type-art" : "on",
+ "type-music" : "on",
+ "type-flash" : "on",
+ "type-story" : "on",
+ "type-photo" : "on",
+ "type-poetry" : "on",
+ "mode" : "extended",
+ }
+ data.update(query)
+ if "page" in query:
+ data["page"] = text.parse_int(query["page"])
+
+ while True:
+ page = self.request(url, method="POST", data=data).text
+ post_id = None
+
+ for post_id in text.extract_iter(page, 'id="sid-', '"'):
+ yield post_id
+
+ if not post_id:
+ return
+ data["page"] += 1
+
class FuraffinityGalleryExtractor(FuraffinityExtractor):
"""Extractor for a furaffinity user's gallery"""
@@ -171,6 +211,25 @@ class FuraffinityFavoriteExtractor(FuraffinityExtractor):
return self._pagination_favorites()
+class FuraffinitySearchExtractor(FuraffinityExtractor):
+ """Extractor for furaffinity search results"""
+ subcategory = "search"
+ directory_fmt = ("{category}", "Search", "{search}")
+ pattern = BASE_PATTERN + r"/search/?\?([^#]+)"
+ test = ("https://www.furaffinity.net/search/?q=cute", {
+ "pattern": r"https://d.facdn.net/art/[^/]+/\d+/\d+.\w+\.\w+",
+ "range": "45-50",
+ "count": 6,
+ })
+
+ def metadata(self):
+ self.query = text.parse_query(self.user)
+ return {"search": self.query.get("q")}
+
+ def posts(self):
+ return self._pagination_search(self.query)
+
+
class FuraffinityPostExtractor(FuraffinityExtractor):
"""Extractor for individual posts on furaffinity"""
subcategory = "post"