Search in sources :

Example 16 with Movie

use of com.uwetrottmann.trakt5.entities.Movie in project SeriesGuide by UweTrottmann.

the class TmdbMoviesLoader method loadInBackground.

@Override
public Result loadInBackground() {
    String languageCode = DisplaySettings.getMoviesLanguage(getContext());
    String regionCode = DisplaySettings.getMoviesRegion(getContext());
    List<Movie> results = null;
    String action = null;
    try {
        Response<MovieResultsPage> response;
        if (TextUtils.isEmpty(query)) {
            MoviesService moviesService = this.moviesService.get();
            Call<MovieResultsPage> call;
            switch(link) {
                case POPULAR:
                    action = "get popular movies";
                    call = moviesService.popular(null, languageCode);
                    break;
                case DIGITAL:
                    action = "get movie digital releases";
                    call = tmdb.get().discoverMovie().with_release_type(new DiscoverFilter(DiscoverFilter.Separator.AND, ReleaseType.DIGITAL)).release_date_lte(getDateNow()).release_date_gte(getDateOneMonthAgo()).language(languageCode).region(regionCode).build();
                    break;
                case DISC:
                    action = "get movie disc releases";
                    call = tmdb.get().discoverMovie().with_release_type(new DiscoverFilter(DiscoverFilter.Separator.AND, ReleaseType.PHYSICAL)).release_date_lte(getDateNow()).release_date_gte(getDateOneMonthAgo()).language(languageCode).region(regionCode).build();
                    break;
                case IN_THEATERS:
                default:
                    action = "get now playing movies";
                    call = tmdb.get().discoverMovie().with_release_type(new DiscoverFilter(DiscoverFilter.Separator.OR, ReleaseType.THEATRICAL, ReleaseType.THEATRICAL_LIMITED)).release_date_lte(getDateNow()).release_date_gte(getDateOneMonthAgo()).language(languageCode).region(regionCode).build();
                    break;
            }
            response = call.execute();
        } else {
            action = "search for movies";
            response = searchService.get().movie(query, null, languageCode, false, null, null, null).execute();
        }
        if (response.isSuccessful()) {
            MovieResultsPage page = response.body();
            if (page != null) {
                results = page.results;
            }
        } else {
            SgTmdb.trackFailedRequest(getContext(), action, response);
            return buildErrorResult();
        }
    } catch (IOException e) {
        SgTmdb.trackFailedRequest(getContext(), action, e);
        // only check for connection here to allow hitting the response cache
        return AndroidUtils.isNetworkConnected(getContext()) ? buildErrorResult() : new Result(null, getContext().getString(R.string.offline));
    }
    return new Result(results, getContext().getString(R.string.no_results));
}
Also used : Movie(com.uwetrottmann.tmdb2.entities.Movie) DiscoverFilter(com.uwetrottmann.tmdb2.entities.DiscoverFilter) MovieResultsPage(com.uwetrottmann.tmdb2.entities.MovieResultsPage) IOException(java.io.IOException) MoviesService(com.uwetrottmann.tmdb2.services.MoviesService)

Example 17 with Movie

use of com.uwetrottmann.trakt5.entities.Movie in project SeriesGuide by UweTrottmann.

the class MovieDetailsFragment method populateMovieViews.

