1
resposta

INTEGRANDO IA

SERIE

package br.com.benja.ScreenMatchNew.model;

import br.com.benja.ScreenMatchNew.service.ConsultaGemini;

import java.util.OptionalDouble;

public class Serie {
    private String titulo;
    private Integer totalTemporadas;
    private double avaliacao;
    private Categoria genero;         // Novo campo: Gênero da série
    private String atores;        // Novo campo: Atores principais
    private String poster;        // Novo campo: URL do pôster
    private String sinopse;        // Novo campo: Sinopse da série



    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Integer getTotalTemporadas() {
        return totalTemporadas;
    }

    public void setTotalTemporadas(Integer totalTemporadas) {
        this.totalTemporadas = totalTemporadas;
    }

    public double getAvaliacao() {
        return avaliacao;
    }

    public void setAvaliacao(double avaliacao) {
        this.avaliacao = avaliacao;
    }

    public Categoria getGenero() {
        return genero;
    }

    public void setGenero(Categoria genero) {
        this.genero = genero;
    }

    public String getAtores() {
        return atores;
    }

    public void setAtores(String atores) {
        this.atores = atores;
    }

    public String getPoster() {
        return poster;
    }

    public void setPoster(String poster) {
        this.poster = poster;
    }

    public String getSinopse() {
        return sinopse;
    }

    public void setSinopse(String sinopse) {
        this.sinopse = sinopse;
    }


    public Serie(DadosSerie dadosSerie) {
        this.titulo = dadosSerie.titulo();
        this.totalTemporadas = dadosSerie.totalTemporadas();
        this.avaliacao = OptionalDouble.of(Double.valueOf(dadosSerie.avaliacoesPorTemporada())).orElse(0);
        this.genero = Categoria.fromString(dadosSerie.genero().split(",")[0].trim());
        this.atores = dadosSerie.atores();
        this.poster = dadosSerie.poster();
        this.sinopse = ConsultaGemini.obterTraducao(dadosSerie.sinopse()).trim();


        try {
                this.genero = Categoria.fromString(dadosSerie.genero().split(",")[0].trim());
            } catch (IllegalArgumentException e) {
                this.genero = null; // ou Categoria.DESCONHECIDO, se existir
            }

        }

        @Override
        public String toString () {
            return "genero=" + genero +
                    ", titulo='" + titulo + '\'' +
                    ", totalTemporadas=" + totalTemporadas +
                    ", avaliacao=" + avaliacao +
                    ", atores='" + atores + '\'' +
                    ", poster='" + poster + '\'' +
                    ", sinopse='" + sinopse + '\'';
        }
    }

GEMINI ao inves de OpenAI

package br.com.benja.ScreenMatchNew.service;

import com.google.genai.Client;
import com.google.genai.types.GenerateContentResponse;

public class ConsultaGemini {

    private static final String CHAVE = "SUA CHAVE AQUI";
    public static String obterTraducao(String texto) {

        Client client = Client.builder().apiKey(CHAVE).build();;

        GenerateContentResponse response =
                client.models.generateContent(
                        "gemini-2.0-flash",
                        "Apenas traduza, sem me dizer nada alem disso, o seguinte trecho: " + texto,
                        null);

        return response.text();
    }
}
1 resposta

Seu código está bem estruturado e mostra uma abordagem interessante ao integrar a API da Gemini para realizar a tradução automática da sinopse da série. Aqui vão alguns comentários técnicos e sugestões construtivas:

Pontos positivos:
Organização e clareza:
A classe Serie está bem definida, com encapsulamento adequado dos atributos, uso correto de getters e setters, além de um toString() bem estruturado para exibir informações úteis.

Uso do OptionalDouble:
Embora o uso de OptionalDouble.of(...).orElse(0) funcione, nesse caso ele está redundante — como você já tem um valor do tipo double, pode simplificar.

Integração com Gemini:
A classe ConsultaGemini encapsula bem a lógica de chamada à API. O prompt direto “Apenas traduza...” é objetivo e reduz chances de respostas fora do esperado. Boa prática.

Sugestões de melhoria:
Evitar repetição da lógica do genero no construtor:
O this.genero = Categoria.fromString(...) está sendo atribuído duas vezes (uma fora e outra dentro do try/catch). Você pode manter apenas a do try/catch.

try {
this.genero = Categoria.fromString(dadosSerie.genero().split(",")[0].trim());
} catch (IllegalArgumentException e) {
this.genero = null; // ou Categoria.DESCONHECIDO
}

Segurança da chave da API:
A CHAVE está fixa no código. Para produção, o ideal é usar variáveis de ambiente ou arquivos .properties que não sejam versionados.

this.avaliacao = Double.parseDouble(dadosSerie.avaliacoesPorTemporada());

try {
GenerateContentResponse response = client.models.generateContent(...);
return response.text();
} catch (Exception e) {
return "Erro na tradução";
}