Skip to content

Instantly share code, notes, and snippets.

@fanda
Created March 15, 2016 22:25
Show Gist options
  • Save fanda/0138bdeaf4fb01f5cefc to your computer and use it in GitHub Desktop.
Save fanda/0138bdeaf4fb01f5cefc to your computer and use it in GitHub Desktop.
MPDP - Ruby GTK client for MPD server
#!/usr/bin/ruby
require 'rubygems'
require 'gtk2'
require 'librmpd'
require 'find'
require 'pp'
$mpd = MPD.new 'localhost', 6600
$mpd.connect
window = Gtk::Window.new()
window.set_window_position Gtk::Window::POS_CENTER
window.set_title 'mpdp'
window.border_width = 5
$song_title_l = Gtk::Label.new
$song_artist_l = Gtk::Label.new
if $song = $mpd.current_song
$song_title_l.markup = "<b>#{$song.title}</b>"
$song_artist_l.text = $song.artist if $song.artist
else
$song_title_l.markup = "<b>Not connected</b>"
end
def song_fraction
if $mpd.status['time']
$mpd.status['time'] =~ /(\d+):(\d+)/
$1.to_f / $2.to_f
else
0.0
end
end
def song_time_string
$mpd.status['time'] =~ /(\d+):(\d+)/
song_m = $2.to_i / 60
song_s = $2.to_i - song_m * 60
elap_m = $1.to_i / 60
elap_s = $1.to_i - elap_m * 60
"#{elap_m}:#{elap_s < 10 ? '0'+elap_s.to_s : elap_s
} / #{song_m}:#{song_s < 10 ? '0'+song_s.to_s : song_s}"
end
def refresh_progress_bar
$song_time_pb.text = song_time_string
$song_time_pb.fraction = song_fraction
end
def mpd_play
if $song = $mpd.current_song
$song_title_l.markup = "<b>#{$song.title}</b>"
$song_artist_l.text = $song.artist
else
$song_title_l.markup = "<b>Not connected</b>"
end
refresh_progress_bar
end
$song_time_pb = Gtk::ProgressBar.new
refresh_progress_bar
again_b = Gtk::Button.new('again')
play_b = Gtk::Button.new('play')
next_b = Gtk::Button.new('next')
$rand_b = Gtk::ToggleButton.new('random')
$loop_b = Gtk::ToggleButton.new('loop')
[again_b, play_b, next_b, $rand_b, $loop_b].each do |b|
b.width_request = 40
b.height_request = 25
b.resize_mode = Gtk::RESIZE_PARENT
end
play_b.label = 'stop' if $mpd.playing?
$rand_b.draw_indicator = $mpd.random?
$playlist = Gtk::ListStore.new(String, String)
iter = $playlist.iter_first
$mpd.playlist.each_with_index do |song, i|
m = song['time'].to_i / 60
s = song['time'].to_i - m * 60
time = "#{m}:#{s < 10 ? '0'+s.to_s : s}"
iter = $playlist.append
iter.set_value(0, time)
iter.set_value(1, song['title'])
end
$playlist_view = Gtk::TreeView.new($playlist)
$playlist_view.selection.mode = Gtk::SELECTION_SINGLE
$playlist_view.reorderable = true
renderer = Gtk::CellRendererText.new
column = Gtk::TreeViewColumn.new("Time", renderer, :text => 0)
column.alignment = 0.0
$playlist_view.append_column column
column = Gtk::TreeViewColumn.new("Title", renderer, :text =>1)
#column.expand = false
$playlist_view.append_column column
dirslist = Gtk::ListStore.new(String)
Dir.open('/mnt/exdata/music').entries.sort.each do |e|
next if e == '.'
iter = dirslist.append
iter[0] = e
end
$dirslist_view = Gtk::TreeView.new(dirslist)
$dirslist_view.selection.mode = Gtk::SELECTION_SINGLE
renderer.xalign = 0.0
column = Gtk::TreeViewColumn.new("", renderer, :text => 0)
$dirslist_view.append_column column
$dirslist_view.hide
player_lay = Gtk::Fixed.new
player_lay.put play_b, 0, 0
player_lay.put next_b, 40, 0
player_lay.put again_b, 80, 0
option_lay = Gtk::Fixed.new
option_lay.put $rand_b, 0, 0
option_lay.put $loop_b, 40, 0
player_box = Gtk::HBox.new
player_box.pack_start player_lay, false, false
player_box.pack_start $song_time_pb, true
player_box.pack_start option_lay, false, false
playlist_page = Gtk::ScrolledWindow.new
playlist_page.add $playlist_view
dirslist_page = Gtk::ScrolledWindow.new
dirslist_page.add $dirslist_view
list_box = Gtk::Notebook.new
list_box.append_page playlist_page, Gtk::Label.new("Show playlist")
list_box.append_page dirslist_page, Gtk::Label.new("Browse database")
box = Gtk::VBox.new
box.pack_start player_box, false, false
box.pack_start $song_title_l, false, false
box.pack_start $song_artist_l, false, false
box.pack_start list_box, true
window.add box
window.show_all
window.signal_connect('destroy'){
$mpd.disconnect
Gtk.main_quit
}
play_b.signal_connect('clicked') {
if $mpd.stopped? or $mpd.paused?
$mpd.play
play_b.label = 'stop'
else
$mpd.pause = true
play_b.label = 'play'
end
mpd_play
}
next_b.signal_connect('clicked') {
$mpd.next
mpd_play
}
again_b.signal_connect('clicked') {
$mpd.previous
mpd_play
}
$rand_b.signal_connect('clicked') {
state = ! $mpd.random?
$mpd.random = state
$rand_b.draw_indicator = state
}
$loop_b.signal_connect('clicked') {
#$mpd.random = true
}
$playlist_view.signal_connect('button_press_event') { |widget, event|
menu = Gtk::Menu.new
menu.append(Gtk::MenuItem.new("Test1"))
menu.append(Gtk::MenuItem.new("Test2"))
menu.show_all
pp widget.selection.selected
menu.popup(nil,nil,event.button,event.time)
}
GLib::Timeout.add(1000) do
if $mpd.status['state'] == 'play'
refresh_progress_bar
end
true
end
Gtk.main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment