r15803 - in /packages/unstable/rhythmbox/debian: ./ patches/

sjoerd at users.alioth.debian.org sjoerd at users.alioth.debian.org
Sat May 3 10:03:57 UTC 2008


Author: sjoerd
Date: Sat May  3 10:03:57 2008
New Revision: 15803

URL: http://svn.debian.org/wsvn/pkg-gnome/?sc=1&rev=15803
Log:
* Sync a set of fixes from SVN from the Ubuntu packaging:
  - debian/patches/90_from_svn_fix_audioscrobbler_issue.patch
    + Added. Fixes sending songs data with uri escape sequences still in them
    to audioscrobbler
  - debian/patches/91_from_svn_fix_eject_crasher.patch
    + Added. Fixes crash on eject
  - debian/patches/92_from_svn_fix_amazon_coverts_download.patch
    + Added. Fix the amazon cover downloader
  - debian/patches/93_from_svn_fix_cdda_gvfs_handling.patch
    + Added. Handle new-style gvfs cdda URIs
  - debian/patches/93_from_svn_fix_xfade_locking_issue.patch
    + Added. Fixes some locking issues with the xfade backend
  - debian/patches/94_from_svn_fix_podcast_parsing_issue.patch
    + Added. Fix parsing problems with some podcasts (Closes: #473412)

Added:
    packages/unstable/rhythmbox/debian/patches/90_from_svn_fix_audioscrobbler_issue.patch
    packages/unstable/rhythmbox/debian/patches/91_from_svn_fix_eject_crasher.patch
    packages/unstable/rhythmbox/debian/patches/92_from_svn_fix_amazon_coverts_download.patch
    packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_cdda_gvfs_handling.patch
    packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_xfade_locking_issue.patch
    packages/unstable/rhythmbox/debian/patches/94_from_svn_fix_podcast_parsing_issue.patch
Modified:
    packages/unstable/rhythmbox/debian/changelog

Modified: packages/unstable/rhythmbox/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/rhythmbox/debian/changelog?rev=15803&op=diff
==============================================================================
--- packages/unstable/rhythmbox/debian/changelog (original)
+++ packages/unstable/rhythmbox/debian/changelog Sat May  3 10:03:57 2008
@@ -3,8 +3,22 @@
   * debian/patches/00-rhythmbox-radio-songinfo.patch
     - Added. Fixes radio streams not showing metadata after being paused and
     started again.
-
- -- Sjoerd Simons <sjoerd at debian.org>  Sat, 03 May 2008 11:46:12 +0200
+  * Sync a set of fixes from SVN from the Ubuntu packaging:
+    - debian/patches/90_from_svn_fix_audioscrobbler_issue.patch
+      + Added. Fixes sending songs data with uri escape sequences still in them
+      to audioscrobbler
+    - debian/patches/91_from_svn_fix_eject_crasher.patch
+      + Added. Fixes crash on eject
+    - debian/patches/92_from_svn_fix_amazon_coverts_download.patch
+      + Added. Fix the amazon cover downloader
+    - debian/patches/93_from_svn_fix_cdda_gvfs_handling.patch
+      + Added. Handle new-style gvfs cdda URIs
+    - debian/patches/93_from_svn_fix_xfade_locking_issue.patch
+      + Added. Fixes some locking issues with the xfade backend
+    - debian/patches/94_from_svn_fix_podcast_parsing_issue.patch
+      + Added. Fix parsing problems with some podcasts (Closes: #473412)
+
+ -- Sjoerd Simons <sjoerd at debian.org>  Sat, 03 May 2008 11:53:40 +0200
 
 rhythmbox (0.11.5-2) unstable; urgency=low
 

Added: packages/unstable/rhythmbox/debian/patches/90_from_svn_fix_audioscrobbler_issue.patch
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/rhythmbox/debian/patches/90_from_svn_fix_audioscrobbler_issue.patch?rev=15803&op=file
==============================================================================
--- packages/unstable/rhythmbox/debian/patches/90_from_svn_fix_audioscrobbler_issue.patch (added)
+++ packages/unstable/rhythmbox/debian/patches/90_from_svn_fix_audioscrobbler_issue.patch Sat May  3 10:03:57 2008
@@ -1,0 +1,48 @@
+--- trunk/plugins/audioscrobbler/rb-audioscrobbler.c	2008/03/22 10:30:55	5642
++++ trunk/plugins/audioscrobbler/rb-audioscrobbler.c	2008/03/22 11:54:45	5643
+@@ -1458,6 +1458,17 @@
+ 
+ 
+ /* Queue functions: */
++static char *rb_uri_decode (const char *uri)
++{
++#if defined(HAVE_LIBSOUP_2_4)
++    return soup_uri_decode (uri);
++#else 
++    char *decoded;
++    decoded = g_strdup (uri);
++    soup_uri_decode (decoded);
++    return decoded;
++#endif
++}
+ 
+ static AudioscrobblerEntry*
+ rb_audioscrobbler_load_entry_from_string (const char *string)
+@@ -1477,23 +1488,19 @@
+ 		if (breaks2[0] != NULL && breaks2[1] != NULL) {
+ 			if (g_str_has_prefix (breaks2[0], "a")) {
+ 				g_free (entry->artist);
+-				entry->artist = g_strdup (breaks2[1]);
+-				soup_uri_decode (entry->artist);
++				entry->artist = rb_uri_decode (breaks2[1]);
+ 			}
+ 			if (g_str_has_prefix (breaks2[0], "t")) {
+ 				g_free (entry->title);
+-				entry->title = g_strdup (breaks2[1]);
+-				soup_uri_decode (entry->title);
++				entry->title = rb_uri_decode (breaks2[1]);
+ 			}
+ 			if (g_str_has_prefix (breaks2[0], "b")) {
+ 				g_free (entry->album);
+-				entry->album = g_strdup (breaks2[1]);
+-				soup_uri_decode (entry->album);
++				entry->album = rb_uri_decode (breaks2[1]);
+ 			}
+ 			if (g_str_has_prefix (breaks2[0], "m")) {
+ 				g_free (entry->mbid);
+-				entry->mbid = g_strdup (breaks2[1]);
+-				soup_uri_decode (entry->mbid);
++				entry->mbid = rb_uri_decode (breaks2[1]);
+ 			}
+ 			if (g_str_has_prefix (breaks2[0], "l")) {
+ 				entry->length = atoi (breaks2[1]);

Added: packages/unstable/rhythmbox/debian/patches/91_from_svn_fix_eject_crasher.patch
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/rhythmbox/debian/patches/91_from_svn_fix_eject_crasher.patch?rev=15803&op=file
==============================================================================
--- packages/unstable/rhythmbox/debian/patches/91_from_svn_fix_eject_crasher.patch (added)
+++ packages/unstable/rhythmbox/debian/patches/91_from_svn_fix_eject_crasher.patch Sat May  3 10:03:57 2008
@@ -1,0 +1,10 @@
+--- trunk/shell/rb-shell.c	2008/03/16 23:00:12	5622
++++ trunk/shell/rb-shell.c	2008/03/17 10:51:13	5623
+@@ -3351,7 +3351,6 @@
+ 	if (play) {
+ 		if (playlist_source != NULL) {
+ 			rb_shell_activate_source (shell, playlist_source);
+-			g_object_unref (playlist_source);
+ 			return TRUE;
+ 		}
+ 

Added: packages/unstable/rhythmbox/debian/patches/92_from_svn_fix_amazon_coverts_download.patch
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/rhythmbox/debian/patches/92_from_svn_fix_amazon_coverts_download.patch?rev=15803&op=file
==============================================================================
--- packages/unstable/rhythmbox/debian/patches/92_from_svn_fix_amazon_coverts_download.patch (added)
+++ packages/unstable/rhythmbox/debian/patches/92_from_svn_fix_amazon_coverts_download.patch Sat May  3 10:03:57 2008
@@ -1,0 +1,281 @@
+--- trunk/plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py	2007/12/27 13:46:47	5508
++++ trunk/plugins/artdisplay/artdisplay/AmazonCoverArtSearch.py	2008/04/10 22:11:54	5674
+@@ -27,6 +27,10 @@
+ DEFAULT_LOCALE = "en_US"
+ ASSOCIATE = "webservices-20"
+ 
++# We are not allowed to batch more than 2 requests at once
++# http://docs.amazonwebservices.com/AWSEcommerceService/4-0/PgCombiningOperations.html
++MAX_BATCH_JOBS = 2
++
+ 
+ class Bag: pass
+ 
+@@ -35,30 +39,31 @@
+ 		self.searching = False
+ 		self.cancel = False
+ 		self.loader = loader
+-		self._supportedLocales = {
+-			"en_US" : ("us", "xml.amazon.com", "music"),
+-			"en_GB" : ("uk", "xml-eu.amazon.com", "music"),
+-			"de" : ("de", "xml-eu.amazon.com", "music"),
+-			"ja" : ("jp", "xml.amazon.co.jp", "music-jp")
+-		}
+ 		self.db = None
+ 		self.entry = None
++		(self.tld, self.encoding) = self.__get_locale ()
+ 
+ 	def __get_locale (self):
+-		default = locale.getdefaultlocale ()
++		# "JP is the only locale that correctly takes UTF8 input. All other locales use LATIN1."
++		# http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1295&categoryID=117
++		supported_locales = {
++			"en_US" : ("com", "latin1"),
++			"en_GB" : ("co.uk", "latin1"),
++			"de" : ("de", "latin1"),
++			"ja" : ("jp", "utf8")
++		}
++
+ 		lc_id = DEFAULT_LOCALE
+-		if default[0] is not None:
+-			if self._supportedLocales.has_key (default[0]):
+-				lc_id = default[0]
++		default = locale.getdefaultlocale ()[0]
++		if default:
++			if supported_locales.has_key (default):
++				lc_id = default
+ 			else:
+-				lang = default[0].split("_")[0]
+-				if self._supportedLocales.has_key (lang):
++				lang = default.split("_")[0]
++				if supported_locales.has_key (lang):
+ 					lc_id = lang
+ 
+-		lc_host = self._supportedLocales[lc_id][1]
+-		lc_name = self._supportedLocales[lc_id][0]
+-		lc_mode = self._supportedLocales[lc_id][2]
+-		return ((lc_host, lc_name, lc_mode))
++		return supported_locales[lc_id]
+ 
+ 	def search (self, db, entry, on_search_completed_callback, *args):
+ 		self.searching = True
+@@ -72,6 +77,10 @@
+ 		st_artist = db.entry_get (entry, rhythmdb.PROP_ARTIST) or _("Unknown")
+ 		st_album = db.entry_get (entry, rhythmdb.PROP_ALBUM) or _("Unknown")
+ 
++		if st_artist == st_album == _("Unknown"):
++			self.on_search_completed (None)
++			return
++
+ 		# Tidy up
+ 
+ 		# Replace quote characters
+@@ -119,68 +128,58 @@
+ 				self.keywords.append ("%s %s" % (st_artist, st_album))
+ 				if st_album_no_vol != st_album:
+ 					self.keywords.append ("%s %s" % (st_artist, st_album_no_vol))
+-				if (st_album != _("Unknown")):
+-					self.keywords.append ("Various %s" % (st_album))
++				self.keywords.append ("Various %s" % (st_album))
+ 			self.keywords.append ("%s" % (st_artist))
+ 
+ 		# Initiate asynchronous search
+-		self.search_next ();
++		self.search_next ()
+ 
+-	def __build_url (self, keyword):
+-		(lc_host, lc_name, lc_mode) = self.__get_locale ()
++	def search_next (self):
++		if len (self.keywords) == 0:
++			# No keywords left to search -> no results
++			self.on_search_completed (None)
++			return False
+ 
+-		url = "http://" + lc_host + "/onca/xml3?f=xml"
+-		url += "&t=%s" % ASSOCIATE
+-		url += "&dev-t=%s" % LICENSE_KEY
+-		url += "&type=%s" % 'lite'
+-		url += "&locale=%s" % lc_name
+-		url += "&mode=%s" % lc_mode
+-		url += "&%s=%s" % ('KeywordSearch', urllib.quote (keyword))
++		self.searching = True
+ 
+-		return url
++		url = "http://ecs.amazonaws." + self.tld + "/onca/xml" \
++		      "?Service=AWSECommerceService"                   \
++		      "&AWSAccessKeyId=" + LICENSE_KEY +               \
++		      "&AssociateTag=" + ASSOCIATE +                   \
++		      "&ResponseGroup=Images,ItemAttributes"           \
++		      "&Operation=ItemSearch"                          \
++		      "&ItemSearch.Shared.SearchIndex=Music"
+ 
+-	def search_next (self):
+-		self.searching = True
+-		
+-		if len (self.keywords)==0:
+-			keyword = None
+-		else:
++		job = 1
++		while job <= MAX_BATCH_JOBS and len (self.keywords) > 0:
+ 			keyword = self.keywords.pop (0)
++			keyword = keyword.encode (self.encoding, "ignore")
++			keyword = keyword.strip ()
++			keyword = urllib.quote (keyword)
++			url += "&ItemSearch.%d.Keywords=%s" % (job, keyword)
++			job += 1
+ 
+-		if keyword is None:
+-			# No keywords left to search -> no results
+-			self.on_search_completed (None)
+-			ret = False
+-		else:
+-			# Retrieve search for keyword
+-			url = self.__build_url (keyword.strip ())
+-			self.loader.get_url (url, self.on_search_response)
+-			ret = True
+-
+-		return ret
++		# Retrieve search for keyword
++		self.loader.get_url (url, self.on_search_response)
++		return True
+ 
+ 	def __unmarshal (self, element):
+ 		rc = Bag ()
+-		if isinstance (element, minidom.Element) and (element.tagName == 'Details'):
+-			rc.URL = element.attributes["url"].value
+-		childElements = [e for e in element.childNodes if isinstance (e, minidom.Element)]
+-		if childElements:
+-			for child in childElements:
++		child_elements = [e for e in element.childNodes if isinstance (e, minidom.Element)]
++		if child_elements:
++			for child in child_elements:
+ 				key = child.tagName
+ 				if hasattr (rc, key):
+-					if type (getattr (rc, key)) <> type ([]):
++					if not isinstance (getattr (rc, key), list):
+ 						setattr (rc, key, [getattr (rc, key)])
+-					setattr (rc, key, getattr (rc, key) + [self.__unmarshal (child)])
+-				elif isinstance(child, minidom.Element) and (child.tagName == 'Details'):
+-					setattr (rc,key,[self.__unmarshal(child)])
++					getattr (rc, key).append (self.__unmarshal (child))
++				# get_best_match_urls() wants a list, even if there is only one item/artist
++				elif child.tagName in ("Items", "Item", "Artist"):
++					setattr (rc, key, [self.__unmarshal(child)])
+ 				else:
+ 					setattr (rc, key, self.__unmarshal(child))
+ 		else:
+ 			rc = "".join ([e.data for e in element.childNodes if isinstance (e, minidom.Text)])
+-			if element.tagName == 'SalesRank':
+-				rc = rc.replace ('.', '')
+-				rc = rc.replace (',', '')
+-				rc = int (rc)
+ 		return rc
+ 
+ 	def on_search_response (self, result_data):
+@@ -194,14 +193,14 @@
+ 			self.search_next()
+ 			return
+ 		
+-		data = self.__unmarshal (xmldoc).ProductInfo
+-
+-		if hasattr(data, 'ErrorMsg'):
+-			# Search was unsuccessful, try next keyword
++		data = self.__unmarshal (xmldoc)
++		if not hasattr (data, "ItemSearchResponse") or \
++		   not hasattr (data.ItemSearchResponse, "Items"):
++			# Something went wrong ...
+ 			self.search_next ()
+ 		else:
+ 			# We got some search results
+-			self.on_search_results (data.Details)
++			self.on_search_results (data.ItemSearchResponse.Items)
+ 
+ 	def on_search_results (self, results):
+ 		self.on_search_completed (results)
+@@ -224,25 +223,27 @@
+ 		return s
+ 
+ 	def __valid_match (self, item):
+-		if item.ImageUrlLarge == "" and item.ImageUrlMedium == "":
+-			print "%s doesn't have image URLs; ignoring" % (item.URL)
+-			return False
+-		return True
++		return (hasattr (item, "LargeImage") or hasattr (item, "MediumImage")) \
++		       and hasattr (item, "ItemAttributes")
+ 
+ 	def get_best_match_urls (self, search_results):
+ 		# Default to "no match", our results must match our criteria
+ 		best_match = None
+ 
+-		search_results = filter(self.__valid_match, search_results)
+-		try:
++		for result in search_results:
++			if not hasattr (result, "Item"):
++				# Search was unsuccessful, try next batch job
++				continue
++
++			items = filter(self.__valid_match, result.Item)
+ 			if self.search_album != _("Unknown"):
+ 				album_check = self.__tidy_up_string (self.search_album)
+-				for item in search_results:
++				for item in items:
++					if not hasattr (item.ItemAttributes, "Title"):
++						continue
+ 
+-					# Check for album name in ProductName
+-					product_name = self.__tidy_up_string (item.ProductName)
+-
+-					if product_name == album_check:
++					album = self.__tidy_up_string (item.ItemAttributes.Title)
++					if album == album_check:
+ 						# Found exact album, can not get better than that
+ 						best_match = item
+ 						break
+@@ -250,8 +251,9 @@
+ 					# Check the results for both an album name that contains the name
+ 					# we're searching for, and an album name that's a substring of the
+ 					# name we're searching for
+-					elif (best_match is None) and (product_name.find (album_check) != -1 
+-                                                                  or album_check.find (product_name) != -1):
++					elif (best_match is None) and \
++					     (album.find (album_check) != -1 or
++					      album_check.find (album) != -1):
+ 						best_match = item
+ 
+ 			# If we still have no definite hit, use first result where artist matches
+@@ -260,14 +262,11 @@
+ 				if best_match is None:
+ 					# Check if artist appears in the Artists list
+ 					hit = False
+-					for item in search_results:
+-
+-						if type (item.Artists.Artist) <> type ([]):
+-							artists = [item.Artists.Artist]
+-						else:
+-							artists = item.Artists.Artist
++					for item in items:
++						if not hasattr (item.ItemAttributes, "Artist"):
++							continue
+ 
+-						for artist in artists:
++						for artist in item.ItemAttributes.Artist:
+ 							artist = self.__tidy_up_string (artist)
+ 							if artist.find (artist_check) != -1:
+ 								best_match = item
+@@ -276,10 +275,10 @@
+ 						if hit:
+ 							break
+ 
+-			if best_match:
+-				return filter(lambda x: x != "", [item.ImageUrlLarge, item.ImageUrlMedium])
+-			else:
+-				return []
++			urls = [getattr (best_match, size).URL for size in ("LargeImage", "MediumImage")
++			        if hasattr (best_match, size)]
++			if urls:
++				return urls
+ 
+-		except TypeError:
+-			return []
++		# No search was successful
++		return []

Added: packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_cdda_gvfs_handling.patch
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_cdda_gvfs_handling.patch?rev=15803&op=file
==============================================================================
--- packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_cdda_gvfs_handling.patch (added)
+++ packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_cdda_gvfs_handling.patch Sat May  3 10:03:57 2008
@@ -1,0 +1,103 @@
+--- trunk/data/rhythmbox.desktop.in.in	2008/04/10 22:11:54	5674
++++ trunk/data/rhythmbox.desktop.in.in	2008/04/11 10:48:30	5675
+@@ -2,7 +2,7 @@
+ _Name=Rhythmbox Music Player
+ _GenericName=Music Player
+ _Comment=Play and organize your music collection
+-Exec=rhythmbox
++Exec=rhythmbox %U
+ Terminal=false
+ Type=Application
+ Icon=rhythmbox
+--- trunk/plugins/audiocd/rb-audiocd-source.c	2008/04/10 22:11:54	5674
++++ trunk/plugins/audiocd/rb-audiocd-source.c	2008/04/11 10:48:30	5675
+@@ -768,6 +768,28 @@
+ 	return actions;
+ }
+ 
++static char *
++_gnome_vfs_to_gvfs_cdda_uri (const char *gnome_vfs_uri)
++{
++	GString *retval;
++	guint i;
++
++	if (strstr (gnome_vfs_uri, "/dev/") == NULL)
++		return NULL;
++
++	retval = g_string_new ("");
++	for (i = 0; gnome_vfs_uri[i] != '\0' ;) {
++		if (strncmp (gnome_vfs_uri + i, "/dev/", 5) == 0)
++			i += 5;
++		else {
++			g_string_append_c (retval, gnome_vfs_uri[i]);
++			i++;
++		}
++	}
++
++	return g_string_free (retval, FALSE);
++}
++
+ static guint
+ impl_want_uri (RBSource *source, const char *uri)
+ {
+@@ -792,6 +814,16 @@
+ 
+ 	if (strcmp (activation_uri, uri) == 0)
+ 		retval = 100;
++	else {
++		char *gvfs_uri;
++
++		/* FIXME work-around "new" gvfs style URLs:
++		 * cdda://sr0/ instead of cdda:///dev/sr0 */
++		gvfs_uri = _gnome_vfs_to_gvfs_cdda_uri (activation_uri);
++		if (strncmp (gvfs_uri, uri, strlen (gvfs_uri - 1)) == 0)
++			retval = 100;
++		g_free (gvfs_uri);
++	}
+ 
+ 	g_free (activation_uri);
+ 
+--- trunk/shell/rb-shell.c	2008/04/10 22:11:54	5674
++++ trunk/shell/rb-shell.c	2008/04/11 10:48:30	5675
+@@ -3327,13 +3327,21 @@
+ 								     uri, error))
+ 					return FALSE;
+ 			}
+-		} else if (result == TOTEM_PL_PARSER_RESULT_IGNORED && rb_uri_is_local (uri)) {
+-			/* That happens for directories */
++		} else if ((result == TOTEM_PL_PARSER_RESULT_IGNORED && rb_uri_is_local (uri))
++			   || result == TOTEM_PL_PARSER_RESULT_UNHANDLED) {
++			/* That happens for directories and unhandled schemes, such as CDDA */
+ 			playlist_source = rb_shell_guess_source_for_uri (shell, uri);
+ 			if (playlist_source == NULL || rb_source_uri_is_source (playlist_source, uri) == FALSE) {
+-				rb_debug ("%s is a directory, but doesn't have a source, adding as a dir", uri);
+-				if (!rb_shell_add_uri (shell, uri, NULL, NULL, error))
++				/* Do we have a directory? */
++				if (rb_uri_is_local (uri)) {
++					rb_debug ("%s is a directory, but doesn't have a source, adding as a dir", uri);
++					if (!rb_shell_add_uri (shell, uri, NULL, NULL, error))
++						return FALSE;
++				} else {
++					/* Or something else? */
++					rb_debug ("%s is not handled as a playlist, isn't local, and doesn't have a source, doing nothing", uri);
+ 					return FALSE;
++				}
+ 			}
+ 		} else {
+ 			rb_debug ("%s didn't parse as a playlist", uri);
+@@ -3350,7 +3358,14 @@
+ 
+ 	if (play) {
+ 		if (playlist_source != NULL) {
++			char *name;
++
+ 			rb_shell_activate_source (shell, playlist_source);
++
++			g_object_get (playlist_source, "name", &name, NULL);
++			rb_debug ("Activated source '%s' for uri %s", name, uri);
++			g_free (name);
++
+ 			return TRUE;
+ 		}
+ 
+

Added: packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_xfade_locking_issue.patch
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_xfade_locking_issue.patch?rev=15803&op=file
==============================================================================
--- packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_xfade_locking_issue.patch (added)
+++ packages/unstable/rhythmbox/debian/patches/93_from_svn_fix_xfade_locking_issue.patch Sat May  3 10:03:57 2008
@@ -1,0 +1,137 @@
+--- trunk/backends/gstreamer/rb-player-gst-xfade.c	2008/04/08 12:51:33	5670
++++ trunk/backends/gstreamer/rb-player-gst-xfade.c	2008/04/08 22:26:36	5671
+@@ -515,14 +515,6 @@
+ 	}
+ }
+ 
+-static void
+-dump_stream_list_lock (RBPlayerGstXFade *player)
+-{
+-	g_static_rec_mutex_lock (&player->priv->stream_list_lock);
+-	dump_stream_list (player);
+-	g_static_rec_mutex_unlock (&player->priv->stream_list_lock);
+-}
+-
+ /* caller must hold stream list lock */
+ static RBXFadeStream *
+ find_stream_by_uri (RBPlayerGstXFade *player, const char *uri)
+@@ -797,14 +789,17 @@
+ static void
+ emit_stream_error (RBXFadeStream *stream, GError *error)
+ {
++	g_static_rec_mutex_lock (&stream->player->priv->stream_list_lock);
++
+ 	if (stream->error_idle_id != 0) {
+ 		g_error_free (error);
+-		return;
++	} else {
++		stream->error = error;
++		stream->error_idle_id = g_idle_add ((GSourceFunc) emit_stream_error_cb,
++						    stream);
+ 	}
+ 
+-	stream->error = error;
+-	stream->error_idle_id = g_idle_add ((GSourceFunc) emit_stream_error_cb,
+-					    stream);
++	g_static_rec_mutex_unlock (&stream->player->priv->stream_list_lock);
+ }
+ 
+ static void
+@@ -1332,8 +1327,8 @@
+ 	GList *t;
+ 	GList *reap = NULL;
+ 
+-	player->priv->stream_reap_id = 0;
+ 	g_static_rec_mutex_lock (&player->priv->stream_list_lock);
++	player->priv->stream_reap_id = 0;
+ 	dump_stream_list (player);
+ 	for (t = player->priv->streams; t != NULL; t = t->next) {
+ 		RBXFadeStream *stream = (RBXFadeStream *)t->data;
+@@ -1358,11 +1353,14 @@
+ static void
+ schedule_stream_reap (RBPlayerGstXFade *player)
+ {
+-	if (player->priv->stream_reap_id != 0)
+-		return;
++	g_static_rec_mutex_lock (&player->priv->stream_list_lock);
+ 
+-	dump_stream_list_lock (player);
+-	player->priv->stream_reap_id = g_idle_add ((GSourceFunc) reap_streams, player);
++	if (player->priv->stream_reap_id == 0) {
++		dump_stream_list (player);
++		player->priv->stream_reap_id = g_idle_add ((GSourceFunc) reap_streams, player);
++	}
++	
++	g_static_rec_mutex_unlock (&player->priv->stream_list_lock);
+ }
+ 
+ /* emits a tag signal from the player, maybe */
+@@ -2161,6 +2159,7 @@
+ {
+ 	RBPlayerGstXFade *player = stream->player;
+ 	gboolean ret = TRUE;
++	gboolean need_reap = FALSE;
+ 
+ 	g_static_rec_mutex_lock (&player->priv->stream_list_lock);
+ 
+@@ -2198,7 +2197,8 @@
+ 			case PREROLLING:
+ 			case PREROLL_PLAY:
+ 				rb_debug ("stream %s is paused; replacing it", pstream->uri);
+-				unlink_and_dispose_stream (player, pstream);
++				pstream->state = PENDING_REMOVE;
++				need_reap = TRUE;
+ 				break;
+ 
+ 			default:
+@@ -2236,13 +2236,14 @@
+ 				break;
+ 			case PAUSED:
+ 				rb_debug ("stream %s is paused; replacing it", pstream->uri);
+-				unlink_and_dispose_stream (player, pstream);
++				pstream->state = PENDING_REMOVE;
++				need_reap = TRUE;
+ 				break;
+ 			default:
+ 				break;
+ 			}
+ 		}
+-
++	
+ 		if (playing) {
+ 			/* wait for current stream's EOS */
+ 			rb_debug ("existing playing stream found; waiting for its EOS -> WAITING_EOS");
+@@ -2252,11 +2253,7 @@
+ 			ret = link_and_unblock_stream (stream, error);
+ 		}
+ 	} else {
+-		/* replace any existing playing stream.
+-		 * might need to use schedule_stream_reap instead of
+-		 * doing it directly, since we can get in here on a streaming
+-		 * thread..  hmm.
+-		 */
++		/* replace any existing playing stream */
+ 		GList *l;
+ 		for (l = player->priv->streams; l != NULL; l = l->next) {
+ 			RBXFadeStream *pstream = (RBXFadeStream *)l->data;
+@@ -2269,7 +2266,8 @@
+ 			case FADING_IN:
+ 				/* kill this one */
+ 				rb_debug ("stopping stream %s (replaced by new stream)", pstream->uri);
+-				unlink_and_dispose_stream (player, pstream);
++				need_reap = TRUE;
++				pstream->state = PENDING_REMOVE;
+ 				break;
+ 
+ 			default:
+@@ -2281,6 +2279,10 @@
+ 		ret = link_and_unblock_stream (stream, error);
+ 	}
+ 
++	if (need_reap) {
++		schedule_stream_reap (player);
++	}
++
+ 	g_static_rec_mutex_unlock (&player->priv->stream_list_lock);
+ 
+ 	return ret;

Added: packages/unstable/rhythmbox/debian/patches/94_from_svn_fix_podcast_parsing_issue.patch
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/rhythmbox/debian/patches/94_from_svn_fix_podcast_parsing_issue.patch?rev=15803&op=file
==============================================================================
--- packages/unstable/rhythmbox/debian/patches/94_from_svn_fix_podcast_parsing_issue.patch (added)
+++ packages/unstable/rhythmbox/debian/patches/94_from_svn_fix_podcast_parsing_issue.patch Sat May  3 10:03:57 2008
@@ -1,0 +1,11 @@
+--- trunk/podcast/rb-podcast-parse.c	2008/03/30 21:37:43	5659
++++ trunk/podcast/rb-podcast-parse.c	2008/03/31 12:46:48	5660
+@@ -193,7 +193,7 @@
+ 	}
+ 
+ 	plparser = totem_pl_parser_new ();
+-	g_object_set (plparser, "recurse", FALSE, NULL);
++	g_object_set (plparser, "recurse", FALSE, "force", TRUE, NULL);
+ 	g_signal_connect (G_OBJECT (plparser), "entry-parsed", G_CALLBACK (entry_parsed), data);
+ 	g_signal_connect (G_OBJECT (plparser), "playlist-started", G_CALLBACK (playlist_started), data);
+ 	g_signal_connect (G_OBJECT (plparser), "playlist-ended", G_CALLBACK (playlist_ended), data);




More information about the pkg-gnome-commits mailing list