diff --git a/gallery_dl/extractor/pinterest.py b/gallery_dl/extractor/pinterest.py index 739e67e0..db3ebe93 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,27 @@ class PinterestBoardExtractor(PinterestExtractor): return self.api.board_pins(board["id"]) +class PinterestBoardsExtractor(PinterestExtractor): + """Extractor for a user's boards """ + subcategory = "boards" + pattern = BASE_PATTERN + r"/(?!pin/)([^/?#&]+)/_saved/?$" + test = ("https://www.pinterest.de/g1952849/_saved/", { + "pattern": PinterestBoardExtractor.pattern, + "count": ">= 2", + }) + + 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 +323,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} diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py index 7b893d0b..b8598617 100755 --- a/scripts/supportedsites.py +++ b/scripts/supportedsites.py @@ -132,6 +132,7 @@ SUBCATEGORY_MAP = { "media": "Media Files", }, "pinterest": { + "board": "", "pinit": "pin.it Links", }, "pixiv": {