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; } } }
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); }
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); }
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); }
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); } }
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 */ }
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"); } }