Fix some missing renames in PlaybackController. Doc changes from singlerepeat branch.

This commit is contained in:
Stein Magnus Jodal 2010-08-16 21:27:38 +02:00
parent e7291c3d2c
commit 4cfbfbb2d2
2 changed files with 114 additions and 41 deletions

View File

@ -72,19 +72,36 @@ greatly improved MPD client support.
- Relocate from :mod:`mopidy.backends` to :mod:`mopidy.backends.base`. - Relocate from :mod:`mopidy.backends` to :mod:`mopidy.backends.base`.
- The ``id`` field of :class:`mopidy.models.Track` has been removed, as it is - The ``id`` field of :class:`mopidy.models.Track` has been removed, as it is
no longer needed after the CPID refactoring. no longer needed after the CPID refactoring.
- :meth:`mopidy.backends.base.BaseBackend()` now accepts an
``output_queue`` which it can use to send messages (i.e. audio data)
to the output process.
- :meth:`mopidy.backends.base.BaseLibraryController.find_exact()` now accepts - :meth:`mopidy.backends.base.BaseLibraryController.find_exact()` now accepts
keyword arguments of the form ``find_exact(artist=['foo'], keyword arguments of the form ``find_exact(artist=['foo'],
album=['bar'])``. album=['bar'])``.
- :meth:`mopidy.backends.base.BaseLibraryController.search()` now accepts - :meth:`mopidy.backends.base.BaseLibraryController.search()` now accepts
keyword arguments of the form ``search(artist=['foo', 'fighters'], keyword arguments of the form ``search(artist=['foo', 'fighters'],
album=['bar', 'grooves'])``. album=['bar', 'grooves'])``.
- :meth:`mopidy.backends.base.BaseBackend()` now accepts an
``output_queue`` which it can use to send messages (i.e. audio data)
to the output process.
- :meth:`mopidy.backends.base.BaseCurrentPlaylistController.load()` now - :meth:`mopidy.backends.base.BaseCurrentPlaylistController.load()` now
appends to the existing playlist. Use appends to the existing playlist. Use
:meth:`mopidy.backends.base.BaseCurrentPlaylistController.clear()` if you :meth:`mopidy.backends.base.BaseCurrentPlaylistController.clear()` if you
want to clear it first. want to clear it first.
- The following fields in
:class:`mopidy.backends.base.BasePlaybackController` has been renamed to
reflect their relation to methods called on the controller:
- ``next_track`` to ``track_at_next``
- ``next_cp_track`` to ``cp_track_at_next``
- ``previous_track`` to ``track_at_previous``
- ``previous_cp_track`` to ``cp_track_at_previous``
- :attr:`mopidy.backends.base.BasePlaybackController.track_at_eot` and
:attr:`mopidy.backends.base.BasePlaybackController.cp_track_at_eot` has
been added to better handle the difference between the user pressing next
and the current track ending.
- Rename
:meth:`mopidy.backends.base.BasePlaybackController.new_playlist_loaded_callback()`
to
:meth:`mopidy.backends.base.BasePlaybackController.on_current_playlist_change()`.
0.1.0a3 (2010-08-03) 0.1.0a3 (2010-08-03)

View File

