From 30d82d8d12b7e16286f64559dceab6c78b34e33e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Pav=C3=B3n=20Abi=C3=A1n?= Date: Thu, 11 Jun 2026 08:40:48 +0200 Subject: [PATCH] =?UTF-8?q?Arreglar=20alt=20y=20=20mostrar=20la=20home,=20?= =?UTF-8?q?que=20desaparec=C3=ADa.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 2 +- src/blueski.defaults | 2 +- src/controller/blueski/handler.py | 2 +- src/controller/buffers/blueski/base.py | 4 ++-- src/sessions/blueski/compose.py | 9 +++++++++ src/sessions/blueski/session.py | 12 ++++++++++++ src/sessions/blueski/templates.py | 4 ++++ src/sessions/blueski/utils.py | 18 +++++++++++++++++- 8 files changed, 47 insertions(+), 6 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4e44e3c5..48ea35fd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -56,4 +56,4 @@ winpaths==0.2 wxPython==4.2.5 youtube-dl==2021.12.17 zipp==4.1.0 -atproto>=0.0.67 +atproto>=0.0.68 diff --git a/src/blueski.defaults b/src/blueski.defaults index e90b775b..bc758d64 100644 --- a/src/blueski.defaults +++ b/src/blueski.defaults @@ -44,7 +44,7 @@ braille_reporting = boolean(default=True) speech_reporting = boolean(default=True) [templates] -post = string(default="$display_name, $reply_to$safe_text $date.") +post = string(default="$display_name, $reply_to$safe_text $image_descriptions $date.") person = string(default="$display_name (@$screen_name). $followers followers, $following following, $posts posts. Joined $created_at.") notification = string(default="$display_name $text, $date") diff --git a/src/controller/blueski/handler.py b/src/controller/blueski/handler.py index 342f2b8e..44eda881 100644 --- a/src/controller/blueski/handler.py +++ b/src/controller/blueski/handler.py @@ -357,7 +357,7 @@ class Handler: buffer.session.settings["templates"] = {} templates_cfg = buffer.session.settings.get("templates", {}) template_state = { - "post": templates_cfg.get("post", "$display_name, $reply_to$safe_text $date."), + "post": templates_cfg.get("post", "$display_name, $reply_to$safe_text $image_descriptions $date."), "person": templates_cfg.get("person", "$display_name (@$screen_name). $followers followers, $following following, $posts posts. Joined $created_at."), "notification": templates_cfg.get("notification", "$display_name $text, $date"), } diff --git a/src/controller/buffers/blueski/base.py b/src/controller/buffers/blueski/base.py index 24173bae..48c0ae26 100644 --- a/src/controller/buffers/blueski/base.py +++ b/src/controller/buffers/blueski/base.py @@ -804,12 +804,12 @@ class BaseBuffer(base.Buffer): try: if self.type == "notifications": template = template_settings.get("notification", "$display_name $text, $date") - post_template = template_settings.get("post", "$display_name, $reply_to$safe_text $date.") + post_template = template_settings.get("post", "$display_name, $reply_to$safe_text $image_descriptions $date.") return templates.render_notification(item, template, post_template, self.session.settings, relative_times, offset_hours) if self.type in ("user", "post_user_list"): template = template_settings.get("person", "$display_name (@$screen_name). $followers followers, $following following, $posts posts. Joined $created_at.") return templates.render_user(item, template, self.session.settings, relative_times, offset_hours) - template = template_settings.get("post", "$display_name, $reply_to$safe_text $date.") + template = template_settings.get("post", "$display_name, $reply_to$safe_text $image_descriptions $date.") return templates.render_post(item, template, self.session.settings, relative_times, offset_hours) except Exception: # Fallback to compose if any template render fails. diff --git a/src/sessions/blueski/compose.py b/src/sessions/blueski/compose.py index a87bf630..900da253 100644 --- a/src/sessions/blueski/compose.py +++ b/src/sessions/blueski/compose.py @@ -136,6 +136,11 @@ def compose_post(post, db, settings, relative_times, show_screen_names=False, sa if images: text += f" [{len(images)} {_('images')}]" + if etype and ("gallery" in etype): + items = g(embed, "items", []) + if items: + text += f" [{len(items)} {_('images')}]" + if etype and ("recordWithMedia" in etype): media = g(embed, "media", {}) mtype = g(media, "$type") or g(media, "py_type") @@ -143,6 +148,10 @@ def compose_post(post, db, settings, relative_times, show_screen_names=False, sa images = g(media, "images", []) if images: text += f" [{len(images)} {_('images')}]" + elif mtype and "gallery" in mtype: + items = g(media, "items", []) + if items: + text += f" [{len(items)} {_('images')}]" elif mtype and "external" in mtype: ext = g(media, "external", {}) title = g(ext, "title", "") diff --git a/src/sessions/blueski/session.py b/src/sessions/blueski/session.py index 8e5810fe..5a6ab56b 100644 --- a/src/sessions/blueski/session.py +++ b/src/sessions/blueski/session.py @@ -96,6 +96,18 @@ class Session(base.baseSession): self.settings.write() except Exception: pass + # Upgrade old default post templates so image descriptions are read. + old_post_templates = ( + "$display_name, $safe_text $date.", + "$display_name, $reply_to$safe_text $date.", + ) + templates_cfg = self.settings.get("templates") + if templates_cfg is not None and templates_cfg.get("post") in old_post_templates: + templates_cfg["post"] = "$display_name, $reply_to$safe_text $image_descriptions $date." + try: + self.settings.write() + except Exception: + pass except Exception: log.exception("Failed to migrate legacy Blueski settings") diff --git a/src/sessions/blueski/templates.py b/src/sessions/blueski/templates.py index 527fd3d5..793bf0fd 100644 --- a/src/sessions/blueski/templates.py +++ b/src/sessions/blueski/templates.py @@ -69,9 +69,13 @@ def _extract_image_descriptions(post, record): mtype = _g(media, "$type") or _g(media, "py_type") or "" if "images" in mtype: return list(_g(media, "images", []) or []) + if "gallery" in mtype: + return list(_g(media, "items", []) or []) return [] if "images" in etype: return list(_g(embed, "images", []) or []) + if "gallery" in etype: + return list(_g(embed, "items", []) or []) return [] images = [] diff --git a/src/sessions/blueski/utils.py b/src/sessions/blueski/utils.py index 8bd61682..1bbdda1f 100644 --- a/src/sessions/blueski/utils.py +++ b/src/sessions/blueski/utils.py @@ -78,7 +78,7 @@ def _extract_images_from_embed(embed): for img in (img_list or []): url = None # Try all possible URL field names - for key in ["fullsize", "thumb", "url", "uri", "src"]: + for key in ["fullsize", "thumb", "thumbnail", "url", "uri", "src"]: val = g(img, key) if val and isinstance(val, str) and val.startswith("http"): url = val @@ -103,12 +103,18 @@ def _extract_images_from_embed(embed): if "images" in etype.lower(): images.extend(extract_images(g(embed, "images", []))) + # Gallery embed (app.bsky.embed.gallery or app.bsky.embed.gallery#view) + if "gallery" in etype.lower(): + images.extend(extract_images(g(embed, "items", []))) + # Check in recordWithMedia wrapper if "recordwithmedia" in etype.lower(): media = g(embed, "media", {}) mtype = g(media, "$type") or g(media, "py_type") or "" if "images" in mtype.lower(): images.extend(extract_images(g(media, "images", []))) + if "gallery" in mtype.lower(): + images.extend(extract_images(g(media, "items", []))) return images @@ -136,6 +142,12 @@ def is_image(post): if images and len(images) > 0: return True + # Gallery embed + if "gallery" in etype.lower(): + items = g(embed, "items", []) + if items and len(items) > 0: + return True + # Check in recordWithMedia wrapper if "recordwithmedia" in etype.lower(): media = g(embed, "media", {}) @@ -144,6 +156,10 @@ def is_image(post): images = g(media, "images", []) if images and len(images) > 0: return True + if "gallery" in mtype.lower(): + items = g(media, "items", []) + if items and len(items) > 0: + return True return False