Spaces:
Sleeping
Sleeping
File size: 4,219 Bytes
a47efa0 3f205eb 48662e6 3f205eb a47efa0 48662e6 3f205eb a47efa0 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb 48662e6 3f205eb a47efa0 48662e6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 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() |