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 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 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>(){}.getType(); Gson gson = new Gson(); List 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 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 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()); } } }