Browse Source

Fix parsing expired media

Tulir Asokan 4 năm trước cách đây
mục cha
commit
9f92cb6fe7
2 tập tin đã thay đổi với 44 bổ sung18 xóa
  1. 26 2
      mauigpapi/types/thread_item.py
  2. 18 16
      mautrix_instagram/portal.py

+ 26 - 2
mauigpapi/types/thread_item.py

@@ -130,6 +130,7 @@ class MediaType(SerializableEnum):
 @dataclass(kw_only=True)
 class ExpiredMediaItem(SerializableAttrs['ExpiredMediaItem']):
     media_type: Optional[MediaType] = None
+    user: Optional[BaseResponseUser] = None
 
 
 @dataclass(kw_only=True)
@@ -386,9 +387,18 @@ class ReelShareItem(SerializableAttrs['ReelShareItem']):
     reel_owner_id: int
     is_reel_persisted: int
     reel_type: str
-    media: ReelMediaShareItem
+    media: Union[ReelMediaShareItem, ExpiredMediaItem]
     reaction_info: Optional[ReelShareReactionInfo] = None
 
+    @classmethod
+    def deserialize(cls, data: JSON) -> 'ReelShareItem':
+        data = {**data}
+        if "id" not in data["media"]:
+            data["media"] = ExpiredMediaItem.deserialize(data["media"])
+        else:
+            data["media"] = ReelMediaShareItem.deserialize(data["media"])
+        return _dict_to_attrs(cls, data)
+
 
 @dataclass
 class StoryShareItem(SerializableAttrs['StoryShareItem']):
@@ -399,8 +409,22 @@ class StoryShareItem(SerializableAttrs['StoryShareItem']):
     reel_id: str
     # TODO enum?
     story_share_type: str  # default
-    media: ReelMediaShareItem
+    media: Union[ReelMediaShareItem, ExpiredMediaItem]
 
+    # Only present when expired
+    message: Optional[str] = None
+    # TODO enum
+    reason: Optional[int] = None  # 3 = expired?
+
+
+    @classmethod
+    def deserialize(cls, data: JSON) -> 'StoryShareItem':
+        data = {**data}
+        if "media" not in data:
+            data["media"] = ExpiredMediaItem()
+        else:
+            data["media"] = ReelMediaShareItem.deserialize(data["media"])
+        return _dict_to_attrs(cls, data)
 
 @dataclass(kw_only=True)
 class ThreadItem(SerializableAttrs['ThreadItem']):

+ 18 - 16
mautrix_instagram/portal.py

@@ -356,32 +356,34 @@ class Portal(DBPortal, BasePortal):
 
     async def _handle_instagram_media(self, source: 'u.User', intent: IntentAPI, item: ThreadItem
                                       ) -> Optional[EventID]:
+        # TODO maybe use a dict and item.item_type instead of a ton of ifs
+        method = self._reupload_instagram_media
         if item.media:
-            reuploaded = await self._reupload_instagram_media(source, item.media, intent)
+            media_data = item.media
         elif item.visual_media:
-            if isinstance(item.visual_media.media, ExpiredMediaItem):
-                # TODO send error message instead
-                return None
-            reuploaded = await self._reupload_instagram_media(source, item.visual_media.media,
-                                                              intent)
+            media_data = item.visual_media.media
         elif item.animated_media:
-            reuploaded = await self._reupload_instagram_animated(source, item.animated_media,
-                                                                 intent)
+            media_data = item.animated_media
+            method = self._reupload_instagram_animated
         elif item.voice_media:
-            reuploaded = await self._reupload_instagram_voice(source, item.voice_media, intent)
+            media_data = item.voice_media
+            method = self._reupload_instagram_voice
         elif item.reel_share:
-            reuploaded = await self._reupload_instagram_media(source, item.reel_share.media,
-                                                              intent)
+            media_data = item.reel_share.media
         elif item.story_share:
-            reuploaded = await self._reupload_instagram_media(source, item.story_share.media,
-                                                              intent)
+            media_data = item.story_share.media
         elif item.media_share:
-            reuploaded = await self._reupload_instagram_media(source, item.media_share, intent)
+            media_data = item.media_share
         else:
-            reuploaded = None
-        if not reuploaded:
+            media_data = None
+        if not media_data:
             self.log.debug(f"Unsupported media type in item {item}")
             return None
+        elif isinstance(media_data, ExpiredMediaItem):
+            self.log.debug(f"Expired media in item {item}")
+            # TODO send error message
+            return None
+        reuploaded = await method(source, media_data, intent)
         content = MediaMessageEventContent(body=reuploaded.file_name, external_url=reuploaded.url,
                                            url=reuploaded.mxc, file=reuploaded.decryption_info,
                                            info=reuploaded.info, msgtype=reuploaded.msgtype)