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)