示例#1
0
static void
on_search_ready (GObject *source,
                 GAsyncResult *result,
                 gpointer user_data)
{
  ResolveClosure *closure = (ResolveClosure *) user_data;
  GrlTmdbRequest *request = GRL_TMDB_REQUEST (source);
  GValue *value;
  GError *error = NULL;

  GRL_DEBUG ("Initial search ready...");
  if (!grl_tmdb_request_run_finish (GRL_TMDB_REQUEST (source),
                                    result,
                                    &error)) {
    resolve_closure_callback (closure, error);
    resolve_closure_free (closure);
    g_error_free (error);
    return;
  }

  value = grl_tmdb_request_get (request, "$.total_results");
  if (g_value_get_int64 (value) == 0) {
    /* Nothing found */
    resolve_closure_callback (closure, NULL);
    resolve_closure_free (closure);
    g_value_unset (value);
    g_free (value);
    return;
  }
  g_value_unset (value);
  g_free (value);

  value = grl_tmdb_request_get (request, "$.results[0].id");
  if (value == NULL) {
    /* Cannot continue without id */
    error = g_error_new_literal (GRL_CORE_ERROR,
                                 GRL_CORE_ERROR_RESOLVE_FAILED,
                                 _("Remote data does not contain valid identifier"));
    resolve_closure_callback (closure, error);
    resolve_closure_free (closure);
    g_error_free (error);
    return;
  }

  if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_TMDB_ID)) {
    char *tmdb_id = g_strdup_printf ("%" G_GINT64_FORMAT,
                                     g_value_get_int64 (value));
    grl_data_set_string (GRL_DATA (closure->rs->media),
                         GRL_TMDB_METADATA_KEY_TMDB_ID, tmdb_id);
    g_free (tmdb_id);
  }

  closure->id = g_value_get_int64 (value);
  g_value_unset (value);
  g_free (value);

  if (SHOULD_RESOLVE (GRL_METADATA_KEY_RATING)) {
    value = grl_tmdb_request_get (request, "$.results[0].vote_average");
    if (value != NULL) {
      grl_media_set_rating (closure->rs->media,
                            (float) g_value_get_double (value),
                            10.0f);
      g_value_unset (value);
      g_free (value);
    }
    g_hash_table_remove (closure->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_RATING));
  }

  /* Add thumbnails first, and posters and backdrops later.
   * Posters more likely make a good thumbnail than backdrops.
   */
  if (SHOULD_RESOLVE (GRL_METADATA_KEY_THUMBNAIL)) {
    value = grl_tmdb_request_get (request, "$.results[0].poster_path");
    if (value != NULL) {
        add_image (closure->self, closure->rs->media,
                   GRL_METADATA_KEY_THUMBNAIL,
                   g_value_get_string (value));

        g_value_unset (value);
        g_free (value);
    }
  }

  if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER)) {
    value = grl_tmdb_request_get (request, "$.results[0].poster_path");
    if (value != NULL) {
        add_image (closure->self, closure->rs->media,
                   GRL_TMDB_METADATA_KEY_POSTER,
                   g_value_get_string (value));

        g_value_unset (value);
        g_free (value);
    }
  }

  if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP)) {
    value = grl_tmdb_request_get (request, "$.results[0].backdrop_path");
    if (value != NULL) {
      add_image (closure->self, closure->rs->media,
                 GRL_TMDB_METADATA_KEY_BACKDROP,
                 g_value_get_string (value));

      g_value_unset (value);
      g_free (value);
    }
  }

  if (SHOULD_RESOLVE (GRL_METADATA_KEY_ORIGINAL_TITLE)) {
    value = grl_tmdb_request_get (request, "$.results[0].original_title");
    if (value != NULL) {
      grl_media_video_set_original_title (GRL_MEDIA_VIDEO (closure->rs->media),
                                          g_value_get_string (value));
      g_value_unset (value);
      g_free (value);
    }
    g_hash_table_remove (closure->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ORIGINAL_TITLE));
  }

  remove_request (closure, request);

  /* Check if we need to do additional requests. */
  if (closure->slow) {
    resolve_slow_details (closure);

    if (run_pending_requests (closure, G_MAXINT) > 0)
      return;
  }

  resolve_closure_callback (closure, NULL);
  resolve_closure_free (closure);
}
static void
update_media (GrlMedia *media, GHashTable *video)
{
  gchar *str;

  str = g_hash_table_lookup (video, VIMEO_VIDEO_ID);
  if (str)
  {
    char *external_url;

    grl_media_set_id (media, str);
    external_url = g_strdup_printf ("https://vimeo.com/%s", str);
    grl_media_set_external_url (media, external_url);
    g_free (external_url);
  }

  str = g_hash_table_lookup (video, VIMEO_VIDEO_TITLE);
  if (str)
  {
    grl_media_set_title (media, str);
  }

  str = g_hash_table_lookup (video, VIMEO_VIDEO_DESCRIPTION);
  if (str)
  {
    grl_media_set_description (media, str);
  }

  str = g_hash_table_lookup (video, VIMEO_VIDEO_DURATION);
  if (str)
  {
    grl_media_set_duration (media, str_to_gint (str));
  }

  str = g_hash_table_lookup (video, VIMEO_VIDEO_OWNER_NAME);
  if (str)
  {
    grl_media_set_author (media, str);
  }

  str = g_hash_table_lookup (video, VIMEO_VIDEO_UPLOAD_DATE);
  if (str)
  {
    GDateTime *date = parse_date (str);
    if (date) {
      grl_media_set_publication_date (media, date);
      g_date_time_unref (date);
    }
  }

  str = g_hash_table_lookup (video, VIMEO_VIDEO_THUMBNAIL);
  if (str)
  {
    grl_media_set_thumbnail (media, str);
  }

  str = g_hash_table_lookup (video, VIMEO_VIDEO_WIDTH);
  if (str)
  {
    grl_media_video_set_width (GRL_MEDIA_VIDEO (media), str_to_gint (str));
  }

  str = g_hash_table_lookup (video, VIMEO_VIDEO_HEIGHT);
  if (str)
  {
    grl_media_video_set_height (GRL_MEDIA_VIDEO (media), str_to_gint (str));
  }
}
示例#3
0
static void
on_request_ready (GObject *source,
                  GAsyncResult *result,
                  gpointer user_data) {
  ResolveClosure *closure = (ResolveClosure *) user_data;
  GrlTmdbRequest *request = GRL_TMDB_REQUEST (source);
  const GrlTmdbRequestDetail detail = grl_tmdb_request_get_detail (request);
  GError *error = NULL;
  GList *values, *iter;
  GValue *value;

  GRL_DEBUG ("Detail request (%s) ready for movie #%" G_GUINT64_FORMAT "...",
             grl_tmdb_request_detail_to_string (detail), closure->id);

  if (!grl_tmdb_request_run_finish (GRL_TMDB_REQUEST (source),
                                    result,
                                    &error)) {
    /* Just remove the request and hope the others have some data */
    GRL_WARNING ("Failed to get %s: %s",
                 grl_tmdb_request_get_uri (request),
                 error->message);
    goto out;
  }

  switch (detail) {
    case GRL_TMDB_REQUEST_DETAIL_MOVIE:
    {
      if (SHOULD_RESOLVE (GRL_METADATA_KEY_GENRE)) {
        iter = values = grl_tmdb_request_get_string_list (request, "$.genres..name");
        while (iter != NULL) {
          grl_data_add_string (GRL_DATA (closure->rs->media),
                               GRL_METADATA_KEY_GENRE, iter->data);
          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_STUDIO)) {
        iter = values = grl_tmdb_request_get_string_list (request, "$.production_companies..name");
        while (iter != NULL) {
          grl_data_add_string (GRL_DATA (closure->rs->media),
                               GRL_METADATA_KEY_STUDIO, iter->data);
          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_SITE)) {
        value = grl_tmdb_request_get (request, "$.homepage");
        if (value != NULL) {
          grl_media_set_site (closure->rs->media, g_value_get_string (value));
          g_value_unset (value);
          g_free (value);
        }
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_DESCRIPTION)) {
        value = grl_tmdb_request_get (request, "$.overview");
        if (value != NULL) {
          grl_media_set_description (closure->rs->media,
                                     g_value_get_string (value));
          g_value_unset (value);
          g_free (value);
        }
      }

      if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_IMDB_ID)) {
        value = grl_tmdb_request_get (request, "$.imdb_id");
        if (value != NULL) {
          grl_data_set_string (GRL_DATA (closure->rs->media),
                               GRL_TMDB_METADATA_KEY_IMDB_ID,
                               g_value_get_string (value));
          g_value_unset (value);
          g_free (value);
        }
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_RATING)) {
        value = grl_tmdb_request_get (request, "$.vote_average");
        if (value != NULL) {
          grl_media_set_rating (closure->rs->media,
                                (float) g_value_get_double (value),
                                10.0f);
          g_value_unset (value);
          g_free (value);
        }
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_ORIGINAL_TITLE)) {
        value = grl_tmdb_request_get (request, "$.original_title");
        if (value != NULL) {
          grl_media_video_set_original_title (GRL_MEDIA_VIDEO (closure->rs->media),
                                              g_value_get_string (value));
          g_value_unset (value);
          g_free (value);
        }
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_TITLE)) {
        value = grl_tmdb_request_get (request, "$.title");
        if (value != NULL) {
          grl_media_set_title (closure->rs->media, g_value_get_string (value));
          g_value_unset (value);
          g_free (value);
        }
      }

      if (!closure->slow) {
        /* Add thumbnails first and poster and backdrops later.
         * Posters more likely make a good thumbnail than backdrops.
         */
        if (SHOULD_RESOLVE (GRL_METADATA_KEY_THUMBNAIL)) {
          value = grl_tmdb_request_get (request, "$.poster_path");
          if (value != NULL) {
              add_image (closure->self, closure->rs->media,
                         GRL_METADATA_KEY_THUMBNAIL,
                         g_value_get_string (value));

              g_value_unset (value);
              g_free (value);
          }
        }

        if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER)) {
          value = grl_tmdb_request_get (request, "$.poster_path");
          if (value != NULL) {
              add_image (closure->self, closure->rs->media,
                         GRL_TMDB_METADATA_KEY_POSTER,
                         g_value_get_string (value));

              g_value_unset (value);
              g_free (value);
          }
        }

        if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP)) {
          value = grl_tmdb_request_get (request, "$.backdrop_path");
          if (value != NULL) {
            add_image (closure->self, closure->rs->media,
                       GRL_TMDB_METADATA_KEY_BACKDROP,
                       g_value_get_string (value));

            g_value_unset (value);
            g_free (value);
          }
        }
      }
    }
    break;
    case GRL_TMDB_REQUEST_DETAIL_MOVIE_IMAGES:
    {
      /* Add thumbnails first, and posters and backdrops later.
       * Posters more likely make a good thumbnail than backdrops.
       */
      if (SHOULD_RESOLVE (GRL_METADATA_KEY_THUMBNAIL)) {
        iter = values = grl_tmdb_request_get_string_list_with_filter (request,
                                                                      "$.posters",
                                                                      neutral_backdrop_filter);
        while (iter != NULL) {
          add_image (closure->self, closure->rs->media,
                     GRL_METADATA_KEY_THUMBNAIL,
                     iter->data);

          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }

      if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER)) {
        iter = values = grl_tmdb_request_get_string_list_with_filter (request,
                                                                      "$.posters",
                                                                      neutral_backdrop_filter);
        while (iter != NULL) {
          add_image (closure->self, closure->rs->media,
                     GRL_TMDB_METADATA_KEY_POSTER,
                     iter->data);

          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }

      if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP)) {
        iter = values = grl_tmdb_request_get_string_list_with_filter (request,
                                                                      "$.backdrops",
                                                                      neutral_backdrop_filter);
        while (iter != NULL) {
          add_image (closure->self, closure->rs->media,
                     GRL_TMDB_METADATA_KEY_BACKDROP,
                     iter->data);

          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }
    }
    break;
    case GRL_TMDB_REQUEST_DETAIL_MOVIE_KEYWORDS:
    {
      if (SHOULD_RESOLVE (GRL_METADATA_KEY_KEYWORD)) {
        iter = values = grl_tmdb_request_get_string_list (request,
                                                          "$.keywords..name");
        while (iter != NULL) {
          grl_media_add_keyword (closure->rs->media, iter->data);
          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }
    }
    break;
    case GRL_TMDB_REQUEST_DETAIL_MOVIE_CAST:
    {
      if (SHOULD_RESOLVE (GRL_METADATA_KEY_PERFORMER)) {
        values = grl_tmdb_request_get_string_list (request, "$.cast..name");
        iter = values;
        while (iter != NULL) {
          grl_media_video_add_performer (GRL_MEDIA_VIDEO (closure->rs->media),
                                         iter->data);
          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_PRODUCER)) {
        values = grl_tmdb_request_get_string_list_with_filter (request,
                                                               "$.crew[*]",
                                                               producer_filter);
        iter = values;
        while (iter != NULL) {
            grl_media_video_add_producer (GRL_MEDIA_VIDEO (closure->rs->media),
                                          iter->data);
          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_DIRECTOR)) {
        values = grl_tmdb_request_get_string_list_with_filter (request,
                                                               "$.crew[*]",
                                                               director_filter);
        iter = values;
        while (iter != NULL) {
          grl_media_video_add_director (GRL_MEDIA_VIDEO (closure->rs->media),
                                        iter->data);
          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }

      if (SHOULD_RESOLVE (GRL_METADATA_KEY_AUTHOR)) {
        values = grl_tmdb_request_get_string_list_with_filter (request,
                                                               "$.crew[*]",
                                                               writer_filter);
        iter = values;
        while (iter != NULL) {
          grl_media_add_author (GRL_MEDIA (closure->rs->media),
                                iter->data);
          iter = iter->next;
        }
        g_list_free_full (values, g_free);
      }
    }
    break;
    case GRL_TMDB_REQUEST_DETAIL_MOVIE_RELEASE_INFO:
    {
      if (SHOULD_RESOLVE (GRL_METADATA_KEY_REGION) ||
              SHOULD_RESOLVE (GRL_METADATA_KEY_CERTIFICATE) ||
              SHOULD_RESOLVE (GRL_METADATA_KEY_PUBLICATION_DATE)) {
        values = grl_tmdb_request_get_list_with_filter (request,
                                                        "$.countries[*]",
                                                        NULL);

        for (iter = values; iter != NULL; iter = iter->next) {
          const char *region, *cert, *date;
          GDateTime *pubdate;
          JsonObject *object;

          object = json_node_get_object (iter->data);
          region = json_object_get_string_member (object, "iso_3166_1");
          cert = json_object_get_string_member (object, "certification");
          date = json_object_get_string_member (object, "release_date");
          pubdate = parse_date (date);

          grl_media_add_region_data (closure->rs->media, region, pubdate, cert);

          g_date_time_unref (pubdate);
        }

        g_list_free_full (values, (GDestroyNotify) json_node_free);
      }
    }
    break;
    default:
      break;
  }

out:
  if (error != NULL) {
    g_error_free (error);
  }

  remove_request (closure, request);

  if (g_queue_is_empty (closure->pending_requests)) {
    resolve_closure_callback (closure, NULL);
    resolve_closure_free (closure);
  }
}