[grilo-plugins] tmdb: Permit resolving by tmdb-id
- From: Mathias Hasselmann <hasselmm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grilo-plugins] tmdb: Permit resolving by tmdb-id
- Date: Wed, 19 Dec 2012 20:58:58 +0000 (UTC)
commit 13f5ec616aae1f90b50a5d01fbac3f1ad53f5197
Author: Mathias Hasselmann <mathias openismus com>
Date: Tue Dec 4 02:08:08 2012 +0100
tmdb: Permit resolving by tmdb-id
src/tmdb/grl-tmdb.c | 292 ++++++++++++++++++++++----------
test/Makefile.am | 9 +
test/test_data/tmdb/fast-by-id.ini | 10 +
test/test_tmdb_fast_resolution_by_id.c | 117 +++++++++++++
test/test_tmdb_full_resolution.c | 2 +-
5 files changed, 342 insertions(+), 88 deletions(-)
---
diff --git a/src/tmdb/grl-tmdb.c b/src/tmdb/grl-tmdb.c
index 92ccde2..ce9d91b 100644
--- a/src/tmdb/grl-tmdb.c
+++ b/src/tmdb/grl-tmdb.c
@@ -25,6 +25,7 @@
#endif
#include <string.h>
+#include <stdlib.h>
#include <grilo.h>
#include <net/grl-net.h>
@@ -76,7 +77,13 @@ struct _ResolveClosure {
gboolean slow;
};
+struct _PendingRequest {
+ GrlTmdbRequest *request;
+ GAsyncReadyCallback callback;
+};
+
typedef struct _ResolveClosure ResolveClosure;
+typedef struct _PendingRequest PendingRequest;
static GrlTmdbSource *grl_tmdb_source_new (const char *api_key);
@@ -112,6 +119,8 @@ register_metadata_key (GrlRegistry *registry,
const char *blurb);
static void resolve_closure_free (ResolveClosure *closure);
+static void resolve_slow_details (ResolveClosure *closure);
+
/* =================== GrlTmdbMetadata Plugin =============== */
@@ -228,6 +237,8 @@ grl_tmdb_source_init (GrlTmdbSource *self)
/* Fast keys */
g_hash_table_add (self->priv->supported_keys,
+ GRLKEYID_TO_POINTER (GRL_METADATA_KEY_TITLE));
+ g_hash_table_add (self->priv->supported_keys,
GRLKEYID_TO_POINTER (GRL_METADATA_KEY_THUMBNAIL));
g_hash_table_add (self->priv->supported_keys,
GRLKEYID_TO_POINTER (GRL_TMDB_METADATA_KEY_BACKDROP));
@@ -398,11 +409,71 @@ resolve_closure_callback (ResolveClosure *closure,
g_error_free (error);
}
+static void queue_request (ResolveClosure *closure,
+ GrlTmdbRequest *request,
+ GAsyncReadyCallback callback)
+{
+ PendingRequest *pending_request;
+
+ pending_request = g_slice_new0 (PendingRequest);
+ pending_request->request = request;
+ pending_request->callback = callback;
+
+ g_queue_push_tail (closure->pending_requests, pending_request);
+}
+
+static int run_pending_requests (ResolveClosure *closure,
+ int max_num_request)
+{
+ int num_requests = 0;
+ GList *it;
+
+ for (it = closure->pending_requests->head; it; it = it->next) {
+ if (num_requests >= max_num_request)
+ break;
+
+ PendingRequest *const pending_request = it->data;
+
+ grl_tmdb_request_run_async (pending_request->request,
+ closure->self->priv->wc,
+ pending_request->callback,
+ NULL,
+ closure);
+
+ ++num_requests;
+ }
+
+ return num_requests;
+}
+
+static void pending_request_free (gpointer data)
+{
+ PendingRequest *const pending_request = data;
+ g_object_unref (pending_request->request);
+ g_slice_free (PendingRequest, pending_request);
+}
+
+static void remove_request (ResolveClosure *closure,
+ GrlTmdbRequest *request)
+{
+ GList *it;
+
+ for (it = closure->pending_requests->head; it; it = it->next) {
+ PendingRequest *const pending_request = it->data;
+
+ if (pending_request->request == request) {
+ g_queue_unlink (closure->pending_requests, it);
+ pending_request_free (pending_request);
+ break;
+ }
+ }
+}
+
static void
resolve_closure_free (ResolveClosure *closure)
{
g_object_unref (closure->self);
- g_queue_free_full (closure->pending_requests, g_object_unref);
+ g_queue_free_full (closure->pending_requests, pending_request_free);
g_hash_table_destroy (closure->keys);
g_slice_free (ResolveClosure, closure);
}
@@ -583,6 +654,60 @@ on_request_ready (GObject *source,
g_value_unset (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);
+ }
+ }
+
+ 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);
+ }
+ }
+
+ 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);
+ }
+ }
+
+ if (!closure->slow) {
+ /* Add posters first and backdrops later.
+ * Posters more likely make a good thumbnail than backdrops.
+ */
+ 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);
+ }
+ }
+
+ 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);
+ }
+ }
+ }
}
break;
case GRL_TMDB_REQUEST_DETAIL_MOVIE_IMAGES:
@@ -709,8 +834,8 @@ out:
if (error != NULL) {
g_error_free (error);
}
- g_queue_remove (closure->pending_requests, request);
- g_object_unref (request);
+
+ remove_request (closure, request);
if (g_queue_is_empty (closure->pending_requests)) {
resolve_closure_callback (closure, NULL);
@@ -718,25 +843,6 @@ out:
}
}
-static GrlTmdbRequest *
-create_and_run_request (GrlTmdbSource *self,
- ResolveClosure *closure,
- GrlTmdbRequestDetail id)
-{
- GrlTmdbRequest *request;
-
- request = grl_tmdb_request_new_details (self->priv->api_key,
- id,
- closure->id);
- grl_tmdb_request_run_async (request,
- self->priv->wc,
- on_request_ready,
- NULL,
- closure);
-
- return request;
-}
-
static void
on_search_ready (GObject *source,
GAsyncResult *result,
@@ -744,7 +850,6 @@ on_search_ready (GObject *source,
{
ResolveClosure *closure = (ResolveClosure *) user_data;
GrlTmdbRequest *request = GRL_TMDB_REQUEST (source);
- GrlTmdbSource *self = closure->self;
GValue *value;
GError *error = NULL;
@@ -797,6 +902,7 @@ on_search_ready (GObject *source,
10.0f);
g_value_unset (value);
}
+ g_hash_table_remove (closure->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_RATING));
}
/* Add posters first and backdrops later.
@@ -810,7 +916,6 @@ on_search_ready (GObject *source,
g_value_get_string (value));
g_value_unset (value);
-
}
}
@@ -825,15 +930,6 @@ on_search_ready (GObject *source,
}
}
- if (SHOULD_RESOLVE (GRL_METADATA_KEY_CERTIFICATE)) {
- value = grl_tmdb_request_get (request, "$.results[0].adult");
- if (value != NULL) {
- if (g_value_get_boolean (value))
- grl_media_set_certificate (closure->rs->media, "adult");
- g_value_unset (value);
- }
- }
-
if (SHOULD_RESOLVE (GRL_METADATA_KEY_ORIGINAL_TITLE)) {
value = grl_tmdb_request_get (request, "$.results[0].original_title");
if (value != NULL) {
@@ -841,58 +937,62 @@ on_search_ready (GObject *source,
g_value_get_string (value));
g_value_unset (value);
}
+ g_hash_table_remove (closure->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ORIGINAL_TITLE));
}
- g_queue_pop_head (closure->pending_requests);
- g_object_unref (source);
+ remove_request (closure, request);
- /* No need to do additional requests */
- if (!closure->slow) {
- resolve_closure_callback (closure, NULL);
- resolve_closure_free (closure);
- return;
+ /* Check if we need to do additional requests. */
+ if (closure->slow) {
+ resolve_slow_details (closure);
+
+ if (run_pending_requests (closure, G_MAXINT) > 0)
+ return;
}
- /* We need to do additional requests. Check if we should have resolved
- * images and try to get some more */
+ resolve_closure_callback (closure, NULL);
+ resolve_closure_free (closure);
+}
+
+static void queue_detail_request (ResolveClosure *closure,
+ GrlTmdbRequestDetail detail)
+{
+ GrlTmdbRequest *request;
+
+ request = grl_tmdb_request_new_details (closure->self->priv->api_key,
+ detail, closure->id);
+
+ queue_request (closure, request, on_request_ready);
+}
+
+static void resolve_slow_details (ResolveClosure *closure)
+{
if (SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_BACKDROP) ||
SHOULD_RESOLVE (GRL_TMDB_METADATA_KEY_POSTER))
- g_queue_push_tail (closure->pending_requests,
- create_and_run_request (self,
- closure,
- GRL_TMDB_REQUEST_DETAIL_MOVIE_IMAGES));
+ queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE_IMAGES);
- if (SHOULD_RESOLVE (GRL_METADATA_KEY_GENRE) ||
+ 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))
- g_queue_push_tail (closure->pending_requests,
- create_and_run_request (self,
- closure,
- GRL_TMDB_REQUEST_DETAIL_MOVIE));
+ queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE);
if (SHOULD_RESOLVE (GRL_METADATA_KEY_KEYWORD))
- g_queue_push_tail (closure->pending_requests,
- create_and_run_request (self,
- closure,
- GRL_TMDB_REQUEST_DETAIL_MOVIE_KEYWORDS));
+ 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))
- g_queue_push_tail (closure->pending_requests,
- create_and_run_request (self,
- closure,
- GRL_TMDB_REQUEST_DETAIL_MOVIE_CAST));
+ 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))
- g_queue_push_tail (closure->pending_requests,
- create_and_run_request (self,
- closure,
- GRL_TMDB_REQUEST_DETAIL_MOVIE_RELEASE_INFO));
+ queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE_RELEASE_INFO);
}
static void
@@ -906,6 +1006,8 @@ on_configuration_ready (GObject *source,
GError *error = NULL;
GValue *value;
+ GRL_DEBUG ("Configuration request ready...");
+
if (!grl_tmdb_request_run_finish (GRL_TMDB_REQUEST (source),
result,
&error)) {
@@ -926,7 +1028,8 @@ on_configuration_ready (GObject *source,
return;
}
- self->priv->configuration = g_queue_pop_head (closure->pending_requests);
+ self->priv->configuration = g_object_ref (request);
+ remove_request (closure, request);
value = grl_tmdb_request_get (request, "$.images.base_url");
if (value != NULL) {
@@ -941,11 +1044,7 @@ on_configuration_ready (GObject *source,
ResolveClosure *pending_closure;
pending_closure = g_queue_pop_head (self->priv->pending_resolves);
- grl_tmdb_request_run_async (g_queue_peek_head (pending_closure->pending_requests),
- self->priv->wc,
- on_search_ready,
- NULL,
- pending_closure);
+ run_pending_requests (pending_closure, G_MAXINT);
}
}
@@ -1011,8 +1110,9 @@ grl_tmdb_source_may_resolve (GrlSource *source,
return FALSE;
}
- /* We can do nothing without a title */
- if (!grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_TITLE)) {
+ /* We can do nothing without a title or the movie-id */
+ if (!grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_TITLE) &&
+ !grl_data_has_key (GRL_DATA (media), GRL_TMDB_METADATA_KEY_TMDB_ID)) {
if (!missing_keys)
*missing_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_TITLE, NULL);
@@ -1028,9 +1128,10 @@ grl_tmdb_source_resolve (GrlSource *source,
{
ResolveClosure *closure;
GrlTmdbRequest *request;
- GAsyncReadyCallback callback;
- const char *title;
+ const char *title = NULL;
+ const char *str_movie_id;
GrlTmdbSource *self = GRL_TMDB_SOURCE (source);
+ guint64 movie_id = 0;
GList *it;
if (!GRL_IS_MEDIA_VIDEO (rs->media)) {
@@ -1039,9 +1140,19 @@ grl_tmdb_source_resolve (GrlSource *source,
return;
}
- title = grl_media_get_title (rs->media);
- if (title == NULL) {
- /* Can't search for anything without a title ... */
+ /* 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;
}
@@ -1054,8 +1165,8 @@ grl_tmdb_source_resolve (GrlSource *source,
closure->pending_requests = g_queue_new ();
closure->keys = g_hash_table_new (g_direct_hash, g_direct_equal);
closure->slow = FALSE;
- request = grl_tmdb_request_new_search (closure->self->priv->api_key, title);
- g_queue_push_tail (closure->pending_requests, request);
+ closure->id = movie_id;
+
it = rs->keys;
/* Copy keys to list for faster lookup */
@@ -1085,17 +1196,24 @@ grl_tmdb_source_resolve (GrlSource *source,
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_queue_push_head (closure->pending_requests, request);
- callback = on_configuration_ready;
+ g_assert (g_queue_is_empty (closure->pending_requests));
+ queue_request (closure, request, on_configuration_ready);
self->priv->config_pending = TRUE;
- } else {
+ }
+
+ if (title) {
GRL_DEBUG ("Running initial search...");
- callback = on_search_ready;
+ request = grl_tmdb_request_new_search (closure->self->priv->api_key, title);
+ queue_request (closure, request, on_search_ready);
+ } else {
+ GRL_DEBUG ("Running lookup by id...");
+
+ if (closure->slow) {
+ resolve_slow_details (closure);
+ } else {
+ queue_detail_request (closure, GRL_TMDB_REQUEST_DETAIL_MOVIE);
+ }
}
- grl_tmdb_request_run_async (g_queue_peek_head (closure->pending_requests),
- closure->self->priv->wc,
- callback,
- NULL,
- closure);
+ run_pending_requests (closure, 1);
}
diff --git a/test/Makefile.am b/test/Makefile.am
index 9a1c108..a7245c1 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -10,6 +10,7 @@ INCLUDES = @DEPS_CFLAGS@
check_tests = test_tmdb_preconditions \
test_tmdb_missing_configuration \
test_tmdb_fast_resolution \
+ test_tmdb_fast_resolution_by_id \
test_tmdb_full_resolution
# TODO: Add test_local_metadata to check_tests when it runs without errors.
@@ -79,6 +80,14 @@ test_tmdb_fast_resolution_LDADD = \
test_tmdb_fast_resolution_CFLAGS = \
-DPREFIX=$(prefix) $(test_tmdb_defines)
+test_tmdb_fast_resolution_by_id_SOURCES = \
+ test_tmdb_fast_resolution_by_id.c \
+ test_tmdb_utils.h test_tmdb_utils.c
+test_tmdb_fast_resolution_by_id_LDADD = \
+ @DEPS_LIBS@
+test_tmdb_fast_resolution_by_id_CFLAGS = \
+ -DPREFIX=$(prefix) $(test_tmdb_defines)
+
test_tmdb_full_resolution_SOURCES = \
test_tmdb_full_resolution.c \
test_tmdb_utils.h test_tmdb_utils.c
diff --git a/test/test_data/tmdb/fast-by-id.ini b/test/test_data/tmdb/fast-by-id.ini
new file mode 100644
index 0000000..b13fdfb
--- /dev/null
+++ b/test/test_data/tmdb/fast-by-id.ini
@@ -0,0 +1,10 @@
+# This file only contains the configuration and the initial search result
+
+[default]
+version=1
+
+[http://api.themoviedb.org/3/configuration?api%5Fkey=TMDB%5FTEST%5FAPI%5FKEY]
+data = configuration.txt
+
+[http://api.themoviedb.org/3/movie/10528?api%5Fkey=TMDB%5FTEST%5FAPI%5FKEY]
+data = details.txt
diff --git a/test/test_tmdb_fast_resolution_by_id.c b/test/test_tmdb_fast_resolution_by_id.c
new file mode 100644
index 0000000..9491ae0
--- /dev/null
+++ b/test/test_tmdb_fast_resolution_by_id.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2012 Openismus GmbH
+ *
+ * Author: Jens Georg <jensg openismus com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#include <grilo.h>
+#include "test_tmdb_utils.h"
+#include <math.h>
+#include <float.h>
+
+#define TMDB_PLUGIN_ID "grl-tmdb"
+
+/** Compare the floats.
+ * A simple == will fail on values that are effectively the same,
+ * due to rounding issues.
+ */
+static gboolean compare_floats(gfloat a, gfloat b)
+{
+ return fabs(a - b) < DBL_EPSILON;
+}
+
+static void
+test (void)
+{
+ GrlKeyID backdrop, posters, tmdb_id;
+ GrlRegistry *registry;
+ GrlOperationOptions *options = NULL;
+ GrlMedia *media = NULL;
+ GError *error = NULL;
+
+ test_setup_tmdb ();
+
+ registry = grl_registry_get_default ();
+ backdrop = grl_registry_lookup_metadata_key (registry, "tmdb-backdrop");
+ g_assert_cmpint (backdrop, !=, GRL_METADATA_KEY_INVALID);
+ posters = grl_registry_lookup_metadata_key (registry, "tmdb-poster");
+ g_assert_cmpint (posters, !=, GRL_METADATA_KEY_INVALID);
+ tmdb_id = grl_registry_lookup_metadata_key (registry, "tmdb-id");
+ g_assert_cmpint (tmdb_id, !=, GRL_METADATA_KEY_INVALID);
+
+ options = grl_operation_options_new (NULL);
+ g_assert (options != NULL);
+ grl_operation_options_set_flags (options, GRL_RESOLVE_FAST_ONLY);
+
+ media = grl_media_video_new ();
+ g_assert (media != NULL);
+ grl_data_set_string (GRL_DATA (media), tmdb_id, "10528");
+
+ GrlSource *source = test_get_source();
+ g_assert (source);
+ grl_source_resolve_sync (source,
+ media,
+ grl_source_supported_keys (source),
+ options,
+ &error);
+
+ /* Fast resolution must not result in an error if the details are missing */
+ g_assert (error == NULL);
+
+ /* Check if we have everything we need */
+ g_assert (compare_floats (grl_media_get_rating (media), 3.8f));
+ g_assert_cmpstr (grl_data_get_string (GRL_DATA (media), GRL_METADATA_KEY_ORIGINAL_TITLE), ==,
+ "Sherlock Holmes");
+ /* There's only one poster/backdrop in the search result */
+ g_assert_cmpstr (grl_data_get_string (GRL_DATA (media), backdrop), ==,
+ "http://cf2.imgobject.com/t/p/original/uM414ugc1B910bTvGEIzsucfMMC.jpg");
+
+ g_assert_cmpstr (grl_data_get_string (GRL_DATA (media), posters), ==,
+ "http://cf2.imgobject.com/t/p/original/22ngurXbLqab7Sko6aTSdwOCe5W.jpg");
+
+ g_assert (grl_media_get_publication_date (media) == NULL);
+
+ g_object_unref (media);
+ media = NULL;
+
+ g_object_unref (options);
+ options = NULL;
+
+ test_shutdown_tmdb ();
+}
+
+
+int
+main(int argc, char **argv)
+{
+ g_setenv ("GRL_PLUGIN_LIST", TMDB_PLUGIN_ID, TRUE);
+ g_setenv ("GRL_PLUGIN_PATH", g_getenv ("PWD"), TRUE);
+
+ /* We must set this before calling grl_init.
+ * See https://bugzilla.gnome.org/show_bug.cgi?id=685967#c17
+ */
+ g_setenv ("GRL_NET_MOCKED", GRILO_PLUGINS_TESTS_TMDB_DATA_PATH "fast-by-id.ini", TRUE);
+
+ grl_init (&argc, &argv);
+#if !GLIB_CHECK_VERSION(2,32,0)
+ g_thread_init (NULL);
+#endif
+
+ test ();
+}
diff --git a/test/test_tmdb_full_resolution.c b/test/test_tmdb_full_resolution.c
index b311cbd..f3ed4f5 100644
--- a/test/test_tmdb_full_resolution.c
+++ b/test/test_tmdb_full_resolution.c
@@ -40,7 +40,7 @@ compare_floats(gfloat a, gfloat b)
return fabs(a - b) < DBL_EPSILON;
}
-const char *iso_date (const GDateTime *date, char **strbuf)
+static const char *iso_date (const GDateTime *date, char **strbuf)
{
if (*strbuf)
g_free (*strbuf);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]