Moved converters to other file, added methods for video and gif, which supports resize.
XXX: videos don't want to be played by riot, i don't know why...
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
from typing import Optional, Tuple, Union, Dict
|
||||
from io import BytesIO, StringIO
|
||||
from io import BytesIO
|
||||
import time
|
||||
import logging
|
||||
import asyncio
|
||||
@@ -30,6 +30,7 @@ from telethon.errors import (AuthBytesInvalidError, AuthKeyInvalidError, Locatio
|
||||
|
||||
from mautrix.appservice import IntentAPI
|
||||
|
||||
|
||||
from ..tgclient import MautrixTelegramClient
|
||||
from ..db import TelegramFile as DBTelegramFile
|
||||
from ..util import sane_mimetypes
|
||||
@@ -48,16 +49,7 @@ try:
|
||||
except ImportError:
|
||||
VideoFileClip = random = string = os = mimetypes = None
|
||||
|
||||
try:
|
||||
import cairosvg
|
||||
from tgs.parsers.tgs import parse_tgs as tgs_importer
|
||||
from tgs.exporters import svg as tgs_svg_exporter
|
||||
# from tgs.exporters import gif as tgs_gif_exporter
|
||||
except (ImportError, OSError):
|
||||
cairosvg = None
|
||||
tgs_importer = None
|
||||
tgs_svg_exporter = None
|
||||
# tgs_gif_exporter = None
|
||||
from .tgs_converter import convert_tgs
|
||||
|
||||
log: logging.Logger = logging.getLogger("mau.util")
|
||||
|
||||
@@ -83,32 +75,6 @@ def convert_image(file: bytes, source_mime: str = "image/webp", target_type: str
|
||||
return source_mime, file, None, None
|
||||
|
||||
|
||||
def convert_tgs(file: bytes) -> Tuple[str, bytes, Optional[int], Optional[int]]:
|
||||
if cairosvg and tgs_importer and tgs_svg_exporter:
|
||||
try:
|
||||
with BytesIO(file) as fi:
|
||||
animation = tgs_importer(fi)
|
||||
"""
|
||||
It's possible to convert to gif, but out animation is too big (~500KB),
|
||||
Convert to mp4 needs opencv2 to be installed...
|
||||
TODO: Maybe should create config parameter
|
||||
"""
|
||||
with StringIO() as svg, BytesIO() as fo:
|
||||
frame = int(animation.out_point * 0.3)
|
||||
w, h = 256, 256
|
||||
tgs_svg_exporter.export_svg(animation, svg, frame=frame)
|
||||
svg.seek(0)
|
||||
cairosvg.svg2png(file_obj=svg, write_to=fo, output_width=w, output_height=h)
|
||||
out = fo.getvalue()
|
||||
return "image/png", out, w, h
|
||||
# Yep... some animations crash library...
|
||||
except AttributeError:
|
||||
log.exception("Error occurred while converting animated sticker")
|
||||
else:
|
||||
log.warning("Unable to convert animated sticker, install tgs and cairosvg packages")
|
||||
return "application/gzip", file, None, None
|
||||
|
||||
|
||||
def _temp_file_name(ext: str) -> str:
|
||||
return ("/tmp/mxtg-video-"
|
||||
+ "".join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10))
|
||||
@@ -200,9 +166,9 @@ async def transfer_file_to_matrix(client: MautrixTelegramClient, intent: IntentA
|
||||
if not location_id:
|
||||
return None
|
||||
|
||||
db_file = DBTelegramFile.get(location_id)
|
||||
if db_file:
|
||||
return db_file
|
||||
#db_file = DBTelegramFile.get(location_id)
|
||||
#if db_file:
|
||||
# return db_file
|
||||
|
||||
try:
|
||||
lock = transfer_locks[location_id]
|
||||
@@ -218,9 +184,9 @@ async def _unlocked_transfer_file_to_matrix(client: MautrixTelegramClient, inten
|
||||
loc_id: str, location: TypeLocation,
|
||||
thumbnail: TypeThumbnail, is_sticker: bool
|
||||
) -> Optional[DBTelegramFile]:
|
||||
db_file = DBTelegramFile.get(loc_id)
|
||||
if db_file:
|
||||
return db_file
|
||||
#db_file = DBTelegramFile.get(loc_id)
|
||||
#if db_file:
|
||||
# return db_file
|
||||
|
||||
try:
|
||||
file = await client.download_file(location)
|
||||
@@ -235,9 +201,8 @@ async def _unlocked_transfer_file_to_matrix(client: MautrixTelegramClient, inten
|
||||
|
||||
image_converted = False
|
||||
if mime_type == "application/gzip" and is_sticker:
|
||||
mime_type, file, width, height = convert_tgs(file)
|
||||
mime_type, file, width, height, thumbnail = convert_tgs(file, "gif", 128, 128)
|
||||
image_converted = width is not None
|
||||
thumbnail = None
|
||||
|
||||
if mime_type == "image/webp":
|
||||
new_mime_type, file, width, height = convert_image(
|
||||
|
||||
Reference in New Issue
Block a user