static void playing_song_changed_cb (RBShellPlayer *player, RhythmDBEntry *entry, RBGriloPlugin *plugin) { const char *uri; RhythmDBEntryType *entry_type; RBGriloEntryData *data; if (entry == NULL) return; entry_type = rhythmdb_entry_get_entry_type (entry); if (RB_IS_GRILO_ENTRY_TYPE (entry_type) == FALSE) { return; } data = RHYTHMDB_ENTRY_GET_TYPE_DATA (entry, RBGriloEntryData); uri = grl_data_get_string (data->grilo_data, GRL_METADATA_KEY_THUMBNAIL); if (uri != NULL) { RBExtDBKey *key; key = rb_ext_db_key_create_storage ("album", rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ALBUM)); rb_ext_db_key_add_field (key, "artist", rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ARTIST)); rb_ext_db_store_uri (plugin->art_store, key, RB_EXT_DB_SOURCE_SEARCH, uri); rb_ext_db_key_free (key); } }
static void gen_prop_insert_string (GString *gstr, tracker_grl_sparql_t *assoc, GrlData *data) { gchar *tmp; switch (GRL_METADATA_KEY_GET_TYPE (assoc->grl_key)) { case G_TYPE_STRING: tmp = g_strescape (grl_data_get_string (data, assoc->grl_key), NULL); g_string_append_printf (gstr, "%s \"%s\"", assoc->sparql_key_attr, tmp); g_free (tmp); break; case G_TYPE_INT: g_string_append_printf (gstr, "%s %i", assoc->sparql_key_attr, grl_data_get_int (data, assoc->grl_key)); break; case G_TYPE_FLOAT: g_string_append_printf (gstr, "%s %f", assoc->sparql_key_attr, grl_data_get_float (data, assoc->grl_key)); break; default: break; } }
static gboolean has_compatible_media_url (GrlMedia *media) { gboolean ret = FALSE; const gchar *url; gchar *scheme; /* HACK: Cheat slightly, we don't want to use UPnP URLs */ if (grl_data_has_key (GRL_DATA (media), GRL_METADATA_KEY_SOURCE)) { const char *source; source = grl_data_get_string (GRL_DATA (media), GRL_METADATA_KEY_SOURCE); if (g_str_has_prefix (source, "grl-upnp-uuid:")) return FALSE; if (g_str_has_prefix (source, "grl-dleyna-uuid:")) return FALSE; } url = grl_media_get_url (media); if (!url) { return FALSE; } scheme = g_uri_parse_scheme (url); ret = is_supported_scheme (scheme); g_free (scheme); return ret; }
static void set_string_prop_from_key (RhythmDB *db, RhythmDBEntry *entry, RhythmDBPropType prop, GrlData *data, GrlKeyID key) { GValue v = {0,}; if (grl_data_has_key (data, key) == FALSE) return; g_value_init (&v, G_TYPE_STRING); g_value_set_string (&v, grl_data_get_string (data, key)); rhythmdb_entry_set (db, entry, prop, &v); g_value_unset (&v); }
static void gen_prop_insert_string (GString *gstr, tracker_grl_sparql_t *assoc, GrlData *data) { gchar *tmp; GType type = GRL_METADATA_KEY_GET_TYPE (assoc->grl_key); switch (type) { case G_TYPE_STRING: tmp = g_strescape (grl_data_get_string (data, assoc->grl_key), NULL); g_string_append_printf (gstr, "%s \"%s\"", assoc->sparql_key_attr, tmp); g_free (tmp); break; case G_TYPE_INT: g_string_append_printf (gstr, "%s %i", assoc->sparql_key_attr, grl_data_get_int (data, assoc->grl_key)); break; case G_TYPE_FLOAT: g_string_append_printf (gstr, "%s %f", assoc->sparql_key_attr, grl_data_get_float (data, assoc->grl_key)); break; case G_TYPE_BOOLEAN: /* Special case for favourite tag, see comment in * grl_tracker_tracker_get_insert_string for more details. */ if (assoc->grl_key == GRL_METADATA_KEY_FAVOURITE) { g_string_append_printf (gstr, "%s nao:predefined-tag-favorite", assoc->sparql_key_attr); } break; default: if (type == G_TYPE_DATE_TIME) { tmp = g_date_time_format (grl_data_get_boxed (data, assoc->grl_key), "%FT%T%:z"); g_string_append_printf (gstr, "%s '%s'", assoc->sparql_key_attr, tmp); g_free (tmp); } break; } }
static void resolve_cb (GrlSource *src, guint operation_id, GrlMedia *media, gpointer user_data, const GError *error) { g_assert_no_error (error); g_assert (media); const gchar *title = grl_media_get_title (media); const gchar *studio = grl_media_get_studio (media); printf ("Media: Title='%s', Studio='%s'\n", title, studio); if (director_key != 0) { const gchar *director = grl_data_get_string (GRL_DATA (media), director_key); printf (" Director=%s\n", director); } g_main_loop_quit (loop); }
/* Returns whether to free the value parameter or not. */ static void set_metadata_from_media (MexContent *content, GrlMedia *media, MexContentMetadata mex_key) { gchar *string; const gchar *cstring; GrlKeyID grl_key = _get_grl_key_from_mex (mex_key); gint n; if (!grl_key) return; switch (G_PARAM_SPEC (grl_key)->value_type) { case G_TYPE_STRING: cstring = grl_data_get_string (GRL_DATA (media), grl_key); if (cstring) mex_grilo_program_set_metadata (content, mex_key, cstring); break; case G_TYPE_INT: n = grl_data_get_int (GRL_DATA (media), grl_key); if (n > 0) { string = g_strdup_printf ("%i", n); mex_grilo_program_set_metadata (content, mex_key, string); g_free (string); } break; case G_TYPE_FLOAT: string = g_strdup_printf ("%f", grl_data_get_float (GRL_DATA (media), grl_key)); mex_grilo_program_set_metadata (content, mex_key, string); g_free (string); break; } }
static RhythmDBEntry * create_entry_for_media (RhythmDB *db, RhythmDBEntryType *entry_type, GrlData *data, GrlData *container) { RhythmDBEntry *entry; RBGriloEntryData *entry_data; entry = rhythmdb_entry_lookup_by_location (db, grl_media_get_url (GRL_MEDIA (data))); if (entry != NULL) { return entry; } rb_debug ("creating entry for %s / %s", grl_media_get_url (GRL_MEDIA (data)), grl_media_get_id (GRL_MEDIA (data))); entry = rhythmdb_entry_new (db, entry_type, grl_media_get_url (GRL_MEDIA (data))); /* just use the url? */ if (entry == NULL) { /* crap. */ return NULL; } set_string_prop_from_key (db, entry, RHYTHMDB_PROP_TITLE, data, GRL_METADATA_KEY_TITLE); set_string_prop_from_key (db, entry, RHYTHMDB_PROP_ALBUM, data, GRL_METADATA_KEY_ALBUM); set_string_prop_from_key (db, entry, RHYTHMDB_PROP_ARTIST, data, GRL_METADATA_KEY_ARTIST); set_string_prop_from_key (db, entry, RHYTHMDB_PROP_GENRE, data, GRL_METADATA_KEY_GENRE); set_string_prop_from_key (db, entry, RHYTHMDB_PROP_TITLE, data, GRL_METADATA_KEY_TITLE); if (grl_data_has_key (data, GRL_METADATA_KEY_PUBLICATION_DATE)) { /* something - grilo has this as a string? */ } if (grl_data_has_key (data, GRL_METADATA_KEY_BITRATE)) { GValue v = {0,}; g_value_init (&v, G_TYPE_ULONG); g_value_set_ulong (&v, grl_data_get_int (data, GRL_METADATA_KEY_BITRATE)); rhythmdb_entry_set (db, entry, RHYTHMDB_PROP_BITRATE, &v); g_value_unset (&v); } if (grl_data_has_key (data, GRL_METADATA_KEY_DURATION)) { /* this is probably in seconds */ GValue v = {0,}; g_value_init (&v, G_TYPE_ULONG); g_value_set_ulong (&v, grl_data_get_int (data, GRL_METADATA_KEY_DURATION)); rhythmdb_entry_set (db, entry, RHYTHMDB_PROP_DURATION, &v); g_value_unset (&v); } if (grl_data_has_key (data, GRL_METADATA_KEY_MIME)) { const char *media_type; media_type = rb_gst_mime_type_to_media_type (grl_data_get_string (data, GRL_METADATA_KEY_MIME)); if (media_type) { GValue v = {0,}; g_value_init (&v, G_TYPE_STRING); g_value_set_string (&v, media_type); rhythmdb_entry_set (db, entry, RHYTHMDB_PROP_MEDIA_TYPE, &v); g_value_unset (&v); } } if (grl_data_has_key (data, GRL_METADATA_KEY_TRACK_NUMBER)) { GValue v = {0,}; g_value_init (&v, G_TYPE_ULONG); g_value_set_ulong (&v, grl_data_get_int (data, GRL_METADATA_KEY_TRACK_NUMBER)); rhythmdb_entry_set (db, entry, RHYTHMDB_PROP_TRACK_NUMBER, &v); g_value_unset (&v); } /* rating and play count? */ entry_data = RHYTHMDB_ENTRY_GET_TYPE_DATA (entry, RBGriloEntryData); entry_data->grilo_data = g_object_ref (data); if (container != NULL) { entry_data->grilo_container = g_object_ref (container); } /* might want to consider batching this */ rhythmdb_commit (db); return entry; }
static void set_metadata_from_media (MexContent *content, GrlMedia *media, MexContentMetadata mex_key) { gchar *string; const gchar *cstring; GrlKeyID grl_key = _get_grl_key_from_mex (mex_key); gint n; gint year = 0; if (!grl_key) return; switch (grl_metadata_key_get_type (grl_key)) { case G_TYPE_STRING: cstring = grl_data_get_string (GRL_DATA (media), grl_key); if (cstring) { if (mex_key == MEX_CONTENT_METADATA_TITLE) { gchar *showname = NULL, *title, *season_str; gint season, episode; gchar *replacement; const gchar *mimetype; mimetype = mex_content_get_metadata (content, MEX_CONTENT_METADATA_MIMETYPE); if (!mimetype) mimetype = ""; if (g_str_has_prefix (mimetype, "video/")) { mex_metadata_from_uri (cstring, &title, &showname, &year, &season, &episode); } if (showname) { replacement = g_strdup_printf (_("Episode %d"), episode); } else { GRegex *regex; /* strip off any file extensions */ regex = g_regex_new ("\\.....?$", 0, 0, NULL); replacement = g_regex_replace (regex, cstring, -1, 0, "", 0, NULL); g_regex_unref (regex); } if (!replacement) replacement = g_strdup (cstring); mex_content_set_metadata (content, mex_key, replacement); mex_content_set_metadata (content, MEX_CONTENT_METADATA_SERIES_NAME, showname); season_str = g_strdup_printf (_("Season %d"), season); mex_content_set_metadata (content, MEX_CONTENT_METADATA_SEASON, season_str); g_free (season_str); if (year) { replacement = g_strdup_printf ("%d", year); mex_content_set_metadata (content, MEX_CONTENT_METADATA_YEAR, replacement); g_free (replacement); } } else mex_content_set_metadata (content, mex_key, cstring); } break; case G_TYPE_INT: n = grl_data_get_int (GRL_DATA (media), grl_key); string = g_strdup_printf ("%i", n); mex_content_set_metadata (content, mex_key, string); g_free (string); break; case G_TYPE_FLOAT: string = g_strdup_printf ("%f", grl_data_get_float (GRL_DATA (media), grl_key)); mex_content_set_metadata (content, mex_key, string); g_free (string); break; } }
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); } }
static void fill_properties_table (MS2Server *server, GHashTable *properties_table, GList *keys, GrlMedia *media) { GList *prop; GrlKeyID key; const gchar *title; gchar *id; gchar *urls[2] = { 0 }; for (prop = keys; prop; prop = g_list_next (prop)) { key = GRLPOINTER_TO_KEYID (prop->data); if (key == GRL_METADATA_KEY_ID || grl_data_has_key (GRL_DATA (media), key)) { if (key == GRL_METADATA_KEY_ID) { id = serialize_media (media); if (id) { ms2_server_set_path (server, properties_table, id, grl_media_is_container (media)); g_free (id); } } else if (key == GRL_METADATA_KEY_TITLE) { /* Ensure we always insert a valid title */ title = grl_media_get_title (media); if (!title) { title = "Unknown"; } ms2_server_set_display_name (server, properties_table, title); } else if (key == GRL_METADATA_KEY_ALBUM) { ms2_server_set_album (server, properties_table, grl_data_get_string (GRL_DATA (media), GRL_METADATA_KEY_ALBUM)); } else if (key == GRL_METADATA_KEY_ARTIST) { ms2_server_set_artist (server, properties_table, grl_data_get_string (GRL_DATA (media), GRL_METADATA_KEY_ARTIST)); } else if (key == GRL_METADATA_KEY_GENRE) { ms2_server_set_genre (server, properties_table, grl_data_get_string (GRL_DATA (media), GRL_METADATA_KEY_GENRE)); } else if (key == GRL_METADATA_KEY_MIME) { ms2_server_set_mime_type (server, properties_table, grl_media_get_mime (media)); } else if (key == GRL_METADATA_KEY_URL) { urls[0] = (gchar *) grl_media_get_url (media); ms2_server_set_urls (server, properties_table, urls); } else if (key == GRL_METADATA_KEY_BITRATE) { ms2_server_set_bitrate (server, properties_table, grl_data_get_int (GRL_DATA (media), GRL_METADATA_KEY_BITRATE)); } else if (key == GRL_METADATA_KEY_DURATION) { ms2_server_set_duration (server, properties_table, grl_media_get_duration (media)); } else if (key == GRL_METADATA_KEY_HEIGHT) { ms2_server_set_height (server, properties_table, grl_data_get_int (GRL_DATA (media), GRL_METADATA_KEY_HEIGHT)); } else if (key == GRL_METADATA_KEY_WIDTH) { ms2_server_set_width (server, properties_table, grl_data_get_int (GRL_DATA (media), GRL_METADATA_KEY_WIDTH)); } else if (key == GRL_METADATA_KEY_GRILO_MS2_PARENT) { if (grl_media_get_id (media) == NULL) { ms2_server_set_parent (server, properties_table, MS2_ROOT); } else { ms2_server_set_parent (server, properties_table, grl_media_get_grilo_ms2_parent (media)); } } } } }