diff --git a/post_parser.py b/post_parser.py
index ed5f95b..1e80e4f 100644
--- a/post_parser.py
+++ b/post_parser.py
@@ -240,24 +240,25 @@ class PostParser:
return "❓ Unknown Post"
def _format_forward_info(self, message: Message) -> Union[str, None]:
- if forward_from_chat := getattr(message, "forward_from_chat", None):
- forward_title = getattr(forward_from_chat, "title", "Unknown channel")
- forward_username = getattr(forward_from_chat, "username", None)
- if forward_username:
- forward_link = f'{forward_title} (@{forward_username})'
- return f'
Forwarded from {forward_link}
'
- return f'Forwarded from {forward_title}
'
-
- elif forward_from := getattr(message, "forward_from", None):
- forward_name = f"{getattr(forward_from, 'first_name', '')} {getattr(forward_from, 'last_name', '')}".strip()
- forward_username = getattr(forward_from, "username", None)
- if forward_username:
- forward_link = f'{forward_name} (@{forward_username})'
- return f'Forwarded from {forward_link}
'
- return f'Forwarded from {forward_name}
'
-
- elif forward_sender_name := getattr(message, "forward_sender_name", None):
- return f'Forwarded from {forward_sender_name}
'
+ if forward_origin := getattr(message, "forward_origin", None):
+ if sender_chat := getattr(forward_origin, "sender_chat", None):
+ forward_title = getattr(sender_chat, "title", "Unknown channel")
+ forward_username = getattr(sender_chat, "username", None)
+ if forward_username:
+ forward_link = f'{forward_title} (@{forward_username})'
+ return f'Forwarded from {forward_link}
'
+ return f'Forwarded from {forward_title}
'
+
+ elif sender_user := getattr(forward_origin, "sender_user", None):
+ forward_name = f"{getattr(sender_user, 'first_name', '')} {getattr(sender_user, 'last_name', '')}".strip()
+ forward_username = getattr(sender_user, "username", None)
+ if forward_username:
+ forward_link = f'{forward_name} (@{forward_username})'
+ return f'Forwarded from {forward_link}
'
+ return f'Forwarded from {forward_name}
'
+
+ elif sender_user_name := getattr(forward_origin, "sender_user_name", None):
+ return f'Forwarded from {sender_user_name}
'
return None
@@ -291,9 +292,7 @@ class PostParser:
flags = []
# Add "fwd" flag for forwarded messages
- if (getattr(message, "forward_from_chat", None) or
- getattr(message, "forward_from", None) or
- getattr(message, "forward_sender_name", None)):
+ if message.forward_origin:
flags.append("fwd")
# Add flag "video" if the message media is VIDEO or ANIMATION and the body text is up to 200 characters.
diff --git a/tests/test_post_parser.py b/tests/test_post_parser.py
index 5494853..61a707a 100644
--- a/tests/test_post_parser.py
+++ b/tests/test_post_parser.py
@@ -108,7 +108,7 @@ class TestPostParserGenerateTitle(unittest.TestCase):
def test_generate_title_caption_with_url_and_text(self):
message = self._create_mock_message(media=MessageMediaType.PHOTO, caption="Look at this photo! https://example.com/image.jpg")
- self.assertEqual(self.parser._generate_title(message), "Look at this photo!")
+ self.assertEqual(self.parser._generate_title(message), "📷 Photo")
def test_generate_title_caption_with_uppercase_text(self):
message = self._create_mock_message(text="ЖИЗНЬ НА ОБОЯХ")
diff --git a/tests/test_post_parser_flags.py b/tests/test_post_parser_flags.py
index afe336f..2c1e917 100644
--- a/tests/test_post_parser_flags.py
+++ b/tests/test_post_parser_flags.py
@@ -33,13 +33,12 @@ class TestPostParserExtractFlags(unittest.TestCase):
text=None,
caption=None,
reactions_data=None, # Format: [("emoji", count), ...]
- forward_from_chat=None, # Mock Chat object or True
- forward_from=None, # Mock User object or True
- forward_sender_name=None, # String or True
+ forward_origin=None, # Pass forward info via this
chat_username="test_channel"): # Default chat username
message = MagicMock(spec=Message)
message.media = media
message.id = 123 # Add a default message ID
+ message.forward_origin = None # Add missing attribute
# Mock chat attribute
mock_chat = MagicMock(spec=Chat)
@@ -61,18 +60,11 @@ class TestPostParserExtractFlags(unittest.TestCase):
else:
message.reactions = None
- # Mock forwarding info
- if forward_from_chat:
- message.forward_from_chat = MagicMock(spec=Chat) if forward_from_chat is True else forward_from_chat
+ # Mock forwarding info using the new forward_origin attribute
+ if forward_origin:
+ message.forward_origin = MagicMock() if forward_origin is True else forward_origin
else:
- message.forward_from_chat = None
-
- if forward_from:
- message.forward_from = MagicMock(spec=User) if forward_from is True else forward_from
- else:
- message.forward_from = None
-
- message.forward_sender_name = forward_sender_name if forward_sender_name is not True else "Hidden Sender"
+ message.forward_origin = None
# Correctly mock text and caption to have an .html attribute and behave like strings
if text:
@@ -103,15 +95,15 @@ class TestPostParserExtractFlags(unittest.TestCase):
# --- Test Cases ---
def test_flag_fwd_forwarded_from_chat(self):
- message = self._create_mock_message(forward_from_chat=True)
+ message = self._create_mock_message(forward_origin=MagicMock(sender_chat=True))
self.assertIn("fwd", self.parser._extract_flags(message))
def test_flag_fwd_forwarded_from_user(self):
- message = self._create_mock_message(forward_from=True)
+ message = self._create_mock_message(forward_origin=MagicMock(sender_user=True))
self.assertIn("fwd", self.parser._extract_flags(message))
def test_flag_fwd_forwarded_sender_name(self):
- message = self._create_mock_message(forward_sender_name=True)
+ message = self._create_mock_message(forward_origin=MagicMock(sender_user_name="Hidden Sender"))
self.assertIn("fwd", self.parser._extract_flags(message))
def test_flag_video_media_video_short_caption(self):
@@ -133,6 +125,7 @@ class TestPostParserExtractFlags(unittest.TestCase):
message = MagicMock(spec=Message)
message.media = MessageMediaType.VIDEO
message.id = 123
+ message.forward_origin = None # Add missing attribute
# Create a basic mock Chat
mock_chat = MagicMock(spec=Chat)
@@ -356,7 +349,7 @@ class TestPostParserExtractFlags(unittest.TestCase):
media=MessageMediaType.VIDEO,
caption="Livestream announcement! Support via донат at https://example.com. Join https://t.me/+SECRET and mention @admin. #реклама",
reactions_data=[("🤡", 40)],
- forward_from_chat=True
+ forward_origin=MagicMock(sender_chat=True) # Use forward_origin
)
# Mock HTML generation as it's used internally
_ = self.parser._generate_html_body(message)
@@ -374,7 +367,7 @@ class TestPostParserExtractFlags(unittest.TestCase):
def test_flag_multiple_fwd_link_mention(self):
message = self._create_mock_message(
text="Forwarded message with a link https://example.com and mention @someone.",
- forward_sender_name=True
+ forward_origin=MagicMock(sender_user_name="Hidden Sender") # Use forward_origin
)
flags = self.parser._extract_flags(message)
expected_flags = ["fwd", "no_image", "link", "mention"]
@@ -425,7 +418,7 @@ class TestPostParserExtractFlags(unittest.TestCase):
message = self._create_mock_message(
media=MessageMediaType.VIDEO_NOTE,
caption="Video note from @someone, full version on Sponsr",
- forward_from=True # Forwarded from user
+ forward_origin=MagicMock(sender_user=True) # Use forward_origin
)
flags = self.parser._extract_flags(message)
expected_flags = ["video", "fwd", "paywall", "mention"]