diff options
Diffstat (limited to 'gallery_dl/extractor/pinterest.py')
| -rw-r--r-- | gallery_dl/extractor/pinterest.py | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/gallery_dl/extractor/pinterest.py b/gallery_dl/extractor/pinterest.py index 739e67e..334412d 100644 --- a/gallery_dl/extractor/pinterest.py +++ b/gallery_dl/extractor/pinterest.py @@ -22,6 +22,7 @@ class PinterestExtractor(Extractor): category = "pinterest" filename_fmt = "{category}_{id}.{extension}" archive_fmt = "{id}" + root = "https://www.pinterest.com" def __init__(self, match): Extractor.__init__(self, match) @@ -123,7 +124,7 @@ class PinterestBoardExtractor(PinterestExtractor): subcategory = "board" directory_fmt = ("{category}", "{board[owner][username]}", "{board[name]}") archive_fmt = "{board[id]}_{id}" - pattern = BASE_PATTERN + r"/(?!pin/)([^/?#&]+)/([^/?#&]+)/?$" + pattern = BASE_PATTERN + r"/(?!pin/)([^/?#&]+)/(?!_saved)([^/?#&]+)/?$" test = ( ("https://www.pinterest.com/g1952849/test-/", { "pattern": r"https://i\.pinimg\.com/originals/", @@ -167,6 +168,30 @@ class PinterestBoardExtractor(PinterestExtractor): return self.api.board_pins(board["id"]) +class PinterestUserExtractor(PinterestExtractor): + """Extractor for a user's boards""" + subcategory = "user" + pattern = BASE_PATTERN + r"/(?!pin/)([^/?#&]+)(?:/_saved)?/?$" + test = ( + ("https://www.pinterest.de/g1952849/", { + "pattern": PinterestBoardExtractor.pattern, + "count": ">= 2", + }), + ("https://www.pinterest.de/g1952849/_saved/"), + ) + + def __init__(self, match): + PinterestExtractor.__init__(self, match) + self.user = text.unquote(match.group(1)) + + def items(self): + for board in self.api.boards(self.user): + url = board.get("url") + if url: + board["_extractor"] = PinterestBoardExtractor + yield Message.Queue, self.root + url, board + + class PinterestSectionExtractor(PinterestExtractor): """Extractor for board sections on pinterest.com""" subcategory = "section" @@ -301,6 +326,18 @@ class PinterestAPI(): "field_set_key": "detailed"} return self._call("Board", options)["resource_response"]["data"] + def boards(self, user): + """Yield all boards from 'user'""" + options = { + "sort" : "last_pinned_to", + "field_set_key" : "profile_grid_item", + "filter_stories" : False, + "username" : user, + "page_size" : 25, + "include_archived": True, + } + return self._pagination("Boards", options) + def board_pins(self, board_id): """Yield all pins of a specific board""" options = {"board_id": board_id} |
