Created
March 15, 2016 22:25
-
-
Save fanda/0138bdeaf4fb01f5cefc to your computer and use it in GitHub Desktop.
MPDP - Ruby GTK client for MPD server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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