Beispiel #1
0
static void
_mex_grilo_program_save_metadata (MexContent *content)
{
  MexGriloProgram        *program = MEX_GRILO_PROGRAM (content);
  MexGriloProgramPrivate *priv    = program->priv;
  GrlMediaSource         *source;
  const GList *ckeys;
  GList *keys;

  g_object_get (G_OBJECT (mex_program_get_feed (MEX_PROGRAM (program))),
                "grilo-source", &source,
                NULL);

  if (!(grl_metadata_source_supported_operations (GRL_METADATA_SOURCE (source))
        & GRL_OP_SET_METADATA))
    goto goout;

  ckeys = grl_metadata_source_writable_keys (GRL_METADATA_SOURCE (source));
  keys = g_list_copy ((GList *) ckeys);

  grl_metadata_source_set_metadata (GRL_METADATA_SOURCE (source),
                                    priv->media,
                                    keys,
                                    GRL_WRITE_NORMAL,
                                    NULL, NULL);

  g_list_free (keys);

 goout:
  g_object_unref (source);
}
static void
_mex_grilo_feed_content_updated (GrlSource *source,
                                 GPtrArray *changed_medias,
                                 GrlSourceChangeType change_type,
                                 gboolean known_location,
                                 MexGriloFeed *feed)
{
  gint i;
  GrlMedia *media;
  const gchar *id;
  MexGriloProgram *program;

  for (i = 0 ; i < changed_medias->len ; i++)
    {
      media =  g_ptr_array_index (changed_medias, i);
      id = grl_media_get_id (media);
      switch (change_type)
        {
        case GRL_CONTENT_CHANGED:
          program = MEX_GRILO_PROGRAM (mex_feed_lookup (MEX_FEED (feed), id));
          /* The policy might be slightly different here... */
          if (program != NULL) {
            mex_grilo_program_set_grilo_media (program, media);
          }
          break;

        case GRL_CONTENT_ADDED:
          program = MEX_GRILO_PROGRAM (mex_feed_lookup (MEX_FEED (feed), id));
          if (program != NULL) {
            mex_grilo_program_set_grilo_media (program, media);
          } else {
            emit_media_added (feed, media);
          }
          break;

        case GRL_CONTENT_REMOVED:
          program = MEX_GRILO_PROGRAM (mex_feed_lookup (MEX_FEED (feed), id));
          if (program != NULL) {
            mex_model_remove_content (MEX_MODEL (feed), MEX_CONTENT (program));
          }
          break;
        }
    }
}
Beispiel #3
0
static gchar *
mex_grilo_program_get_id (MexProgram *program)
{
  MexGriloProgram *self = MEX_GRILO_PROGRAM (program);
  MexGriloProgramPrivate *priv = self->priv;
  const gchar *id = grl_media_get_id (priv->media);

  if (!id)
    return NULL;

  return g_strdup (id);
}
Beispiel #4
0
static void
_mex_grilo_program_set_metadata (MexContent         *content,
                                 MexContentMetadata  key,
                                 const gchar        *value)
{
  MexGriloProgram        *program = MEX_GRILO_PROGRAM (content);
  MexGriloProgramPrivate *priv    = program->priv;

  if (!value)
    return;

  set_metadata_to_media (priv->media, key, value);
  mex_grilo_program_set_metadata (content, key, value);
}
Beispiel #5
0
static void
mex_grilo_program_dispose (GObject *object)
{
  MexGriloProgramPrivate *priv = MEX_GRILO_PROGRAM (object)->priv;

  if (priv->media) {
    g_object_unref (priv->media);
    priv->media = NULL;
  }

  if (priv->pid) {
    g_spawn_close_pid (priv->pid);
    priv->pid = 0;
  }

  G_OBJECT_CLASS (mex_grilo_program_parent_class)->dispose (object);
}
Beispiel #6
0
static void
mex_grilo_program_set_property (GObject      *object,
                                guint         property_id,
                                const GValue *value,
                                GParamSpec   *pspec)
{
  MexGriloProgram *program = MEX_GRILO_PROGRAM (object);

  switch (property_id) {
  case PROP_GRILO_MEDIA:
    mex_grilo_program_set_grilo_media (program, g_value_get_object (value));
    break;

  default:
    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  }
}
Beispiel #7
0
static void
mex_grilo_program_complete (MexProgram *program)
{
  GList *keys = NULL;
  GrlMediaSource *source = NULL;

  MexGriloProgram *self = MEX_GRILO_PROGRAM (program);
  MexGriloProgramPrivate *priv = self->priv;

  if (priv->completed)
    return;

  priv->completed = TRUE;

  g_object_get (G_OBJECT (mex_program_get_feed (program)),
                "grilo-source", &source,
                "grilo-metadata-keys", &keys,
                NULL);

  if (!source)
    return;

  if (!GRL_IS_METADATA_SOURCE (source))
    return;

  if (!(grl_metadata_source_supported_operations (GRL_METADATA_SOURCE (source))
        & GRL_OP_METADATA))
    return;

  /* FIXME: Currently just adding a ref, but we should keep the operation ID
   *        and cancel it on dispose instead.
   */
  g_object_ref (self);
  grl_media_source_metadata (source,
                             priv->media,
                             keys,
                             GRL_RESOLVE_IDLE_RELAY | GRL_RESOLVE_FULL,
                             program_complete_cb,
                             self);

  /* We don't unref the source here, it is done in
     mex_grilo_program_complete_cb */
}
Beispiel #8
0
static void
mex_grilo_program_get_stream (MexProgram        *program,
                              MexGetStreamReply  reply,
                              gpointer           userdata)
{
  GList *keys;
  GrlMediaSource *source;
  MexGriloProgramClosure *closure;
  MexGriloProgram *self = MEX_GRILO_PROGRAM (program);
  MexGriloProgramPrivate *priv = self->priv;

  closure = g_slice_new0 (MexGriloProgramClosure);
  closure->self = self;
  closure->reply = reply;
  closure->userdata = userdata;

  /* We have to add a reference around ourselves, as you can't cancel
   * the metadata callback and we need to be around when the reply
   * comes.
   */
  g_object_ref (self);

  g_object_get (G_OBJECT (mex_program_get_feed (program)),
                "grilo-source", &source,
                NULL);
  if (GRL_IS_METADATA_SOURCE (source) &&
      grl_metadata_source_supported_operations (
                                                GRL_METADATA_SOURCE (source)) & GRL_OP_METADATA) {
    keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL);
    grl_media_source_metadata (source,
                               priv->media,
                               keys,
                               GRL_RESOLVE_IDLE_RELAY | GRL_RESOLVE_FULL,
                               mex_grilo_program_get_stream_cb,
                               closure);
    g_list_free (keys);
  }
  else
    g_idle_add (mex_grilo_program_no_get_stream_cb, closure);
}
static void
browse_cb (GrlSource    *source,
           guint         browse_id,
           GrlMedia     *media,
           guint         remaining,
           gpointer      userdata,
           const GError *error)
{
  MexGriloFeed *feed = (MexGriloFeed *) userdata;
  MexGriloFeedPrivate *priv = feed->priv;
  MexGriloProgram *program;

  if (error) {
    g_warning ("Error browsing: %s", error->message);
    return;
  }

  if (priv->op == NULL) {
    g_warning ("No operation found");
    return;
  }

  if (priv->op->op_id != browse_id)
    return;

  if (media) {
    /*
     * FIXME: talk to thomas/lionel/grilo guys about that crasher. We are
     * being called with what seems to be an invalid media when cancelled.
     * this is obviously temporary to enable people to work in the meantime
     */
    gconstpointer foo = grl_media_get_id (media);
    if (!foo) {
      const gchar *source_name;

      source_name =
        grl_source_get_name (GRL_SOURCE (priv->source));
      g_warning ("FIXME: oh no, a grilo bug! (on the '%s' source)",
                 source_name);
      return;
    }

    program = MEX_GRILO_PROGRAM (mex_feed_lookup (MEX_FEED (feed),
                                                  grl_media_get_id (media)));
    if (program != NULL) {
      mex_grilo_program_set_grilo_media (program, media);
      return;
    } else {
      emit_media_added (feed, media);
      g_object_unref (media);
    }
  }

  priv->op->count++;

  if (remaining == 0) {
    priv->op->op_id = 0;

    /* Emit completed signal */
    priv->completed = TRUE;
    g_object_notify (G_OBJECT (feed), "completed");
  }
}