172 lines
6.8 KiB
Java
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());
|
|
}
|
|
}
|
|
} |