tizen 2.3 release
[framework/connectivity/bluez.git] / test / simple-player
1 #!/usr/bin/python
2
3 from __future__ import print_function
4
5 import os
6 import sys
7 import dbus
8 import dbus.service
9 import dbus.mainloop.glib
10 try:
11   from gi.repository import GObject
12 except ImportError:
13   import gobject as GObject
14 import bluezutils
15
16 class Player(dbus.service.Object):
17         properties = None
18         metadata = None
19
20         def set_object(self, obj = None):
21                 if obj != None:
22                         bus = dbus.SystemBus()
23                         mp = dbus.Interface(bus.get_object("org.bluez", obj),
24                                                 "org.bluez.MediaPlayer1")
25                         prop = dbus.Interface(bus.get_object("org.bluez", obj),
26                                                 "org.freedesktop.DBus.Properties")
27
28                         self.properties = prop.GetAll("org.bluez.MediaPlayer1")
29
30                         bus.add_signal_receiver(self.properties_changed,
31                                 path = obj,
32                                 dbus_interface = "org.freedesktop.DBus.Properties",
33                                 signal_name = "PropertiesChanged")
34                 else:
35                         track = dbus.Dictionary({
36                                         "xesam:title" : "Title",
37                                         "xesam:artist" : "Artist",
38                                         "xesam:album" : "Album",
39                                         "xesam:genre" : "Genre",
40                                         "xesam:trackNumber" : dbus.Int32(1),
41                                         "mpris:length" : dbus.Int64(10000) },
42                                         signature="sv")
43
44                         self.properties = dbus.Dictionary({
45                                         "PlaybackStatus" : "playing",
46                                         "LoopStatus" : "None",
47                                         "Rate" : dbus.Double(1.0),
48                                         "Shuffle" : dbus.Boolean(False),
49                                         "Metadata" : track,
50                                         "Volume" : dbus.Double(1.0),
51                                         "Position" : dbus.UInt32(0),
52                                         "MinimumRate" : dbus.Double(1.0),
53                                         "MaximumRate" : dbus.Double(1.0),
54                                         "CanGoNext" : dbus.Boolean(False),
55                                         "CanGoPrevious" : dbus.Boolean(False),
56                                         "CanPlay" : dbus.Boolean(False),
57                                         "CanSeek" : dbus.Boolean(False),
58                                         "CanControl" : dbus.Boolean(False),
59                                         },
60                                         signature="sv")
61
62                         handler = InputHandler(self)
63                         GObject.io_add_watch(sys.stdin, GObject.IO_IN,
64                                                         handler.handle)
65
66         @dbus.service.method("org.freedesktop.DBus.Properties",
67                                         in_signature="ssv", out_signature="")
68         def Set(self, interface, key, value):
69                 print("Set (%s, %s)" % (key, value), file=sys.stderr)
70                 return
71
72         @dbus.service.signal("org.freedesktop.DBus.Properties",
73                                                         signature="sa{sv}as")
74         def PropertiesChanged(self, interface, properties,
75                                                 invalidated = dbus.Array()):
76                 """PropertiesChanged(interface, properties, invalidated)
77
78                 Send a PropertiesChanged signal. 'properties' is a dictionary
79                 containing string parameters as specified in doc/media-api.txt.
80                 """
81                 pass
82
83         def help(self, func):
84                 help(self.__class__.__dict__[func])
85
86         def properties_changed(self, interface, properties, invalidated):
87                 print("properties_changed(%s, %s)" % (properties, invalidated))
88
89                 self.PropertiesChanged(interface, properties, invalidated)
90
91 class InputHandler:
92         commands = { 'PropertiesChanged': '(interface, properties)',
93                         'help': '(cmd)' }
94         def __init__(self, player):
95                 self.player = player
96                 print('\n\nAvailable commands:')
97                 for cmd in self.commands:
98                         print('\t', cmd, self.commands[cmd], sep='')
99
100                 print("\nUse python syntax to pass arguments to available methods.\n" \
101                 "E.g.: PropertiesChanged({'Metadata' : {'Title': 'My title', \
102                 'Album': 'my album' }})")
103                 self.prompt()
104
105         def prompt(self):
106                 print('\n>>> ', end='')
107                 sys.stdout.flush()
108
109         def handle(self, fd, condition):
110                 s = os.read(fd.fileno(), 1024).strip()
111                 try:
112                         cmd = s[:s.find('(')]
113                         if not cmd in self.commands:
114                                 print("Unknown command ", cmd)
115                 except ValueError:
116                         print("Malformed command")
117                         return True
118
119                 try:
120                         exec "self.player.%s" % s
121                 except Exception as e:
122                         print(e)
123                         pass
124                 self.prompt()
125                 return True
126
127
128 if __name__ == '__main__':
129         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
130
131         bus = dbus.SystemBus()
132
133         if len(sys.argv) > 1:
134                 path = bluezutils.find_adapter(sys.argv[1]).object_path
135         else:
136                 path = bluezutils.find_adapter().object_path
137
138         media = dbus.Interface(bus.get_object("org.bluez", path),
139                                                 "org.bluez.Media1")
140
141         path = "/test/player"
142         player = Player(bus, path)
143         mainloop = GObject.MainLoop()
144
145         if len(sys.argv) > 2:
146                 player.set_object(sys.argv[2])
147         else:
148                 player.set_object()
149
150         print('Register media player with:\n\tProperties: %s' \
151                                                 % (player.properties))
152
153         media.RegisterPlayer(dbus.ObjectPath(path), player.properties)
154
155         mainloop.run()