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.
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.
-
#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.
12 13 14 |
# File 'lib/muzak/player/mpv.rb', line 12 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.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/muzak/player/mpv.rb', line 23 def activate! return if running? debug "activating #{self.class}" args = [ # there's also this, which (might) also work # "--audio-display=no", "--no-osc", "--no-osd-bar", "--no-input-default-bindings", "--no-input-cursor", "--load-scripts=no", # autoload and other scripts with clobber our mpv management ] 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.has_flag?("--prefetch-playlist") @mpv = ::MPV::Session.new(user_args: args) @mpv.callbacks << ::MPV::Callback.new(self, :dispatch_event!) instance.event :player_activated end |
#clear_queue ⇒ void
This method returns an undefined value.
Clears mpv's internal queue.
167 168 169 170 |
# File 'lib/muzak/player/mpv.rb', line 167 def clear_queue return unless running? @mpv.command "stop" end |
#deactivate! ⇒ void
This method returns an undefined value.
Deactivate mpv by killing it and cleaning up.
55 56 57 58 59 60 61 62 63 64 |
# File 'lib/muzak/player/mpv.rb', line 55 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.
194 195 196 197 198 199 200 201 202 |
# File 'lib/muzak/player/mpv.rb', line 194 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.
119 120 121 122 123 124 125 |
# File 'lib/muzak/player/mpv.rb', line 119 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.
131 132 133 134 135 136 137 |
# File 'lib/muzak/player/mpv.rb', line 131 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.
109 110 111 112 113 |
# File 'lib/muzak/player/mpv.rb', line 109 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.
142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'lib/muzak/player/mpv.rb', line 142 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.
183 184 185 186 187 188 |
# File 'lib/muzak/player/mpv.rb', line 183 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.
94 95 96 |
# File 'lib/muzak/player/mpv.rb', line 94 def next_song @mpv.command "playlist-next" end |
#now_playing ⇒ Song?
Get mpv's currently loaded song.
174 175 176 |
# File 'lib/muzak/player/mpv.rb', line 174 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.
78 79 80 81 82 |
# File 'lib/muzak/player/mpv.rb', line 78 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.
69 70 71 72 73 |
# File 'lib/muzak/player/mpv.rb', line 69 def play return unless running? @mpv.set_property "pause", false end |
#playing? ⇒ Boolean
Returns Whether or not mpv is currently playing.
85 86 87 88 89 |
# File 'lib/muzak/player/mpv.rb', line 85 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.
101 102 103 |
# File 'lib/muzak/player/mpv.rb', line 101 def previous_song @mpv.command "playlist-prev" end |
#running? ⇒ Boolean
Returns whether or not the current instance is running.
17 18 19 |
# File 'lib/muzak/player/mpv.rb', line 17 def running? !!@mpv&.running? end |
#shuffle_queue ⇒ void
This method returns an undefined value.
Shuffle mpv's internal queue.
159 160 161 162 163 |
# File 'lib/muzak/player/mpv.rb', line 159 def shuffle_queue return unless running? @mpv.command "playlist-shuffle" end |