Mopidy extension to automatically pick up where you left off and start playing the last track from the position before Mopidy was shut down. https://pypi.org/project/Mopidy-Autoplay
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Stephan Helma 7e90dbf917 Adds more verbose and prominent explanations for internet streams. 3 months ago
.circleci Initial commit. 1 year ago
mopidy_autoplay Undoes PR7 (untile we get an explanation). 4 months ago
tests Initial commit. 1 year ago
.gitignore Transfer from hg to git. 12 months ago
CHANGELOG.rst Undoes PR7 (untile we get an explanation). 4 months ago
LICENSE Initial commit. 1 year ago
MANIFEST.in Revert "Revert "Replaces mentions of github.com to codeberg.org."" 4 months ago
README.rst Adds more verbose and prominent explanations for internet streams. 3 months ago
pyproject.toml - Fix the section name for the example of the ini file shown in the 6 months ago
setup.cfg Revert "Revert "Replaces mentions of github.com to codeberg.org."" 4 months ago
setup.py Initial commit. 1 year ago
tox.ini Initial commit. 1 year ago

README.rst

Mopidy-Autoplay

Latest PyPI version

CircleCI build status

Test coverage

Mopidy extension to automatically pick up where you left off and start playing the last track from the position before Mopidy was shut down.

If you simply want to restore Mopidy's state exactly as it were when you left, you can set core/restore_state to true. The default behaviour of this extension is to mimick this, but by using this extension, you can modify the state. You can set the entries in the tracklist, the tracklist options, the playback state (e.g. set it to paused) and the mixer's volume (and mute state).

Notice

There are some similar extensions which might suit your requirements better:

  • If you want to automatically play a playlist after start of the Mopidy service, use Mopidy-DefaultPlaylist.
  • If you want to automate music playback based on the time of the day, use Mopidy-Auto.
  • If you want to save the current playback state to be able to resume later, have a look at Mopidy-Bookmarks.

Caveats

Internet streams not playing

Important for streaming backends, such as ytmusic, spotify and all similar backends which needs a bit longer to load: It is highly likely that Mopidy-Autoplay will _not work with them most of the time.

Unfortunately there is is nothing I can do about it.

TL;DR: The reason for this is as follows: Mopidy loads the add-ons in an arbitrary order. Each add-on needs a certain time to initialize. As soon as Mopidy-Autoplay has finished loading, it will send a request to play the last track. If the backend responsible for playing that track has not finished loading yet, it can not honour that request and does not play this track. Mopidy-Autoplay then tries to play the next available track. If there is none, nothing is played and to the user it looks like Mopidy-Autoplay is not working. (Only the logging shows a warning, but to be honest, who is scrutinizing the logs?)

The suggestion to add a delay before Mopidy-Autoplay requests playing the tracks might work. But this has two major disadvantages: Faster backends will also be delayed. And – more important – if the backends needs longer, because of a slower than usual response by the streaming server (slow internet, slow server, …), the track is sometimes played and sometimes not played. This will confuse the user even more. (IMHO spurios errors are worse than consistent errors.)

A discussion about this behaviour can be found in this topic and this comment.

Interference with Mopidy's core/restore_state option

If you set Mopidy's configuration option core/restore_state = true, this might interfere with Mopidy-Autoplay, so it is best to either set core/restore_state = false or delete this entry. (When I tested it, Mopidy-Autoplay gets activated well after the state is restored with core/restore_state, thus Mopidy-Autoplay takes precedence.)

Installation

Install by running:

python3 -m pip install Mopidy-Autoplay

See https://mopidy.com/ext/mopidy-autoplay/ for alternative installation methods.

Configuration

Before starting Mopidy, you must add configuration for Mopidy-Autoplay to your Mopidy configuration file:

[autoplay]
enabled = true

# Save on events.
# https://docs.mopidy.com/en/latest/api/core/#core-events lists possible events,
# e.g.
#     save_on_events = track_playback_started,playback_state_changed
# saves the state whenever a track starts playing or the playback changes
# (stops, pauses, plays)
save_on_events =

