From 95d287bafc4be0db3204fafe134af663fae088e4 Mon Sep 17 00:00:00 2001 From: LeoMortari Date: Sat, 2 Aug 2025 12:27:26 -0300 Subject: [PATCH] Ajusta projeto para consumir uma fila --- components/video.py | 5 ++- main.py | 106 ++++++++++++++++++++------------------------ requirements.txt | 5 +-- 3 files changed, 53 insertions(+), 63 deletions(-) diff --git a/components/video.py b/components/video.py index 760b929..d689236 100644 --- a/components/video.py +++ b/components/video.py @@ -1,6 +1,4 @@ import os -import subprocess -import unicodedata from moviepy.video.io.VideoFileClip import VideoFileClip from moviepy.video.VideoClip import ColorClip @@ -126,12 +124,15 @@ def process_full_video(filename: str, times: list = None) -> list: if end is None: with VideoFileClip(video_path) as clip: end = clip.duration + print(f"Cortando trecho {idx}: {start}s a {end}s") temp_path = f"temp/{os.path.splitext(filename)[0]}_{idx}.mp4" + cut_video_new_clip(video_path, start, end, temp_path) out = process_segment(temp_path, top_text, bottom_text, filename, idx) + processed.append(out) return processed diff --git a/main.py b/main.py index c7894c0..82b0d2e 100644 --- a/main.py +++ b/main.py @@ -1,21 +1,30 @@ import os +import pika +import json import requests -import threading - -os.environ["IMAGEIO_FFMPEG_EXE"] = "/usr/bin/ffmpeg" - -from flask import Flask, request, jsonify from components.video import process_full_video -app = Flask(__name__) +RABBITMQ_HOST = os.environ.get('RABBITMQ_HOST', 'rabbitmq') +RABBITMQ_PORT = int(os.environ.get('RABBITMQ_PORT', 5672)) +RABBITMQ_USER = os.environ.get('RABBITMQ_USER', 'admin') +RABBITMQ_PASS = os.environ.get('RABBITMQ_PASS') +RABBITMQ_QUEUE = os.environ.get('RABBITMQ_QUEUE', 'to-render') -def process_and_call_webhook(url, video_id, times, webhook_url, filename): +if not RABBITMQ_PASS: + raise RuntimeError("RABBITMQ_PASS não definido no ambiente") + +def callback(ch, method, properties, body): try: - os.makedirs("videos", exist_ok=True) - os.makedirs("temp", exist_ok=True) + data = json.loads(body) + filename = data.get("filename") + times = data.get("times", []) + webhook_url = data.get("webhookUrl") + url = data.get("url") + video_id = data.get("videoId") + + print(f"Processando vídeo: {filename}") - print(f"Working on video {filename}") processed_files = process_full_video(filename, times) payload = { @@ -26,63 +35,44 @@ def process_and_call_webhook(url, video_id, times, webhook_url, filename): "videoId": video_id, "error": False, } - - try: - resp = requests.post(webhook_url, json=payload, timeout=30) - - print(f"Webhook status: {resp.status_code}, content: {resp.text}") - - except Exception as webhook_error: - print(f"Erro ao chamar webhook: {webhook_error}") - except Exception as e: payload = { "videosProcessedQuantity": 0, - "filename": filename, - "processedFiles": processed_files, - "url": url, - "videoId": video_id, + "filename": filename if 'filename' in locals() else None, + "processedFiles": [], + "url": url if 'url' in locals() else None, + "videoId": video_id if 'video_id' in locals() else None, "error": str(e), } - - try: - resp = requests.post(webhook_url, json=payload, timeout=30) - - print(f"Webhook send error status: {resp.status_code}") - - print(str(e)) - except Exception as webhook_error: - print(f"Erro ao chamar webhook: {webhook_error}") - print(f"Erro no processamento: {e}") -@app.route('/process', methods=['POST']) -def process_video(): + try: + if webhook_url: + resp = requests.post(webhook_url, json=payload, timeout=30) + print(f"Webhook status: {resp.status_code}") + except Exception as wh_err: + print(f"Erro ao chamar webhook: {wh_err}") - data = request.get_json() - - if not data or not ("url" in data or "videoId" in data): - return jsonify({"error": "Informe 'url' ou 'videoId'"}), 400 + ch.basic_ack(delivery_tag=method.delivery_tag) - url = data.get("url") - video_id = data.get("videoId") - times = data.get("times", []) - webhook_url = data.get("webhookUrl") +def main(): + credentials = pika.PlainCredentials(RABBITMQ_USER, RABBITMQ_PASS) + parameters = pika.ConnectionParameters( + host=RABBITMQ_HOST, + port=RABBITMQ_PORT, + credentials=credentials, + heartbeat=600, + blocked_connection_timeout=300 + ) + connection = pika.BlockingConnection(parameters) + channel = connection.channel() + channel.queue_declare(queue=RABBITMQ_QUEUE, durable=True) + channel.basic_qos(prefetch_count=1) + channel.basic_consume(queue=RABBITMQ_QUEUE, on_message_callback=callback) - if not webhook_url: - return jsonify({"error": "Informe 'webhookUrl'"}), 400 + print(' [*] Esperando mensagens. Para sair: CTRL+C') - filename = data.get("filename") - if not filename: - return jsonify({"error": "Informe 'filename'"}), 400 + channel.start_consuming() - threading.Thread( - target=process_and_call_webhook, - args=(url, video_id, times, webhook_url, filename), - daemon=True - ).start() - - return jsonify({"message": f"{video_id if video_id else url}"}), 200 - -if __name__ == '__main__': - app.run(host="0.0.0.0", port=5000, debug=True) +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt index e16a219..c82cf97 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ -flask moviepy==2.2.0 pillow==9.5.0 -yt_dlp -requests \ No newline at end of file +requests +pika \ No newline at end of file