Update app.py
Browse files
app.py
CHANGED
|
@@ -760,36 +760,51 @@ async def generate_elements_endpoint(request: GenerateElementsRequest):
|
|
| 760 |
contexto_add = f"\n{request.context}" if request.context else ""
|
| 761 |
|
| 762 |
prompt = f"""
|
| 763 |
-
Crie um título e uma descrição analisando o vídeo e pesquisando pelo contexto geral e completo, em várias fontes e indo entender. Corrija qualquer informação imprecisa, utilize técnicas modernas que
|
| 764 |
|
| 765 |
Contexto que pode ajudar (baseado na legenda do vídeo): {contexto_add}
|
| 766 |
|
| 767 |
EXEMPLOS:
|
| 768 |
|
| 769 |
-
|
| 770 |
-
|
| 771 |
-
|
| 772 |
-
|
| 773 |
-
|
| 774 |
-
|
| 775 |
-
|
| 776 |
-
|
| 777 |
-
|
| 778 |
-
|
| 779 |
-
|
| 780 |
-
|
| 781 |
-
|
| 782 |
-
|
| 783 |
-
|
| 784 |
-
|
| 785 |
-
}},
|
| 786 |
-
{{
|
| 787 |
-
"title": "O exato momento em que Carl supera seu luto de décadas 🥹",
|
| 788 |
-
"description": "🍇 O broche que Carl entrega a Russell é uma tampa de refrigerante de uva (Grape Soda) original dos anos 30, o mesmo objeto que Ellie deu a Carl quando eles se conheceram na infância.\n\nNo final de Up: Altas Aventuras (2009), Russell, com 8 anos, lida com a falta do pai durante a cerimônia de formatura dos Exploradores da Natureza. Carl Fredricksen sobe ao palco e entrega ao garoto a \"Insígnia Ellie\", a mais alta distinção que ele tem. Isso representa o momento preciso em que Carl supera seu luto de décadas, transferindo o legado de aventura para Russell e assumindo o papel de figura paterna para o garoto.\n\nDirigido por Pete Docter, o longa fez história ao ser a primeira animação a abrir o Festival de Cannes e venceu os Oscars de Melhor Filme de Animação e Melhor Trilha Sonora."
|
| 789 |
-
}}
|
| 790 |
-
]
|
| 791 |
|
| 792 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 793 |
"""
|
| 794 |
|
| 795 |
# 4. Enviar para o Gemini
|
|
@@ -806,14 +821,38 @@ Mande apenas o JSON na resposta. Sem texto adicional.
|
|
| 806 |
content = response_gemini.get("content", "")
|
| 807 |
print(f"✅ Resposta recebida ({len(content)} chars)")
|
| 808 |
|
| 809 |
-
# 5. Processar Resposta
|
| 810 |
-
|
| 811 |
-
|
| 812 |
-
|
| 813 |
-
|
| 814 |
-
|
| 815 |
-
|
| 816 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 817 |
|
| 818 |
except HTTPException:
|
| 819 |
raise
|
|
|
|
| 760 |
contexto_add = f"\n{request.context}" if request.context else ""
|
| 761 |
|
| 762 |
prompt = f"""
|
| 763 |
+
Crie um título e uma descrição analisando o vídeo e pesquisando pelo contexto geral e completo, em várias fontes e indo entender. Corrija qualquer informação imprecisa, utilize técnicas modernas que prendem o leitor a ler até o final. A legenda deve ser compatível e do tamanho de uma legenda do Instagram. A descrição deve ser sem tópico, apenas descrição limpa e direta, sem conclusões parecendo IA e sem enrolação/redundâncias. Eu quero informações concretas, informações, não pensamentos, opiniões ou imaginações. Não deve ser muito redundante, deve ter informação, apenas. Se inspire no modo de escrita dos exemplos.
|
| 764 |
|
| 765 |
Contexto que pode ajudar (baseado na legenda do vídeo): {contexto_add}
|
| 766 |
|
| 767 |
EXEMPLOS:
|
| 768 |
|
| 769 |
+
TÍTULO: O autor escreveu essa história como um pedido de desculpas à irmã porque, ao contrário do herói do filme, ele admite que não foi bondoso o suficiente para salvá-lá.
|
| 770 |
+
DESCRIÇÃO: 🥲 O autor escreveu a obra como um pedido de desculpas à sua irmã, Keiko, que morreu de fome em 1945. Enquanto o protagonista do filme é o símbolo máximo do sacrifício e do cuidado, Nosaka admitiu em diversas entrevistas que a realidade foi muito mais cruel e humana.
|
| 771 |
+
|
| 772 |
+
Aos 14 anos, por exemplo, consumido pela fome e pelo desespero do pós-guerra em Kobe, Nosaka não dividia toda a comida. Muitas vezes, ele comia primeiro, deixando apenas as sobras para a irmã pequena. O peso de cuidar de um bebê no meio do caos o levava ao limite, chegando a admitir que batia na cabeça de Keiko para que ela parasse de chorar. O arrependimento de ter sobrevivido às custas da negligência com a irmã o assombrou por décadas. Criando Seita, Nosaka projetou o irmão idealizado que ele gostaria de ter sido, dando ao personagem a bondade e a paciência que ele, na vida real, não teve forças para manifestar.
|
| 773 |
+
|
| 774 |
+
---
|
| 775 |
+
|
| 776 |
+
TÍTULO: É incrível como ele era vulnerável e emotivo antes de perder qualquer traço de humanidade
|
| 777 |
+
DESCRIÇÃO: No episódio 3 da 1ª temporada de Breaking Bad (...And the Bag's in the River), Walter White reconstrói um prato quebrado e descobre que falta um único estilhaço. Ele percebe que Krazy-8, o traficante mantido em seu porão, escondeu a peça pontiaguda para usá-la como arma. Walt estava decidido a libertar o prisioneiro, mas a prova física da traição o forçou a estrangular o traficante pra sobreviver.
|
| 778 |
+
|
| 779 |
+
Foi nesse momento que o docente de química compreendeu que a empatia seria sua condenação. Morria, naquele instante, o mestre de escola, e surgia a lógica inflexível de Heisenberg 🔥
|
| 780 |
+
|
| 781 |
+
---
|
| 782 |
+
|
| 783 |
+
TÍTULO: Imagina escrever uma música do próprio livro e vê-la ganhar vida em live-action 😮💨
|
| 784 |
+
DESCRIÇÃO: Jogos Vorazes deu vida a "The Hanging Tree", de Suzanne Collins, depois que a canção apareceu pela primeira vez em seu livro Mockingjay. Na Parte 1 de Mockingjay, no Distrito 12, o que começa como uma lembrança solene do pai de Katniss transforma-se em um grito de mobilização para que os distritos se oponham à Capital. Enquanto Snow manipula a mente de Peeta no silêncio do Distrito 13, a canção deixa muito claro que o poder de uma ideia é a única coisa que o medo não consegue deter. Até porque, nada representa uma ameaça maior para um tirano do que um povo que não tem mais nada a perder 🎯
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 785 |
|
| 786 |
+
---
|
| 787 |
+
|
| 788 |
+
TÍTULO: Normal People foi tão bom porque Paul Mescal não tava atuando 🥹
|
| 789 |
+
DESCRIÇÃO: 🥹 Paul Mescal era um ator de teatro praticamente desconhecido até ser escalado como Connell Waldron em Normal People. A adaptação do best-seller de Sally Rooney rendeu a Mescal o BAFTA de Melhor Ator e uma indicação ao Emmy, que claramente consolidou sua química com Daisy Edgar-Jones como uma das mais realistas da televisão recente.
|
| 790 |
+
|
| 791 |
+
A produção utilizou uma coordenadora de intimidade para garantir que as cenas de vulnerabilidade fossem autênticas, focando mais na linguagem corporal e no silêncio do que em diálogos expositivos. Filmada na Irlanda e na Itália, a série apresenta com precisão técnica a transição da vida escolar em Sligo para a universidade no Trinity College, evitando os clichês estéticos típicos de romances juvenis e concentrando-se no naturalismo das atuações.
|
| 792 |
+
|
| 793 |
+
---
|
| 794 |
+
|
| 795 |
+
TÍTULO: O exato momento em que Carl supera seu luto de décadas 🥹
|
| 796 |
+
DESCRIÇÃO: 🍇 O broche que Carl entrega a Russell é uma tampa de refrigerante de uva (Grape Soda) original dos anos 30, o mesmo objeto que Ellie deu a Carl quando eles se conheceram na infância.
|
| 797 |
+
|
| 798 |
+
No final de Up: Altas Aventuras (2009), Russell, com 8 anos, lida com a falta do pai durante a cerimônia de formatura dos Exploradores da Natureza. Carl Fredricksen sobe ao palco e entrega ao garoto a "Insígnia Ellie", a mais alta distinção que ele tem. Isso representa o momento preciso em que Carl supera seu luto de décadas, transferindo o legado de aventura para Russell e assumindo o papel de figura paterna para o garoto.
|
| 799 |
+
|
| 800 |
+
Dirigido por Pete Docter, o longa fez história ao ser a primeira animação a abrir o Festival de Cannes e venceu os Oscars de Melhor Filme de Animação e Melhor Trilha Sonora.
|
| 801 |
+
|
| 802 |
+
---
|
| 803 |
+
|
| 804 |
+
Mande apenas o título e a descrição na resposta, no formato:
|
| 805 |
+
|
| 806 |
+
TÍTULO: <valor>
|
| 807 |
+
DESCRIÇÃO: <valor>
|
| 808 |
"""
|
| 809 |
|
| 810 |
# 4. Enviar para o Gemini
|
|
|
|
| 821 |
content = response_gemini.get("content", "")
|
| 822 |
print(f"✅ Resposta recebida ({len(content)} chars)")
|
| 823 |
|
| 824 |
+
# 5. Processar Resposta (Novo formato TÍTULO/DESCRIÇÃO)
|
| 825 |
+
# Regex para capturar TÍTULO e DESCRIÇÃO
|
| 826 |
+
# Suporta múltiplos blocos se o modelo gerar mais de um
|
| 827 |
+
results = []
|
| 828 |
+
import re # Assuming re is not globally imported, adding it here for scope
|
| 829 |
+
pattern = re.compile(r"TÍTULO:\s*(.*?)\s*\nDESCRIÇÃO:\s*(.*?)(?=\n\s*TÍTULO:|$)", re.DOTALL | re.IGNORECASE)
|
| 830 |
+
|
| 831 |
+
matches = pattern.findall(content)
|
| 832 |
+
for title, description in matches:
|
| 833 |
+
results.append({
|
| 834 |
+
"title": title.strip(),
|
| 835 |
+
"description": description.strip()
|
| 836 |
+
})
|
| 837 |
+
|
| 838 |
+
if not results:
|
| 839 |
+
# Tentar formato sem quebra de linha exata ou variações
|
| 840 |
+
# Fallback simples
|
| 841 |
+
if "TÍTULO:" in content and "DESCRIÇÃO:" in content:
|
| 842 |
+
parts = content.split("TÍTULO:")[1:]
|
| 843 |
+
for part in parts:
|
| 844 |
+
if "DESCRIÇÃO:" in part:
|
| 845 |
+
t_part, d_part = part.split("DESCRIÇÃO:", 1)
|
| 846 |
+
results.append({
|
| 847 |
+
"title": t_part.strip(),
|
| 848 |
+
"description": d_part.strip()
|
| 849 |
+
})
|
| 850 |
+
|
| 851 |
+
if not results:
|
| 852 |
+
print(f"⚠️ Falha ao extrair TÍTULO/DESCRIÇÃO. Conteúdo bruto: {content[:200]}...")
|
| 853 |
+
return JSONResponse(content={"raw_content": content, "error": "Failed to parse format"}, status_code=200)
|
| 854 |
+
|
| 855 |
+
return results
|
| 856 |
|
| 857 |
except HTTPException:
|
| 858 |
raise
|