# To reduce the number of write operations, it is possible to give an interval
# in seconds: All events will be collected for this interval and only written
# afterwards. If set to 0, the state will be saved immediately.
save_interval = 10

# Each of the following keys can take the value "auto" (without quotes),
# in which case the values active before Mopidy was stopped are used.

# Tracklist (uris = uri, ...; index = int)
tracklist.uris = auto
tracklist.index = auto

# Tracklist options (on|off|true|false)
tracklist.consume = auto
tracklist.random = auto
tracklist.repeat = auto
tracklist.single = auto

# Playback (state = stopped|playing|paused; time_position = [in ms])
playback.state = auto
playback.time_position = auto

# Mixer (volume = [0..100]; mute = on|off|true|false)
mixer.volume = auto
mixer.mute = auto

With this default configuration, Mopidy restores the queue (tracklist) with all the tracks from the time it was shut down. It restores all the settings, such as "consume", "random", "repeat" and "single", sets the volume level and if it was muted and finally plays the track at the position mopidy was playing before it was shut down.

If you always want to play the last track, regardless if it was playing or muted before shutdown, use:

playback.state = playing
mixer.volume = 80
mixer.mute = off

If you always want to start with the same track, e.g. a webradio stream, add to the settings above:

tracklist.uris = http://icecast.radiofrance.fr/fip-hifi.aac
tracklist.index = 0

For more than one track, separate them with a comma ,. Please also note, that the URI is not encapsulated in quotation marks (" or ').

Autosave

To not just save the state, when Mopidy shuts down, you have to list all events, when the state should be saved. The possible events are listed and described in https://docs.mopidy.com/en/latest/api/core/#core-events.

To get the state written immediately, set:

save_interval = 0

If you use a SD-card and worry about excessive wear (e.g. when changing volume, each step would write the state file to the disk), increase this value, e.g.:

save_interval = 10

and all changes will be collected for 10 seconds and the state file will be written at a maximum every tenth second.

How to find the URIs?

You can use any of the URIs supported on your installation of Mopidy. Here are some examples:

  • file:///usr/share/sounds/alsa/Noise.wav (Extension Mopidy-File must be enabled, which it is by default) Please note, that as of Mopidy version 3.0.2, it is possible to load any file on the filesystem permission permitted, but that might change in future to just allow files from directories mentioned in `file/media_dirs <https://docs.mopidy.com/en/latest/ext/file/#confval-file/media_dirs>`_.
  • http://bbcmedia.ic.llnwd.net/stream/bbcmedia_radio2_mf_p (Extension Mopidy-Stream must be enabled, which it is by default)
  • m3u://<myplaylist>.m3u8 (Extension Mopidy-M3U) must be enabled, which it is by default) – all entries of this playlist will be inserted into the list instead of m3u://.

In addition to these URIs, which are supported natively by Mopidy, Mopidy-Autoplay also supports a unique match: URI. Currently implemented are glob patterns to load many files from the file system, e.g. the URI will load all .wav files found in the directory /usr/share/sounds/alsa/:

  • match:file:///usr/share/sounds/alsa/*.wav (Extension Mopidy-File) must be enabled, which it is by default) – all files found will be inserted into the list instead of match:file://. Note, that according to Python's documentation, the order of the files is unpredictable and depends on the operating system.

If you don't know, how the URI is named, you can do the following:

  1. Assemble the tracks, you want to play after start-up, put all of them into Mopidy's queue.
  2. Stop Mopidy.
  3. Open the state file /var/lib/mopidy/autoplay/autoplay.state and look for the tracklist/uris entry. This should be the list of URI you are looking for.
  4. Copy this list into Mopidy's configuration file under autoplay/tracklist.uris, remove the square brackets ([, ]) and the quotation marks (") surrounding the URIs, keeping the commas (,) between the URIs, e.g. tracklist.uris = file:///usr/share/sounds/alsa/Noise.wav, http://bbcmedia.ic.llnwd.net/stream/bbcmedia_radio2_mf_p.
  5. Take also notice of the tracklist/index entry in the state file, which can be used as tracklist.index in the configuration file to start with a certain entry.

Project resources

Credits