From 54cd13304bde8658c6d86f0276886ee418a52680 Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Fri, 21 Mar 2025 15:13:55 +0300 Subject: [PATCH] Add webpage data extraction and formatting in PostParser for enhanced link previews --- post_parser.py | 66 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 7 deletions(-) diff --git a/post_parser.py b/post_parser.py index cce79bf..cd85d31 100644 --- a/post_parser.py +++ b/post_parser.py @@ -325,6 +325,19 @@ class PostParser: 'reactions': self._extract_reactions(message), 'media_group_id': message.media_group_id } + + # Add webpage data if available + if webpage := getattr(message, "web_page", None): + result['webpage'] = { + 'type': getattr(webpage, 'type', None), + 'url': getattr(webpage, 'url', None), + 'display_url': getattr(webpage, 'display_url', None), + 'site_name': getattr(webpage, 'site_name', None), + 'title': getattr(webpage, 'title', None), + 'description': getattr(webpage, 'description', None), + 'has_large_media': getattr(webpage, 'has_large_media', False), + 'is_telegram_link': getattr(webpage, 'type', '') == 'telegram_message' + } return result @@ -438,19 +451,58 @@ class PostParser: def _format_webpage(self, webpage, message) -> Union[str, None]: base_url = Config['pyrogram_bridge_url'] try: + # Check if this is a Telegram message link + is_telegram_message = getattr(webpage, "type", "") == "telegram_message" + + if is_telegram_message: + # Telegram message preview with distinctive styling + html_parts = ['
'] + html_parts.append(f'
๐Ÿ“ฑ Telegram
') + else: + # Regular webpage preview + html_parts = ['
'] + # Add site name if available + if site_name := getattr(webpage, "site_name", None): + html_parts.append(f'
{site_name}
') + + # Add title with link if available + if title := getattr(webpage, "title", None): + url = getattr(webpage, "url", "#") + html_parts.append(f'') + + # Add description if available + if description := getattr(webpage, "description", None): + # Process the description to handle line breaks and possibly HTML + processed_description = description.replace('\n', '
') + # Check for unlinked URLs and turn them into links + processed_description = self._add_hyperlinks_to_raw_urls(processed_description) + html_parts.append(f'
{processed_description}
') + + # Display URL for non-telegram links or when display_url is available + if not is_telegram_message: + display_url = getattr(webpage, "display_url", None) + url = getattr(webpage, "url", None) + if display_url: + html_parts.append(f'
{display_url}
') + elif url: + html_parts.append(f'
{url}
') + else: + # For Telegram links, show a "View in Telegram" button + url = getattr(webpage, "url", "#") + html_parts.append(f'') + + # Add photo if available if photo := getattr(webpage, "photo", None): if file_unique_id := getattr(photo, "file_unique_id", None): channel_username = self.get_channel_username(message) file = f"{channel_username}/{message.id}/{file_unique_id}" digest = generate_media_digest(file) url = f"{base_url}/media/{file}/{digest}" - return ( - f'
' - f'' - f'' - f'
' - ) - return None + html_parts.append(f'') + + html_parts.append('
') + return '\n'.join(html_parts) except Exception as e: logger.error(f"webpage_parsing_error: url {getattr(webpage, 'url', 'unknown')}, error {str(e)}") return None