@ -25,7 +25,7 @@ class BasePlaybackController(object):
#: Tracks are not removed from the playlist. #: Tracks are not removed from the playlist.
consume = False consume = False
#: The currently playing or selected track #: The currently playing or selected track.
#: #:
#: A two-tuple of (CPID integer, :class:`mopidy.models.Track`) or #: A two-tuple of (CPID integer, :class:`mopidy.models.Track`) or
#: :class:`None`. #: :class:`None`.
@ -45,7 +45,8 @@ class BasePlaybackController(object):
repeat = False repeat = False
#: :class:`True` #: :class:`True`
#: Playback is stopped after current song, unless in repeat mode. #: Playback is stopped after current song, unless in :attr:`repeat`
#: mode.
#: :class:`False` #: :class:`False`
#: Playback continues after current song. #: Playback continues after current song.
single = False single = False
@ -59,19 +60,32 @@ class BasePlaybackController(object):
self._play_time_started = None self._play_time_started = None
def destroy(self): def destroy(self):
"""Cleanup after component.""" """
Cleanup after component.
May be overridden by subclasses.
"""
pass pass
def _get_cpid(self, cp_track):
if cp_track is None:
return None
return cp_track[0]
def _get_track(self, cp_track):
if cp_track is None:
return None
return cp_track[1]
@property @property
def current_cpid(self): def current_cpid(self):
""" """
The CPID (current playlist ID) of :attr:`current_track`. The CPID (current playlist ID) of the currently playing or selected
track.
Read-only. Extracted from :attr:`current_cp_track` for convenience. Read-only. Extracted from :attr:`current_cp_track` for convenience.
""" """
if self.current_cp_track is None: return self._get_cpid(self.current_cp_track)
return None
return self.current_cp_track[0]
@property @property
def current_track(self): def current_track(self):
@ -80,13 +94,15 @@ class BasePlaybackController(object):
Read-only. Extracted from :attr:`current_cp_track` for convenience. Read-only. Extracted from :attr:`current_cp_track` for convenience.
""" """
if self.current_cp_track is None: return self._get_track(self.current_cp_track)
return None
return self.current_cp_track[1]
@property @property
def current_playlist_position(self): def current_playlist_position(self):
"""The position of the current track in the current playlist.""" """
The position of the current track in the current playlist.
Read-only.
"""
if self.current_cp_track is None: if self.current_cp_track is None:
return None return None
try: try:
@ -96,25 +112,23 @@ class BasePlaybackController(object):
return None return None
@property @property
def next_track(self): def track_at_eot(self):
""" """
The next track in the playlist. The track that will be played at the end of the current track.
A :class:`mopidy.models.Track` extracted from :attr:`cp_track_at_next` for Read-only. A :class:`mopidy.models.Track` extracted from
convenience. :attr:`cp_track_at_eot` for convenience.
""" """
cp_track_at_next = self.cp_track_at_next return self._get_track(self.cp_track_at_eot)
if cp_track_at_next is None:
return None
return cp_track_at_next[1]
@property @property
def cp_track_at_eot(self): def cp_track_at_eot(self):
""" """
The next track in the playlist which should be played when The track that will be played at the end of the current track.
we get an end of track event, such as when a track is finished playing.
A two-tuple of (CPID integer, :class:`mopidy.models.Track`). Read-only. A two-tuple of (CPID integer, :class:`mopidy.models.Track`).
Not necessarily the same track as :attr:`cp_track_at_next`.
""" """
cp_tracks = self.backend.current_playlist.cp_tracks cp_tracks = self.backend.current_playlist.cp_tracks
@ -147,13 +161,22 @@ class BasePlaybackController(object):
except IndexError: except IndexError:
return None return None
@property
def track_at_next(self):
"""
The track that will be played if calling :meth:`next()`.
Read-only. A :class:`mopidy.models.Track` extracted from
:attr:`cp_track_at_next` for convenience.
"""
return self._get_track(self.cp_track_at_next)
@property @property
def cp_track_at_next(self): def cp_track_at_next(self):
""" """
The next track in the playlist which should be played when we get a The track that will be played if calling :meth:`next()`.
event, such as a user clicking the next button.
A two-tuple of (CPID integer, :class:`mopidy.models.Track`). Read-only. A two-tuple of (CPID integer, :class:`mopidy.models.Track`).
For normal playback this is the next track in the playlist. If repeat For normal playback this is the next track in the playlist. If repeat
is enabled the next track can loop around the playlist. When random is is enabled the next track can loop around the playlist. When random is
@ -188,22 +211,19 @@ class BasePlaybackController(object):
return None return None
@property @property
def previous_track(self): def track_at_previous(self):
""" """
The previous track in the playlist. The track that will be played if calling :meth:`previous()`.
A :class:`mopidy.models.Track` extracted from :attr:`previous_cp_track` Read-only. A :class:`mopidy.models.Track` extracted from
for convenience. :attr:`cp_track_at_previous` for convenience.
""" """
previous_cp_track = self.previous_cp_track return self._get_track(self.cp_track_at_previous)
if previous_cp_track is None:
return None
return previous_cp_track[1]
@property @property
def previous_cp_track(self): def cp_track_at_previous(self):
""" """
The previous track in the playlist. The track that will be played if calling :meth:`previous()`.
A two-tuple of (CPID integer, :class:`mopidy.models.Track`). A two-tuple of (CPID integer, :class:`mopidy.models.Track`).
@ -337,11 +357,18 @@ class BasePlaybackController(object):
self.state = self.PAUSED self.state = self.PAUSED
def _pause(self): def _pause(self):
"""
To be overridden by subclass. Implement your backend's pause
functionality here.
:rtype: :class:`True` if successful, else :class:`False`
"""
raise NotImplementedError raise NotImplementedError
def play(self, cp_track=None, on_error_step=1): def play(self, cp_track=None, on_error_step=1):
""" """
Play the given track or the currently active track. Play the given track, or if the given track is :class:`None`, play the
currently active track.
:param cp_track: track to play :param cp_track: track to play
:type cp_track: two-tuple (CPID integer, :class:`mopidy.models.Track`) :type cp_track: two-tuple (CPID integer, :class:`mopidy.models.Track`)
@ -371,15 +398,24 @@ class BasePlaybackController(object):
self._shuffled.remove(self.current_cp_track) self._shuffled.remove(self.current_cp_track)
def _play(self, track): def _play(self, track):
"""
To be overridden by subclass. Implement your backend's play
functionality here.
:param track: the track to play
:type track: :class:`mopidy.models.Track`
:rtype: :class:`True` if successful, else :class:`False`
"""
raise NotImplementedError raise NotImplementedError
def previous(self): def previous(self):
"""Play the previous track.""" """Play the previous track."""
if self.previous_cp_track is None: if self.cp_track_at_previous is None:
return return
if self.state == self.STOPPED: if self.state == self.STOPPED:
return return
self.play(self.previous_cp_track, on_error_step=-1) self.play(self.cp_track_at_previous, on_error_step=-1)
def resume(self): def resume(self):
"""If paused, resume playing the current track.""" """If paused, resume playing the current track."""
@ -387,6 +423,12 @@ class BasePlaybackController(object):
self.state = self.PLAYING self.state = self.PLAYING
def _resume(self): def _resume(self):
"""
To be overridden by subclass. Implement your backend's resume
functionality here.
:rtype: :class:`True` if successful, else :class:`False`
"""
raise NotImplementedError raise NotImplementedError
def seek(self, time_position): def seek(self, time_position):
@ -413,6 +455,14 @@ class BasePlaybackController(object):
self._seek(time_position) self._seek(time_position)
def _seek(self, time_position): def _seek(self, time_position):
"""
To be overridden by subclass. Implement your backend's seek
functionality here.
:param time_position: time position in milliseconds
:type time_position: int
:rtype: :class:`True` if successful, else :class:`False`
"""
raise NotImplementedError raise NotImplementedError
def stop(self): def stop(self):
@ -421,4 +471,10 @@ class BasePlaybackController(object):
self.state = self.STOPPED self.state = self.STOPPED
def _stop(self): def _stop(self):
"""
To be overridden by subclass. Implement your backend's stop
functionality here.
:rtype: :class:`True` if successful, else :class:`False`
"""
raise NotImplementedError raise NotImplementedError