Segue a resolução da atividade proposta.
Classe Titulo:
//imports
public class Titulo implements Comparable<Titulo>{
private String nome;
private int anoDeLancamento;
private int duracaoEmMinutos;
private boolean incluidoNoPlano;
private double somaDasAvaliacoes;
private int totalDeAvaliacoes;
public Titulo(String nome, int anoDeLancamento) {
this.nome = nome;
this.anoDeLancamento = anoDeLancamento;
}
public Titulo(TituloOmdb tituloOmdb) {
this.nome = tituloOmdb.title();
if (tituloOmdb.year().length() > 4 || tituloOmdb.year().equals("N/A")) {
this.anoDeLancamento = 0;
throw new ErroDeConversaoDeAPIException("Data inconsistente ou não disponível");
} else {
this.anoDeLancamento = Integer.parseInt(tituloOmdb.year());
}
if (tituloOmdb.runtime().equals("N/A")) {
this.duracaoEmMinutos = 0;
throw new ErroDeConversaoDeAPIException("Duração não disponível");
} else {
this.duracaoEmMinutos = Integer.parseInt(tituloOmdb.runtime().replaceAll("[^0-9]", ""));
}
}
//Getters and setters.
public double pegaMedia() {
if (totalDeAvaliacoes != 0) {
return somaDasAvaliacoes/totalDeAvaliacoes;
} else {
return 0.0;
}
}
public void avalia(double avaliacao){
somaDasAvaliacoes += avaliacao;
totalDeAvaliacoes++;
}
@Override
public String toString() {
return "(" + this.nome + " (" + this.anoDeLancamento + ")" +
", duração: " + this.duracaoEmMinutos + " minutos)\n";
}
@Override
public int compareTo(Titulo o) {
return this.getNome().compareTo(o.getNome());
}
}
Record TituloOmdb:
package br.com.alura.screenmatch.modelos;
public record TituloOmdb(String title, String year, String runtime) {
}
Classe PrincipalComBusca:
//imports
public class PrincipalComBusca {
public static void main(String[] args) throws IOException, InterruptedException {
Scanner sc = new Scanner(System.in);
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.setPrettyPrinting()
.create();
List<Titulo> listaDeTitulos = new LinkedList<>();
String busca = "";
while (!busca.equalsIgnoreCase("sair")) {
System.out.println("Digite o nome do filme ou sair: ");
busca = sc.nextLine();
if (busca.equalsIgnoreCase("sair")) {
break;
}
String nomeFilmeCodificado = URLEncoder.encode(busca, StandardCharsets.UTF_8);
String OMDB_API_KEY = "api_key";
String url = "https://www.omdbapi.com/?t=" + nomeFilmeCodificado + "&apikey=" + OMDB_API_KEY;
ConsultaAPI consulta = new ConsultaAPI();
String json = consulta.consultaAPI(url);
System.out.println("Json de retorno da API: " + json);
TituloOmdb tituloOmdb = gson.fromJson(json, TituloOmdb.class);
System.out.println("TítuloOmdb: " + tituloOmdb);
try {
Titulo meuTitulo = new Titulo(tituloOmdb);
System.out.println("Título convertido: " + meuTitulo);
listaDeTitulos.add(meuTitulo);
} catch (ErroDeConversaoDeAPIException e) {
System.out.println("Houve um erro!");
System.out.println(e.getMessage());
}
}
FileWriter writer = new FileWriter("filmes.txt");
writer.write(listaDeTitulos.toString());
writer.close();
System.out.println(listaDeTitulos);
System.out.println("Fim do programa");
sc.close();
}
}
Output:
Digite o nome do filme ou sair:
akira
Json de retorno da API: {"Title":"Akira","Year":"1988",...}
TítuloOmdb: TituloOmdb[title=Akira, year=1988, runtime=124 min]
Título convertido: (Akira (1988), duração: 124 minutos)
Digite o nome do filme ou sair:
cyberpunk
Json de retorno da API: {"Title":"Cyberpunk","Year":"1990",...}
TítuloOmdb: TituloOmdb[title=Cyberpunk, year=1990, runtime=60 min]
Título convertido: (Cyberpunk (1990), duração: 60 minutos)
Digite o nome do filme ou sair:
animatrix
Json de retorno da API: {"Title":"The Animatrix","Year":"2003",...}
TítuloOmdb: TituloOmdb[title=The Animatrix, year=2003, runtime=100 min]
Título convertido: (The Animatrix (2003), duração: 100 minutos)
Digite o nome do filme ou sair:
sair
[(Akira (1988), duração: 124 minutos)
, (Cyberpunk (1990), duração: 60 minutos)
, (The Animatrix (2003), duração: 100 minutos)
]
Fim do programa
Process finished with exit code 0