From f4af9f679a1be7102b85fee9000719a44469d7e9 Mon Sep 17 00:00:00 2001 From: Jakob Neufeld Date: Sun, 20 Aug 2023 22:12:51 +0200 Subject: [PATCH] Added animated telegram sticker support for sticker-import --- sticker/lib/util.py | 6 +++--- sticker/stickerimport.py | 25 ++++++++++++++++++++----- sticker/version.py | 7 ++++++- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/sticker/lib/util.py b/sticker/lib/util.py index 2b3fe2a..b48181e 100644 --- a/sticker/lib/util.py +++ b/sticker/lib/util.py @@ -57,7 +57,7 @@ def add_to_index(name: str, output_dir: str) -> None: def make_sticker(mxc: str, width: int, height: int, size: int, - body: str = "") -> matrix.StickerInfo: + body: str = "", mimetype: str = "image/png") -> matrix.StickerInfo: return { "body": body, "url": mxc, @@ -65,7 +65,7 @@ def make_sticker(mxc: str, width: int, height: int, size: int, "w": width, "h": height, "size": size, - "mimetype": "image/png", + "mimetype": mimetype, # Element iOS compatibility hack "thumbnail_url": mxc, @@ -73,7 +73,7 @@ def make_sticker(mxc: str, width: int, height: int, size: int, "w": width, "h": height, "size": size, - "mimetype": "image/png", + "mimetype": mimetype, }, }, "msgtype": "m.sticker", diff --git a/sticker/stickerimport.py b/sticker/stickerimport.py index db176e4..2f4fc10 100644 --- a/sticker/stickerimport.py +++ b/sticker/stickerimport.py @@ -19,13 +19,13 @@ import asyncio import os.path import json import re - +import os from telethon import TelegramClient from telethon.tl.functions.messages import GetAllStickersRequest, GetStickerSetRequest from telethon.tl.types.messages import AllStickers from telethon.tl.types import InputStickerSetShortName, Document, DocumentAttributeSticker from telethon.tl.types.messages import StickerSet as StickerSetFull - +from subprocess import run from .lib import matrix, util @@ -39,6 +39,19 @@ async def reupload_document(client: TelegramClient, document: Document) -> matri print(".", flush=True) return util.make_sticker(mxc, width, height, len(data)) +async def reupload_document_gif(client: TelegramClient, document: Document) -> matrix.StickerInfo: + print(f"Reuploading {document.id}", end="", flush=True) + data = await client.download_media(document, file=bytes) + print(".", end="", flush=True) + # run LottieConverter + convert_data = run(['lottieconverter', '-', '-', 'gif', '512x512', '60'],capture_output = True, input=data).stdout + print(".", end="", flush=True) + mxc = await matrix.upload(convert_data, "image/gif", f"{document.id}.gif") + print(".", flush=True) + # 512x512 is mandatory for all stickers + return util.make_sticker(mxc, 512, 512, len(data), mimetype="image/gif") + + def add_meta(document: Document, info: matrix.StickerInfo, pack: StickerSetFull) -> None: for attr in document.attributes: @@ -57,8 +70,7 @@ def add_meta(document: Document, info: matrix.StickerInfo, pack: StickerSetFull) async def reupload_pack(client: TelegramClient, pack: StickerSetFull, output_dir: str) -> None: if pack.set.animated: - print("Animated stickerpacks are currently not supported") - return + print("Warning, to convert animated stickers, you need lottieconverter installed") pack_path = os.path.join(output_dir, f"{pack.set.short_name}.json") try: @@ -85,7 +97,10 @@ async def reupload_pack(client: TelegramClient, pack: StickerSetFull, output_dir reuploaded_documents[document.id] = already_uploaded[document.id] print(f"Skipped reuploading {document.id}") except KeyError: - reuploaded_documents[document.id] = await reupload_document(client, document) + if pack.set.animated: + reuploaded_documents[document.id] = await reupload_document_gif(client,document) + else: + reuploaded_documents[document.id] = await reupload_document(client, document) # Always ensure the body and telegram metadata is correct add_meta(document, reuploaded_documents[document.id], pack) diff --git a/sticker/version.py b/sticker/version.py index 47f7fff..a6c0452 100644 --- a/sticker/version.py +++ b/sticker/version.py @@ -1 +1,6 @@ -from .get_version import git_tag, git_revision, version, linkified_version +# Generated in setup.py + +git_tag = None +git_revision = 'f59406a4' +version = '0.1.0+dev.f59406a4' +linkified_version = '0.1.0+dev.[f59406a4](https://github.com/maunium/stickerpicker/commit/f59406a47a6778cd402e656ffb64f667335f665a)'