refactor PostParser: improve story media handling by using original story sender channel for file paths and adding error logging for channel extraction

This commit is contained in:
vvzvlad
2025-05-10 21:57:51 +03:00
parent e0e35cd879
commit b5c52ddd70
+45 -4
View File
@@ -646,12 +646,19 @@ class PostParser:
if file_unique_id is None:
logger.debug(f"File unique id not found for message {message.id}")
elif file_unique_id:
channel_username = self.get_channel_username(message)
file = f"{channel_username}/{message.id}/{file_unique_id}"
# For story media, use original story sender channel, not the repost channel
if message.media == MessageMediaType.STORY and hasattr(message, 'story') and hasattr(message.story, 'sender_chat'):
story_channel = self._get_story_channel_username(message.story)
story_id = getattr(message.story, 'id', 0)
file = f"{story_channel}/{story_id}/{file_unique_id}"
else:
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}"
logger.debug(f"Collected media file: {channel_username}/{message.id}/{file_unique_id}")
logger.debug(f"Collected media file: {file}")
# Check if document is a PDF file
if (message.media == MessageMediaType.DOCUMENT and
@@ -960,14 +967,30 @@ class PostParser:
elif message.sticker: file_data['file_unique_id'] = message.sticker.file_unique_id
elif message.story and message.story.media == MessageMediaType.VIDEO and hasattr(message.story, 'video') and message.story.video:
file_data['file_unique_id'] = message.story.video.file_unique_id
# Use story sender channel instead of the repost channel
if hasattr(message.story, 'sender_chat'):
story_channel = self._get_story_channel_username(message.story)
if story_channel:
file_data['channel'] = story_channel
file_data['post_id'] = getattr(message.story, 'id', 0)
channel_username = story_channel # Override the channel for the following check
elif message.story and message.story.media == MessageMediaType.PHOTO and hasattr(message.story, 'photo') and message.story.photo:
file_data['file_unique_id'] = message.story.photo.file_unique_id
# Use story sender channel instead of the repost channel
if hasattr(message.story, 'sender_chat'):
story_channel = self._get_story_channel_username(message.story)
if story_channel:
file_data['channel'] = story_channel
file_data['post_id'] = getattr(message.story, 'id', 0)
channel_username = story_channel # Override the channel for the following check
elif message.web_page and message.web_page.photo:
file_data['file_unique_id'] = message.web_page.photo.file_unique_id
if file_data['file_unique_id']:
if file_data['file_unique_id'] and not file_data['channel']: # Only set if not already set (for story)
file_data['channel'] = channel_username
file_data['post_id'] = message.id
if file_data['file_unique_id'] and file_data['channel'] and file_data['post_id']:
file_data['added'] = datetime.now().timestamp()
file_path = os.path.join(os.path.abspath("./data"), 'media_file_ids.json')
@@ -1000,6 +1023,24 @@ class PostParser:
except Exception as e:
logger.error(f"file_id_collection_error: message_id {message.id}, error {str(e)}")
def _get_story_channel_username(self, story) -> Union[str, None]:
"""Extract channel username or ID from story object"""
if sender_chat := getattr(story, 'sender_chat', None):
# First try to get username
if hasattr(sender_chat, 'usernames') and sender_chat.usernames:
active_usernames = [u.username for u in sender_chat.usernames if u.active]
if active_usernames:
return active_usernames[0]
if hasattr(sender_chat, 'username') and sender_chat.username:
return sender_chat.username
# Return numeric ID only if no username found
if hasattr(sender_chat, 'id') and isinstance(sender_chat.id, int) and str(sender_chat.id).startswith('-100'):
return str(sender_chat.id)
logger.error(f"story_channel_username_error: no username or valid ID found for story")
return None
def get_channel_username(self, message: Message) -> Union[str, None]:
"""Extract channel username or ID from message"""
chat = message.chat if hasattr(message, 'chat') else message