File size: 3,134 Bytes
a47efa0
 
3f205eb
 
 
a47efa0
3f205eb
 
 
a47efa0
3f205eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a47efa0
 
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
import gradio as gr
import os
import requests
import subprocess
import time

# SEUS SEGREDOS (Configure isso nas Settings do Space em "Repository Secrets")
IG_USER_ID = os.environ.get("IG_USER_ID")
ACCESS_TOKEN = os.environ.get("IG_ACCESS_TOKEN")

def converter_e_publicar(video_webm):
    if not video_webm:
        return "Nenhum vídeo recebido."

    # 1. CONVERSÃO (WebM -> MP4)
    # O gradio entrega o caminho do arquivo temporário em video_webm
    output_path = video_webm.replace(".webm", ".mp4")
    
    # Comando FFmpeg para converter garantindo compatibilidade com Instagram
    # -c:v libx264 (Vídeo H.264)
    # -c:a aac (Áudio AAC)
    # -pix_fmt yuv420p (Formato de pixel exigido pelo player mobile)
    command = [
        "ffmpeg", "-y", "-i", video_webm,
        "-c:v", "libx264", "-c:a", "aac", 
        "-pix_fmt", "yuv420p", "-movflags", "+faststart",
        output_path
    ]
    
    subprocess.run(command, check=True)
    
    # 2. GERAR URL PÚBLICA (Truque do Gradio)
    # O arquivo agora está salvo no servidor. Precisamos da URL completa.
    # Em Spaces públicos, a URL segue esse padrão. Ajuste SEU_USER e SEU_SPACE.
    # O Gradio expõe arquivos na pasta /file/
    filename = os.path.basename(output_path)
    # ATENÇÃO: O caminho interno do gradio costuma ser /tmp/gradio/..., 
    # a URL pública pega o caminho absoluto.
    public_url = f"https://SEU_USER-SEU_SPACE.hf.space/file={output_path}"
    
    # 3. PUBLICAR NO INSTAGRAM
    
    # Passo A: Criar Container
    url_container = f"https://graph.facebook.com/v19.0/{IG_USER_ID}/media"
    payload = {
        "media_type": "REELS", # Ou VIDEO
        "video_url": public_url,
        "caption": "Vídeo gerado automaticamente via Gemini App Builder 🚀",
        "access_token": ACCESS_TOKEN
    }
    
    r = requests.post(url_container, data=payload)
    if r.status_code != 200:
        return f"Erro ao criar container: {r.text}"
    
    container_id = r.json().get("id")
    
    # Passo B: Esperar processamento (Polling)
    status = "IN_PROGRESS"
    while status == "IN_PROGRESS":
        time.sleep(5) # Espera 5 segundos
        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")
        print(f"Status do vídeo: {status}")
        
        if status == "ERROR":
             return "Erro no processamento do vídeo pelo Instagram."

    # Passo C: Publicar Oficialmente
    publish_url = f"https://graph.facebook.com/v19.0/{IG_USER_ID}/media_publish"
    pub_payload = {
        "creation_id": container_id,
        "access_token": ACCESS_TOKEN
    }
    
    final_r = requests.post(publish_url, data=pub_payload)
    
    if final_r.status_code == 200:
        return "Sucesso! Vídeo publicado no Instagram."
    else:
        return f"Erro na publicação final: {final_r.text}"

# Interface simples (API mode)
demo = gr.Interface(
    fn=converter_e_publicar,
    inputs=gr.Video(label="Envie seu WebM"),
    outputs="text"
)

demo.launch()