Class: Muzak::Player::MPV

Inherits:
StubPlayer show all
Defined in:
lib/muzak/player/mpv.rb

Overview

Exposes MPV's IPC to muzak for playback control.

Instance Attribute Summary

Attributes inherited from StubPlayer

#instance

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from StubPlayer

#initialize, player_name

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.

Returns:

  • (Boolean)

    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_queuevoid

This method returns an undefined value.

Clears mpv's internal queue.



167
168
169
170
171
# File 'lib/muzak/player/mpv.rb', line 167

def clear_queue
  return unless running?

  @mpv.command "playlist-clear"
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.

Parameters:

  • event (String)

    the event



195
196
197
198
199
200
201
202
203
# File 'lib/muzak/player/mpv.rb', line 195

def dispatch_event!(event)
  case event
  when "file-loaded"
    instance.event :song_loaded, now_playing
  when "end-file"
    instance.event :song_unloaded
    @_now_playing = nil
  end
end

#enqueue_album(album) ⇒ void

Note:

Activates mpv if not already activated.

This method returns an undefined value.

Tell mpv to add the given album to its queue.

Parameters:

  • album (Album)

    the album to add



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

Note:

Activates mpv if not already activated.

This method returns an undefined value.

Tell mpv to add the given playlist to its queue.

Parameters:

  • playlist (Playlist)

    the playlist to add



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

Note:

Activates mpv if not already activated.

This method returns an undefined value.

Tell mpv to add the given song to its queue.

Parameters:

  • song (Song)

    the song to add



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_queueArray<Song>

Note:

This includes songs already played.

Get mpv's internal queue.

Returns:

  • (Array<Song>)

    all songs in mpv's 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.

Parameters:

  • song (Song)

    the song to load

  • art (String)

    the art file to load



184
185
186
187
188
189
# File 'lib/muzak/player/mpv.rb', line 184

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_songvoid

Note:

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_playingSong?

Get mpv's currently loaded song.

Returns:

  • (Song, nil)

    the currently loaded song



175
176
177
# File 'lib/muzak/player/mpv.rb', line 175

def now_playing
  @_now_playing ||= Song.new(@mpv.get_property "path")
end

#pausevoid

Note:

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

#playvoid

Note:

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.

Returns:

  • (Boolean)

    Whether or not mpv is currently playing.



85
86
87
88
89
# File 'lib/muzak/player/mpv.rb', line 85

def playing?
  return false unless running?

  !@mpv.get_property "pause"
end

#previous_songvoid

Note:

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.

Returns:

  • (Boolean)

    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_queuevoid

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