]> git.sesse.net Git - vlc/blob - extras/dbus-vlc.py
Leverage libgcrypt CounTeR mode implementation to simplify our code
[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 #
24 # 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
25 # This is an unfinished document (on the 12/06/2006) and has been designed to be as general as possible.
26 # So don't expect that much from this, but basic capabilities should work out of the box (Play/Pause/Next/Add)
27 #
28 # Also notice it has been designed first for a previous specificaiton, and thus some code may not work/be disabled
29 #
30 import dbus
31 import dbus.glib
32 import gtk
33 import gtk.glade
34 import egg.trayicon
35 import gobject
36 import os
37
38 global position
39 global timer
40 #global playing
41
42 def itemchange_handler(item):
43     gobject.timeout_add( 2000, timeset)
44     l_item.set_text(item)
45
46 bus = dbus.SessionBus()
47 player_o = bus.get_object("org.freedesktop.MediaPlayer", "/Player")
48 tracklist_o = bus.get_object("org.freedesktop.MediaPlayer", "/TrackList")
49
50 tracklist  = dbus.Interface(tracklist_o, "org.freedesktop.MediaPlayer")
51 player = dbus.Interface(player_o, "org.freedesktop.MediaPlayer")
52 try:
53     player_o.connect_to_signal("TrackChange", itemchange_handler, dbus_interface="org.freedesktop.MediaPlayer")
54 except:
55     True
56
57 def AddTrack(widget):
58     mrl = e_mrl.get_text()
59     if mrl != None and mrl != "":
60         tracklist.AddTrack(mrl, True)
61     else:
62         mrl = bt_file.get_filename()
63         if mrl != None and mrl != "":
64             tracklist.AddTrack("directory://" + mrl, True)
65
66 def Next(widget):
67     player.Next(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
68     update(0)
69
70 def Prev(widget):
71     player.Prev(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
72     update(0)
73
74 def Stop(widget):
75     player.Stop(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
76     update(0)
77
78 def update(widget):
79 #    itemchange_handler(str(player.GetPlayingItem()))
80     vol.set_value(player.VolumeGet())
81     GetPlayStatus(0)
82
83 def GetPlayStatus(widget):
84     global playing
85     status = str(player.GetStatus())
86     if status == 0:
87         img_bt_toggle.set_from_stock("gtk-media-pause", gtk.ICON_SIZE_SMALL_TOOLBAR)
88         playing = True
89     else:
90         img_bt_toggle.set_from_stock("gtk-media-play", gtk.ICON_SIZE_SMALL_TOOLBAR)
91         playing = False
92
93 def Quit(widget):
94     player.Quit(reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
95     l_item.set_text("")
96
97 def Pause(widget):
98     player.Pause()
99 #        img_bt_toggle.set_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_SMALL_TOOLBAR)
100 #        img_bt_toggle.set_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_SMALL_TOOLBAR)
101     update(0)
102
103 def volchange(widget, data):
104     player.VolumeSet(vol.get_value_as_int(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
105
106 def timechange(widget, x=None, y=None):
107     player.PositionSet(time_s.get_value(), reply_handler=(lambda *args: None), error_handler=(lambda *args: None))
108
109 def timeset():
110 #    global playing
111     time_s.set_value(player.PositionGet())
112 #    return playing
113
114 def expander(widget):
115     if exp.get_expanded() == False:
116         exp.set_label("Less")
117     else:
118         exp.set_label("More")
119
120 def delete_event(self, widget):
121     widget.hide()
122     return True
123
124 def destroy(widget):
125     gtk.main_quit()
126
127 def key_release(widget, event):
128     global position
129     if event.keyval == gtk.keysyms.Escape:
130         position = window.get_position()
131         widget.hide()
132
133 def tray_button(widget,event):
134     global position
135     if event.button == 1:
136         if window.get_property('visible'):
137             position = window.get_position()
138             window.hide()
139         else:
140             window.move(position[0], position[1])
141             window.show()
142     if event.button == 3:
143         menu.popup(None,None,None,event.button,event.time)
144
145 xml = gtk.glade.XML('dbus-vlc.glade')
146
147 bt_close    = xml.get_widget('close')
148 bt_quit     = xml.get_widget('quit')
149 bt_file     = xml.get_widget('ChooseFile')
150 bt_mrl      = xml.get_widget('AddMRL')
151 bt_next     = xml.get_widget('next')
152 bt_prev     = xml.get_widget('prev')
153 bt_stop     = xml.get_widget('stop')
154 bt_toggle   = xml.get_widget('toggle')
155 l_item      = xml.get_widget('item')
156 e_mrl       = xml.get_widget('mrl')
157 window      = xml.get_widget('window1')
158 img_bt_toggle=xml.get_widget('image6')
159 exp         = xml.get_widget('expander2')
160 expvbox     = xml.get_widget('expandvbox')
161 menu        = xml.get_widget('menu1')
162 menuitem    = xml.get_widget('menuquit')
163 vlcicon     = xml.get_widget('eventicon')
164 vol         = xml.get_widget('vol')
165 time_s      = xml.get_widget('time_s')
166 time_l      = xml.get_widget('time_l')
167
168 window.connect('delete_event',  delete_event)
169 window.connect('destroy',       destroy)
170 window.connect('key_release_event', key_release)
171
172 tray = egg.trayicon.TrayIcon("VLC")
173 eventbox = gtk.EventBox()
174 tray.add(eventbox)
175 eventbox.set_events(gtk.gdk.BUTTON_PRESS_MASK)
176 eventbox.connect('button_press_event', tray_button)
177 image = gtk.Image()
178 eventbox.add(image)
179 image.set_from_icon_name("vlc", gtk.ICON_SIZE_MENU)
180 tray.show_all()
181
182 def icon_clicked(widget, event):
183     update(0)
184
185 menu.attach_to_widget(eventbox,None)
186
187 bt_close.connect('clicked',     destroy)
188 bt_quit.connect('clicked',      Quit)
189 bt_mrl.connect('clicked',       AddTrack)
190 bt_toggle.connect('clicked',    Pause)
191 bt_next.connect('clicked',      Next)
192 bt_prev.connect('clicked',      Prev)
193 bt_stop.connect('clicked',      Stop)
194 exp.connect('activate',         expander)
195 menuitem.connect('activate',    destroy)
196 vlcicon.set_events(gtk.gdk.BUTTON_PRESS_MASK)
197 vlcicon.connect('button_press_event', icon_clicked)
198 vol.connect('change-value',     volchange)
199 vol.connect('scroll-event',     volchange)
200 time_s.connect('adjust-bounds', timechange)
201
202 time_s.set_update_policy(gtk.UPDATE_DISCONTINUOUS)
203 gobject.timeout_add( 2000, timeset)
204
205 library = "/media/mp3"
206
207 try:
208     os.chdir(library)
209     bt_file.set_current_folder(library)
210 except:
211     print "edit this file to point to your media library"
212
213 window.set_icon_name('vlc')
214 window.set_title("VLC - D-Bus ctrl")
215 window.show()
216
217 try:
218     update(0)
219 except:
220     True
221
222 gtk.main()