Class: Muzak::Player::MPV
- Inherits:
-
StubPlayer
- Object
- StubPlayer
- Muzak::Player::MPV
- Defined in:
- lib/muzak/player/mpv.rb
Overview
Exposes MPV's IPC to muzak for playback control.
Constant Summary collapse
- DEFAULT_MPV_ARGS =
[ "--no-osc", "--no-osd-bar", "--no-input-default-bindings", "--no-input-cursor", "--load-scripts=no", # autoload and other scripts clobber our mpv management ].freeze
Instance Attribute Summary
Attributes inherited from StubPlayer
Class Method Summary collapse
-
.available? ⇒ Boolean
Whether or not MPV is available for execution.
Instance Method Summary collapse
-
#activate! ⇒ void
Activate mpv by executing it and preparing for event processing.
-
#clear_queue ⇒ void
Clears mpv's internal queue.
- #configured_mpv_args ⇒ Object
-
#deactivate! ⇒ void
Deactivate mpv by killing it and cleaning up.
-
#dispatch_event!(event) ⇒ void
private
Dispatch the given event to the active Instance.
-
#enqueue_album(album) ⇒ void
Tell mpv to add the given album to its queue.
-
#enqueue_playlist(playlist) ⇒ void
Tell mpv to add the given playlist to its queue.
-
#enqueue_song(song) ⇒ void
Tell mpv to add the given song to its queue.
-
#list_queue ⇒ Array<Song>
Get mpv's internal queue.
-
#load_song(song, art) ⇒ void
private
Load a song and optional album art into mpv.
-
#next_song ⇒ void
Tell mpv to play the next song in its queue.
-
#now_playing ⇒ Song?
Get mpv's currently loaded song.
-
#pause ⇒ void
Tell mpv to pause playback.
-
#play ⇒ void
Tell mpv to begin playback.
-
#playing? ⇒ Boolean
Whether or not mpv is currently playing.
-
#previous_song ⇒ void
Tell mpv to play the previous song in its queue.
-
#running? ⇒ Boolean
Whether or not the current instance is running.
-
#shuffle_queue ⇒ void
Shuffle mpv's internal queue.
Methods inherited from StubPlayer
Methods included from Utils
album_art?, #build_response, #danger, #debug, #debug?, #error, #error!, music?, #output, #pretty, #verbose, #verbose?, which?
Constructor Details
This class inherits a constructor from Muzak::Player::StubPlayer
Class Method Details
.available? ⇒ Boolean
Returns whether or not MPV is available for execution.
22 23 24 |
# File 'lib/muzak/player/mpv.rb', line 22 def self.available? ::MPV::Server.available? end |
Instance Method Details
#activate! ⇒ void
This method returns an undefined value.
Activate mpv by executing it and preparing for event processing.
33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/muzak/player/mpv.rb', line 33 def activate! return if running? debug "activating #{self.class}" args = DEFAULT_MPV_ARGS + configured_mpv_args @mpv = ::MPV::Session.new(user_args: args) @mpv.callbacks << method(:dispatch_event!) instance.event :player_activated end |
#clear_queue ⇒ void
This method returns an undefined value.
Clears mpv's internal queue.
160 161 162 163 |
# File 'lib/muzak/player/mpv.rb', line 160 def clear_queue return unless running? @mpv.command "stop" end |
#configured_mpv_args ⇒ Object
171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/muzak/player/mpv.rb', line 171 def configured_mpv_args args = [] args.concat ["--no-force-window", "--no-video"] if Config.mpv_no_art args << "--geometry=#{Config.art_geometry}" if Config.art_geometry # this is an experimental flag, but it could improve # muzak's load times substantially when used with a network # mounted music library args << "--prefetch-playlist" if ::MPV::Server.flag?("--prefetch-playlist") args end |
#deactivate! ⇒ void
This method returns an undefined value.
Deactivate mpv by killing it and cleaning up.
48 49 50 51 52 53 54 55 56 57 |
# File 'lib/muzak/player/mpv.rb', line 48 def deactivate! return unless running? debug "deactivating #{self.class}" @mpv.quit! ensure @_now_playing = nil instance.event :player_deactivated end |
#dispatch_event!(event) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Dispatch the given event to the active Instance.
202 203 204 205 206 207 208 209 210 |
# File 'lib/muzak/player/mpv.rb', line 202 def dispatch_event!(event) case event when "file-loaded" instance.event :song_loaded, when "end-file" instance.event :song_unloaded @_now_playing = nil end end |
#enqueue_album(album) ⇒ void
Activates mpv if not already activated.
This method returns an undefined value.
Tell mpv to add the given album to its queue.
112 113 114 115 116 117 118 |
# File 'lib/muzak/player/mpv.rb', line 112 def enqueue_album(album) activate! unless running? album.songs.each do |song| load_song song, album.cover_art end end |
#enqueue_playlist(playlist) ⇒ void
Activates mpv if not already activated.
This method returns an undefined value.
Tell mpv to add the given playlist to its queue.
124 125 126 127 128 129 130 |
# File 'lib/muzak/player/mpv.rb', line 124 def enqueue_playlist(playlist) activate! unless running? playlist.songs.each do |song| load_song song, song.best_guess_album_art end end |
#enqueue_song(song) ⇒ void
Activates mpv if not already activated.
This method returns an undefined value.
Tell mpv to add the given song to its queue.
102 103 104 105 106 |
# File 'lib/muzak/player/mpv.rb', line 102 def enqueue_song(song) activate! unless running? load_song song, song.best_guess_album_art end |
#list_queue ⇒ Array<Song>
This includes songs already played.
Get mpv's internal queue.
135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/muzak/player/mpv.rb', line 135 def list_queue entries = @mpv.get_property "playlist/count" playlist = [] entries.times do |i| # TODO: this is slow and should be avoided at all costs, # since we have access to these Song instances earlier # in the object's lifecycle. playlist << Song.new(@mpv.get_property("playlist/#{i}/filename")) end playlist end |
#load_song(song, art) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Load a song and optional album art into mpv.
191 192 193 194 195 196 |
# File 'lib/muzak/player/mpv.rb', line 191 def load_song(song, art) append_type = Config.autoplay ? "append-play" : "append" cmds = ["loadfile", song.path, append_type] cmds << "external-file=\"#{art}\"" if art @mpv.command(*cmds) end |
#next_song ⇒ void
Does nothing if the current song is the last.
This method returns an undefined value.
Tell mpv to play the next song in its queue.
87 88 89 |
# File 'lib/muzak/player/mpv.rb', line 87 def next_song @mpv.command "playlist-next" end |
#now_playing ⇒ Song?
Get mpv's currently loaded song.
167 168 169 |
# File 'lib/muzak/player/mpv.rb', line 167 def @_now_playing ||= Song.new @mpv.get_property("path") end |
#pause ⇒ void
Does nothing is playback is already paused.
This method returns an undefined value.
Tell mpv to pause playback.
71 72 73 74 75 |
# File 'lib/muzak/player/mpv.rb', line 71 def pause return unless running? @mpv.set_property "pause", true end |
#play ⇒ void
Does nothing is playback is already in progress.
This method returns an undefined value.
Tell mpv to begin playback.
62 63 64 65 66 |
# File 'lib/muzak/player/mpv.rb', line 62 def play return unless running? @mpv.set_property "pause", false end |
#playing? ⇒ Boolean
Returns Whether or not mpv is currently playing.
78 79 80 81 82 |
# File 'lib/muzak/player/mpv.rb', line 78 def return false unless running? !@mpv.get_property "pause" end |
#previous_song ⇒ void
Does nothing if the current song is the first.
This method returns an undefined value.
Tell mpv to play the previous song in its queue.
94 95 96 |
# File 'lib/muzak/player/mpv.rb', line 94 def previous_song @mpv.command "playlist-prev" end |
#running? ⇒ Boolean
Returns whether or not the current instance is running.
27 28 29 |
# File 'lib/muzak/player/mpv.rb', line 27 def running? !!@mpv&.running? end |
#shuffle_queue ⇒ void
This method returns an undefined value.
Shuffle mpv's internal queue.
152 153 154 155 156 |
# File 'lib/muzak/player/mpv.rb', line 152 def shuffle_queue return unless running? @mpv.command "playlist-shuffle" end |