]> git.sesse.net Git - vlc/blob - extras/dbus-vlc.py
dab06d525f1d8deb24555ffbc964a5119d541e8e
[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 remote_object = bus.get_object("org.videolan.vlc", "/org/videolan/vlc")
41 interface  = dbus.Interface(remote_object, "org.videolan.vlc")
42 try:
43     remote_object.connect_to_signal("ItemChange", itemchange_handler, dbus_interface="org.videolan.vlc")
44 except:
45     True
46
47 def AddMRL(widget):
48     mrl = e_mrl.get_text()
49     if mrl != None and mrl != "":
50         interface.AddMRL(mrl, True)
51     else:
52         mrl = bt_file.get_filename()
53         if mrl != None and mrl != "":
54             interface.AddMRL("directory://" + mrl, True)
55
56 def Next(widget):
57     interface.Next(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
58     update(0)
59
60 def Prev(widget):
61     interface.Prev(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
62     update(0)
63
64 def Stop(widget):
65     interface.Stop(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
66     update(0)
67
68 def update(widget):
69     itemchange_handler(str(interface.GetPlayingItem()))
70     vol.set_value(interface.VolumeGet())
71     GetPlayStatus(0)
72
73 def GetPlayStatus(widget):
74     global playing
75     status = str(interface.GetPlayStatus())
76     if status == "playing":
77         img_bt_toggle.set_from_stock("gtk-media-pause", gtk.ICON_SIZE_SMALL_TOOLBAR)
78         playing = True
79     else:
80         img_bt_toggle.set_from_stock("gtk-media-play", gtk.ICON_SIZE_SMALL_TOOLBAR)
81         playing = False
82
83 def Quit(widget):
84     interface.Quit(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
85     l_item.set_text("")
86
87 def TogglePause(widget):
88     if interface.TogglePause() == True:
89         img_bt_toggle.set_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_SMALL_TOOLBAR)
90     else:
91         img_bt_toggle.set_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_SMALL_TOOLBAR)
92     update(0)
93
94 def volchange(widget, data):
95     interface.VolumeSet(vol.get_value_as_int(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
96
97 def timechange(widget, x=None, y=None):
98     interface.PositionSet(time_s.get_value(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
99
100 def timeset():
101     global playing
102     time_s.set_value(interface.PositionGet())
103     return playing
104
105 def expander(widget):
106     if exp.get_expanded() == False:
107         exp.set_label("Less")
108     else:
109         exp.set_label("More")
110
111 def delete_event(self, widget):
112     widget.hide()
113     return True
114
115 def destroy(widget):
116     gtk.main_quit()
117
118 def key_release(widget, event):
119     global position
120     if event.keyval == gtk.keysyms.Escape:
121         position = window.get_position()
122         widget.hide()
123
124 def tray_button(widget,event):
125     global position
126     if event.button == 1:
127         if window.get_property('visible'):
128             position = window.get_position()
129             window.hide()
130         else:
131             window.move(position[0], position[1])
132             window.show()
133     if event.button == 3:
134         menu.popup(None,None,None,event.button,event.time)
135
136 xml = gtk.glade.XML('dbus-vlc.glade')
137
138 bt_close    = xml.get_widget('close')
139 bt_quit     = xml.get_widget('quit')
140 bt_file     = xml.get_widget('ChooseFile')
141 bt_mrl      = xml.get_widget('AddMRL')
142 bt_next     = xml.get_widget('next')
143 bt_prev     = xml.get_widget('prev')
144 bt_stop     = xml.get_widget('stop')
145 bt_toggle   = xml.get_widget('toggle')
146 l_item      = xml.get_widget('item')
147 e_mrl       = xml.get_widget('mrl')
148 window      = xml.get_widget('window1')
149 img_bt_toggle=xml.get_widget('image6')
150 exp         = xml.get_widget('expander2')
151 expvbox     = xml.get_widget('expandvbox')
152 menu        = xml.get_widget('menu1')
153 menuitem    = xml.get_widget('menuquit')
154 vlcicon     = xml.get_widget('eventicon')
155 vol         = xml.get_widget('vol')
156 time_s      = xml.get_widget('time_s')
157 time_l      = xml.get_widget('time_l')
158
159 window.connect('delete_event',  delete_event)
160 window.connect('destroy',       destroy)
161 window.connect('key_release_event', key_release)
162
163 tray = egg.trayicon.TrayIcon("VLC")
164 eventbox = gtk.EventBox()
165 tray.add(eventbox)
166 eventbox.set_events(gtk.gdk.BUTTON_PRESS_MASK)
167 eventbox.connect('button_press_event', tray_button)
168 image = gtk.Image()
169 eventbox.add(image)
170 image.set_from_icon_name("vlc", gtk.ICON_SIZE_MENU)
171 tray.show_all()
172
173 def icon_clicked(widget, event):
174     update(0)
175
176 menu.attach_to_widget(eventbox,None)
177
178 bt_close.connect('clicked',     destroy)
179 bt_quit.connect('clicked',      Quit)
180 bt_mrl.connect('clicked',       AddMRL)
181 bt_toggle.connect('clicked',    TogglePause)
182 bt_next.connect('clicked',      Next)
183 bt_prev.connect('clicked',      Prev)
184 bt_stop.connect('clicked',      Stop)
185 exp.connect('activate',         expander)
186 menuitem.connect('activate',    destroy)
187 vlcicon.set_events(gtk.gdk.BUTTON_PRESS_MASK)
188 vlcicon.connect('button_press_event', icon_clicked)
189 vol.connect('change-value',     volchange)
190 vol.connect('scroll-event',     volchange)
191 time_s.connect('adjust-bounds', timechange)
192
193 time_s.set_update_policy(gtk.UPDATE_DISCONTINUOUS)
194 gobject.timeout_add( 2000, timeset)
195
196 library = "/media/mp3"
197
198 try:
199     os.chdir(library)
200     bt_file.set_current_folder(library)
201 except:
202     print "edit this file to point to your media library"
203
204 window.set_icon_name('vlc')
205 window.set_title("VLC - D-Bus ctrl")
206 window.show()
207
208 try:
209     update(0)
210 except:
211     True
212
213 gtk.main()