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