[gnome-music/wip/jfelder/player-discovery] player: Do not reset validation if the playlist is unchanged
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/player-discovery] player: Do not reset validation if the playlist is unchanged
- Date: Wed, 13 Feb 2019 13:43:59 +0000 (UTC)
commit d06ba1fc255bad527cebd8b7d47e9f4ddac99cde
Author: Jean Felder <jfelder src gnome org>
Date: Wed Feb 13 12:10:40 2019 +0100
player: Do not reset validation if the playlist is unchanged
_validation_indexes keeps track of the songs being validated. Every
time a new playlist is loaded or a new song from the same playlist is
loaded by clicking on it, this list is reset. In the latter case, it
works fine in most of the cases because the discovery mechanism (which
is asynchronous) is fast enough to end before the user can click on an
other song. Indeed, the list is already empty when it is reset.
However, on a slow configuration, it is possible to select an other
song before the end of the discovery mechanism. So, the validation
list is reset even if a discovery is running. This results in a crash
as reported by #252.
The solution is to not reset _validation_indexes if the playlist is
unchanged. Also, introduce a new ValidationStatus (DOING) when a song
is being validated. This prevents to queue multiple times the same
song on a slow configuration.
closes: #252
gnomemusic/player.py | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
---
diff --git a/gnomemusic/player.py b/gnomemusic/player.py
index 6a077092..bb0ffc13 100644
--- a/gnomemusic/player.py
+++ b/gnomemusic/player.py
@@ -59,8 +59,9 @@ class RepeatMode(IntEnum):
class ValidationStatus(IntEnum):
"""Enum for song validation"""
PENDING = 0
- FAILED = 1
- SUCCEEDED = 2
+ DOING = 1
+ FAILED = 2
+ SUCCEEDED = 3
class PlayerField(IntEnum):
@@ -127,7 +128,6 @@ class PlayerPlaylist(GObject.GObject):
"""
path = model.get_path(model_iter)
self._current_index = int(path.to_string())
- self._validation_indexes = defaultdict(list)
# Playlist is the same. Check that the requested song is valid.
# If not, try to get the next valid one
@@ -140,6 +140,7 @@ class PlayerPlaylist(GObject.GObject):
self._validate_next_song()
return False
+ self._validation_indexes = defaultdict(list)
self._type = playlist_type
self._id = playlist_id
@@ -283,8 +284,9 @@ class PlayerPlaylist(GObject.GObject):
@log
def _validate_song(self, index):
item = self._songs[index]
- # Song has already been processed, nothing to do.
- if item[PlayerField.VALIDATION] != ValidationStatus.PENDING:
+ # Song is being processed or has already been processed.
+ # Nothing to do.
+ if item[PlayerField.VALIDATION] > ValidationStatus.PENDING:
return
song = item[PlayerField.SONG]
@@ -297,6 +299,7 @@ class PlayerPlaylist(GObject.GObject):
"Skipping validation of {} as not a local file".format(url))
return
+ item[PlayerField.VALIDATION] = ValidationStatus.DOING
self._validation_indexes[url].append(index)
self._discoverer.discover_uri_async(url)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]