This new Loop mode keeps reproducing the current track, unless it is
changed using the player controls to go to the next/previous track.
As in other applications, this is set by using the "Repeat" button,
which now goes from "Off" -> "Repeat All" -> "Repeat One".
Adding the Loop functionality, along with the Player changes to support
it, and a button to the player controls.
`Player` now has a `loopMode` attribute, which determines whether it
should loop. At the moment, only the following modes are supported:
* `LoopNone`: Disables loop.
* `LoopAll`: Enables loop for the entire playlist queue.
This has been designed as an enum, to support other modes in the future
(e.g. loop for the current track only).
It depends on the `loop` functionality provided by MPV (using the
[`loop-playlist` option](https://mpv.io/manual/master/#options-loop-playlist)),
so no custom logic is needed to reset the currently playing index.
According to the official
[migration guide](https://github.com/pelletier/go-toml/tree/v2#migrating-from-v1),
there are no breaking changes that could affect this project.
Main differences are:
* `Default struct fields order`: Struct fields stop being alphabetically
sorted, unless their sorting is changed in the struct definitions. Shouldn't be
relevant.
* `No indentation by default`: Also not relevant for newly generated
configuration files. Doesn't break reading existing configuration
files.
This change fixes two `TODO` comments, by scrobbling the currently
playing track if it's removed from the queue, and only run OnSongChange
callbacks when the playing track is affected.