rpms/rhythmbox/devel rb-no-HEAD-for-podcasts.patch, NONE, 1.1 rhythmbox.spec, 1.269, 1.270

Bastien Nocera hadess at fedoraproject.org
Fri Oct 16 15:22:33 UTC 2009


Author: hadess

Update of /cvs/pkgs/rpms/rhythmbox/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv32207

Modified Files:
	rhythmbox.spec 
Added Files:
	rb-no-HEAD-for-podcasts.patch 
Log Message:
* Fri Oct 16 2009 Bastien Nocera <bnocera at redhat.com> 0.12.5-6
- Avoid using HEAD to get podcast mime-types


rb-no-HEAD-for-podcasts.patch:
 rb-podcast-manager.c |  150 +++++++++++++++++++++++++++++++--------------------
 1 file changed, 92 insertions(+), 58 deletions(-)

--- NEW FILE rb-no-HEAD-for-podcasts.patch ---
>From a3a69d76e25358fc05c99e57041fa1485486345f Mon Sep 17 00:00:00 2001
From: Robert Ancell <robert.ancell at canonical.com>
Date: Thu, 15 Oct 2009 16:28:32 +1100
Subject: [PATCH] Support using g_file_input_stream_query_info() to get file information for podcasts.  This means only one connection to the server is required instead of two when using g_file_query_info()

---
 podcast/rb-podcast-manager.c |  149 ++++++++++++++++++++++++++----------------
 1 files changed, 92 insertions(+), 57 deletions(-)

diff --git a/podcast/rb-podcast-manager.c b/podcast/rb-podcast-manager.c
index eb6c821..bc1695b 100644
--- a/podcast/rb-podcast-manager.c
+++ b/podcast/rb-podcast-manager.c
@@ -153,9 +153,14 @@ static void rb_podcast_manager_get_property 		(GObject *object,
 							 guint prop_id,
 		                                	 GValue *value,
                 		                	 GParamSpec *pspec);
+static void read_file_cb					(GFile *source,
+							 GAsyncResult *result,
+							 RBPodcastManagerInfo *data);
 static void download_file_info_cb			(GFile *source,
 							 GAsyncResult *result,
 							 RBPodcastManagerInfo *data);
