diff --git a/ROADMAP.md b/ROADMAP.md index 1c28e779785be3b484c0fa0e6d3307fa79e56333..f86283dc375572a293226880cbdd9e4e334e9a8b 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -29,11 +29,11 @@ * Facebook Messenger → Matrix * [ ] Message content * [x] Text - * [ ] Media + * [x] Media * [x] Stickers * [x] Files * [x] Voice messages - * [ ] Videos + * [x] Videos * [x] Images * [x] Locations * [x] Formatting diff --git a/mautrix_facebook/portal.py b/mautrix_facebook/portal.py index 5eed6fdbf6c09dbc07699b4a5667b34b471a1c55..c33c0b9e2e2c40280e34035a318623aa907c02ef 100644 --- a/mautrix_facebook/portal.py +++ b/mautrix_facebook/portal.py @@ -17,6 +17,7 @@ from typing import (Dict, Deque, Optional, Tuple, Union, Set, Iterator, List, Ca TYPE_CHECKING) from tempfile import NamedTemporaryFile from datetime import datetime, timezone +from mimetypes import guess_extension from collections import deque import asyncio import shutil @@ -30,7 +31,7 @@ from mautrix.types import (RoomID, EventType, ContentURI, MessageEventContent, E ImageInfo, MessageType, LocationMessageEventContent, LocationInfo, ThumbnailInfo, FileInfo, AudioInfo, Format, RelatesTo, RelationType, TextMessageEventContent, MediaMessageEventContent, Membership, - EncryptedFile) + EncryptedFile, VideoInfo) from mautrix.appservice import IntentAPI from mautrix.errors import MForbidden, IntentError, MatrixError from mautrix.bridge import BasePortal, NotificationDisabler @@ -765,8 +766,6 @@ class Portal(BasePortal): url=mxc, file=decryption_info, msgtype=MessageType.AUDIO, body=attachment.filename, info=AudioInfo(size=size, mimetype=mime, duration=attachment.duration.seconds), relates_to=self._get_facebook_reply(reply_to)), timestamp=timestamp) - # elif isinstance(attachment, fbchat.VideoAttachment): - # TODO elif isinstance(attachment, fbchat.FileAttachment): mxc, mime, size, decryption_info = await self._reupload_fb_file( attachment.url, intent, attachment.name, encrypt=self.encrypted) @@ -774,14 +773,21 @@ class Portal(BasePortal): url=mxc, file=decryption_info, msgtype=MessageType.FILE, body=attachment.name, info=FileInfo(size=size, mimetype=mime), relates_to=self._get_facebook_reply(reply_to)), timestamp=timestamp) - elif isinstance(attachment, fbchat.ImageAttachment): + elif isinstance(attachment, (fbchat.ImageAttachment, fbchat.VideoAttachment)): mxc, mime, size, decryption_info = await self._reupload_fb_file( await source.fetch_image_url(attachment.id), intent, encrypt=self.encrypted) + if isinstance(attachment, fbchat.ImageAttachment): + filename = f"image.{attachment.original_extension}" + msgtype = MessageType.IMAGE + info = ImageInfo(size=size, mimetype=mime, width=attachment.width, + height=attachment.height) + else: + filename = f"video{guess_extension(mime)}" + msgtype = MessageType.VIDEO + info = VideoInfo(size=size, mimetype=mime, width=attachment.width, + height=attachment.height, duration=attachment.duration.seconds) event_id = await self._send_message(intent, MediaMessageEventContent( - url=mxc, file=decryption_info, msgtype=MessageType.IMAGE, - body=f"image.{attachment.original_extension}", - info=ImageInfo(size=size, mimetype=mime, width=attachment.width, - height=attachment.height), + url=mxc, file=decryption_info, msgtype=msgtype, body=filename, info=info, relates_to=self._get_facebook_reply(reply_to)), timestamp=timestamp) elif isinstance(attachment, fbchat.LocationAttachment): content = await self._convert_facebook_location(intent, attachment)