Initial support for multiple query services
[maevies] / ui / maeviesui / util / moviemanager.py
1 # -*- coding: utf-8 -*-
2
3 ###########################################################################
4 #    Maevies
5 #    Copyright (C) 2010 Simón Pena <spenap@gmail.com>
6 #
7 #    This program is free software: you can redistribute it and/or modify
8 #    it under the terms of the GNU General Public License as published by
9 #    the Free Software Foundation, either version 3 of the License, or
10 #    (at your option) any later version.
11 #
12 #    This program is distributed in the hope that it will be useful,
13 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #    GNU General Public License for more details.
16 #
17 #    You should have received a copy of the GNU General Public License
18 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 ###########################################################################
20
21 import dbus
22 import gobject
23 from dbus import glib
24 import gtk
25 from dbus.exceptions import DBusException
26
27 gobject.threads_init()
28 glib.init_threads()
29
30 MINFO_PROVIDER_INTERFACE = 'com.simonpena.maevies.minfoprovider'
31 MINFO_PROVIDER_BUS_NAME = 'com.simonpena.maevies.minfoprovider'
32 TMDB_MOVIE_INTERFACE = 'com.simonpena.maevies.tmdbmovie'
33 TMDB_MOVIE_BUS_NAME = 'com.simonpena.maevies.tmdbmovie'
34 TMDB = 0
35 WATC = 1
36
37 class MovieManager:
38
39     def __init__(self, response_received_cb=None):
40         self.response_received_cb = response_received_cb
41         self._bus = None
42         self._provider = None
43
44         self._bus = dbus.SessionBus()
45
46     def _get_provider(self):
47         if not self._provider:
48             self._provider = self._create_minfo_provider()
49         return self._provider
50
51     def _create_minfo_provider(self):
52         provider_proxy = self._bus.get_object(MINFO_PROVIDER_BUS_NAME,
53                                              '/MInfoProvider')
54         provider_interface = dbus.Interface(provider_proxy,
55                                             dbus_interface=MINFO_PROVIDER_INTERFACE)
56         provider_interface.connect_to_signal('ResponseReceived',
57                                              self._on_response_received)
58         return provider_interface
59
60     def query(self, movie_name='', query_type=TMDB):
61         try:
62             self._get_provider().Query(query_type, movie_name)
63         except DBusException:
64             self._on_response_received([])
65
66     def _on_response_received(self, interface, object_paths):
67         movies = []
68
69         if interface == TMDB_MOVIE_INTERFACE:
70             for path in object_paths:
71                 movies.append(MovieProxy(self._bus, path))
72         else:
73             pass
74
75         if self.response_received_cb:
76             self.response_received_cb(movies)
77
78 class MovieImage:
79     def __init__(self, image_struct):
80         self._type, self._url, self._size, self._id = image_struct
81
82     def get_url(self):
83         return self._url
84
85     def get_id(self):
86         return self._id
87
88     def get_size(self):
89         return self._size
90
91     def get_type(self):
92         return self._type
93
94     def __str__(self):
95         str = ''
96         for field in [self._id, self._url, self._type, self._size]:
97             str += '\t%s\n' % field
98         return str
99
100 class MovieProxy:
101
102     def __init__(self, bus, object_path):
103         self._bus = bus
104         self.interface = self._create_movie_interface(object_path)
105         self.fields = ['Title', 'Release date', 'Rating', 'Popularity']
106         self._images = self._retrieve_images()
107
108     def _create_movie_interface(self, object_path):
109         proxy = self._bus.get_object(TMDB_MOVIE_BUS_NAME,
110                                     object_path)
111         interface = dbus.Interface(proxy,
112                                    dbus_interface=TMDB_MOVIE_INTERFACE)
113         return interface
114
115     def _retrieve_images(self):
116         images = { }
117         dbus_images = self.interface.GetImages()
118         for dbus_image in dbus_images:
119             image = MovieImage(dbus_image)
120             if not images.has_key(image.get_type()):
121                 images[image.get_type()] = {}
122             images[image.get_type()][image.get_size()] = image
123         return images
124
125     def get_value(self, field):
126         if field == 'Title':
127             return self.get_title()
128         elif field == 'Release date':
129             return self.get_released()
130         elif field == 'Rating':
131             return self.get_rating()
132         elif field == 'Popularity':
133             return self.get_popularity()
134         else:
135             return ''
136
137     def get_title(self):
138         return self.interface.GetTitle()
139
140     def get_popularity(self):
141         return self.interface.GetPopularity()
142
143     def get_rating(self):
144         return self.interface.GetRating()
145
146     def get_image(self, type, size):
147         return self._images[type][size]
148
149     def get_released(self):
150         return self.interface.GetReleased()
151
152     def get_info(self):
153         return ('<b>%(title)s</b>\n<small><i>Popularity: </i>%(popularity)s'
154                 '    <i>Rating: </i>%(rating)s    <i>Released: </i>'
155                 '%(released)s</small>' %
156                 {'title' : self.get_title(),
157                  'popularity' : self.get_popularity(),
158                  'rating' : self.get_rating(),
159                  'released' : self.get_released()})
160
161     def get_overview(self):
162         return self.interface.GetOverview()
163
164     def get_placeholder_image(self):
165         return self._get_placeholder_pixbuf()
166
167     def _get_placeholder_pixbuf(self):
168         pixbuf = gtk.IconTheme().load_icon('general_video_file', 48, 0)
169         return pixbuf