+static void download_podcast				(GFileInfo *src_info,
+							 RBPodcastManagerInfo *data);
 static void rb_podcast_manager_abort_download		(RBPodcastManagerInfo *data);
 static gboolean rb_podcast_manager_sync_head_cb 	(gpointer data);
 static gboolean rb_podcast_manager_head_query_cb 	(GtkTreeModel *query_model,
@@ -618,7 +623,7 @@ rb_podcast_manager_head_query_cb (GtkTreeModel *query_model,
 }
 
 static void
-download_error (RBPodcastManagerInfo *data, GError *error)
+download_error (RBPodcastManagerInfo *data, GError *error, gboolean in_thread)
 {
 	GValue val = {0,};
 	rb_debug ("error downloading %s: %s",
@@ -636,7 +641,12 @@ download_error (RBPodcastManagerInfo *data, GError *error)
 	g_value_unset (&val);
 
 	rhythmdb_commit (data->pd->priv->db);
-	g_idle_add ((GSourceFunc)end_job, data);
+
+	if (in_thread) {
+		g_idle_add ((GSourceFunc)end_job, data);
+	} else {
+		rb_podcast_manager_abort_download (data);
+	}
 }
 
 static gboolean
@@ -645,7 +655,6 @@ rb_podcast_manager_next_file (RBPodcastManager * pd)
 	const char *location;
 	RBPodcastManagerInfo *data;
 	char *query_string;
-	const char *attrs;
 	GList *d;
 
 	g_assert (rb_is_main_thread ());
@@ -689,69 +698,103 @@ rb_podcast_manager_next_file (RBPodcastManager * pd)
 
 	data->source = g_file_new_for_uri (location);
 
-	attrs = G_FILE_ATTRIBUTE_STANDARD_SIZE ","
-		G_FILE_ATTRIBUTE_STANDARD_COPY_NAME ","
-		G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME;
-	g_file_query_info_async (data->source,
-				 attrs,
-				 G_FILE_QUERY_INFO_NONE,
-				 0,
-				 data->cancel,
-				 (GAsyncReadyCallback) download_file_info_cb,
-				 data);
+	g_file_read_async (data->source,
+	                   0,
+	                   data->cancel,
+	                   (GAsyncReadyCallback) read_file_cb,
+	                   data);
 
 	GDK_THREADS_LEAVE ();
 	return FALSE;
 }
 
 static void
-download_file_info_cb (GFile *source,
-		       GAsyncResult *result,
-		       RBPodcastManagerInfo *data)
+read_file_cb (GFile *source,
+              GAsyncResult *result,
+              RBPodcastManagerInfo *data)
 {
 	GError *error = NULL;
 	GFileInfo *src_info;
-	char *local_file_name = NULL;
-	char *feed_folder;
-	char *esc_local_file_name;
-	char *local_file_uri;
-	char *sane_local_file_uri;
-	char *conf_dir_uri;
 
 	g_assert (rb_is_main_thread ());
 
-	rb_debug ("got file info results for %s",
+	rb_debug ("started read for %s",
 		  get_remote_location (data->entry));
 
-	src_info = g_file_query_info_finish (source, result, &error);
-
-	/* ignore G_IO_ERROR_FAILED here, as it probably just means that the server is lame.
-	 * actual problems (not found, permission denied, etc.) have specific errors codes,
-	 * so they'll still be reported.
+	data->in_stream = g_file_read_finish (data->source,
+	                                      result,
+	                                      &error);
+	if (error != NULL) {
+		download_error (data, error, FALSE);
+		g_error_free (error);
+		return;
+	}
+    
+	src_info = g_file_input_stream_query_info (data->in_stream,
+	                                           G_FILE_ATTRIBUTE_STANDARD_SIZE ","
+	                                           G_FILE_ATTRIBUTE_STANDARD_COPY_NAME ","
+	                                           G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME,
+	                                           NULL,
+	                                           &error);
+
+	/* If no stream information then probably using an old version of gvfs, fall back
+	 * to getting the stream information from the GFile.
+	 * This branch can be removed when this version of gvfs is released, see:
+	 * https://bugzilla.gnome.org/show_bug.cgi?id=598505
 	 */
-	if (error != NULL && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_FAILED) == FALSE) {
-		GValue val = {0,};
+	if (error != NULL) {
+		rb_debug ("file info query from input failed, trying query on file: %s", error->message);
+		g_error_free (error);
 
-		rb_debug ("file info query failed: %s", error->message);
+		g_file_query_info_async (data->source,
+		                         G_FILE_ATTRIBUTE_STANDARD_SIZE ","
+		                         G_FILE_ATTRIBUTE_STANDARD_COPY_NAME ","
+		                         G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME,
+		                         G_FILE_QUERY_INFO_NONE,
+		                         0,
+		                         data->cancel,
+		                         (GAsyncReadyCallback) download_file_info_cb,
+		                         data);
+		return;
+	}
 
-		g_value_init (&val, G_TYPE_ULONG);
-		g_value_set_ulong (&val, RHYTHMDB_PODCAST_STATUS_ERROR);
-		rhythmdb_entry_set (data->pd->priv->db, data->entry, RHYTHMDB_PROP_STATUS, &val);
-		g_value_unset (&val);
+	rb_debug ("got file info results for %s",
+		  get_remote_location (data->entry));
 
-		g_value_init (&val, G_TYPE_STRING);
-		g_value_set_string (&val, error->message);
-		rhythmdb_entry_set (data->pd->priv->db, data->entry, RHYTHMDB_PROP_PLAYBACK_ERROR, &val);
-		g_value_unset (&val);
+	download_podcast (src_info, data);
+}
 
-		rhythmdb_commit (data->pd->priv->db);
+static void
+download_file_info_cb (GFile *source,
+                       GAsyncResult *result,
+                       RBPodcastManagerInfo *data)
+{
+	GError *error = NULL;
+	GFileInfo *src_info;
+
+	src_info = g_file_query_info_finish (source, result, &error);
 
+	if (error != NULL) {
+		download_error (data, error, FALSE);
 		g_error_free (error);
-		rb_podcast_manager_abort_download (data);
-		return;
 	} else {
-		g_clear_error (&error);
+		rb_debug ("got file info results for %s",
+			  get_remote_location (data->entry));
+
+		download_podcast (src_info, data);
 	}
+}
+
+static void
+download_podcast (GFileInfo *src_info, RBPodcastManagerInfo *data)
+{
+	GError *error = NULL;
+	char *local_file_name = NULL;
+	char *feed_folder;
+	char *esc_local_file_name;
+	char *local_file_uri;
+	char *sane_local_file_uri;
+	char *conf_dir_uri;
 
 	if (src_info != NULL) {
 		data->download_size = g_file_info_get_attribute_uint64 (src_info, G_FILE_ATTRIBUTE_STANDARD_SIZE);
@@ -769,7 +812,7 @@ download_file_info_cb (GFile *source,
 
 	if (local_file_name == NULL) {
 		/* fall back to the basename from the original URI */
-		local_file_name = g_file_get_basename (source);
+		local_file_name = g_file_get_basename (data->source);
 		rb_debug ("didn't get a filename from the file info request; using basename %s", local_file_name);
 	}
 
@@ -819,7 +862,6 @@ download_file_info_cb (GFile *source,
 		return;
 	}
 
-
 	data->destination = g_file_new_for_uri (sane_local_file_uri);
 	if (g_file_query_exists (data->destination, NULL)) {
 		GFileInfo *dest_info;
@@ -892,7 +934,7 @@ download_file_info_cb (GFile *source,
 					TRUE,
 					&error);
 	if (error != NULL) {
-		download_error (data, error);
+		download_error (data, error, TRUE);
 		g_error_free (error);
 	}
 }
@@ -1407,14 +1449,6 @@ podcast_download_thread (RBPodcastManagerInfo *data)
 	gssize n_read;
 	gssize n_written;
 	guint64 downloaded;
-	
-	/* open remote file */
-	data->in_stream = g_file_read (data->source, data->cancel, &error);
-	if (error != NULL) {
-		download_error (data, error);
-		g_error_free (error);
-		return NULL;
-	}
 
 	/* if we have an offset to download from, try the seek
 	 * before anything else.  if we can't seek, we'll have to
@@ -1443,7 +1477,7 @@ podcast_download_thread (RBPodcastManagerInfo *data)
 		}
 	}
 	if (error != NULL) {
-		download_error (data, error);
+		download_error (data, error, TRUE);
 		g_error_free (error);
 		return NULL;
 	}
@@ -1491,7 +1525,7 @@ podcast_download_thread (RBPodcastManagerInfo *data)
 						  data->cancel,
 						  &error);
 		if (error != NULL) {
-			download_error (data, error);
+			download_error (data, error, TRUE);
 			g_error_free (error);
 			return NULL;
 		}
@@ -1535,7 +1569,8 @@ podcast_download_thread (RBPodcastManagerInfo *data)
 	g_object_unref (data->out_stream);
 
 	if (error != NULL) {
-		download_error (data, error);
+		download_error (data, error, TRUE);
+		g_error_free (error);
 	} else {
 		download_progress (data, downloaded, data->download_size, TRUE);
 	}
-- 
1.6.3.3



Index: rhythmbox.spec
===================================================================
RCS file: /cvs/pkgs/rpms/rhythmbox/devel/rhythmbox.spec,v
retrieving revision 1.269
retrieving revision 1.270
diff -u -p -r1.269 -r1.270
--- rhythmbox.spec	13 Oct 2009 16:17:00 -0000	1.269
+++ rhythmbox.spec	16 Oct 2009 15:22:32 -0000	1.270
@@ -3,7 +3,7 @@
 Name: rhythmbox
 Summary: Music Management Application
 Version: 0.12.5
-Release: 5%{?dist}
+Release: 6%{?dist}
 License: GPLv2+ with exceptions and GFDL
 Group: Applications/Multimedia
 URL: http://projects.gnome.org/rhythmbox/
@@ -56,6 +56,8 @@ BuildRequires: automake autoconf libtool
 Patch1: 0001-Use-C-only-for-the-browser-plugin.patch
 # https://bugzilla.gnome.org/show_bug.cgi?id=597899
 Patch2: rb-fix-daap-plugin.patch
+# https://bugzilla.gnome.org/show_bug.cgi?id=596615
+Patch3: rb-no-HEAD-for-podcasts.patch
 
 %description
 Rhythmbox is an integrated music management application based on the powerful
@@ -93,6 +95,7 @@ from, and sending media to UPnP/DLNA net
 %patch1 -p1 -b .itms
 %patch2 -p1 -b .daap
 autoreconf -i
+%patch3 -p1 -b .http-head
 
 # Use the installed louie, not the one in Coherence
 find plugins/coherence/upnp_coherence/ -type f -exec sed -i 's/coherence.extern.louie as louie/louie/' '{}' ';'
@@ -224,6 +227,9 @@ fi
 %{_libdir}/rhythmbox/plugins/upnp_coherence
 
 %changelog
+* Fri Oct 16 2009 Bastien Nocera <bnocera at redhat.com> 0.12.5-6
+- Avoid using HEAD to get podcast mime-types
+
 * Tue Oct 13 2009 Bastien Nocera <bnocera at redhat.com> 0.12.5-5
 - Fix DAAP plugin not working
 




More information about the fedora-extras-commits mailing list