[rhythmbox] metadata: add audio, video, other flags



commit b934260e33d124069ee934235ea4e91e2c6e37aa
Author: Jonathan Matthew <jonathan d14n org>
Date:   Mon Jun 8 18:55:39 2009 +1000

    metadata: add audio, video, other flags
    
    Three new functions in the RBMetadata interface, returning whether the
    file contains audio, video, and 'other' data.  This is the first step in
    moving the decision on whether to ignore a file outside the metadata
    reader.
---
 metadata/rb-metadata-dbus-client.c  |   90 ++++++++++++++++++++++++-----------
 metadata/rb-metadata-dbus-service.c |   13 +++++
 metadata/rb-metadata-gst.c          |   22 +++++++--
 metadata/rb-metadata.h              |    3 +
 4 files changed, 96 insertions(+), 32 deletions(-)

diff --git a/metadata/rb-metadata-dbus-client.c b/metadata/rb-metadata-dbus-client.c
index 0d2f9c5..aa96e41 100644
--- a/metadata/rb-metadata-dbus-client.c
+++ b/metadata/rb-metadata-dbus-client.c
@@ -90,6 +90,9 @@ struct RBMetaDataPrivate
 	char       *mimetype;
 	char      **missing_plugins;
 	char      **plugin_descriptions;
+	gboolean    has_audio;
+	gboolean    has_video;
+	gboolean    has_other_data;
 	GHashTable *metadata;
 };
 
@@ -371,6 +374,11 @@ rb_metadata_load (RBMetaData *md,
 	DBusError dbus_error = {0,};
 	gboolean ok;
 	GError *fake_error = NULL;
+	GError *dbus_gerror;
+
+	dbus_gerror = g_error_new (RB_METADATA_ERROR,
+				   RB_METADATA_ERROR_INTERNAL,
+				   _("D-BUS communication error"));
 
 	if (error == NULL)
 		error = &fake_error;
@@ -397,15 +405,9 @@ rb_metadata_load (RBMetaData *md,
 							RB_METADATA_DBUS_INTERFACE,
 							"load");
 		if (!message) {
-			g_set_error (error,
-				     RB_METADATA_ERROR,
-				     RB_METADATA_ERROR_INTERNAL,
-				     _("D-BUS communication error"));
+			g_propagate_error (error, dbus_gerror);
 		} else if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &uri, DBUS_TYPE_INVALID)) {
-			g_set_error (error,
-				     RB_METADATA_ERROR,
-				     RB_METADATA_ERROR_INTERNAL,
-				     _("D-BUS communication error"));
+			g_propagate_error (error, dbus_gerror);
 		}
 	}
 
@@ -422,30 +424,21 @@ rb_metadata_load (RBMetaData *md,
 
 	if (*error == NULL) {
 		if (!dbus_message_iter_init (response, &iter)) {
-			g_set_error (error,
-				     RB_METADATA_ERROR,
-				     RB_METADATA_ERROR_INTERNAL,
-				     _("D-BUS communication error"));
+			g_propagate_error (error, dbus_gerror);
 			rb_debug ("couldn't read response message");
 		}
 	}
 	
 	if (*error == NULL) {
 		if (!rb_metadata_dbus_get_strv (&iter, &md->priv->missing_plugins)) {
-			g_set_error (error,
-				     RB_METADATA_ERROR,
-				     RB_METADATA_ERROR_INTERNAL,
-				     _("D-BUS communication error"));
+			g_propagate_error (error, dbus_gerror);
 			rb_debug ("couldn't get missing plugin data from response message");
 		}
 	}
 
 	if (*error == NULL) {
 		if (!rb_metadata_dbus_get_strv (&iter, &md->priv->plugin_descriptions)) {
-			g_set_error (error,
-				     RB_METADATA_ERROR,
-				     RB_METADATA_ERROR_INTERNAL,
-				     _("D-BUS communication error"));
+			g_propagate_error (error, dbus_gerror);
 			rb_debug ("couldn't get missing plugin descriptions from response message");
 		}
 	}
@@ -461,22 +454,43 @@ rb_metadata_load (RBMetaData *md,
 
 	if (*error == NULL) {
 		if (!rb_metadata_dbus_get_boolean (&iter, &ok)) {
-			g_set_error (error,
-				     RB_METADATA_ERROR,
-				     RB_METADATA_ERROR_INTERNAL,
-				     _("D-BUS communication error"));
+			g_propagate_error (error, dbus_gerror);
 			rb_debug ("couldn't get success flag from response message");
 		} else if (ok == FALSE) {
 			read_error_from_message (md, &iter, error);
 		}
 	}
 
+	if (*error == NULL) {
+		if (!rb_metadata_dbus_get_boolean (&iter, &md->priv->has_audio)) {
+			g_propagate_error (error, dbus_gerror);
+			rb_debug ("couldn't get has-audio flag from response message");
+		} else {
+			rb_debug ("has audio: %d", md->priv->has_audio);
+		}
+	}
+
+	if (*error == NULL) {
+		if (!rb_metadata_dbus_get_boolean (&iter, &md->priv->has_video)) {
+			g_propagate_error (error, dbus_gerror);
+			rb_debug ("couldn't get has-video flag from response message");
+		} else {
+			rb_debug ("has video: %d", md->priv->has_video);
+		}
+	}
+
+	if (*error == NULL) {
+		if (!rb_metadata_dbus_get_boolean (&iter, &md->priv->has_other_data)) {
+			g_propagate_error (error, dbus_gerror);
+			rb_debug ("couldn't get has-other-data flag from response message");
+		} else {
+			rb_debug ("has other data: %d", md->priv->has_other_data);
+		}
+	}
+
 	if (ok && *error == NULL) {
 		if (!rb_metadata_dbus_get_string (&iter, &md->priv->mimetype)) {
-			g_set_error (error,
-				     RB_METADATA_ERROR,
-				     RB_METADATA_ERROR_INTERNAL,
-				     _("D-BUS communication error"));
+			g_propagate_error (error, dbus_gerror);
 		} else {
 			rb_debug ("got mimetype: %s", md->priv->mimetype);
 		}
@@ -490,6 +504,8 @@ rb_metadata_load (RBMetaData *md,
 		dbus_message_unref (message);
 	if (response)
 		dbus_message_unref (response);
+	if (*error != dbus_gerror)
+		g_error_free (dbus_gerror);
 	if (fake_error)
 		g_error_free (fake_error);
 
@@ -743,3 +759,21 @@ rb_metadata_save (RBMetaData *md, GError **error)
 
 	g_static_mutex_unlock (&conn_mutex);
 }
+
+gboolean
+rb_metadata_has_audio (RBMetaData *md)
+{
+	return md->priv->has_audio;
+}
+
+gboolean
+rb_metadata_has_video (RBMetaData *md)
+{
+	return md->priv->has_video;
+}
+
+gboolean
+rb_metadata_has_other_data (RBMetaData *md)
+{
+	return md->priv->has_other_data;
+}
diff --git a/metadata/rb-metadata-dbus-service.c b/metadata/rb-metadata-dbus-service.c
index 3cd1f31..300c32f 100644
--- a/metadata/rb-metadata-dbus-service.c
+++ b/metadata/rb-metadata-dbus-service.c
@@ -127,6 +127,9 @@ rb_metadata_dbus_load (DBusConnection *connection,
 	const char *mimetype = NULL;
 	char **missing_plugins = NULL;
 	char **plugin_descriptions = NULL;
+	gboolean has_audio;
+	gboolean has_video;
+	gboolean has_other_data;
 
 	if (!dbus_message_iter_init (message, &iter)) {
 		return DBUS_HANDLER_RESULT_NEED_MEMORY;
@@ -169,6 +172,9 @@ rb_metadata_dbus_load (DBusConnection *connection,
 	}
 
 	mimetype = rb_metadata_get_mime (svc->metadata);
+	has_audio = rb_metadata_has_audio (svc->metadata);
+	has_video = rb_metadata_has_video (svc->metadata);
+	has_other_data = rb_metadata_has_other_data (svc->metadata);
 	dbus_message_iter_init_append (reply, &iter);
 	
 	if (!rb_metadata_dbus_add_strv (&iter, missing_plugins)) {
@@ -181,6 +187,9 @@ rb_metadata_dbus_load (DBusConnection *connection,
 	}
 
 	if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &ok) ||
+	    !dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &has_audio) ||
+	    !dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &has_video) ||
+	    !dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &has_other_data) ||
 	    !dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &mimetype)) {
 		rb_debug ("out of memory adding data to return message");
 		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
@@ -468,6 +477,10 @@ test_load (const char *uri)
 		}
 	}
 
