]> git.sesse.net Git - vlc/blob - extras/dbus-vlc.py
D-Bus module now uses new specification
[vlc] / extras / dbus-vlc.py
1 #!/usr/bin/python
2 # -*- coding: utf8 -*-
3 #
4 # Copyright (C) 2006 Rafaël Carré <funman at videolanorg>
5 #
6 # $Id$
7
8 #  This program is free software; you can redistribute it and/or modify
9 #  it under the terms of the GNU General Public License as published by
10 #  the Free Software Foundation; either version 2 of the License, or
11 #  (at your option) any later version.
12
13 #  This program is distributed in the hope that it will be useful,
14 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #  GNU General Public License for more details.
17
18 #  You should have received a copy of the GNU General Public License
19 #  along with this program; if not, write to the Free Software
20 #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 #
22
23 import dbus
24 import dbus.glib
25 import gtk
26 import gtk.glade
27 import egg.trayicon
28 import gobject
29 import os
30
31 global position
32 global timer
33 #global playing
34
35 def itemchange_handler(item):
36     gobject.timeout_add( 2000, timeset)
37     l_item.set_text(item)
38
39 bus = dbus.SessionBus()
40 player_o = bus.get_object("org.freedesktop.MediaPlayer", "/Player")
41 tracklist_o = bus.get_object("org.freedesktop.MediaPlayer", "/TrackList")
42
43 tracklist  = dbus.Interface(tracklist_o, "org.freedesktop.MediaPlayer")
44 player = dbus.Interface(player_o, "org.freedesktop.MediaPlayer")
45 try:
46     player_o.connect_to_signal("TrackChange", itemchange_handler, dbus_interface="org.freedesktop.MediaPlayer")
47 except:
48     True
49
50 def AddTrack(widget):
51     mrl = e_mrl.get_text()
52     if mrl != None and mrl != "":
53         tracklist.AddTrack(mrl, True)
54     else:
55         mrl = bt_file.get_filename()
56         if mrl != None and mrl != "":
57             tracklist.AddTrack("directory://" + mrl, True)
58
59 def Next(widget):
60     player.Next(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
61     update(0)
62
63 def Prev(widget):
64     player.Prev(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
65     update(0)
66
67 def Stop(widget):
68     player.Stop(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
69     update(0)
70
71 def update(widget):
72 #    itemchange_handler(str(player.GetPlayingItem()))
73     vol.set_value(player.VolumeGet())
74     GetPlayStatus(0)
75
76 def GetPlayStatus(widget):
77     global playing
78     status = str(player.GetStatus())
79     if status == 0:
80         img_bt_toggle.set_from_stock("gtk-media-pause", gtk.ICON_SIZE_SMALL_TOOLBAR)
81         playing = True
82     else:
83         img_bt_toggle.set_from_stock("gtk-media-play", gtk.ICON_SIZE_SMALL_TOOLBAR)
84         playing = False
85
86 def Quit(widget):
87     player.Quit(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
88     l_item.set_text("")
89
90 def Pause(widget):
91     player.Pause()
92 #        img_bt_toggle.set_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_SMALL_TOOLBAR)
93 #        img_bt_toggle.set_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_SMALL_TOOLBAR)
94     update(0)
95
96 def volchange(widget, data):
97     player.VolumeSet(vol.get_value_as_int(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
98
99 def timechange(widget, x=None, y=None):
100     player.PositionSet(time_s.get_value(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
101
102 def timeset():
103 #    global playing
104     time_s.set_value(player.PositionGet())
105 #    return playing
106
107 def expander(widget):
108     if exp.get_expanded() == False:
109         exp.set_label("Less")
110     else:
111         exp.set_label("More")
112
113 def delete_event(self, widget):
114     widget.hide()
115     return True
116
117 def destroy(widget):
118     gtk.main_quit()
119
120 def key_release(widget, event):
121     global position
122     if event.keyval == gtk.keysyms.Escape:
123         position = window.get_position()
124         widget.hide()
125
126 def tray_button(widget,event):
127     global position
128     if event.button == 1:
129         if window.get_property('visible'):
130             position = window.get_position()
131             window.hide()
132         else:
133             window.move(position[0], position[1])
134             window.show()
135     if event.button == 3:
136         menu.popup(None,None,None,event.button,event.time)
137
138 xml = gtk.glade.XML('dbus-vlc.glade')
139
140 bt_close    = xml.get_widget('close')
141 bt_quit     = xml.get_widget('quit')
142 bt_file     = xml.get_widget('ChooseFile')
143 bt_mrl      = xml.get_widget('AddMRL')
144 bt_next     = xml.get_widget('next')
145 bt_prev     = xml.get_widget('prev')
146 bt_stop     = xml.get_widget('stop')
147 bt_toggle   = xml.get_widget('toggle')
148 l_item      = xml.get_widget('item')
149 e_mrl       = xml.get_widget('mrl')
150 window      = xml.get_widget('window1')
151 img_bt_toggle=xml.get_widget('image6')
152 exp         = xml.get_widget('expander2')
153 expvbox     = xml.get_widget('expandvbox')
154 menu        = xml.get_widget('menu1')
155 menuitem    = xml.get_widget('menuquit')
156 vlcicon     = xml.get_widget('eventicon')
157 vol         = xml.get_widget('vol')
158 time_s      = xml.get_widget('time_s')
159 time_l      = xml.get_widget('time_l')
160
161 window.connect('delete_event',  delete_event)
162 window.connect('destroy',       destroy)
163 window.connect('key_release_event', key_release)
164
165 tray = egg.trayicon.TrayIcon("VLC")
166 eventbox = gtk.EventBox()
167 tray.add(eventbox)
168 eventbox.set_events(gtk.gdk.BUTTON_PRESS_MASK)
169 eventbox.connect('button_press_event', tray_button)
170 image = gtk.Image()
171 eventbox.add(image)
172 image.set_from_icon_name("vlc", gtk.ICON_SIZE_MENU)
173 tray.show_all()
174
175 def icon_clicked(widget, event):
176     update(0)
177
178 menu.attach_to_widget(eventbox,None)
179
180 bt_close.connect('clicked',     destroy)
181 bt_quit.connect('clicked',      Quit)
182 bt_mrl.connect('clicked',       AddTrack)
183 bt_toggle.connect('clicked',    Pause)
184 bt_next.connect('clicked',      Next)
185 bt_prev.connect('clicked',      Prev)
186 bt_stop.connect('clicked',      Stop)
187 exp.connect('activate',         expander)
188 menuitem.connect('activate',    destroy)
189 vlcicon.set_events(gtk.gdk.BUTTON_PRESS_MASK)
190 vlcicon.connect('button_press_event', icon_clicked)
191 vol.connect('change-value',     volchange)
192 vol.connect('scroll-event',     volchange)
193 time_s.connect('adjust-bounds', timechange)
194
195 time_s.set_update_policy(gtk.UPDATE_DISCONTINUOUS)
196 gobject.timeout_add( 2000, timeset)
197
198 library = "/media/mp3"
199
200 try:
201     os.chdir(library)
202     bt_file.set_current_folder(library)
203 except:
204     print "edit this file to point to your media library"
205
206 window.set_icon_name('vlc')
207 window.set_title("VLC - D-Bus ctrl")
208 window.show()
209
210 try:
211     update(0)
212 except:
213     True
214
215 gtk.main()