static tracker_grl_sparql_t * insert_key_mapping (GrlKeyID grl_key, const gchar *sparql_key_attr, const gchar *sparql_key_attr_call, const gchar *sparql_key_flavor) { tracker_grl_sparql_t *assoc = g_new0 (tracker_grl_sparql_t, 1); GList *assoc_list = g_hash_table_lookup (grl_to_sparql_mapping, GRLKEYID_TO_POINTER (grl_key)); gchar *canon_name = g_strdup (GRL_METADATA_KEY_GET_NAME (grl_key)); assoc->grl_key = grl_key; assoc->sparql_key_name = build_flavored_key (canon_name, sparql_key_flavor); assoc->sparql_key_attr = sparql_key_attr; assoc->sparql_key_attr_call = sparql_key_attr_call; assoc->sparql_key_flavor = sparql_key_flavor; assoc_list = g_list_append (assoc_list, assoc); g_hash_table_insert (grl_to_sparql_mapping, GRLKEYID_TO_POINTER (grl_key), assoc_list); g_hash_table_insert (sparql_to_grl_mapping, (gpointer) assoc->sparql_key_name, assoc); g_hash_table_insert (sparql_to_grl_mapping, (gpointer) GRL_METADATA_KEY_GET_NAME (grl_key), assoc); g_free (canon_name); return assoc; }
/** * grl_operation_options_set_key_filter_value: * @options: a #GrlOperationOptions instance * @key: a #GrlKeyID * @value: a #GValue * * Set filter as "@key == @value". * * Returns: %TRUE on success * * Since: 0.2.0 **/ gboolean grl_operation_options_set_key_filter_value (GrlOperationOptions *options, GrlKeyID key, GValue *value) { gboolean ret; GrlRegistry *registry; GType key_type; registry = grl_registry_get_default (); key_type = grl_registry_lookup_metadata_key_type (registry, key); if (G_VALUE_TYPE (value) != key_type) return FALSE; ret = (options->priv->caps == NULL) || grl_caps_is_key_filter (options->priv->caps, key); if (ret) { if (value) { g_hash_table_insert (options->priv->key_filter, GRLKEYID_TO_POINTER (key), grl_g_value_dup (value)); } else { g_hash_table_remove (options->priv->key_filter, GRLKEYID_TO_POINTER (key)); } } return ret; }
static void grl_vimeo_source_resolve (GrlSource *source, GrlSourceResolveSpec *rs) { gint id; const gchar *id_str; if (!rs->media || (id_str = grl_media_get_id (rs->media)) == NULL) { goto send_unchanged; } /* As all the keys are added always, except URL, the only case is missing URL */ if (g_list_find (rs->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_URL)) != NULL && grl_media_get_url (rs->media) == NULL) { errno = 0; id = (gint) g_ascii_strtod (id_str, NULL); if (errno != 0) { goto send_unchanged; } g_vimeo_video_get_play_url (GRL_VIMEO_SOURCE (source)->priv->vimeo, id, video_get_play_url_cb, rs); } else { goto send_unchanged; } return; send_unchanged: rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL); }
/** * grl_related_keys_set: * @relkeys: set of related keys to modify * @key: (type GrlKeyID): key to change or add * @value: the new value * * Sets the value associated with @key into @relkeys. Old value is freed and * the new one is set. * * Also, checks that @value is compliant with @key specification, modifying it * accordingly. For instance, if @key requires a number between 0 and 10, but * value is outside this range, it will be adapted accordingly. * * Since: 0.1.10 **/ void grl_related_keys_set (GrlRelatedKeys *relkeys, GrlKeyID key, const GValue *value) { GValue *copy = NULL; GrlRegistry *registry; g_return_if_fail (GRL_IS_RELATED_KEYS (relkeys)); g_return_if_fail (key); if (!value) { return; } /* Dup value */ if (G_VALUE_TYPE (value) != GRL_METADATA_KEY_GET_TYPE (key)) { GRL_WARNING ("value has type %s, but expected %s", g_type_name (G_VALUE_TYPE (value)), g_type_name (GRL_METADATA_KEY_GET_TYPE (key))); return; } copy = g_new0 (GValue, 1); g_value_init (copy, G_VALUE_TYPE (value)); g_value_copy (value, copy); registry = grl_registry_get_default (); if (!grl_registry_metadata_key_validate (registry, key, copy)) { GRL_WARNING ("'%s' value invalid, adjusting", GRL_METADATA_KEY_GET_NAME (key)); } g_hash_table_insert (relkeys->priv->data, GRLKEYID_TO_POINTER (key), copy); }
static tracker_grl_sparql_t * insert_key_mapping (GrlKeyID grl_key, const gchar *sparql_key_attr, const gchar *sparql_key_attr_call, const gchar *sparql_key_flavor) { tracker_grl_sparql_t *assoc = g_new0 (tracker_grl_sparql_t, 1); GList *assoc_list = g_hash_table_lookup (grl_to_sparql_mapping, GRLKEYID_TO_POINTER (grl_key)); gchar *canon_name = g_strdup (GRL_METADATA_KEY_GET_NAME (grl_key)); assoc->grl_key = grl_key; assoc->sparql_key_name = build_flavored_key (canon_name, sparql_key_flavor); assoc->sparql_key_name_canon = g_strdup (canon_name); assoc->sparql_key_attr = sparql_key_attr; assoc->sparql_key_attr_call = sparql_key_attr_call; assoc->sparql_key_flavor = sparql_key_flavor; assoc_list = g_list_append (assoc_list, assoc); g_hash_table_insert (grl_to_sparql_mapping, GRLKEYID_TO_POINTER (grl_key), assoc_list); g_hash_table_insert (sparql_to_grl_mapping, (gpointer) assoc->sparql_key_name, assoc); g_hash_table_insert (sparql_to_grl_mapping, (gpointer) GRL_METADATA_KEY_GET_NAME (grl_key), assoc); /* Grilo maps key names to SPARQL variables. Key names can contain dashes, * however SPARQL does not allow dashes in variable names. So use the to * underscores converted canon_name as additional mapping. */ if (g_strrstr (assoc->sparql_key_name_canon, "_")) { g_hash_table_insert (sparql_to_grl_mapping, (gpointer) assoc->sparql_key_name_canon, assoc); } g_free (canon_name); return assoc; }
/** * grl_related_keys_remove: * @relkeys: set of related keys * @key: (type GrlKeyID): key to remove * * Removes @key from @relkeys set. * * Since: 0.2.3 **/ void grl_related_keys_remove (GrlRelatedKeys *relkeys, GrlKeyID key) { g_return_if_fail (GRL_IS_RELATED_KEYS (relkeys)); g_return_if_fail (key != GRL_METADATA_KEY_INVALID); g_hash_table_remove (relkeys->priv->data, GRLKEYID_TO_POINTER (key)); }
/** * grl_related_keys_get: * @relkeys: set of related keys to retrieve value * @key: (type GrlKeyID): key to look up. * * Get the value associated with @key from @relkeys. If it does not contain any * value, %NULL will be returned. * * Returns: (transfer none): a #GValue. This value should not be modified nor * freed by user. * * Since: 0.1.10 **/ const GValue * grl_related_keys_get (GrlRelatedKeys *relkeys, GrlKeyID key) { g_return_val_if_fail (GRL_IS_RELATED_KEYS (relkeys), NULL); g_return_val_if_fail (key, NULL); return g_hash_table_lookup (relkeys->priv->data, GRLKEYID_TO_POINTER (key)); }
/** * grl_related_keys_has_key: * @relkeys: set of related keys to inspect * @key: (type GrlKeyID): key to search * * Checks if @key is in @relkeys. * * Returns: %TRUE if @key is in @relkeys, %FALSE in other case. * * Since: 0.1.10 **/ gboolean grl_related_keys_has_key (GrlRelatedKeys *relkeys, GrlKeyID key) { g_return_val_if_fail (GRL_IS_RELATED_KEYS (relkeys), FALSE); return g_hash_table_lookup_extended (relkeys->priv->data, GRLKEYID_TO_POINTER (key), NULL, NULL); }
static const GList * grl_gravatar_source_supported_keys (GrlSource *source) { static GList *keys = NULL; if (!keys) { if (GRL_METADATA_KEY_ARTIST_AVATAR) { keys = g_list_prepend (keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ARTIST_AVATAR)); } if (GRL_METADATA_KEY_AUTHOR_AVATAR) { keys = g_list_prepend (keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_AUTHOR_AVATAR)); } } return keys; }
static gboolean grl_tmdb_source_may_resolve (GrlSource *source, GrlMedia *media, GrlKeyID key_id, GList **missing_keys) { GrlTmdbSource *self = GRL_TMDB_SOURCE (source); if (!g_hash_table_contains (self->priv->supported_keys, GRLKEYID_TO_POINTER (key_id)) && !g_hash_table_contains (self->priv->slow_keys, GRLKEYID_TO_POINTER (key_id))) return FALSE; /* We can only entertain videos */ if (media && !grl_media_is_video (media)) return FALSE; /* Caller wants to check what's needed to resolve */ if (!media) { if (missing_keys) *missing_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_TITLE, NULL); return FALSE; } /* 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); return FALSE; } return TRUE; }
/** * grl_metadata_key_list_new: (skip) * @first_key: first key * @...: va_list keys * * Returns a #GList containing the va_list keys. Use #GRL_METADATA_KEY_INVALID * to finalize them. * * Returns: a #GList * * Since: 0.2.0 **/ GList * grl_metadata_key_list_new(GrlKeyID first_key, ...) { GList *key_list = NULL; GrlKeyID next_key; va_list va_keys; va_start (va_keys, first_key); next_key = first_key; while (next_key) { key_list = g_list_prepend (key_list, GRLKEYID_TO_POINTER (next_key)); next_key = va_arg (va_keys, GrlKeyID); } va_end (va_keys); return g_list_reverse (key_list); }
static void grl_vimeo_source_search (GrlSource *source, GrlSourceSearchSpec *ss) { SearchData *sd; GError *error; gint per_page; GVimeo *vimeo = GRL_VIMEO_SOURCE (source)->priv->vimeo; guint skip = grl_operation_options_get_skip (ss->options); gint count = grl_operation_options_get_count (ss->options); if (!ss->text) { /* Vimeo does not support searching all */ error = g_error_new (GRL_CORE_ERROR, GRL_CORE_ERROR_SEARCH_NULL_UNSUPPORTED, _("Failed to search: %s"), _("non-NULL search text is required")); ss->callback (ss->source, ss->operation_id, NULL, 0, ss->user_data, error); g_error_free (error); return; } sd = g_slice_new0 (SearchData); sd->vimeo = vimeo; sd->get_url = (g_list_find (ss->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_URL)) != NULL); /* Compute items per page and page offset */ grl_paging_translate (skip, count, MAX_ELEMENTS, (guint *) &per_page, (guint *) &(sd->page), (guint *) &(sd->offset)); g_vimeo_set_per_page (vimeo, per_page); sd->ss = ss; g_vimeo_videos_search (vimeo, ss->text, sd->page, search_cb, sd); }
gboolean grl_tracker_key_is_supported (const GrlKeyID key) { return g_hash_table_lookup (grl_to_sparql_mapping, GRLKEYID_TO_POINTER (key)) != NULL; }
static GList * get_mapping_from_grl (const GrlKeyID key) { return (GList *) g_hash_table_lookup (grl_to_sparql_mapping, GRLKEYID_TO_POINTER (key)); }
/* Given a null-terminated array of MediaServerSpec2 properties, returns a list with the corresponding Grilo metadata keys */ static GList * get_grilo_keys (const gchar **ms_keys, GList **other_keys) { GList *grl_keys = NULL; gint i; /* Check if all keys are requested */ if (g_strcmp0 (ms_keys[0], MS2_PROP_ALL) == 0) { grl_keys = grl_registry_get_metadata_keys (registry); if (other_keys) { *other_keys = g_list_prepend (*other_keys, MS2_PROP_CHILD_COUNT); *other_keys = g_list_prepend (*other_keys, MS2_PROP_TYPE); *other_keys = g_list_prepend (*other_keys, MS2_PROP_ITEM_COUNT); *other_keys = g_list_prepend (*other_keys, MS2_PROP_CONTAINER_COUNT); *other_keys = g_list_prepend (*other_keys, MS2_PROP_SEARCHABLE); } } else { for (i = 0; ms_keys[i]; i++) { if (g_strcmp0 (ms_keys[i], MS2_PROP_PATH) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ID)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_DISPLAY_NAME) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_TITLE)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_DATE) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_PUBLICATION_DATE)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_ALBUM) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ALBUM)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_ARTIST) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ARTIST)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_GENRE) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_GENRE)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_MIME_TYPE) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MIME)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_URLS) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_URL)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_BITRATE) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_BITRATE)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_DURATION) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_DURATION)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_HEIGHT) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_HEIGHT)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_WIDTH) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_WIDTH)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_PARENT) == 0) { grl_keys = g_list_prepend (grl_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_GRILO_MS2_PARENT)); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_CHILD_COUNT) == 0 && other_keys) { *other_keys = g_list_prepend (*other_keys, (gchar *) ms_keys[i]); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_ITEM_COUNT) == 0 && other_keys) { *other_keys = g_list_prepend (*other_keys, (gchar *) ms_keys[i]); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_CONTAINER_COUNT) == 0 && other_keys) { *other_keys = g_list_prepend (*other_keys, (gchar *) ms_keys[i]); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_TYPE) == 0 && other_keys) { *other_keys = g_list_prepend (*other_keys, (gchar *) ms_keys[i]); } else if (g_strcmp0 (ms_keys[i], MS2_PROP_SEARCHABLE) == 0 && other_keys) { *other_keys = g_list_prepend (*other_keys, (gchar *) ms_keys[i]); } } } return grl_keys; }
static gboolean grl_local_metadata_source_may_resolve (GrlSource *source, GrlMedia *media, GrlKeyID key_id, GList **missing_keys) { GrlLocalMetadataSourcePriv *priv = GRL_LOCAL_METADATA_SOURCE_GET_PRIVATE (source); if (!media) return FALSE; if (GRL_IS_MEDIA_AUDIO (media)) { gboolean have_artist = FALSE, have_album = FALSE; if ((have_artist = grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_ARTIST)) && (have_album = grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_ALBUM)) && key_id == GRL_METADATA_KEY_THUMBNAIL) { return TRUE; } else if (missing_keys) { GList *result = NULL; if (!have_artist) result = g_list_append (result, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ARTIST)); if (!have_album) result = g_list_append (result, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ALBUM)); if (result) *missing_keys = result; } return FALSE; } if (GRL_IS_MEDIA_IMAGE (media)) { if (key_id != GRL_METADATA_KEY_THUMBNAIL) return FALSE; if (!grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_URL)) goto missing_url; if (!has_compatible_media_url (media)) return FALSE; return TRUE; } if (GRL_IS_MEDIA_VIDEO (media)) { switch (key_id) { case GRL_METADATA_KEY_TITLE: case GRL_METADATA_KEY_SHOW: case GRL_METADATA_KEY_PUBLICATION_DATE: case GRL_METADATA_KEY_SEASON: case GRL_METADATA_KEY_EPISODE: case GRL_METADATA_KEY_EPISODE_TITLE: if (!priv->guess_video) return FALSE; if (grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_URL) && has_compatible_media_url (media)) return TRUE; if (!grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_TITLE)) goto missing_title; return TRUE; case GRL_METADATA_KEY_THUMBNAIL: if (grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_URL) == FALSE) goto missing_url; return has_compatible_media_url (media); default: if (key_id == priv->hash_keyid) return has_compatible_media_url (media); } } missing_title: if (missing_keys) { if (grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_URL) == FALSE) *missing_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_TITLE, GRL_METADATA_KEY_URL, NULL); else *missing_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_TITLE, NULL); } return FALSE; missing_url: if (missing_keys) *missing_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, NULL); return FALSE; }
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 (grl_data_get_boolean (GRL_DATA (closure->rs->media), GRL_METADATA_KEY_TITLE_FROM_FILENAME)) { value = grl_tmdb_request_get (request, "$.results[0].title"); if (value) { grl_media_set_title (closure->rs->media, g_value_get_string (value)); grl_data_set_boolean (GRL_DATA (closure->rs->media), GRL_METADATA_KEY_TITLE_FROM_FILENAME, FALSE); 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_set_original_title (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 grl_tmdb_source_init (GrlTmdbSource *self) { self->priv = grl_tmdb_source_get_instance_private (self); self->priv->supported_keys = g_hash_table_new (g_direct_hash, g_direct_equal); self->priv->slow_keys = g_hash_table_new (g_direct_hash, g_direct_equal); /* 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)); g_hash_table_add (self->priv->supported_keys, GRLKEYID_TO_POINTER (GRL_TMDB_METADATA_KEY_POSTER)); g_hash_table_add (self->priv->supported_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ORIGINAL_TITLE)); g_hash_table_add (self->priv->supported_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_RATING)); g_hash_table_add (self->priv->supported_keys, GRLKEYID_TO_POINTER (GRL_TMDB_METADATA_KEY_TMDB_ID)); /* Slow keys */ g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_SITE)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_GENRE)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_STUDIO)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_DESCRIPTION)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_CERTIFICATE)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_REGION)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_TMDB_METADATA_KEY_IMDB_ID)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_KEYWORD)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_PERFORMER)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_PRODUCER)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_DIRECTOR)); g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_AUTHOR)); /* The publication date is both available as fast key in the movie details, * but also as more detailed information as regional release date. To avoid * confusion in clients that do a fast resolve first and merge slow data * later we hide the fast version. */ g_hash_table_add (self->priv->slow_keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_PUBLICATION_DATE)); self->priv->wc = grl_net_wc_new (); grl_net_wc_set_throttling (self->priv->wc, 1); self->priv->config_pending = FALSE; self->priv->pending_resolves = g_queue_new (); }
static void store_bookmark (GrlBookmarksSource *bookmarks_source, GList **keylist, GrlMediaBox *parent, GrlMedia *bookmark, GError **error) { GomResource *resource; const gchar *title; const gchar *url; const gchar *desc; const gchar *thumb; GTimeVal now; gint64 parent_id; const gchar *mime; gchar *date; guint type; gint64 id; gchar *str_id; GError *local_error = NULL; gboolean ret; GRL_DEBUG ("store_bookmark"); title = grl_media_get_title (bookmark); url = grl_media_get_url (bookmark); thumb = grl_media_get_thumbnail (bookmark); desc = grl_media_get_description (bookmark); mime = grl_media_get_mime (bookmark); g_get_current_time (&now); date = g_time_val_to_iso8601 (&now); if (!parent) { parent_id = 0; } else { parent_id = g_ascii_strtoll (grl_media_get_id (GRL_MEDIA (parent)), NULL, 0); } if (parent_id < 0) { parent_id = 0; } GRL_DEBUG ("URL: '%s'", url); if (GRL_IS_MEDIA_BOX (bookmark)) { type = BOOKMARK_TYPE_CATEGORY; } else { type = BOOKMARK_TYPE_STREAM; } resource = g_object_new (BOOKMARKS_TYPE_RESOURCE, "repository", bookmarks_source->priv->repository, "parent", parent_id, "type", type, NULL); if (type == BOOKMARK_TYPE_STREAM) { g_object_set (G_OBJECT (resource), "url", url, NULL); *keylist = g_list_remove (*keylist, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_URL)); } if (title) { g_object_set (G_OBJECT (resource), "title", title, NULL); *keylist = g_list_remove (*keylist, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_TITLE)); } else if (url) { g_object_set (G_OBJECT (resource), "title", url, NULL); } else { g_object_set (G_OBJECT (resource), "title", "(unknown)", NULL); } if (date) { g_object_set (G_OBJECT (resource), "date", date, NULL); } if (mime) { g_object_set (G_OBJECT (resource), "mime", mime, NULL); *keylist = g_list_remove (*keylist, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MIME)); } if (desc) { g_object_set (G_OBJECT (resource), "desc", desc, NULL); *keylist = g_list_remove (*keylist, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_DESCRIPTION)); } if (thumb) { g_object_set (G_OBJECT (resource), "thumbnail-url", desc, NULL); *keylist = g_list_remove (*keylist, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_THUMBNAIL)); } ret = gom_resource_save_sync (resource, &local_error); if (!ret) { GRL_WARNING ("Failed to store bookmark '%s': %s", title, local_error->message); *error = g_error_new (GRL_CORE_ERROR, GRL_CORE_ERROR_STORE_FAILED, _("Failed to store: %s"), local_error->message); g_error_free (local_error); g_object_unref (resource); return; } g_object_get (resource, "id", &id, NULL); str_id = g_strdup_printf ("%" G_GINT64_FORMAT, id); grl_media_set_id (bookmark, str_id); g_free (str_id); g_object_unref (resource); if (bookmarks_source->priv->notify_changes) { grl_source_notify_change (GRL_SOURCE (bookmarks_source), bookmark, GRL_CONTENT_ADDED, FALSE); } }
static void key_range_filter_dup (GrlKeyID key, GrlRangeValue *value, GHashTable *destination) { grl_range_value_hashtable_insert (destination, GRLKEYID_TO_POINTER (key), value->min, value->max); }