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()); } } /** * TODO 1: Display movies for a specific genre and page * * Open this link in your browser (and check Pretty-print checkbox) to view json format: * https://api.meshcomp.ir/api/v1/genres/1/movies * * Steps: * - Call getMoviesByGenreList(genreId, page) to get JSON * - Parse JSON to JsonObject * - Get "movies" array (NOT "data") * - Loop through array and print: "ID: {id} | {title} ({year})" * - Also print total and total_pages * * PUT ALL PARSING CODE INSIDE try-catch */ public void displayMoviesByGenre(Long genreId, Long page) { // TODO: Write your code here // All parsing code must be inside try-catch try { // Your code here } 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; } /* BONUS TODO: Display complete movie details for a given movie ID Open this link in your browser (and check Pretty-print checkbox) to view json format: https://api.meshcomp.ir/api/v1/movies/1 INSTRUCTIONS: 1. Call getMovieById(movieId) to get the JSON response string 2. Check if response is null (if yes, print error and return) 3. Parse the JSON string to JsonObject (inside try-catch) 4. Use Gson to extract all fields from the JSON and map them to your Movie class: - Add missing JSON fields to your Movie class first (actors, awards, director, imdb_id, imdb_votes, metascore, plot, rated, released, runtime, type, writer) - Then use Gson to parse your json string 5. Print all movie details in a readable format (PUT ALL PARSING CODE INSIDE THE EXISTING try-catch) */ /* EXAMPLE OUTPUT: ======================================================================= THE SHAWSHANK REDEMPTION (1994) ======================================================================= Rating: 9.3/10 | Votes: 1,738,596 Director: Frank Darabont Cast: Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler Genre: Crime, Drama Runtime: 142 min | Rated: R Country: USA | Released: 14 Oct 1994 Plot: Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency. Awards: Nominated for 7 Oscars. Another 19 wins & 30 nominations. ======================================================================= */ public void displayMovieDetails(Long movieId) { // Step 1: Get JSON response from API String jsonResponse = getMovieById(movieId); // 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() // TODO: use Gson to parse the json // Your code here: } catch (Exception e) { System.err.println("ERROR parsing movie details: " + e.getMessage()); } } }