static void resolve_slow_details (ResolveClosure *closure) { if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP) || SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER)) queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE_IMAGES); if (SHOULD_RESOLVE (GRL_METADATA_KEY_RATING) || SHOULD_RESOLVE (GRL_METADATA_KEY_ORIGINAL_TITLE) || SHOULD_RESOLVE (GRL_METADATA_KEY_TITLE) || SHOULD_RESOLVE (GRL_METADATA_KEY_GENRE) || SHOULD_RESOLVE (GRL_METADATA_KEY_STUDIO) || SHOULD_RESOLVE (GRL_METADATA_KEY_SITE) || SHOULD_RESOLVE (GRL_METADATA_KEY_DESCRIPTION) || SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_IMDB_ID)) queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE); if (SHOULD_RESOLVE (GRL_METADATA_KEY_KEYWORD)) queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE_KEYWORDS); if (SHOULD_RESOLVE (GRL_METADATA_KEY_PERFORMER) || SHOULD_RESOLVE (GRL_METADATA_KEY_PRODUCER) || SHOULD_RESOLVE (GRL_METADATA_KEY_DIRECTOR) || SHOULD_RESOLVE (GRL_METADATA_KEY_AUTHOR)) queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE_CAST); if (SHOULD_RESOLVE (GRL_METADATA_KEY_REGION) || SHOULD_RESOLVE (GRL_METADATA_KEY_CERTIFICATE) || SHOULD_RESOLVE (GRL_METADATA_KEY_PUBLICATION_DATE)) queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE_RELEASE_INFO); }
static void resolve_slow_details (ResolveClosure *closure) { GList *details = NULL; GrlTmdbRequest *request; if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP) || SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER)) details = g_list_prepend (details, GUINT_TO_POINTER (GRL_TMDB_REQUEST_DETAIL_MOVIE_IMAGES)); if (SHOULD_RESOLVE (GRL_METADATA_KEY_RATING) || SHOULD_RESOLVE (GRL_METADATA_KEY_ORIGINAL_TITLE) || SHOULD_RESOLVE (GRL_METADATA_KEY_TITLE) || SHOULD_RESOLVE (GRL_METADATA_KEY_GENRE) || SHOULD_RESOLVE (GRL_METADATA_KEY_STUDIO) || SHOULD_RESOLVE (GRL_METADATA_KEY_SITE) || SHOULD_RESOLVE (GRL_METADATA_KEY_DESCRIPTION) || SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_IMDB_ID)) details = g_list_prepend (details, GUINT_TO_POINTER (GRL_TMDB_REQUEST_DETAIL_MOVIE)); if (SHOULD_RESOLVE (GRL_METADATA_KEY_KEYWORD)) details = g_list_prepend (details, GUINT_TO_POINTER (GRL_TMDB_REQUEST_DETAIL_MOVIE_KEYWORDS)); if (SHOULD_RESOLVE (GRL_METADATA_KEY_PERFORMER) || SHOULD_RESOLVE (GRL_METADATA_KEY_PRODUCER) || SHOULD_RESOLVE (GRL_METADATA_KEY_DIRECTOR) || SHOULD_RESOLVE (GRL_METADATA_KEY_AUTHOR)) details = g_list_prepend (details, GUINT_TO_POINTER (GRL_TMDB_REQUEST_DETAIL_MOVIE_CAST)); if (SHOULD_RESOLVE (GRL_METADATA_KEY_REGION) || SHOULD_RESOLVE (GRL_METADATA_KEY_CERTIFICATE) || SHOULD_RESOLVE (GRL_METADATA_KEY_PUBLICATION_DATE)) details = g_list_prepend (details, GUINT_TO_POINTER (GRL_TMDB_REQUEST_DETAIL_MOVIE_RELEASE_INFO)); if (details == NULL) return; if (g_list_length (details) == 1) { queue_detail_request (closure, GPOINTER_TO_UINT (details->data)); return; } GRL_DEBUG ("Requesting aggregated info for movie #%" G_GUINT64_FORMAT "...", closure->id); request = grl_tmdb_request_new_details_list (closure->self->priv->api_key, details, closure->id); g_list_free (details); queue_request (closure, request, on_request_ready); }
static void grl_tmdb_source_resolve (GrlSource *source, GrlSourceResolveSpec *rs) { ResolveClosure *closure; GrlTmdbRequest *request; const char *title = NULL; const char *str_movie_id; GrlTmdbSource *self = GRL_TMDB_SOURCE (source); guint64 movie_id = 0; GList *it; if (!grl_media_is_video (rs->media)) { /* We only entertain videos */ rs->callback (source, rs->operation_id, rs->media, rs->user_data, NULL); return; } /* If the media is a TV show, don't handle it */ if (grl_media_get_show (rs->media) != NULL) { rs->callback (source, rs->operation_id, rs->media, rs->user_data, NULL); return; } /* Prefer resolving by movie-id: This is more reliable and saves the search query. */ str_movie_id = grl_data_get_string (GRL_DATA (rs->media), GRL_TMDB_METADATA_KEY_TMDB_ID); if (str_movie_id) movie_id = strtoull (str_movie_id, NULL, 10); /* Try title if no movie-id could be found. */ if (movie_id == 0) title = grl_media_get_title (rs->media); if (movie_id == 0 && title == NULL) { /* Can't search for anything without a title or the movie-id ... */ rs->callback (source, rs->operation_id, rs->media, rs->user_data, NULL); return; } GRL_DEBUG ("grl_tmdb_source_resolve"); closure = g_slice_new0 (ResolveClosure); closure->self = g_object_ref (self); closure->rs = rs; closure->pending_requests = g_queue_new (); closure->keys = g_hash_table_new (g_direct_hash, g_direct_equal); closure->slow = FALSE; closure->id = movie_id; it = rs->keys; /* Copy keys to list for faster lookup */ while (it) { g_hash_table_add (closure->keys, it->data); /* Enable slow resolution if slow keys are requested */ closure->slow |= g_hash_table_contains (self->priv->slow_keys, it->data); it = it->next; } /* Disable slow resolution if slow keys where requested, but the operation * options explicitly ask for fast resolving only. */ if (grl_operation_options_get_resolution_flags (rs->options) & GRL_RESOLVE_FAST_ONLY) closure->slow = FALSE; /* We did not receive the config yet, queue request. Config callback will * take care of flushing the queue when ready. */ if (self->priv->configuration == NULL && self->priv->config_pending) { g_queue_push_tail (self->priv->pending_resolves, closure); return; } if (self->priv->configuration == NULL) { GRL_DEBUG ("Fetching TMDb configuration..."); /* We need to fetch TMDb's configuration for the image paths */ request = grl_tmdb_request_new_configuration (closure->self->priv->api_key); g_assert (g_queue_is_empty (closure->pending_requests)); queue_request (closure, request, on_configuration_ready); self->priv->config_pending = TRUE; } if (title) { GRL_DEBUG ("Running initial search for title \"%s\"...", title); request = grl_tmdb_request_new_search (closure->self->priv->api_key, title); queue_request (closure, request, on_search_ready); run_pending_requests (closure, 1); } else { GRL_DEBUG ("Running %s lookup for movie #%" G_GUINT64_FORMAT "...", closure->slow ? "slow" : "fast", movie_id); if (closure->slow) { resolve_slow_details (closure); } else { queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE); } run_pending_requests (closure, G_MAXINT); } }