UploudVideo / app.py
AlexandreScriptsMT's picture
Update app.py
48662e6 verified
import gradio as gr
import os
import subprocess
import requests
import time
# 1. Recuperar Segredos
IG_USER_ID = os.environ.get("IG_USER_ID")
ACCESS_TOKEN = os.environ.get("IG_ACCESS_TOKEN")
def processar_e_publicar(video_webm_path):
if not video_webm_path:
return "Erro: Nenhum vídeo recebido."
# --- ETAPA A: CONVERSÃO (WebM -> MP4) ---
print("Iniciando conversão...")
output_filename = "video_final.mp4"
output_path = os.path.abspath(output_filename)
# Comando FFmpeg otimizado para Instagram
command = [
"ffmpeg", "-y",
"-i", video_webm_path,
"-c:v", "libx264", "-preset", "fast", "-crf", "23", # Video H.264
"-c:a", "aac", "-b:a", "128k", # Audio AAC
"-pix_fmt", "yuv420p", # Garante compatibilidade mobile
"-movflags", "+faststart",
output_path
]
subprocess.run(command, check=True)
# --- ETAPA B: GERAR URL PÚBLICA ---
# O Gradio serve arquivos estáticos na rota /file/
# Precisamos descobrir a URL base do Space dinamicamente ou montar manualmente
# Truque para pegar a URL do Space atual
# Se seu usuario é "Joao" e o space é "Bot", a url é https://joao-bot.hf.space
space_host = os.environ.get("SPACE_HOST") # O HF fornece isso auto em alguns casos
if not space_host:
# Fallback: Tenta construir baseado no user/space se estiver nas envs,
# senão, retornaremos o caminho para debug.
# Mas para simplificar, vamos assumir que o script roda e gera o arquivo local.
# O Gradio retorna o caminho, o cliente (App Builder) vai precisar da URL completa.
pass
# A URL pública do arquivo no Gradio segue este padrão:
# https://{USER}-{SPACE_NAME}.hf.space/file={CAMINHO_ABSOLUTO}
# Vamos deixar o Gradio retornar o arquivo processado, e o próprio Gradio gera o link de download.
# PORÉM, para o Instagram, precisamos passar a URL texto.
# Vamos construir a URL pública manualmente para enviar ao Instagram
# ATENÇÃO: Substitua isso se o HF mudar a estrutura, mas o padrão atual é esse.
# Para automação total, vamos usar uma variável que você preenche ou pegamos do sistema
base_url = f"https://{os.environ.get('SPACE_AUTHOR_NAME')}-{os.environ.get('SPACE_REPO_NAME')}.hf.space"
video_public_url = f"{base_url}/file={output_path}"
print(f"URL Gerada para o Instagram: {video_public_url}")
# --- ETAPA C: PUBLICAR NO INSTAGRAM ---
print("Enviando para o Instagram...")
# 1. Criar Container
url_create = f"https://graph.facebook.com/v19.0/{IG_USER_ID}/media"
payload = {
"media_type": "REELS",
"video_url": video_public_url,
"caption": "Vídeo postado via App Builder 🚀 #AI #Automation",
"access_token": ACCESS_TOKEN
}
req = requests.post(url_create, data=payload)
if req.status_code != 200:
return f"Erro Instagram (Container): {req.text}"
container_id = req.json()['id']
# 2. Esperar processamento (Polling)
status = "IN_PROGRESS"
while status == "IN_PROGRESS":
time.sleep(5)
status_url = f"https://graph.facebook.com/v19.0/{container_id}?fields=status_code&access_token={ACCESS_TOKEN}"
status_resp = requests.get(status_url).json()
status = status_resp.get('status_code', 'ERROR')
print(f"Status: {status}")
if status == 'ERROR':
return "Erro: Instagram falhou ao processar o vídeo."
# 3. Publicar
url_publish = f"https://graph.facebook.com/v19.0/{IG_USER_ID}/media_publish"
pub_payload = {
"creation_id": container_id,
"access_token": ACCESS_TOKEN
}
final_req = requests.post(url_publish, data=pub_payload)
if final_req.status_code == 200:
return f"SUCESSO! Vídeo publicado. ID: {final_req.json()['id']}"
else:
return f"Erro Instagram (Publish): {final_req.text}"
# Interface (API)
demo = gr.Interface(
fn=processar_e_publicar,
inputs=gr.Video(label="Upload WebM"), # Recebe o vídeo
outputs="text" # Retorna a mensagem de sucesso/erro
)
if __name__ == "__main__":
demo.launch()