Backend: Assign CPID to all tracks added to current playlist

This commit is contained in:
Stein Magnus Jodal 2010-07-01 00:16:30 +02:00
parent e6843e8b4d
commit 98ed2d8f48

View File

@ -88,7 +88,7 @@ class BaseCurrentPlaylistController(object):
def __init__(self, backend): def __init__(self, backend):
self.backend = backend self.backend = backend
self._tracks = [] self._cp_tracks = []
def destroy(self): def destroy(self):
"""Cleanup after component.""" """Cleanup after component."""
@ -101,19 +101,7 @@ class BaseCurrentPlaylistController(object):
Read-only. Read-only.
""" """
return copy(self._tracks) return [t[1] for t in self._cp_tracks]
def __set_tracks(self, tracks):
self._tracks = copy(tracks)
self.version += 1
def __clear_tracks(self):
self._tracks = []
self.version += 1
def __remove_track(self, position):
del self._tracks[position]
self.version += 1
def add(self, track, at_position=None): def add(self, track, at_position=None):
""" """
@ -125,20 +113,20 @@ class BaseCurrentPlaylistController(object):
:param at_position: position in current playlist to add track :param at_position: position in current playlist to add track
:type at_position: int or :class:`None` :type at_position: int or :class:`None`
""" """
tracks = self.tracks assert at_position <= len(self._cp_tracks), \
assert at_position <= len(tracks), \
u'at_position can not be greater than playlist length' u'at_position can not be greater than playlist length'
if at_position is not None: if at_position is not None:
tracks.insert(at_position, track) self._cp_tracks.insert(at_position, (self.version, track))
else: else:
tracks.append(track) self._cp_tracks.append((self.version, track))
self.__set_tracks(tracks) self.version += 1
def clear(self): def clear(self):
"""Clear the current playlist.""" """Clear the current playlist."""
self.backend.playback.stop() self.backend.playback.stop()
self.backend.playback.current_track = None self.backend.playback.current_track = None
self.__clear_tracks() self._cp_tracks = []
self.version += 1
def get(self, **criteria): def get(self, **criteria):
""" """
@ -175,7 +163,8 @@ class BaseCurrentPlaylistController(object):
:param tracks: tracks to load :param tracks: tracks to load
:type tracks: list of :class:`mopidy.models.Track` :type tracks: list of :class:`mopidy.models.Track`
""" """
self.__clear_tracks() self._cp_tracks = []
self.version += 1
for track in tracks: for track in tracks:
self.add(track) self.add(track)
self.backend.playback.new_playlist_loaded_callback() self.backend.playback.new_playlist_loaded_callback()
@ -194,20 +183,22 @@ class BaseCurrentPlaylistController(object):
if start == end: if start == end:
end += 1 end += 1
tracks = self.tracks cp_tracks = self._cp_tracks
assert start < end, 'start must be smaller than end' assert start < end, 'start must be smaller than end'
assert start >= 0, 'start must be at least zero' assert start >= 0, 'start must be at least zero'
assert end <= len(tracks), 'end can not be larger than playlist length' assert end <= len(cp_tracks), \
'end can not be larger than playlist length'
assert to_position >= 0, 'to_position must be at least zero' assert to_position >= 0, 'to_position must be at least zero'
assert to_position <= len(tracks), 'to_position can not be larger ' + \ assert to_position <= len(cp_tracks), \
'than playlist length' 'to_position can not be larger than playlist length'
new_tracks = tracks[:start] + tracks[end:] new_cp_tracks = cp_tracks[:start] + cp_tracks[end:]
for track in tracks[start:end]: for cp_track in cp_tracks[start:end]:
new_tracks.insert(to_position, track) new_cp_tracks.insert(to_position, cp_track)
to_position += 1 to_position += 1
self.__set_tracks(new_tracks) self._cp_tracks = new_cp_tracks
self.version += 1
def remove(self, **criteria): def remove(self, **criteria):
""" """
@ -221,7 +212,7 @@ class BaseCurrentPlaylistController(object):
""" """
track = self.get(**criteria) track = self.get(**criteria)
position = self.tracks.index(track) position = self.tracks.index(track)
self.__remove_track(position) del self._cp_tracks[position]
def shuffle(self, start=None, end=None): def shuffle(self, start=None, end=None):
""" """
@ -233,7 +224,7 @@ class BaseCurrentPlaylistController(object):
:param end: position after last track to shuffle :param end: position after last track to shuffle
:type end: int or :class:`None` :type end: int or :class:`None`
""" """
tracks = self.tracks cp_tracks = self._cp_tracks
if start is not None and end is not None: if start is not None and end is not None:
assert start < end, 'start must be smaller than end' assert start < end, 'start must be smaller than end'
@ -242,14 +233,14 @@ class BaseCurrentPlaylistController(object):
assert start >= 0, 'start must be at least zero' assert start >= 0, 'start must be at least zero'
if end is not None: if end is not None:
assert end <= len(tracks), 'end can not be larger than ' + \ assert end <= len(cp_tracks), 'end can not be larger than ' + \
'playlist length' 'playlist length'
before = tracks[:start or 0] before = cp_tracks[:start or 0]
shuffled = tracks[start:end] shuffled = cp_tracks[start:end]
after = tracks[end or len(tracks):] after = cp_tracks[end or len(cp_tracks):]
random.shuffle(shuffled) random.shuffle(shuffled)
self.__set_tracks(before + shuffled + after) self._cp_tracks = before + shuffled + after
self.version += 1 self.version += 1
def destroy(self): def destroy(self):