diff --git a/docs/supportedsites.md b/docs/supportedsites.md index 76f9df59..d6e6b64c 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -148,7 +148,7 @@ Consider all listed sites to potentially be NSFW. Bluesky https://bsky.app/ - Avatars, Backgrounds, Feeds, Followed Users, Hashtags, User Profile Information, Likes, Lists, Media Files, Posts, Replies, Search Results, User Profiles, Videos + Avatars, Backgrounds, Bookmarks, Feeds, Followed Users, Hashtags, User Profile Information, Likes, Lists, Media Files, Posts, Replies, Search Results, User Profiles, Videos Supported diff --git a/gallery_dl/extractor/bluesky.py b/gallery_dl/extractor/bluesky.py index e2c5334d..78d1d661 100644 --- a/gallery_dl/extractor/bluesky.py +++ b/gallery_dl/extractor/bluesky.py @@ -44,6 +44,8 @@ class BlueskyExtractor(Extractor): for post in self.posts(): if "post" in post: post = post["post"] + elif "item" in post: + post = post["item"] if self._user_did and post["author"]["did"] != self._user_did: self.log.debug("Skipping %s (repost)", self._pid(post)) continue @@ -372,6 +374,15 @@ class BlueskyHashtagExtractor(BlueskyExtractor): return self.api.search_posts("#"+hashtag, order) +class BlueskyBookmarkExtractor(BlueskyExtractor): + subcategory = "bookmark" + pattern = BASE_PATTERN + r"/saved" + example = "https://bsky.app/saved" + + def posts(self): + return self.api.get_bookmarks() + + class BlueskyAPI(): """Interface for the Bluesky API @@ -407,6 +418,10 @@ class BlueskyAPI(): } return self._pagination(endpoint, params) + def get_bookmarks(self): + endpoint = "app.bsky.bookmark.getBookmarks" + return self._pagination(endpoint, {}, "bookmarks", check_empty=True) + def get_feed(self, actor, feed): endpoint = "app.bsky.feed.getFeed" uri = (f"at://{self._did_from_actor(actor)}" diff --git a/test/results/bluesky.py b/test/results/bluesky.py index ee330f2f..208ead64 100644 --- a/test/results/bluesky.py +++ b/test/results/bluesky.py @@ -443,4 +443,9 @@ __tests__ = ( "#class" : bluesky.BlueskyPostExtractor, }, +{ + "#url" : "https://bsky.app/saved", + "#class" : bluesky.BlueskyBookmarkExtractor, +}, + )