Files
HW-03-oop-and-api/src/main/java/movie/apis/MovieService.java
T

172 lines
6.8 KiB
Java

package movie.apis;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class MovieService {
private final static String GENRES_URL = "https://api.meshcomp.ir/api/v1/genres";
private final static String MOVIE_BY_ID_URL = "https://api.meshcomp.ir/api/v1/movies/";
private final static HttpClient client = HttpClient.newHttpClient();
private String getGenresList() {
try {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(GENRES_URL))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
System.out.println("Genres List received successfully");
return response.body();
} else {
throw new IOException("HTTP error code: " + response.statusCode());
}
} catch (Exception e) {
System.out.println("!!Exception : " + e.getMessage());
}
return null;
}
private String getMoviesByGenreList(Long genreId, Long page) {
try {
String url = "https://api.meshcomp.ir/api/v1/genres/" + genreId + "/movies?page=" + page;
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
return response.body();
} else {
System.out.println("HTTP error code: " + response.statusCode());
return null;
}
} catch (Exception e) {
System.out.println("!!Exception : " + e.getMessage());
}
return null;
}
public void displayGenres() {
String jsonResponse = getGenresList();
if (jsonResponse == null) {
System.out.println("Failed to get genres");
return;
}
try {
JsonObject rootObject = JsonParser.parseString(jsonResponse).getAsJsonObject();
JsonArray genresArray = rootObject.getAsJsonArray("genres");
Type genreListType = new TypeToken<ArrayList<Genre>>(){}.getType();
Gson gson = new Gson();
List<Genre> genres = gson.fromJson(genresArray, genreListType);
System.out.println("\nALL GENRES:");
for (Genre genre : genres) {
System.out.println(genre.getId() + ". " + genre.getName());
}
System.out.println();
} catch (Exception e) {
System.err.println("ERROR parsing genres: " + e.getMessage());
}
}
public void displayMoviesByGenre(Long genreId, Long page) {
// TODO: Write your code here
try {
String jsonAsString = getMoviesByGenreList(genreId, page);
JsonObject jsonObj = JsonParser.parseString(jsonAsString).getAsJsonObject();
JsonArray moviesArray = jsonObj.getAsJsonArray("movies");
List<Movie> movies = new ArrayList<>();
for(JsonElement movie : moviesArray){
JsonObject movieAsObj = movie.getAsJsonObject();
System.out.printf("ID: %d | %s (%d)\n\n",
movieAsObj.get("id").getAsLong(), movieAsObj.get("title").getAsString(), movieAsObj.get("year").getAsLong());
movies.add(new Movie(movieAsObj.get("id").getAsLong(),
movieAsObj.get("title").getAsString()));
}
System.out.printf("Total: %d, total_pages: %d\n\n",
jsonObj.get("total").getAsLong(), jsonObj.get("total_pages").getAsLong());
} catch (Exception e) {
System.err.println("ERROR: " + e.getMessage());
}
}
/**
* BONUS: Fetch movie details from API using movie ID
* URL format: https://api.meshcomp.ir/api/v1/movies/{movieId}
*/
private String getMovieById(Long movieId) {
try {
// TODO: Complete this method
String url = MOVIE_BY_ID_URL + movieId;
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) return response.body();
return null;
} catch (Exception e) {
System.out.println("!!Exception : " + e.getMessage());
}
return null;
}
public void displayMovieDetails(Long movieId) {
// Step 1: Get JSON response from API
String jsonResponse = getMovieById(movieId);
// System.out.println(jsonResponse + "\n");
// Step 2: Check if we got valid data
// Step 3-5: Parse JSON and display details (PUT YOUR CODE INSIDE try-catch)
if (jsonResponse == null) {
System.out.println("Failed to get movie details for ID: " + movieId);
return;
}
try {
// TODO: Parse jsonResponse to JsonObject
// HINT: Use JsonParser.parseString(jsonResponse).getAsJsonObject()
JsonObject moviesObj = JsonParser.parseString(jsonResponse).getAsJsonObject();
// TODO: use Gson to parse the json
Gson gson = new Gson();
Movie movie = gson.fromJson(moviesObj, Movie.class);
String output = " =======================================================================\n" +
" "+ movie.getTitle() +"\n" +
" =======================================================================\n" +
" Rating: "+ movie.getImdb_rating() +" | Votes: "+ movie.getImdb_votes() + "\n" +
" Director: "+ movie.getDirector() +"\n" +
" Cast: "+ movie.getActors() +"\n" +
" Genre: "+ movie.getGenres() +"\n" +
" Runtime: "+ movie.getRuntime() +" | Rated: "+ movie.getRated() +"\n" +
" Country: "+ movie.getCountry() +" | Released: "+ movie.getReleased() +"\n" +
" Plot: " + movie.getPlot() +
"\n =======================================================================";
System.out.println(output);
} catch (Exception e) {
System.err.println("ERROR parsing movie details: " + e.getMessage());
}
}
}