From b5c52ddd7027f2133faf431ee5c00ee792ceebf9 Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Sat, 10 May 2025 21:57:51 +0300 Subject: [PATCH] refactor PostParser: improve story media handling by using original story sender channel for file paths and adding error logging for channel extraction --- post_parser.py | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/post_parser.py b/post_parser.py index cbba0ad..aba1113 100644 --- a/post_parser.py +++ b/post_parser.py @@ -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