private void populateMovieViews() {
    /**
         * Get everything from TMDb. Also get additional rating from trakt.
         */
    final Ratings traktRatings = movieDetails.traktRatings();
    final Movie tmdbMovie = movieDetails.tmdbMovie();
    final boolean inCollection = movieDetails.inCollection;
    final boolean inWatchlist = movieDetails.inWatchlist;
    final boolean isWatched = movieDetails.isWatched;
    final int rating = movieDetails.userRating;
    textViewMovieTitle.setText(tmdbMovie.title);
    getActivity().setTitle(tmdbMovie.title);
    textViewMovieDescription.setText(tmdbMovie.overview);
    // release date and runtime: "July 17, 2009 | 95 min"
    StringBuilder releaseAndRuntime = new StringBuilder();
    if (tmdbMovie.release_date != null) {
        releaseAndRuntime.append(TimeTools.formatToLocalDate(getContext(), tmdbMovie.release_date));
        releaseAndRuntime.append(" | ");
    }
    releaseAndRuntime.append(getString(R.string.runtime_minutes, String.valueOf(tmdbMovie.runtime)));
    textViewMovieDate.setText(releaseAndRuntime.toString());
    // check-in button
    final String title = tmdbMovie.title;
    buttonMovieCheckIn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // display a check-in dialog
            MovieCheckInDialogFragment f = MovieCheckInDialogFragment.newInstance(tmdbId, title);
            f.show(getFragmentManager(), "checkin-dialog");
            Utils.trackAction(getActivity(), TAG, "Check-In");
        }
    });
    CheatSheet.setup(buttonMovieCheckIn);
    // hide check-in if not connected to trakt or hexagon is enabled
    boolean isConnectedToTrakt = TraktCredentials.get(getActivity()).hasCredentials();
    boolean displayCheckIn = isConnectedToTrakt && !HexagonSettings.isEnabled(getActivity());
    buttonMovieCheckIn.setVisibility(displayCheckIn ? View.VISIBLE : View.GONE);
    dividerMovieButtons.setVisibility(displayCheckIn ? View.VISIBLE : View.GONE);
    // watched button (only supported when connected to trakt)
    if (isConnectedToTrakt) {
        buttonMovieWatched.setText(isWatched ? R.string.action_unwatched : R.string.action_watched);
        CheatSheet.setup(buttonMovieWatched, isWatched ? R.string.action_unwatched : R.string.action_watched);
        Utils.setCompoundDrawablesRelativeWithIntrinsicBounds(buttonMovieWatched, 0, isWatched ? Utils.resolveAttributeToResourceId(getActivity().getTheme(), R.attr.drawableWatched) : Utils.resolveAttributeToResourceId(getActivity().getTheme(), R.attr.drawableWatch), 0, 0);
        buttonMovieWatched.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (isWatched) {
                    MovieTools.unwatchedMovie(SgApp.from(getActivity()), tmdbId);
                    Utils.trackAction(getActivity(), TAG, "Unwatched movie");
                } else {
                    MovieTools.watchedMovie(SgApp.from(getActivity()), tmdbId);
                    Utils.trackAction(getActivity(), TAG, "Watched movie");
                }
            }
        });
        buttonMovieWatched.setVisibility(View.VISIBLE);
    } else {
        buttonMovieWatched.setVisibility(View.GONE);
    }
    // collected button
    Utils.setCompoundDrawablesRelativeWithIntrinsicBounds(buttonMovieCollected, 0, inCollection ? R.drawable.ic_collected : Utils.resolveAttributeToResourceId(getActivity().getTheme(), R.attr.drawableCollect), 0, 0);
    buttonMovieCollected.setText(inCollection ? R.string.action_collection_remove : R.string.action_collection_add);
    CheatSheet.setup(buttonMovieCollected, inCollection ? R.string.action_collection_remove : R.string.action_collection_add);
    buttonMovieCollected.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (inCollection) {
                MovieTools.removeFromCollection(SgApp.from(getActivity()), tmdbId);
                Utils.trackAction(getActivity(), TAG, "Uncollected movie");
            } else {
                MovieTools.addToCollection(SgApp.from(getActivity()), tmdbId);
                Utils.trackAction(getActivity(), TAG, "Collected movie");
            }
        }
    });
    // watchlist button
    Utils.setCompoundDrawablesRelativeWithIntrinsicBounds(buttonMovieWatchlisted, 0, inWatchlist ? R.drawable.ic_listed : Utils.resolveAttributeToResourceId(getActivity().getTheme(), R.attr.drawableList), 0, 0);
    buttonMovieWatchlisted.setText(inWatchlist ? R.string.watchlist_remove : R.string.watchlist_add);
    CheatSheet.setup(buttonMovieWatchlisted, inWatchlist ? R.string.watchlist_remove : R.string.watchlist_add);
    buttonMovieWatchlisted.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (inWatchlist) {
                MovieTools.removeFromWatchlist(SgApp.from(getActivity()), tmdbId);
                Utils.trackAction(getActivity(), TAG, "Unwatchlist movie");
            } else {
                MovieTools.addToWatchlist(SgApp.from(getActivity()), tmdbId);
                Utils.trackAction(getActivity(), TAG, "Watchlist movie");
            }
        }
    });
    // show button bar
    containerMovieButtons.setVisibility(View.VISIBLE);
    // language button
    LanguageTools.LanguageData languageData = LanguageTools.getMovieLanguageData(getContext());
    if (languageData != null) {
        currentLanguageIndex = languageData.languageIndex;
        buttonMovieLanguage.setText(languageData.languageString);
    } else {
        buttonMovieLanguage.setText(null);
    }
    buttonMovieLanguage.setVisibility(View.VISIBLE);
    // ratings
    textViewRatingsTmdbValue.setText(TraktTools.buildRatingString(tmdbMovie.vote_average));
    textViewRatingsTmdbVotes.setText(TraktTools.buildRatingVotesString(getActivity(), tmdbMovie.vote_count));
    if (traktRatings != null) {
        textViewRatingsTraktVotes.setText(TraktTools.buildRatingVotesString(getActivity(), traktRatings.votes));
        textViewRatingsTraktValue.setText(TraktTools.buildRatingString(traktRatings.rating));
    }
    // if movie is not in database, can't handle user ratings
    if (!inCollection && !inWatchlist && !isWatched) {
        textViewRatingsTraktUserLabel.setVisibility(View.GONE);
        textViewRatingsTraktUser.setVisibility(View.GONE);
        containerRatings.setClickable(false);
        // cheat sheet
        containerRatings.setLongClickable(false);
    } else {
        textViewRatingsTraktUserLabel.setVisibility(View.VISIBLE);
        textViewRatingsTraktUser.setVisibility(View.VISIBLE);
        textViewRatingsTraktUser.setText(TraktTools.buildUserRatingString(getActivity(), rating));
        containerRatings.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                rateMovie();
            }
        });
        CheatSheet.setup(containerRatings, R.string.action_rate);
    }
    containerRatings.setVisibility(View.VISIBLE);
    // genres
    textViewMovieGenresLabel.setVisibility(View.VISIBLE);
    Utils.setValueOrPlaceholder(textViewMovieGenres, TmdbTools.buildGenresString(tmdbMovie.genres));
    // trakt comments link
    buttonMovieComments.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent i = new Intent(getActivity(), TraktCommentsActivity.class);
            i.putExtras(TraktCommentsActivity.createInitBundleMovie(title, tmdbId));
            Utils.startActivityWithAnimation(getActivity(), i, v);
            Utils.trackAction(v.getContext(), TAG, "Comments");
        }
    });
    buttonMovieComments.setVisibility(View.VISIBLE);
    // load poster, cache on external storage
    if (TextUtils.isEmpty(tmdbMovie.poster_path)) {
        frameLayoutMoviePoster.setClickable(false);
        frameLayoutMoviePoster.setFocusable(false);
    } else {
        final String smallImageUrl = TmdbSettings.getImageBaseUrl(getActivity()) + TmdbSettings.POSTER_SIZE_SPEC_W342 + tmdbMovie.poster_path;
        ServiceUtils.loadWithPicasso(getActivity(), smallImageUrl).into(imageViewMoviePoster, new Callback.EmptyCallback() {

            @Override
            public void onSuccess() {
                Bitmap bitmap = ((BitmapDrawable) imageViewMoviePoster.getDrawable()).getBitmap();
                paletteAsyncTask = Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {

                    @Override
                    public void onGenerated(Palette palette) {
                        int color = palette.getVibrantColor(Color.WHITE);
                        color = ColorUtils.setAlphaComponent(color, 50);
                        rootLayoutMovie.setBackgroundColor(color);
                    }
                });
            }
        });
        // click listener for high resolution poster
        frameLayoutMoviePoster.setFocusable(true);
        frameLayoutMoviePoster.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                String largeImageUrl = TmdbSettings.getImageBaseUrl(getActivity()) + TmdbSettings.POSTER_SIZE_SPEC_ORIGINAL + tmdbMovie.poster_path;
                Intent intent = new Intent(getActivity(), FullscreenImageActivity.class);
                intent.putExtra(FullscreenImageActivity.EXTRA_PREVIEW_IMAGE, smallImageUrl);
                intent.putExtra(FullscreenImageActivity.EXTRA_IMAGE, largeImageUrl);
                Utils.startActivityWithAnimation(getActivity(), intent, view);
            }
        });
    }
}
Also used : Movie(com.uwetrottmann.tmdb2.entities.Movie) Palette(android.support.v7.graphics.Palette) MovieCheckInDialogFragment(com.battlelancer.seriesguide.ui.dialogs.MovieCheckInDialogFragment) Intent(android.content.Intent) ImageView(android.widget.ImageView) BindView(butterknife.BindView) View(android.view.View) TextView(android.widget.TextView) NestedScrollView(android.support.v4.widget.NestedScrollView) LanguageTools(com.battlelancer.seriesguide.util.LanguageTools) Ratings(com.uwetrottmann.trakt5.entities.Ratings) Bitmap(android.graphics.Bitmap) Callback(com.squareup.picasso.Callback) OnClickListener(android.view.View.OnClickListener)

