aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/bluesky.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/bluesky.py')
-rw-r--r--gallery_dl/extractor/bluesky.py78
1 files changed, 46 insertions, 32 deletions
diff --git a/gallery_dl/extractor/bluesky.py b/gallery_dl/extractor/bluesky.py
index c97bf65..39c5635 100644
--- a/gallery_dl/extractor/bluesky.py
+++ b/gallery_dl/extractor/bluesky.py
@@ -41,6 +41,7 @@ class BlueskyExtractor(Extractor):
self.api = BlueskyAPI(self)
self._user = self._user_did = None
self.instance = self.root.partition("://")[2]
+ self.videos = self.config("videos", True)
def items(self):
for post in self.posts():
@@ -55,14 +56,6 @@ class BlueskyExtractor(Extractor):
post.update(post["record"])
del post["record"]
- images = ()
- if "embed" in post:
- media = post["embed"]
- if "media" in media:
- media = media["media"]
- if "images" in media:
- images = media["images"]
-
if self._metadata_facets:
if "facets" in post:
post["hashtags"] = tags = []
@@ -82,45 +75,66 @@ class BlueskyExtractor(Extractor):
if self._metadata_user:
post["user"] = self._user or post["author"]
+ files = self._extract_files(post)
post["instance"] = self.instance
post["post_id"] = pid
- post["count"] = len(images)
+ post["count"] = len(files)
post["date"] = text.parse_datetime(
post["createdAt"][:19], "%Y-%m-%dT%H:%M:%S")
yield Message.Directory, post
- if not images:
+ if not files:
continue
base = ("https://bsky.social/xrpc/com.atproto.sync.getBlob"
"?did={}&cid=".format(post["author"]["did"]))
- post["num"] = 0
-
- for file in images:
- post["num"] += 1
- post["description"] = file["alt"]
-
- try:
- aspect = file["aspectRatio"]
- post["width"] = aspect["width"]
- post["height"] = aspect["height"]
- except KeyError:
- post["width"] = post["height"] = 0
-
- image = file["image"]
- try:
- cid = image["ref"]["$link"]
- except KeyError:
- cid = image["cid"]
- post["filename"] = cid
- post["extension"] = image["mimeType"].rpartition("/")[2]
-
- yield Message.Url, base + cid, post
+ for post["num"], file in enumerate(files, 1):
+ post.update(file)
+ yield Message.Url, base + file["filename"], post
def posts(self):
return ()
+ def _extract_files(self, post):
+ if "embed" not in post:
+ return ()
+
+ files = []
+ media = post["embed"]
+ if "media" in media:
+ media = media["media"]
+
+ if "images" in media:
+ for image in media["images"]:
+ files.append(self._extract_media(image, "image"))
+ if "video" in media and self.videos:
+ files.append(self._extract_media(media, "video"))
+
+ return files
+
+ def _extract_media(self, media, key):
+ try:
+ aspect = media["aspectRatio"]
+ width = aspect["width"]
+ height = aspect["height"]
+ except KeyError:
+ width = height = 0
+
+ data = media[key]
+ try:
+ cid = data["ref"]["$link"]
+ except KeyError:
+ cid = data["cid"]
+
+ return {
+ "description": media.get("alt") or "",
+ "width" : width,
+ "height" : height,
+ "filename" : cid,
+ "extension" : data["mimeType"].rpartition("/")[2],
+ }
+
def _make_post(self, actor, kind):
did = self.api._did_from_actor(actor)
profile = self.api.get_profile(did)