Example #1
0
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);

}
Example #4
0
/**
 * 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;
}
Example #5
0
/**
 * 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;
}
Example #6
0
/**
 * 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)));
}
Example #7
0
/**
 * 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;
}
Example #8
0
/**
 * 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)));
}
Example #9
0
/**
 * 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)));
}
Example #10
0
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)));
}
Example #11
0
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);
}