Example 18 with Movie

use of com.uwetrottmann.trakt5.entities.Movie in project SeriesGuide by UweTrottmann.

the class SgSyncAdapter method performTraktSync.

private UpdateResult performTraktSync(HashSet<Integer> localShows, long currentTime) {
    if (!TraktCredentials.get(getContext()).hasCredentials()) {
        Timber.d("performTraktSync: no auth, skip");
        return UpdateResult.SUCCESS;
    }
    if (!AndroidUtils.isNetworkConnected(getContext())) {
        return UpdateResult.INCOMPLETE;
    }
    // get last activity timestamps
    TraktTools traktTools = app.getTraktTools();
    LastActivities lastActivity = traktTools.getLastActivity();
    if (lastActivity == null) {
        // trakt is likely offline or busy, try later
        Timber.e("performTraktSync: last activity download failed");
        return UpdateResult.INCOMPLETE;
    }
    if (!AndroidUtils.isNetworkConnected(getContext())) {
        return UpdateResult.INCOMPLETE;
    }
    if (localShows.size() == 0) {
        Timber.d("performTraktSync: no local shows, skip shows");
    } else {
        // download and upload episode watched and collected flags
        if (performTraktEpisodeSync(localShows, lastActivity.episodes, currentTime) != UpdateResult.SUCCESS) {
            return UpdateResult.INCOMPLETE;
        }
        if (!AndroidUtils.isNetworkConnected(getContext())) {
            return UpdateResult.INCOMPLETE;
        }
        // download show ratings
        if (traktTools.downloadShowRatings(lastActivity.shows.rated_at) != UpdateResult.SUCCESS) {
            return UpdateResult.INCOMPLETE;
        }
        if (!AndroidUtils.isNetworkConnected(getContext())) {
            return UpdateResult.INCOMPLETE;
        }
        // download episode ratings
        if (traktTools.downloadEpisodeRatings(lastActivity.episodes.rated_at) != UpdateResult.SUCCESS) {
            return UpdateResult.INCOMPLETE;
        }
        if (!AndroidUtils.isNetworkConnected(getContext())) {
            return UpdateResult.INCOMPLETE;
        }
    }
    // sync watchlist and collection with trakt
    if (app.getMovieTools().syncMovieListsWithTrakt(lastActivity.movies) != UpdateResult.SUCCESS) {
        return UpdateResult.INCOMPLETE;
    }
    if (!AndroidUtils.isNetworkConnected(getContext())) {
        return UpdateResult.INCOMPLETE;
    }
    // download watched movies
    if (traktTools.downloadWatchedMovies(lastActivity.movies.watched_at) != UpdateResult.SUCCESS) {
        return UpdateResult.INCOMPLETE;
    }
    // clean up any useless movies (not watched or not in any list)
    MovieTools.deleteUnusedMovies(getContext());
    if (!AndroidUtils.isNetworkConnected(getContext())) {
        return UpdateResult.INCOMPLETE;
    }
    // download movie ratings
    return traktTools.downloadMovieRatings(lastActivity.movies.rated_at);
}
Also used : TraktTools(com.battlelancer.seriesguide.util.TraktTools) LastActivities(com.uwetrottmann.trakt5.entities.LastActivities)

