void mex_grilo_update_content_from_media (MexContent *content, GrlMedia *media) { g_return_if_fail (MEX_IS_CONTENT (content)); g_return_if_fail (GRL_IS_MEDIA (media)); /* FIXME: This list is just hard-coded and needs to be the same as * the default set of keys in MexGriloFeed... Grilo is likely * to add an API to retrieve all setted keys, we might want * to use that. */ set_metadata_from_media (content, media, MEX_CONTENT_METADATA_TITLE); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_SYNOPSIS); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_MIMETYPE); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_STILL); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_STREAM); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_WIDTH); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_HEIGHT); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_DATE); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_DURATION); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_LAST_POSITION); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_PLAY_COUNT); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_LAST_PLAYED_DATE); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_CAMERA_MODEL); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_ORIENTATION); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_FLASH_USED); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_EXPOSURE_TIME); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_ISO_SPEED); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_CREATION_DATE); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_ALBUM); set_metadata_from_media (content, media, MEX_CONTENT_METADATA_ARTIST); }
/** * mex_media_controls_get_enqueued: * @controls: The MexMediaControls widget * @current_content: MexContent that the player is currently playing * * If the media controls has been given a queue model then return the next * MexContent in the queue model. * * Return value: The next content in the queue or NULL */ MexContent * mex_media_controls_get_enqueued (MexMediaControls *controls, MexContent *current_content) { MexMediaControlsPrivate *priv; MexModel *queue; MexContent *content = NULL; if (!MEX_IS_MEDIA_CONTROLS (controls) || !MEX_IS_CONTENT (current_content)) return NULL; priv = controls->priv; if (priv->is_queue_model == FALSE) return NULL; queue = mex_proxy_get_model (priv->proxy); if (queue) { gint idx, length; idx = mex_model_index (queue, current_content); length = mex_model_get_length (queue); if (idx++ > length) return NULL; content = mex_model_get_content (queue, idx); } return content; }
MexModel * mex_aggregate_model_get_model_for_content (MexAggregateModel *aggregate, MexContent *content) { g_return_val_if_fail (MEX_IS_CONTENT (content), NULL); return (MexModel *)g_hash_table_lookup (aggregate->priv->content_to_model, content); }
/** * mex_content_get_property_name: * @key: The key ID * * Retrieves the property name for @key. * * It's possible to return %NULL when the #MexContent does not want to * associate a GObject property with a #MexContentMetadata key. This means, * for instance that it will disable the #GBindings that are setup * automatically by wigets like #MexContentBox or #MexContentButton. * * The default implementation returns %NULL for any @key value given. * * Return value: The property name or %NULL. */ const char * mex_content_get_property_name (MexContent *content, MexContentMetadata key) { MexContentIface *iface; g_return_val_if_fail (MEX_IS_CONTENT (content), NULL); iface = MEX_CONTENT_GET_IFACE (content); if (iface->get_property_name) return iface->get_property_name (content, key); return NULL; }
/** * mex_content_get_metadata_fallback: * @content: a #MexContent * @key: a #MexContentMetadata * * Retrieves a string for @key for this content. * * Return value: The string corresponding to the @key. Because this string * may be dynamically created it should be freed with g_free when no longer * needed. * * Since: 0.2 */ gchar * mex_content_get_metadata_fallback (MexContent *content, MexContentMetadata key) { MexContentIface *iface; g_return_val_if_fail (MEX_IS_CONTENT (content), NULL); iface = MEX_CONTENT_GET_IFACE (content); if (G_LIKELY (iface->get_metadata_fallback)) return iface->get_metadata_fallback (content, key); return NULL; }
/** * mex_content_save_metadata: * @content: a #MexContent * * Save all metadata into underlaying backend. * * Since: 0.2 */ void mex_content_save_metadata (MexContent *content) { MexContentIface *iface; g_return_if_fail (MEX_IS_CONTENT (content)); iface = MEX_CONTENT_GET_IFACE (content); if (iface->save_metadata) { iface->save_metadata (content); return; } g_warning ("MexContent of type '%s' does not implement save_metadata()", g_type_name (G_OBJECT_TYPE (content))); }
/** * mex_content_get_metadata: * @content: a #MexContent * @key: a #MexContentMetadata * * Retrieves a string for @key for this content. * * Return value: The string corresponding to the @key * * Since: 0.2 */ const gchar * mex_content_get_metadata (MexContent *content, MexContentMetadata key) { MexContentIface *iface; g_return_val_if_fail (MEX_IS_CONTENT (content), NULL); iface = MEX_CONTENT_GET_IFACE (content); if (G_LIKELY (iface->get_metadata)) return iface->get_metadata (content, key); g_warning ("MexContent of type '%s' does not implement get_metadata()", g_type_name (G_OBJECT_TYPE (content))); return NULL; }
/** * mex_content_view_set_content: * @view: a #MexContentView * @content: a #MexContent * * Adds @content to @view */ void mex_content_view_set_content (MexContentView *view, MexContent *content) { MexContentViewIface *iface; g_return_if_fail (MEX_IS_CONTENT_VIEW (view)); g_return_if_fail (MEX_IS_CONTENT (content) || content == NULL); iface = MEX_CONTENT_VIEW_GET_IFACE (view); if (G_LIKELY (iface->set_content)) { iface->set_content (view, content); return; } g_warning ("MexContentView of type '%s' does not implement set_content()", g_type_name (G_OBJECT_TYPE (view))); }
/** * mex_content_set_metadata: * @content: a #MexContent * @key: a #MexContentMetadata * @value: a string corresponding to the new value of @key * * Sets a string for @key for this content. * * Since: 0.2 */ void mex_content_set_metadata (MexContent *content, MexContentMetadata key, const gchar *value) { MexContentIface *iface; g_return_if_fail (MEX_IS_CONTENT (content)); iface = MEX_CONTENT_GET_IFACE (content); if (G_LIKELY (iface->set_metadata)) { iface->set_metadata (content, key, value); return; } g_warning ("MexContent of type '%s' does not implement set_metadata()", g_type_name (G_OBJECT_TYPE (content))); }
void mex_content_foreach_metadata (MexContent *content, MexContentMetadataCb callback, gpointer data) { MexContentIface *iface; g_return_if_fail (MEX_IS_CONTENT (content)); g_return_if_fail (callback != NULL); iface = MEX_CONTENT_GET_IFACE (content); if (iface->foreach_metadata) { iface->foreach_metadata (content, callback, data); return; } g_warning ("MexContent of type '%s' does not implement foreach_metadata()", g_type_name (G_OBJECT_TYPE (content))); }
void mex_view_model_set_start_content (MexViewModel *self, MexContent *content) { MexViewModelPrivate *priv; g_return_if_fail (MEX_IS_VIEW_MODEL (self)); g_return_if_fail (!content || MEX_IS_CONTENT (content)); priv = self->priv; if (priv->start_content) { g_object_unref (priv->start_content); priv->start_content = NULL; } if (content) priv->start_content = g_object_ref (content); else priv->start_content = NULL; mex_view_model_refresh_external_items (self); }
void mex_media_controls_set_content (MexMediaControls *self, MexContent *content, MexModel *context) { MexMediaControlsPrivate *priv = self->priv; gboolean show_description; g_return_if_fail (MEX_IS_CONTENT (content)); if (priv->model == context) { if (priv->content == content) return; if (priv->content) g_object_unref (priv->content); if (content) priv->content = g_object_ref_sink (content); mex_media_controls_focus_content (self, priv->content); mex_media_controls_update_header (self); return; } if (priv->model) { g_object_unref (priv->model); priv->model = NULL; } if (context) priv->model = g_object_ref_sink (context); if (priv->content) { g_object_unref (priv->content); priv->content = NULL; } if (content) priv->content = g_object_ref_sink (content); priv->is_queue_model = FALSE; mex_media_controls_update_header (self); /* We may not have a context if we're launched by something like SetUri*/ if (context) { MexModel *orig_model; orig_model = mex_model_get_model (context); g_object_set (G_OBJECT (priv->proxy_model), "model", orig_model, NULL); mex_view_model_set_start_content (priv->proxy_model, priv->content); mex_view_model_set_loop (priv->proxy_model, TRUE); /* Work out if the context was a queue FIXME unreliable */ /* From coloumn context = MexViewModel MexAggregateModel MexQueueModel */ /* From grid context = MexProxyModel MexProxyModel MexQueueModel */ if (MEX_IS_PROXY_MODEL (context)) { MexModel *model_from_proxy; model_from_proxy = mex_proxy_model_get_model (MEX_PROXY_MODEL (orig_model)); if (MEX_IS_QUEUE_MODEL (model_from_proxy)) priv->is_queue_model = TRUE; } else if (MEX_IS_AGGREGATE_MODEL (orig_model)) { MexModel *real_model; real_model = mex_aggregate_model_get_model_for_content (MEX_AGGREGATE_MODEL (orig_model), content); if (MEX_IS_QUEUE_MODEL (real_model)) priv->is_queue_model = TRUE; } } /* Update content on the queue button */ mex_content_view_set_content (MEX_CONTENT_VIEW (priv->queue_button), priv->content); /* show the description rather than the seek bar for certain content */ show_description = !g_strcmp0 ("x-mex/tv", mex_content_get_metadata (priv->content, MEX_CONTENT_METADATA_MIMETYPE)); mex_media_controls_show_description(self, show_description); }