X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=extras%2Fdbus-vlc.py;h=a3bc266535c6fb1ab2bab13596ee8994b24fe125;hb=66f47dcdb3b4041f8438f9d3da1039899f76b11b;hp=f31332e1f257dfc955a5a7c5ef46eec91ef466cc;hpb=05c276b04d8ed08e049d84586afe92c557a1d4f7;p=vlc diff --git a/extras/dbus-vlc.py b/extras/dbus-vlc.py index f31332e1f2..a3bc266535 100755 --- a/extras/dbus-vlc.py +++ b/extras/dbus-vlc.py @@ -20,96 +20,134 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. # +# +# NOTE: this controller is a SAMPLE, and thus doesn't implement all the D-Bus Media Player specification. http://wiki.videolan.org/index.php/DBus-spec +# This is an unfinished document (on the 12/06/2006) and has been designed to be as general as possible. +# So don't expect that much from this, but basic capabilities should work out of the box (Play/Pause/Next/Add) +# +# Also notice it has been designed first for a previous specificaiton, and thus some code may not work/be disabled +# +# You'll need pygtk >= 2.10 to use gtk.StatusIcon +# import dbus import dbus.glib import gtk import gtk.glade -import egg.trayicon import gobject import os global position global timer global playing +playing = False def itemchange_handler(item): - l_item.set_text(item) - + gobject.timeout_add( 2000, timeset) + try: + a = item["artist"] + except: + a = "" + if a == "": + a = item["URI"] + l_item.set_text(a) + +#connect to the bus bus = dbus.SessionBus() -remote_object = bus.get_object("org.videolan.vlc", "/org/videolan/vlc") -interface = dbus.Interface(remote_object, "org.videolan.vlc") +player_o = bus.get_object("org.freedesktop.MediaPlayer", "/Player") +tracklist_o = bus.get_object("org.freedesktop.MediaPlayer", "/TrackList") + +tracklist = dbus.Interface(tracklist_o, "org.freedesktop.MediaPlayer") +player = dbus.Interface(player_o, "org.freedesktop.MediaPlayer") try: - remote_object.connect_to_signal("ItemChange", itemchange_handler, dbus_interface="org.videolan.vlc") + player_o.connect_to_signal("TrackChange", itemchange_handler, dbus_interface="org.freedesktop.MediaPlayer") except: True -def AddMRL(widget): +#plays an element +def AddTrack(widget): mrl = e_mrl.get_text() if mrl != None and mrl != "": - interface.AddMRL(mrl, True) + tracklist.AddTrack(mrl, True) else: mrl = bt_file.get_filename() if mrl != None and mrl != "": - interface.AddMRL("directory://" + mrl, True) + tracklist.AddTrack("directory://" + mrl, True) + update(0) +#basic control def Next(widget): - interface.Next(reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) + player.Next(reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) update(0) def Prev(widget): - interface.Prev(reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) + player.Prev(reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) update(0) def Stop(widget): - interface.Stop(reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) + player.Stop(reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) update(0) +#update status display def update(widget): - itemchange_handler(str(interface.GetPlayingItem())) - vol.set_value(interface.VolumeGet()) + item = tracklist.GetMetadata(tracklist.GetCurrentTrack()) + vol.set_value(player.VolumeGet()) + try: + a = item["artist"] + except: a = "" + if a == "": + a = item["URI"] + l_item.set_text(a) GetPlayStatus(0) +#get playing status from remote vlc def GetPlayStatus(widget): global playing - status = str(interface.GetPlayStatus()) - if status == "playing": + status = player.GetStatus() + if status == 0: img_bt_toggle.set_from_stock("gtk-media-pause", gtk.ICON_SIZE_SMALL_TOOLBAR) - gobject.timeout_add( 2000, timeset) playing = True else: img_bt_toggle.set_from_stock("gtk-media-play", gtk.ICON_SIZE_SMALL_TOOLBAR) playing = False def Quit(widget): - interface.Quit(reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) + player.Quit(reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) l_item.set_text("") -def TogglePause(widget): - if interface.TogglePause() == True: +def Pause(widget): + player.Pause() + status = player.GetStatus() + if status == 0: img_bt_toggle.set_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_SMALL_TOOLBAR) + gobject.timeout_add( 2000, timeset) else: img_bt_toggle.set_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_SMALL_TOOLBAR) update(0) +#callback for volume def volchange(widget, data): - interface.VolumeSet(vol.get_value_as_int(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) + player.VolumeSet(vol.get_value_as_int(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) +#callback for position change def timechange(widget, x=None, y=None): - interface.PositionSet(time_s.get_value(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) + player.PositionSet(int(time_s.get_value()), reply_handler=(lambda *args: None), error_handler=(lambda *args: None)) +#refresh position def timeset(): global playing - time_s.set_value(interface.PositionGet()) + time_s.set_value(player.PositionGet()) return playing +#simple/full display def expander(widget): if exp.get_expanded() == False: exp.set_label("Less") else: exp.set_label("More") +#close event def delete_event(self, widget): - widget.hide() + self.hide() return True def destroy(widget): @@ -121,17 +159,15 @@ def key_release(widget, event): position = window.get_position() widget.hide() -def tray_button(widget,event): +#click on the tray icon +def tray_button(widget): global position - if event.button == 1: - if window.get_property('visible'): - position = window.get_position() - window.hide() - else: - window.move(position[0], position[1]) - window.show() - if event.button == 3: - menu.popup(None,None,None,event.button,event.time) + if window.get_property('visible'): + position = window.get_position() + window.hide() + else: + window.move(position[0], position[1]) + window.show() xml = gtk.glade.XML('dbus-vlc.glade') @@ -149,8 +185,6 @@ window = xml.get_widget('window1') img_bt_toggle=xml.get_widget('image6') exp = xml.get_widget('expander2') expvbox = xml.get_widget('expandvbox') -menu = xml.get_widget('menu1') -menuitem = xml.get_widget('menuquit') vlcicon = xml.get_widget('eventicon') vol = xml.get_widget('vol') time_s = xml.get_widget('time_s') @@ -160,37 +194,27 @@ window.connect('delete_event', delete_event) window.connect('destroy', destroy) window.connect('key_release_event', key_release) -tray = egg.trayicon.TrayIcon("VLC") -eventbox = gtk.EventBox() -tray.add(eventbox) -eventbox.set_events(gtk.gdk.BUTTON_PRESS_MASK) -eventbox.connect('button_press_event', tray_button) -image = gtk.Image() -eventbox.add(image) -image.set_from_icon_name("vlc", gtk.ICON_SIZE_MENU) -tray.show_all() +tray = gtk.status_icon_new_from_icon_name("vlc") +tray.connect('activate', tray_button) def icon_clicked(widget, event): update(0) -menu.attach_to_widget(eventbox,None) - bt_close.connect('clicked', destroy) bt_quit.connect('clicked', Quit) -bt_mrl.connect('clicked', AddMRL) -bt_toggle.connect('clicked', TogglePause) +bt_mrl.connect('clicked', AddTrack) +bt_toggle.connect('clicked', Pause) bt_next.connect('clicked', Next) bt_prev.connect('clicked', Prev) bt_stop.connect('clicked', Stop) exp.connect('activate', expander) -menuitem.connect('activate', destroy) -vlcicon.set_events(gtk.gdk.BUTTON_PRESS_MASK) -vlcicon.connect('button_press_event', icon_clicked) vol.connect('change-value', volchange) vol.connect('scroll-event', volchange) time_s.connect('adjust-bounds', timechange) - +vlcicon.set_events(gtk.gdk.BUTTON_PRESS_MASK) +vlcicon.connect('button_press_event', icon_clicked) time_s.set_update_policy(gtk.UPDATE_DISCONTINUOUS) +gobject.timeout_add( 2000, timeset) library = "/media/mp3" @@ -209,4 +233,13 @@ try: except: True +icon_theme = gtk.icon_theme_get_default() +try: + pix = icon_theme.load_icon("vlc",24,0) + window.set_icon(pix) +except: + True +position = window.get_position() +vol.set_value(player.VolumeGet()) + gtk.main()