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()