Example 19 with Movie

use of com.uwetrottmann.trakt5.entities.Movie in project SeriesGuide by UweTrottmann.

the class TraktTools method downloadMovieRatings.

/**
     * Downloads trakt movie ratings and applies the latest ones to the database.
     *
     * <p> To apply all ratings, set {@link TraktSettings#KEY_LAST_MOVIES_RATED_AT} to 0.
     */
public UpdateResult downloadMovieRatings(DateTime ratedAt) {
    if (ratedAt == null) {
        Timber.e("downloadMovieRatings: null rated_at");
        return UpdateResult.INCOMPLETE;
    }
    long lastRatedAt = TraktSettings.getLastMoviesRatedAt(context);
    if (!ratedAt.isAfter(lastRatedAt)) {
        // not initial sync, no ratings have changed
        Timber.d("downloadMovieRatings: no changes since %tF %tT", lastRatedAt, lastRatedAt);
        return UpdateResult.SUCCESS;
    }
    if (!TraktCredentials.get(context).hasCredentials()) {
        return UpdateResult.INCOMPLETE;
    }
    // download rated shows
    List<RatedMovie> ratedMovies;
    try {
        Response<List<RatedMovie>> response = traktSync.get().ratingsMovies(RatingsFilter.ALL, Extended.DEFAULT_MIN).execute();
        if (response.isSuccessful()) {
            ratedMovies = response.body();
        } else {
            if (SgTrakt.isUnauthorized(context, response)) {
                return UpdateResult.INCOMPLETE;
            }
            SgTrakt.trackFailedRequest(context, "get movie ratings", response);
            return UpdateResult.INCOMPLETE;
        }
    } catch (IOException e) {
        SgTrakt.trackFailedRequest(context, "get movie ratings", e);
        return UpdateResult.INCOMPLETE;
    }
    if (ratedMovies == null) {
        Timber.e("downloadMovieRatings: null response");
        return UpdateResult.INCOMPLETE;
    }
    if (ratedMovies.isEmpty()) {
        Timber.d("downloadMovieRatings: no ratings on trakt");
        return UpdateResult.SUCCESS;
    }
    // trakt last activity rated_at timestamp is set after the rating timestamp
    // so include ratings that are a little older
    long ratedAtThreshold = lastRatedAt - 5 * DateUtils.MINUTE_IN_MILLIS;
    // go through ratings, latest first (trakt sends in that order)
    ArrayList<ContentProviderOperation> batch = new ArrayList<>();
    for (RatedMovie movie : ratedMovies) {
        if (movie.rating == null || movie.movie == null || movie.movie.ids == null || movie.movie.ids.tmdb == null) {
            // skip, can't handle
            continue;
        }
        if (movie.rated_at != null && movie.rated_at.isBefore(ratedAtThreshold)) {
            // no need to apply older ratings again
            break;
        }
        // if a movie does not exist, this update will do nothing
        ContentProviderOperation op = ContentProviderOperation.newUpdate(SeriesGuideContract.Movies.buildMovieUri(movie.movie.ids.tmdb)).withValue(SeriesGuideContract.Movies.RATING_USER, movie.rating.value).build();
        batch.add(op);
    }
    // apply database updates
    try {
        DBUtils.applyInSmallBatches(context, batch);
    } catch (OperationApplicationException e) {
        Timber.e(e, "downloadMovieRatings: database update failed");
        return UpdateResult.INCOMPLETE;
    }
    // save last rated instant
    PreferenceManager.getDefaultSharedPreferences(context).edit().putLong(TraktSettings.KEY_LAST_MOVIES_RATED_AT, ratedAt.getMillis()).commit();
    Timber.d("downloadMovieRatings: success, last rated_at %tF %tT", ratedAt.getMillis(), ratedAt.getMillis());
    return UpdateResult.SUCCESS;
}
Also used : ContentProviderOperation(android.content.ContentProviderOperation) ArrayList(java.util.ArrayList) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) RatedMovie(com.uwetrottmann.trakt5.entities.RatedMovie) IOException(java.io.IOException) OperationApplicationException(android.content.OperationApplicationException)

