support sending gifs via rpc
This commit is contained in:
parent
49a1b62f21
commit
5d69af14d5
1
Pipfile
1
Pipfile
@ -44,6 +44,7 @@ vkwave = "*"
|
|||||||
imagehash = "*"
|
imagehash = "*"
|
||||||
tqdm = "*"
|
tqdm = "*"
|
||||||
tiktokapi = "*"
|
tiktokapi = "*"
|
||||||
|
ffmpeg-python = "*"
|
||||||
|
|
||||||
[dev-packages]
|
[dev-packages]
|
||||||
|
|
||||||
|
2551
Pipfile.lock
generated
2551
Pipfile.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,13 @@
|
|||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
import traceback
|
import traceback
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
|
import ffmpeg
|
||||||
import imagehash
|
import imagehash
|
||||||
import requests
|
import requests
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
@ -17,7 +19,7 @@ from jsonrpc import Dispatcher as RPCDispatcher
|
|||||||
from djconfig import config
|
from djconfig import config
|
||||||
|
|
||||||
from bots.models import TelegramBotModuleConfig, BotUser
|
from bots.models import TelegramBotModuleConfig, BotUser
|
||||||
from bots.tasks import upload_image_rpc
|
from bots.tasks import upload_image_rpc, upload_animation_rpc
|
||||||
|
|
||||||
|
|
||||||
class ChannelHelperBotModuleConfig(TelegramBotModuleConfig):
|
class ChannelHelperBotModuleConfig(TelegramBotModuleConfig):
|
||||||
@ -70,6 +72,31 @@ class ChannelHelperBotModuleConfig(TelegramBotModuleConfig):
|
|||||||
# QueuedItem.objects.create(config=self, type='photo', args=json.dumps([]), image_hash=image_hash, processed=True)
|
# QueuedItem.objects.create(config=self, type='photo', args=json.dumps([]), image_hash=image_hash, processed=True)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def rpc_post_gif(self, url, note=''):
|
||||||
|
config._reload_maybe()
|
||||||
|
try:
|
||||||
|
fpath_input = os.path.join(tempfile.gettempdir(), '{}.gif'.format(uuid4()))
|
||||||
|
fpath_output = os.path.join(tempfile.gettempdir(), '{}.mp4'.format(uuid4()))
|
||||||
|
resp = requests.get(url)
|
||||||
|
resp.raise_for_status()
|
||||||
|
with open(fpath_input, 'wb') as f:
|
||||||
|
f.write(resp.content)
|
||||||
|
except:
|
||||||
|
raise RuntimeError('Could not load image')
|
||||||
|
video_input = ffmpeg \
|
||||||
|
.input(fpath_input)
|
||||||
|
cmd = video_input \
|
||||||
|
.output(fpath_output,
|
||||||
|
vf='pad=width=ceil(iw/2)*2:height=ceil(ih/2)*2:x=0:y=0:color=Black',
|
||||||
|
vcodec='libx264',
|
||||||
|
crf='26')
|
||||||
|
logging.info('ffmpeg ' + ' '.join(cmd.get_args()))
|
||||||
|
cmd.run()
|
||||||
|
qi = QueuedItem.objects.create(config=self, type='animation', args=json.dumps([]), message_id=None)
|
||||||
|
upload_animation_rpc.delay(qi.pk, fpath_output, note or None)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def periodic_task(self, bot: Bot):
|
def periodic_task(self, bot: Bot):
|
||||||
i = self.queued_items.filter(processed=False).order_by('?').first() # type: QueuedItem
|
i = self.queued_items.filter(processed=False).order_by('?').first() # type: QueuedItem
|
||||||
if i:
|
if i:
|
||||||
|
@ -3,6 +3,7 @@ import logging
|
|||||||
import os
|
import os
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
from telegram import Bot
|
||||||
from telegram.error import RetryAfter
|
from telegram.error import RetryAfter
|
||||||
|
|
||||||
from config.celery import app
|
from config.celery import app
|
||||||
@ -39,3 +40,35 @@ def upload_image_rpc(self, queued_image_pk, fpath, caption):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
raise self.retry(exc=e, countdown=5)
|
raise self.retry(exc=e, countdown=5)
|
||||||
|
|
||||||
|
|
||||||
|
@app.task(bind=True)
|
||||||
|
def upload_animation_rpc(self, queued_image_pk, fpath, caption):
|
||||||
|
from .modules.channel_helper import QueuedItem
|
||||||
|
try:
|
||||||
|
logging.warning(f'Processing upload task for queued animation item #{queued_image_pk}')
|
||||||
|
qi = QueuedItem.objects.get(pk=queued_image_pk)
|
||||||
|
bot = qi.config.bot.get_bot()
|
||||||
|
if qi.config.queued:
|
||||||
|
m = bot.send_animation(
|
||||||
|
config.tmp_uploads_chat_id,
|
||||||
|
open(fpath, 'rb'),
|
||||||
|
caption=caption,
|
||||||
|
)
|
||||||
|
qi.message_id = m.message_id
|
||||||
|
qi.args = json.dumps([m.animation.file_id])
|
||||||
|
qi.save()
|
||||||
|
else:
|
||||||
|
bot.send_animation(
|
||||||
|
qi.config.chat_id,
|
||||||
|
open(fpath, 'rb'),
|
||||||
|
caption=caption,
|
||||||
|
)
|
||||||
|
qi.processed = True
|
||||||
|
qi.save()
|
||||||
|
os.unlink(fpath)
|
||||||
|
except RetryAfter as e:
|
||||||
|
raise self.retry(exc=e, countdown=int(e.retry_after))
|
||||||
|
except Exception as e:
|
||||||
|
traceback.print_exc()
|
||||||
|
raise self.retry(exc=e, countdown=5)
|
||||||
|
Loading…
Reference in New Issue
Block a user