diff --git a/README.md b/README.md index b2b0ac9..8174c3e 100644 --- a/README.md +++ b/README.md @@ -121,64 +121,40 @@ Understanding: You must be able to explain your implementation ## Bonus Tasks ✒️ 1. Fetch and display movie information using movie ID -In this section, you must implement the ability to search for a movie by its ID. The user enters an ID, and the program displays complete movie details. +Implement movie search by ID. User enters an ID, program displays complete movie details. -Movie Class Fields (already defined): +### ⚠️ First: Add Missing Fields to Movie Class +The API returns more data than your current class supports. Add these fields: +- `actors`, `awards`, `director`, `imdb_id`, `imdb_votes`, `metascore`, `plot`, `rated`, `released`, `runtime`, `type`, `writer` -- id (Long) - Movie identifier +### Implementation Steps: -- title (String) - Movie title +1. **Complete `getMovieById(movieId)`** + - Build request to: `https://api.meshcomp.ir/api/v1/movies/{movieId}` + - If status 200 → return JSON body, else → return null -- year (String) - Release year - -- genres (List) - List of genres - -- images (String) - Poster image URL - -- country (String) - Production country - -- imdbRating (String) - IMDB rating - -Implementation Steps: - -- Build and Send Request (getMovieById method): - - - Create HTTP request to: https://api.meshcomp.ir/api/v1/movies/{movieId} - - - Replace {movieId} with the ID from user - - - Send request and get response - -- Handle Response (getMovieById method): - - - If status code is 200, return JSON body - - - Otherwise, print error and return null - -- Parse JSON and Create Movie Object (displayMovieDetails method): - - - Parse JSON response to JsonObject - - - Extract all fields: id, title, year, poster, country, imdb_rating - - - Parse "genres" array and convert each to Genre object - - - Create a Movie object with all extracted data - -- Display Results (displayMovieDetails method): - - - Print all movie details in a clean format - -2. Advanced search (title, genre, year, rating, etc.) - -3. Sorting options for movies - -4. Save/load favorite movies to/from a file - -5. Improved console menu design - -6. GUI version using JavaFX +2. **Complete `displayMovieDetails(movieId)`** + - Call `getMovieById()` → check for null + - Use Gson to parse JSON to Movie object (after adding fields above) + - Print formatted output (see example below) +### 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. + ======================================================================= + +``` --- ## References 📚 @@ -201,5 +177,4 @@ Jackson Tutorial: --- ## Submission ⌛ -Deadline: May 1st (11 Ordibehesht) - +Deadline: May 1st (11 Ordibehesht) \ No newline at end of file diff --git a/src/main/java/movie/apis/Movie.java b/src/main/java/movie/apis/Movie.java index c8cc4e2..969774a 100644 --- a/src/main/java/movie/apis/Movie.java +++ b/src/main/java/movie/apis/Movie.java @@ -10,10 +10,10 @@ public class Movie { private Long id; private String title; - private List genres; - private String images; + private List genres; + private List images; private String year; - private String imdbRating; + private String imdb_rating; private String country; // TODO: Create a constructor with all fields diff --git a/src/main/java/movie/apis/MovieService.java b/src/main/java/movie/apis/MovieService.java index cbbe70b..3f053f5 100644 --- a/src/main/java/movie/apis/MovieService.java +++ b/src/main/java/movie/apis/MovieService.java @@ -90,7 +90,8 @@ public class MovieService { /** * TODO 1: Display movies for a specific genre and page * - * JSON format: { "movies": [ { "id": 1, "title": "Movie", "year": "1994" } ], "total": 177, "total_pages": 18 } + * 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 @@ -131,56 +132,59 @@ public class MovieService { } return null; } - - /** - * BONUS TODO: Display complete movie details for a given movie ID - * - * Expected JSON format from getMovieById(): - * { - * "id": 1, - * "title": "The Shawshank Redemption", - * "year": "1994", - * "genres": ["Crime", "Drama"], - * "poster": "https://moviesapi.ir/images/tt0111161_poster.jpg", - * "country": "USA", - * "imdb_rating": "9.3" - * } - * - * INSTRUCTIONS: - * 1. Call getMovieById(movieId) to get the JSON response - * 2. Check if response is null (if yes, print error and return) - * 3. Parse the JSON string to JsonObject (inside try-catch) - * 4. Extract all fields: id, title, year, genres array, poster, country, imdb_rating - * 5. Convert genres array to comma-separated string - * 6. Print all movie details in a readable format - * - * PUT ALL PARSING CODE INSIDE THE EXISTING try-catch - * - * @param movieId The ID of the movie to display + + /* + 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; } - - // Step 3-6: Parse JSON and display details (PUT YOUR CODE INSIDE try-catch) try { // TODO: Parse jsonResponse to JsonObject - // TODO: Extract id, title, year, genres array, poster, country, imdb_rating - // TODO: Convert genres array to a readable string - // TODO: Print all movie details // HINT: Use JsonParser.parseString(jsonResponse).getAsJsonObject() - // HINT: Use getAsJsonArray("genres") to get genres - // HINT: For each genre, use getAsString() - + // TODO: use Gson to parse the json // Your code here: - - } catch (Exception e) { System.err.println("ERROR parsing movie details: " + e.getMessage()); }