+	g_print ("has audio: %d\n", rb_metadata_has_audio (md));
+	g_print ("has video: %d\n", rb_metadata_has_video (md));
+	g_print ("has other: %d\n", rb_metadata_has_other_data (md));
+
 	if (rb_metadata_get_missing_plugins (md, &missing_plugins, &plugin_descriptions)) {
 		int i = 0;
 		g_print ("missing plugins:\n");
diff --git a/metadata/rb-metadata-gst.c b/metadata/rb-metadata-gst.c
index 85162bb..0a83e81 100644
--- a/metadata/rb-metadata-gst.c
+++ b/metadata/rb-metadata-gst.c
@@ -796,12 +796,8 @@ rb_metadata_gst_new_decoded_pad_cb (GstElement *decodebin, GstPad *pad, gboolean
 			md->priv->has_audio = TRUE;
 		} else if (g_str_has_prefix (mimetype, "video/")) {
 			rb_debug ("got decoded video pad of type %s", mimetype);
-			md->priv->has_non_audio = TRUE;
 			md->priv->has_video = TRUE;
 		} else {
-			/* assume anything we can get a video or text stream out of is
-			 * something that should be fed to totem rather than rhythmbox.
-			 */
 			rb_debug ("got decoded pad of non-audio type %s", mimetype);
 			md->priv->has_non_audio = TRUE;
 		}
@@ -1534,3 +1530,21 @@ rb_metadata_get_missing_plugins (RBMetaData *md,
 	return TRUE;
 }
 
+gboolean
+rb_metadata_has_audio (RBMetaData *md)
+{
+	return md->priv->has_audio;
+}
+
+gboolean
+rb_metadata_has_video (RBMetaData *md)
+{
+	return md->priv->has_video;
+}
+
+gboolean
+rb_metadata_has_other_data (RBMetaData *md)
+{
+	return md->priv->has_non_audio;		/* kinda */
+}
+
diff --git a/metadata/rb-metadata.h b/metadata/rb-metadata.h
index 05502d9..f70a20f 100644
--- a/metadata/rb-metadata.h
+++ b/metadata/rb-metadata.h
@@ -137,6 +137,9 @@ gboolean	rb_metadata_has_missing_plugins (RBMetaData *md);
 gboolean	rb_metadata_get_missing_plugins (RBMetaData *md,
 					 char ***missing_plugins,
 					 char ***plugin_descriptions);
+gboolean	rb_metadata_has_audio	(RBMetaData *md);
+gboolean	rb_metadata_has_video	(RBMetaData *md);
+gboolean	rb_metadata_has_other_data (RBMetaData *md);
 
 gboolean	rb_metadata_get		(RBMetaData *md, RBMetaDataField field,
 					 GValue *val);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]