FramerTelegram / app.py
portalniy-dev's picture
Update app.py
600bbe2 verified
raw
history blame
4.23 kB
import os
import subprocess
import telebot
from telebot import types
TOKEN = "7709328099:AAHvvz2Dqkzb2c0lNh9OViTBnUoW6ZcpreA"
ALLOWED_EXTENSIONS = {'mp4', 'avi', 'mov', 'mkv'}
TEMP_DIR = "temp_files"
bot = telebot.TeleBot(TOKEN)
# Хранилище данных пользователя
user_data = {}
@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
bot.reply_to(message,
"Привет! Отправь мне видео, и я интерполирую кадры до нужного FPS.\n"
"Инструкция:\n"
"1. Отправь видео файл\n"
"2. Укажи желаемый FPS (целое число)\n"
"3. Жди результат обработки"
)
@bot.message_handler(content_types=['video'])
def handle_video(message):
try:
# Скачивание файла
file_info = bot.get_file(message.video.file_id)
downloaded_file = bot.download_file(file_info.file_path)
# Создание временной директории
os.makedirs(TEMP_DIR, exist_ok=True)
# Сохранение файла
ext = file_info.file_path.split('.')[-1] if file_info.file_path else 'mp4'
input_path = os.path.join(TEMP_DIR, f"input_{message.chat.id}.{ext}")
with open(input_path, 'wb') as new_file:
new_file.write(downloaded_file)
user_data[message.chat.id] = {'input_path': input_path}
# Запрос FPS
msg = bot.send_message(message.chat.id, "Видео получено. Введите желаемый FPS:")
bot.register_next_step_handler(msg, process_fps)
except Exception as e:
bot.reply_to(message, f"Ошибка: {str(e)}")
def process_fps(message):
try:
chat_id = message.chat.id
target_fps = int(message.text)
if target_fps <= 0:
raise ValueError("FPS должен быть положительным числом")
if chat_id not in user_data or not os.path.exists(user_data[chat_id]['input_path']):
bot.send_message(chat_id, "Ошибка: видео не найдено")
return
input_path = user_data[chat_id]['input_path']
output_path = os.path.join(TEMP_DIR, f"output_{chat_id}.mp4")
# Получаем исходный FPS
cmd = f"ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 {input_path}"
original_fps = subprocess.check_output(cmd, shell=True).decode().strip().split('/')
original_fps = float(original_fps[0])/float(original_fps[1])
if target_fps <= original_fps:
bot.send_message(chat_id, f"Целевой FPS должен быть больше исходного ({original_fps:.2f})")
return
# Обработка видео
cmd = [
'ffmpeg',
'-i', input_path,
'-vf', f'minterpolate=fps={target_fps}',
'-c:v', 'libx264',
'-preset', 'medium',
'-crf', '23',
'-y',
output_path
]
subprocess.run(cmd, check=True, timeout=300)
# Отправка результата
with open(output_path, 'rb') as video_file:
bot.send_video(chat_id, video_file)
except ValueError:
bot.send_message(chat_id, "Пожалуйста, введите корректное целое число FPS")
except subprocess.TimeoutExpired:
bot.send_message(chat_id, "Обработка заняла слишком много времени")
except Exception as e:
bot.send_message(chat_id, f"Ошибка при обработке: {str(e)}")
finally:
# Очистка временных файлов
if chat_id in user_data:
for path in [user_data[chat_id].get('input_path'), output_path]:
if path and os.path.exists(path):
os.remove(path)
del user_data[chat_id]
if __name__ == '__main__':
bot.polling(none_stop=True)