Example 20 with Movie

use of com.uwetrottmann.trakt5.entities.Movie in project SeriesGuide by UweTrottmann.

the class MovieTools method lookupTraktId.

/**
     * @return {@code null} if looking up the id failed, -1 if the movie was not found or the movie
     * id if it was found.
     */
@Nullable
public Integer lookupTraktId(int movieTmdbId) {
    try {
        Response<List<SearchResult>> response = traktSearch.get().idLookup(IdType.TMDB, String.valueOf(movieTmdbId), Type.MOVIE, null, 1, 1).execute();
        if (response.isSuccessful()) {
            List<SearchResult> results = response.body();
            if (results == null || results.size() != 1) {
                Timber.e("Finding trakt movie failed (no results)");
                return -1;
            }
            SearchResult result = results.get(0);
            if (result.movie != null && result.movie.ids != null) {
                return result.movie.ids.trakt;
            }
            Timber.e("Finding trakt movie failed (not in results)");
            return -1;
        } else {
            SgTrakt.trackFailedRequest(context, "movie trakt id lookup", response);
        }
    } catch (IOException e) {
        SgTrakt.trackFailedRequest(context, "movie trakt id lookup", e);
    }
    return null;
}
Also used : List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) MovieList(com.uwetrottmann.seriesguide.backend.movies.model.MovieList) SearchResult(com.uwetrottmann.trakt5.entities.SearchResult) IOException(java.io.IOException) Nullable(android.support.annotation.Nullable)

