package com.miz.apis.tmdb; import android.content.Context; import android.preference.PreferenceManager; import android.text.TextUtils; import com.miz.abstractclasses.MovieApiService; import com.miz.db.DbAdapterMovies; import com.miz.functions.Actor; import com.miz.functions.CompleteActor; import com.miz.functions.MizLib; import com.miz.functions.WebMovie; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import static com.miz.functions.PreferenceKeys.INCLUDE_ADULT_CONTENT; public class TMDbMovieService extends MovieApiService { private static TMDbMovieService mService; private final String mTmdbApiKey; private final Context mContext; public static TMDbMovieService getInstance(Context context) { if (mService == null) mService = new TMDbMovieService(context); return mService; } private TMDbMovieService(Context context) { mContext = context; mTmdbApiKey = MizLib.getTmdbApiKey(mContext); } @Override public List<Movie> search(String query, String language) { language = getLanguage(language); String serviceUrl = ""; try { serviceUrl = "https://api.themoviedb.org/3/search/movie?query=" + URLEncoder.encode(query, "utf-8") + "&language=" + language + "&api_key=" + mTmdbApiKey; } catch (UnsupportedEncodingException e) {} return getListFromUrl(serviceUrl); } @Override public List<Movie> search(String query, String year, String language) { language = getLanguage(language); String serviceUrl = ""; try { serviceUrl = "https://api.themoviedb.org/3/search/movie?query=" + URLEncoder.encode(query, "utf-8") + "&language=" + language + "&year=" + year + "&api_key=" + mTmdbApiKey; } catch (UnsupportedEncodingException e) {} return getListFromUrl(serviceUrl); } @Override public List<Movie> searchByImdbId(String imdbId, String language) { language = getLanguage(language); ArrayList<Movie> results = new ArrayList<Movie>(); try { JSONObject jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/find/" + imdbId + "?language=" + language + "&external_source=imdb_id&api_key=" + mTmdbApiKey); JSONArray array = jObject.getJSONArray("movie_results"); String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); String imageSizeUrl = MizLib.getImageUrlSize(mContext); for (int i = 0; i < array.length(); i++) { Movie movie = new Movie(); movie.setTitle(array.getJSONObject(i).getString("title")); movie.setOriginalTitle(array.getJSONObject(i).getString("original_title")); movie.setReleasedate(array.getJSONObject(i).getString("release_date")); movie.setPlot(""); // TMDb doesn't support descriptions in search results movie.setRating(String.valueOf(array.getJSONObject(i).getDouble("vote_average"))); movie.setId(String.valueOf(array.getJSONObject(i).getInt("id"))); movie.setCover(baseUrl + imageSizeUrl + array.getJSONObject(i).getString("poster_path")); results.add(movie); } } catch (JSONException e) {} return results; } @Override public Movie get(String id, String json, String language) { Movie movie = new Movie(); movie.setId(id); if (id.equals(DbAdapterMovies.UNIDENTIFIED_ID)) return movie; try { // Get the base URL from the preferences String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); JSONObject jObject = null; if (TextUtils.isEmpty(json)) jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "?api_key=" + mTmdbApiKey + (language.equals("en") ? "" : "&language=" + language) + "&append_to_response=releases,trailers,credits,images"); else jObject = new JSONObject(json); movie.setTitle(MizLib.getStringFromJSONObject(jObject, "title", "")); movie.setPlot(MizLib.getStringFromJSONObject(jObject, "overview", "")); movie.setImdbId(MizLib.getStringFromJSONObject(jObject, "imdb_id", "")); movie.setRating(MizLib.getStringFromJSONObject(jObject, "vote_average", "0.0")); movie.setTagline(MizLib.getStringFromJSONObject(jObject, "tagline", "")); movie.setReleasedate(MizLib.getStringFromJSONObject(jObject, "release_date", "")); movie.setRuntime(MizLib.getStringFromJSONObject(jObject, "runtime", "0")); if (!language.equals("en")) { // This is a localized search - let's fill in the blanks JSONObject englishResults = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "?api_key=" + mTmdbApiKey + "&language=en&append_to_response=releases"); if (TextUtils.isEmpty(movie.getTitle())) movie.setTitle(MizLib.getStringFromJSONObject(englishResults, "title", "")); if (TextUtils.isEmpty(movie.getPlot())) movie.setPlot(MizLib.getStringFromJSONObject(englishResults, "overview", "")); if (TextUtils.isEmpty(movie.getTagline())) movie.setTagline(MizLib.getStringFromJSONObject(englishResults, "tagline", "")); if (TextUtils.isEmpty(movie.getRating())) movie.setRating(MizLib.getStringFromJSONObject(englishResults, "vote_average", "0.0")); if (TextUtils.isEmpty(movie.getReleasedate())) movie.setReleasedate(MizLib.getStringFromJSONObject(englishResults, "release_date", "")); if (movie.getRuntime().equals("0")) movie.setRuntime(MizLib.getStringFromJSONObject(englishResults, "runtime", "0")); } try { movie.setCover(baseUrl + MizLib.getImageUrlSize(mContext) + jObject.getString("poster_path")); } catch (Exception e) {} try { movie.setCollectionTitle(jObject.getJSONObject("belongs_to_collection").getString("name")); movie.setCollectionId(jObject.getJSONObject("belongs_to_collection").getString("id")); } catch (Exception e) {} if (!TextUtils.isEmpty(movie.getCollectionId()) && json == null) { JSONObject collection = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/collection/" + movie.getCollectionId() + "/images?api_key=" + mTmdbApiKey); JSONArray array = collection.getJSONArray("posters"); if (array.length() > 0) movie.setCollectionImage(baseUrl + MizLib.getImageUrlSize(mContext) + array.getJSONObject(0).getString("file_path")); } try { String genres = ""; for (int i = 0; i < jObject.getJSONArray("genres").length(); i++) genres = genres + jObject.getJSONArray("genres").getJSONObject(i).getString("name") + ", "; movie.setGenres(genres.substring(0, genres.length() - 2)); } catch (Exception e) {} try { if (jObject.getJSONObject("trailers").getJSONArray("youtube").length() > 0) { // Go through all YouTube links and looks for trailers JSONArray youtube = jObject.getJSONObject("trailers").getJSONArray("youtube"); for (int i = 0; i < youtube.length(); i++) { if (youtube.getJSONObject(i).getString("type").equals("Trailer")) { movie.setTrailer("http://www.youtube.com/watch?v=" + youtube.getJSONObject(i).getString("source")); break; } } // If no trailer was set, use whatever YouTube link is available (featurette, interviews, etc.) if (TextUtils.isEmpty(movie.getTrailer())) { movie.setTrailer("http://www.youtube.com/watch?v=" + jObject.getJSONObject("trailers").getJSONArray("youtube").getJSONObject(0).getString("source")); } } } catch (Exception e) {} try { for (int i = 0; i < jObject.getJSONObject("releases").getJSONArray("countries").length(); i++) { JSONObject jo = jObject.getJSONObject("releases").getJSONArray("countries").getJSONObject(i); if (jo.getString("iso_3166_1").equalsIgnoreCase("us") || jo.getString("iso_3166_1").equalsIgnoreCase(language)) movie.setCertification(jo.getString("certification")); } } catch (Exception e) {} try { StringBuilder cast = new StringBuilder(); JSONArray array = jObject.getJSONObject("credits").getJSONArray("cast"); for (int i = 0; i < array.length(); i++) { cast.append(array.getJSONObject(i).getString("name")); cast.append("|"); } movie.setCast(cast.toString()); } catch (Exception e) {} try { JSONArray array = jObject.getJSONObject("images").getJSONArray("backdrops"); if (array.length() > 0) { movie.setBackdrop(baseUrl + MizLib.getBackdropUrlSize(mContext) + array.getJSONObject(0).getString("file_path")); } else { // Try with English set as the language, if no results are returned (usually caused by a server-side cache error) try { jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "/images?api_key=" + mTmdbApiKey); JSONArray array2 = jObject.getJSONArray("backdrops"); if (array2.length() > 0) { movie.setBackdrop(baseUrl + MizLib.getBackdropUrlSize(mContext) + array2.getJSONObject(0).getString("file_path")); } } catch (Exception e) {} } } catch (Exception e) {} } catch (Exception e) { // If something goes wrong here, i.e. API error, we won't get any details // about the movie - in other words, it's unidentified movie.setId(DbAdapterMovies.UNIDENTIFIED_ID); } return movie; } @Override public Movie get(String id, String language) { return get(id, null, language); } public Movie getCompleteMovie(String id, String language) { Movie movie = new Movie(); movie.setId(id); if (id.equals(DbAdapterMovies.UNIDENTIFIED_ID)) return movie; try { // Get the base URL from the preferences String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); JSONObject jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "?api_key=" + mTmdbApiKey + (language.equals("en") ? "" : "&language=" + language) + "&append_to_response=releases,trailers,credits,images,similar_movies"); movie.setTitle(MizLib.getStringFromJSONObject(jObject, "title", "")); movie.setPlot(MizLib.getStringFromJSONObject(jObject, "overview", "")); movie.setImdbId(MizLib.getStringFromJSONObject(jObject, "imdb_id", "")); movie.setRating(MizLib.getStringFromJSONObject(jObject, "vote_average", "0.0")); movie.setTagline(MizLib.getStringFromJSONObject(jObject, "tagline", "")); movie.setReleasedate(MizLib.getStringFromJSONObject(jObject, "release_date", "")); movie.setRuntime(MizLib.getStringFromJSONObject(jObject, "runtime", "0")); if (!language.equals("en")) { // This is a localized search - let's fill in the blanks JSONObject englishResults = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "?api_key=" + mTmdbApiKey + "&language=en&append_to_response=releases"); if (TextUtils.isEmpty(movie.getTitle())) movie.setTitle(MizLib.getStringFromJSONObject(englishResults, "title", "")); if (TextUtils.isEmpty(movie.getPlot())) movie.setPlot(MizLib.getStringFromJSONObject(englishResults, "overview", "")); if (TextUtils.isEmpty(movie.getTagline())) movie.setTagline(MizLib.getStringFromJSONObject(englishResults, "tagline", "")); if (TextUtils.isEmpty(movie.getRating())) movie.setRating(MizLib.getStringFromJSONObject(englishResults, "vote_average", "0.0")); if (TextUtils.isEmpty(movie.getReleasedate())) movie.setReleasedate(MizLib.getStringFromJSONObject(englishResults, "release_date", "")); if (movie.getRuntime().equals("0")) movie.setRuntime(MizLib.getStringFromJSONObject(englishResults, "runtime", "0")); } try { movie.setCover(baseUrl + MizLib.getImageUrlSize(mContext) + jObject.getString("poster_path")); } catch (Exception e) {} try { String genres = ""; for (int i = 0; i < jObject.getJSONArray("genres").length(); i++) genres = genres + jObject.getJSONArray("genres").getJSONObject(i).getString("name") + ", "; movie.setGenres(genres.substring(0, genres.length() - 2)); } catch (Exception e) {} try { if (jObject.getJSONObject("trailers").getJSONArray("youtube").length() > 0) { // Go through all YouTube links and looks for trailers JSONArray youtube = jObject.getJSONObject("trailers").getJSONArray("youtube"); for (int i = 0; i < youtube.length(); i++) { if (youtube.getJSONObject(i).getString("type").equals("Trailer")) { movie.setTrailer("http://www.youtube.com/watch?v=" + youtube.getJSONObject(i).getString("source")); break; } } // If no trailer was set, use whatever YouTube link is available (featurette, interviews, etc.) if (TextUtils.isEmpty(movie.getTrailer())) { movie.setTrailer("http://www.youtube.com/watch?v=" + jObject.getJSONObject("trailers").getJSONArray("youtube").getJSONObject(0).getString("source")); } } } catch (Exception e) {} try { for (int i = 0; i < jObject.getJSONObject("releases").getJSONArray("countries").length(); i++) { JSONObject jo = jObject.getJSONObject("releases").getJSONArray("countries").getJSONObject(i); if (jo.getString("iso_3166_1").equalsIgnoreCase("us") || jo.getString("iso_3166_1").equalsIgnoreCase(language)) movie.setCertification(jo.getString("certification")); } } catch (Exception e) {} try { ArrayList<Actor> actors = new ArrayList<Actor>(); JSONArray array = jObject.getJSONObject("credits").getJSONArray("cast"); Set<String> actorIds = new HashSet<String>(); for (int i = 0; i < array.length(); i++) { if (!actorIds.contains(array.getJSONObject(i).getString("id"))) { actorIds.add(array.getJSONObject(i).getString("id")); actors.add(new Actor( array.getJSONObject(i).getString("name"), array.getJSONObject(i).getString("character"), array.getJSONObject(i).getString("id"), baseUrl + MizLib.getActorUrlSize(mContext) + array.getJSONObject(i).getString("profile_path"))); } } movie.setActors(actors); } catch (Exception e) {} try { ArrayList<WebMovie> similarMovies = new ArrayList<WebMovie>(); JSONArray jArray = jObject.getJSONObject("similar_movies").getJSONArray("results"); for (int i = 0; i < jArray.length(); i++) { if (!MizLib.isAdultContent(mContext, jArray.getJSONObject(i).getString("title")) && !MizLib.isAdultContent(mContext, jArray.getJSONObject(i).getString("original_title"))) { similarMovies.add(new WebMovie(mContext, jArray.getJSONObject(i).getString("original_title"), jArray.getJSONObject(i).getString("id"), baseUrl + MizLib.getImageUrlSize(mContext) + jArray.getJSONObject(i).getString("poster_path"), jArray.getJSONObject(i).getString("release_date"))); } } movie.setSimilarMovies(similarMovies); } catch (Exception ignored) {} try { JSONArray array = jObject.getJSONObject("images").getJSONArray("backdrops"); if (array.length() > 0) { movie.setBackdrop(baseUrl + MizLib.getBackdropUrlSize(mContext) + array.getJSONObject(0).getString("file_path")); } else { // Try with English set as the language, if no results are returned (usually caused by a server-side cache error) try { jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "/images?api_key=" + mTmdbApiKey); JSONArray array2 = jObject.getJSONArray("backdrops"); if (array2.length() > 0) { movie.setBackdrop(baseUrl + MizLib.getBackdropUrlSize(mContext) + array2.getJSONObject(0).getString("file_path")); } } catch (Exception e) {} } } catch (Exception e) {} } catch (Exception e) { // If something goes wrong here, i.e. API error, we won't get any details // about the movie - in other words, it's unidentified movie.setId(DbAdapterMovies.UNIDENTIFIED_ID); } return movie; } @Override public List<String> getCovers(String id) { ArrayList<String> covers = new ArrayList<String>(); String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); try { JSONObject jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "/images" + "?api_key=" + mTmdbApiKey); JSONArray jArray = jObject.getJSONArray("posters"); for (int i = 0; i < jArray.length(); i++) { covers.add(baseUrl + MizLib.getImageUrlSize(mContext) + MizLib.getStringFromJSONObject(jArray.getJSONObject(i), "file_path", "")); } } catch (JSONException e) {} return covers; } @Override public List<String> getBackdrops(String id) { ArrayList<String> covers = new ArrayList<String>(); String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); try { JSONObject jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "/images" + "?api_key=" + mTmdbApiKey); JSONArray jArray = jObject.getJSONArray("backdrops"); for (int i = 0; i < jArray.length(); i++) { covers.add(baseUrl + MizLib.getBackdropThumbUrlSize(mContext) + MizLib.getStringFromJSONObject(jArray.getJSONObject(i), "file_path", "")); } } catch (JSONException e) {} return covers; } private ArrayList<Movie> getListFromUrl(String serviceUrl) { ArrayList<Movie> results = new ArrayList<Movie>(); try { JSONObject jObject = MizLib.getJSONObject(mContext, serviceUrl); JSONArray array = jObject.getJSONArray("results"); String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); String imageSizeUrl = MizLib.getImageUrlSize(mContext); for (int i = 0; i < array.length(); i++) { Movie movie = new Movie(); movie.setTitle(array.getJSONObject(i).getString("title")); movie.setOriginalTitle(array.getJSONObject(i).getString("original_title")); movie.setReleasedate(array.getJSONObject(i).getString("release_date")); movie.setPlot(""); // TMDb doesn't support descriptions in search results movie.setRating(String.valueOf(array.getJSONObject(i).getDouble("vote_average"))); movie.setId(String.valueOf(array.getJSONObject(i).getInt("id"))); movie.setCover(baseUrl + imageSizeUrl + array.getJSONObject(i).getString("poster_path")); results.add(movie); } } catch (JSONException e) {} return results; } @Override public List<Movie> searchNgram(String query, String language) { language = getLanguage(language); String serviceUrl = ""; try { serviceUrl = "https://api.themoviedb.org/3/search/movie?query=" + URLEncoder.encode(query, "utf-8") + "&language=" + language + "&search_type=ngram&api_key=" + mTmdbApiKey; } catch (UnsupportedEncodingException e) {} return getListFromUrl(serviceUrl); } @Override public List<Actor> getActors(String id) { ArrayList<Actor> results = new ArrayList<Actor>(); String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); try { JSONObject jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "/credits?api_key=" + mTmdbApiKey); JSONArray jArray = jObject.getJSONArray("cast"); Set<String> actorIds = new HashSet<String>(); for (int i = 0; i < jArray.length(); i++) { if (!actorIds.contains(jArray.getJSONObject(i).getString("id"))) { actorIds.add(jArray.getJSONObject(i).getString("id")); results.add(new Actor( jArray.getJSONObject(i).getString("name"), jArray.getJSONObject(i).getString("character"), jArray.getJSONObject(i).getString("id"), baseUrl + MizLib.getActorUrlSize(mContext) + jArray.getJSONObject(i).getString("profile_path"))); } } } catch (Exception ignored) {} return results; } @Override public List<WebMovie> getSimilarMovies(String id) { ArrayList<WebMovie> results = new ArrayList<WebMovie>(); String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); try { JSONObject jObject = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/movie/" + id + "/similar_movies?api_key=" + mTmdbApiKey); JSONArray jArray = jObject.getJSONArray("results"); for (int i = 0; i < jArray.length(); i++) { if (!MizLib.isAdultContent(mContext, jArray.getJSONObject(i).getString("title")) && !MizLib.isAdultContent(mContext, jArray.getJSONObject(i).getString("original_title"))) { results.add(new WebMovie(mContext, jArray.getJSONObject(i).getString("original_title"), jArray.getJSONObject(i).getString("id"), baseUrl + MizLib.getImageUrlSize(mContext) + jArray.getJSONObject(i).getString("poster_path"), jArray.getJSONObject(i).getString("release_date"))); } } } catch (Exception ignored) {} return results; } public CompleteActor getCompleteActorDetails(final String actorId) { JSONObject json = MizLib.getJSONObject(mContext, "https://api.themoviedb.org/3/person/" + actorId + "?api_key=" + mTmdbApiKey + "&append_to_response=movie_credits,tv_credits,images,tagged_images"); String baseUrl = MizLib.getTmdbImageBaseUrl(mContext); boolean includeAdult = PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(INCLUDE_ADULT_CONTENT, false); // Set up actor details CompleteActor actor = new CompleteActor(actorId); actor.setName(MizLib.getStringFromJSONObject(json, "name", "")); actor.setBiography(MizLib.getStringFromJSONObject(json, "biography", "")); actor.setBirthday(MizLib.getStringFromJSONObject(json, "birthday", "")); actor.setDayOfDeath(MizLib.getStringFromJSONObject(json, "deathday", "")); actor.setPlaceOfBirth(MizLib.getStringFromJSONObject(json, "place_of_birth", "")); String profilePhoto = MizLib.getStringFromJSONObject(json, "profile_path", ""); if (!TextUtils.isEmpty(profilePhoto)) profilePhoto = baseUrl + "w500" + profilePhoto; actor.setProfilePhoto(profilePhoto); String profilePhotoThumb = MizLib.getStringFromJSONObject(json, "profile_path", ""); if (!TextUtils.isEmpty(profilePhoto)) profilePhotoThumb = baseUrl + MizLib.getActorUrlSize(mContext) + profilePhoto; actor.setProfilePhotoThumb(profilePhotoThumb); // Set up movies List<WebMovie> movies = new ArrayList<WebMovie>(); try { JSONArray movieArray = json.getJSONObject("movie_credits").getJSONArray("cast"); for (int i = 0; i < movieArray.length(); i++) { final JSONObject thisObject = movieArray.getJSONObject(i); boolean isAdult = thisObject.getBoolean("adult") | MizLib.isAdultContent(mContext, MizLib.getStringFromJSONObject(thisObject, "title", "")) | MizLib.isAdultContent(mContext, MizLib.getStringFromJSONObject(thisObject, "original_title", "")); // Continue to the next loop iteration if this is an adult title if (!includeAdult && isAdult) continue; WebMovie movie = new WebMovie(mContext, MizLib.getStringFromJSONObject(thisObject, "title", ""), String.valueOf(thisObject.getInt("id")), baseUrl + MizLib.getImageUrlSize(mContext) + MizLib.getStringFromJSONObject(thisObject, "poster_path", ""), MizLib.getStringFromJSONObject(thisObject, "release_date", "")); movies.add(movie); } } catch (JSONException ignored) {} finally { actor.setMovies(movies); } // Set up TV shows List<WebMovie> shows = new ArrayList<WebMovie>(); try { JSONArray showArray = json.getJSONObject("tv_credits").getJSONArray("cast"); for (int i = 0; i < showArray.length(); i++) { final JSONObject thisObject = showArray.getJSONObject(i); boolean isAdult = MizLib.isAdultContent(mContext, MizLib.getStringFromJSONObject(thisObject, "name", "")) | MizLib.isAdultContent(mContext, MizLib.getStringFromJSONObject(thisObject, "original_name", "")); // Continue to the next loop iteration if this is an adult title if (!includeAdult && isAdult) continue; WebMovie show = new WebMovie(mContext, MizLib.getStringFromJSONObject(thisObject, "name", ""), String.valueOf(thisObject.getInt("id")), baseUrl + MizLib.getImageUrlSize(mContext) + MizLib.getStringFromJSONObject(thisObject, "poster_path", ""), MizLib.getStringFromJSONObject(thisObject, "first_air_date", "")); shows.add(show); } } catch (JSONException ignored) {} finally { actor.setTvShows(shows); } int count = 0; try { count += json.getJSONObject("movie_credits").getJSONArray("cast").length(); count += json.getJSONObject("tv_credits").getJSONArray("cast").length(); } catch (JSONException ignored) {} actor.setKnownCreditCount(count); List<String> photos = new ArrayList<String>(); try { JSONArray photoArray = json.getJSONObject("images").getJSONArray("profiles"); for (int i = 0; i < photoArray.length(); i++) { photos.add(baseUrl + MizLib.getImageUrlSize(mContext) + photoArray.getJSONObject(i).getString("file_path")); } } catch (JSONException ignored) {} finally { actor.setPhotos(photos); } List<String> taggedPhotos = new ArrayList<String>(); try { JSONArray photoArray = json.getJSONObject("tagged_images").getJSONArray("results"); for (int i = 0; i < photoArray.length(); i++) { if (photoArray.getJSONObject(i).getString("image_type").equals("backdrop")) taggedPhotos.add(baseUrl + MizLib.getBackdropThumbUrlSize(mContext) + photoArray.getJSONObject(i).getString("file_path")); } } catch (JSONException ignored) {} finally { actor.setTaggedPhotos(taggedPhotos); } return actor; } }