from aiogram import types, F, Router
from aiogram.types import Message, CallbackQuery, ContentType, InlineKeyboardButton, InlineKeyboardMarkup, FSInputFile
from aiogram.filters import Command
import shutil
from scripts import *
from config import WARN
router = Router()
# СТАРТОВАЯ КОМАНДА
@router.message(Command("start", "help"))
async def helps(msg: Message) -> None:
buttons = [[InlineKeyboardButton(text="ФУНКЦИИ", callback_data="fun"),
InlineKeyboardButton(text="АВТОР", callback_data="auth")]]
keyboard = InlineKeyboardMarkup(inline_keyboard=buttons, row_width=2)
await msg.answer(text="Кружочичек — бот для обработки видео и кружочков в Телеграме. Для начала работы "
"вам достаточно скинуть квадратное видео не дольше минуты в чат, чтобы получить кружок. "
"Или скинуть кружок, выбрать формат обработки углов и получить готовый видеоролик! "
"НО у Телеграмма бывают кружочки с некорректными метаданными, из-за чего его "
"обработка становится невозможной, или в итоге видео будет с браком, поэтому "
"обязательно проверяйте полученный результат!", reply_markup=keyboard)
@router.callback_query(F.data == "auth")
async def author(call: CallbackQuery) -> None:
await call.message.answer('| АВТОР |\n\n>> Этот телеграм бот, крайне прост и примитивен. В его '
'распоряжении есть всего лишь две функции, а именно: превращение квадратных '
'видеороликов в кружочки и скачивание кружочков с последующей обработкой краёв в '
'двух предложенных вариантах.'
'\n\nЯ же пишу подобные небольшие проекты, о которых вы можете узнать '
'больше на моём GitHub.')
@router.callback_query(F.data == "fun")
async def function(call: CallbackQuery) -> None:
await call.message.answer('| ФУНКЦИИ |\n\n1. Обработка кружочка с градиентным или размытым фоном на '
'выбор по бокам\n2. Получение из квадратного видео длиною не больше минуты кружочек')
# ОБРАБОТЧИК ВИДЕО
@router.message(F.content_type == ContentType.VIDEO)
async def video_to_circle(msg: Message) -> None:
video = "../data/circles/" + str(msg.chat.id) + ".mp4"
await msg.reply("Началась обработка видео! Оно должно быть квадратным и не дольше одной минуты, в ином "
"случае бот в ответ вернёт вам изначальное видео, а не кружочек!")
await msg.bot.download(file=msg.video.file_id, destination=video)
await msg.answer_video_note(video_note=FSInputFile(video))
os.remove(video)
# ОБРАБОТЧИК КРУЖОЧКОВ
@router.message(F.content_type == ContentType.VIDEO_NOTE)
async def video_note(msg: Message) -> None:
buttons = [[InlineKeyboardButton(text="Градиент", callback_data="grad"),
InlineKeyboardButton(text="Блюр", callback_data="blur")]]
keyboard = types.InlineKeyboardMarkup(inline_keyboard=buttons, row_width=2)
msg_answer = await msg.reply("Кружочек загружается...")
await msg.bot.download(file=msg.video_note.file_id, destination="../data/video_notes/" + str(msg.chat.id) + ".mp4")
await msg_answer.edit_text(text=WARN + "Какой тип фона в углах вы выберите?", reply_markup=keyboard)
@router.callback_query(lambda call: call.data == "grad" or call.data == "blur")
async def work_part(call: CallbackQuery) -> None:
msg = await call.message.edit_text(WARN + "Начало обработки!")
video_name = str(msg.chat.id)
video_file = video_name + ".mp4"
path = f"../data/videos/{video_name}"
os.mkdir(path)
path_video = path + "/" + video_file
os.replace("../data/video_notes/" + video_file, path_video)
path_frames = path + f"/frames"
os.mkdir(path_frames)
path_background = path + f"/background"
os.mkdir(path_background)
msg = await msg.edit_text(WARN + "Этап: 1 - Обработка видео.")
video = Movie(path_video, video_name, path)
procces = video.split_into_frames()
if not procces:
await msg.edit_text("Возникла ошибка! Кружочек невозможно обработать!")
shutil.rmtree(path)
return
msg = await msg.edit_text(WARN + "Этап: 2 - Обработка кадров.")
frames = list(sorted(os.listdir(path_frames)))
for frame in frames:
img = Frame(path_frames + "/" + frame, path_background + "/" + f'{frame[:-5]}-g.jpeg')
width, height = img.size()
if call.data == "blur":
img.blur(width, height)
else:
r, g, b = img.medium_color(); nearly = 10
img.gradient(width, height, (r - nearly, g - nearly, b - nearly),
(r + nearly, g + nearly, b + nearly), (True, False, False))
img.unity_image()
msg = await msg.edit_text(WARN + "Этап: 3 - Объединение кадров.")
video.unity_into_video(frames)
msg_final = await msg.edit_text(WARN + "Готово! Видео отправляется...")
await msg.answer_video(video=FSInputFile(path + "/acs-" + video_file), caption=WARN,
reply_to_message_id=call.message.reply_to_message.message_id)
await msg_final.delete()
shutil.rmtree(path)