Aggregations

Movie (com.uwetrottmann.tmdb2.entities.Movie)14 IOException (java.io.IOException)7 ArrayList (java.util.ArrayList)7 SyncMovie (com.uwetrottmann.trakt5.entities.SyncMovie)5 List (java.util.List)5 OperationApplicationException (android.content.OperationApplicationException)4 LinkedList (java.util.LinkedList)4 ContentProviderOperation (android.content.ContentProviderOperation)3 Nullable (androidx.annotation.Nullable)3 HistoryEntry (com.uwetrottmann.trakt5.entities.HistoryEntry)3 Intent (android.content.Intent)2 Nullable (android.support.annotation.Nullable)2 MovieDetails (com.battlelancer.seriesguide.ui.movies.MovieDetails)2 MovieList (com.uwetrottmann.seriesguide.backend.movies.model.MovieList)2 BaseMovie (com.uwetrottmann.trakt5.entities.BaseMovie)2 Comment (com.uwetrottmann.trakt5.entities.Comment)2 Episode (com.uwetrottmann.trakt5.entities.Episode)2 Friend (com.uwetrottmann.trakt5.entities.Friend)2 LastActivities (com.uwetrottmann.trakt5.entities.LastActivities)2 Ratings (com.uwetrottmann.trakt5.entities.Ratings)2